MetalContext.mm 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/OwnPtr.h>
  7. #include <LibCore/MetalContext.h>
  8. #define FixedPoint FixedPointMacOS
  9. #define Duration DurationMacOS
  10. #include <Metal/Metal.h>
  11. #undef FixedPoint
  12. #undef Duration
  13. namespace Core {
  14. class MetalTextureImpl final : public MetalTexture {
  15. public:
  16. MetalTextureImpl(id<MTLTexture> texture)
  17. : m_texture(texture)
  18. {
  19. }
  20. void const* texture() const override { return m_texture; }
  21. size_t width() const override { return m_texture.width; }
  22. size_t height() const override { return m_texture.height; }
  23. virtual ~MetalTextureImpl()
  24. {
  25. [m_texture release];
  26. }
  27. private:
  28. id<MTLTexture> m_texture;
  29. };
  30. class MetalContextImpl final : public MetalContext {
  31. public:
  32. MetalContextImpl(id<MTLDevice> device, id<MTLCommandQueue> queue)
  33. : m_device(device)
  34. , m_queue(queue)
  35. {
  36. }
  37. void const* device() const override { return m_device; }
  38. void const* queue() const override { return m_queue; }
  39. OwnPtr<MetalTexture> create_texture_from_iosurface(IOSurfaceHandle const& iosurface) override
  40. {
  41. auto* const descriptor = [[MTLTextureDescriptor alloc] init];
  42. descriptor.pixelFormat = MTLPixelFormatBGRA8Unorm;
  43. descriptor.width = iosurface.width();
  44. descriptor.height = iosurface.height();
  45. descriptor.storageMode = MTLStorageModeShared;
  46. descriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead;
  47. id<MTLTexture> texture = [m_device newTextureWithDescriptor:descriptor iosurface:(IOSurfaceRef)iosurface.core_foundation_pointer() plane:0];
  48. [descriptor release];
  49. return make<MetalTextureImpl>(texture);
  50. }
  51. virtual ~MetalContextImpl() override
  52. {
  53. [m_queue release];
  54. [m_device release];
  55. }
  56. private:
  57. id<MTLDevice> m_device;
  58. id<MTLCommandQueue> m_queue;
  59. };
  60. OwnPtr<MetalContext> get_metal_context()
  61. {
  62. auto device = MTLCreateSystemDefaultDevice();
  63. if (!device) {
  64. dbgln("Failed to create Metal device");
  65. return {};
  66. }
  67. auto queue = [device newCommandQueue];
  68. if (!queue) {
  69. dbgln("Failed to create Metal command queue");
  70. [device release];
  71. return {};
  72. }
  73. return make<MetalContextImpl>(device, queue);
  74. }
  75. }