33template <
typename ViewType>
40 device.reset (MTLCreateSystemDefaultDevice());
58 view.wantsLayer = YES;
59 view.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft;
60 view.layer = [CAMetalLayer layer];
63 auto layer = (CAMetalLayer*) view.layer;
65 layer.device =
device.get();
66 layer.framebufferOnly = NO;
67 layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB;
68 layer.opaque =
comp.isOpaque();
69 layer.allowsNextDrawableTimeout = NO;
90 template <
typename Callback>
95 Callback&& drawRectWithContext,
98 auto layer = (CAMetalLayer*) view.layer;
104 case MTLCommandBufferStatusNotEnqueued:
105 case MTLCommandBufferStatusEnqueued:
106 case MTLCommandBufferStatusCommitted:
107 case MTLCommandBufferStatusScheduled:
111 case MTLCommandBufferStatusCompleted:
112 case MTLCommandBufferStatusError:
117 layer.contentsScale = scaleFactor;
118 const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale,
119 layer.contentsScale);
120 const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform);
122 const auto componentHeight =
comp.getHeight();
124 if (
resources ==
nullptr || ! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize))
126 layer.drawableSize = transformedFrameSize;
127 resources = std::make_unique<Resources> (
device.get(), layer, componentHeight);
130 auto gpuTexture =
resources->getGpuTexture();
132 if (gpuTexture ==
nullptr)
138 auto cgContext =
resources->getCGContext();
140 for (
auto rect : dirtyRegions)
142 const auto cgRect = convertToCGRect (rect);
144 CGContextSaveGState (cgContext);
146 CGContextClipToRect (cgContext, cgRect);
147 drawRectWithContext (cgContext, cgRect);
149 CGContextRestoreGState (cgContext);
154 auto sharedTexture =
resources->getSharedTexture();
156 auto encodeBlit = [] (id<MTLCommandBuffer> commandBuffer,
157 id<MTLTexture> source,
158 id<MTLTexture> destination)
160 auto blitCommandEncoder = [commandBuffer blitCommandEncoder];
161 [blitCommandEncoder copyFromTexture: source
164 sourceOrigin: MTLOrigin{}
165 sourceSize: MTLSize { source.width, source.height, 1 }
166 toTexture: destination
169 destinationOrigin: MTLOrigin{}];
170 [blitCommandEncoder endEncoding];
177 id<MTLCommandBuffer> commandBuffer = [
commandQueue.get() commandBuffer];
179 id<CAMetalDrawable> drawable = [layer nextDrawable];
180 encodeBlit (commandBuffer, sharedTexture, drawable.texture);
182 [commandBuffer presentDrawable: drawable];
183 [commandBuffer commit];
208 id<CAMetalDrawable> drawable = [layer nextDrawable];
210 id<MTLCommandBuffer> presentationCommandBuffer = [
commandQueue.get() commandBuffer];
212 encodeBlit (presentationCommandBuffer, gpuTexture, drawable.texture);
214 [presentationCommandBuffer addScheduledHandler: ^(id<MTLCommandBuffer>)
219 [presentationCommandBuffer commit];
233 return ((
n + alignment - 1) / alignment) * alignment;
243 t.reset ([metalDevice newTextureWithDescriptor:
descriptor]);
249 [] (
const ObjCObjectHandle<id<MTLTexture>>&
t) { return [t.get() retainCount] == 1; });
264 Resources (id<MTLDevice> metalDevice, CAMetalLayer* layer,
int componentHeight)
266 const auto bytesPerRow =
alignTo ((
size_t) layer.drawableSize.width * 4, 256);
268 const auto allocationSize =
cpuRenderMemory.ensureSize (bytesPerRow * (
size_t) layer.drawableSize.height);
274 MTLResourceStorageModeManaged
276 MTLResourceStorageModeShared
278 deallocator:
nullptr]);
280 auto* textureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: layer.pixelFormat
281 width: (NSUInteger) layer.drawableSize.width
282 height: (NSUInteger) layer.drawableSize.height
284 textureDesc.storageMode =
286 MTLStorageModeManaged;
288 MTLStorageModeShared;
290 textureDesc.usage = MTLTextureUsageShaderRead;
294 bytesPerRow: bytesPerRow]);
297 (
size_t) layer.drawableSize.width,
298 (
size_t) layer.drawableSize.height,
301 CGColorSpaceCreateWithName (kCGColorSpaceSRGB),
302 (
uint32_t) kCGImageAlphaPremultipliedFirst | (
uint32_t) kCGBitmapByteOrder32Host));
304 CGContextScaleCTM (
cgContext.get(), layer.contentsScale, layer.contentsScale);
305 CGContextConcatCTM (
cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight));
307 textureDesc.storageMode = MTLStorageModePrivate;
308 gpuTexturePool = std::make_unique<GpuTexturePool> (metalDevice, textureDesc);
318 [
buffer.get() didModifyRange: { 0,
buffer.get().length }];
337 if (alignedSize >
size)
355 if (posix_memalign (&
data, alignment, allocationSize) != 0)
#define noexcept
Definition DistrhoDefines.h:72
#define nullptr
Definition DistrhoDefines.h:75
static const LV2_Descriptor descriptor
Definition bindings_test_plugin.c:165
Definition juce_Component.h:36
std::array< ObjCObjectHandle< id< MTLTexture > >, 3 > textureCache
Definition juce_mac_CGMetalLayerRenderer.h:254
id< MTLTexture > take() const
Definition juce_mac_CGMetalLayerRenderer.h:246
GpuTexturePool(id< MTLDevice > metalDevice, MTLTextureDescriptor *descriptor)
Definition juce_mac_CGMetalLayerRenderer.h:240
Definition juce_mac_ObjCHelpers.h:261
Definition juce_RectangleList.h:43
struct huft * t
Definition inflate.c:943
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
unsigned int uint32_t
Definition mid.cpp:100
std::unique_ptr< CGContext, ContextDelete > ContextPtr
Definition juce_mac_CoreGraphicsContext.h:58
Definition carla_juce.cpp:31
png_uint_32 length
Definition png.c:2247
int n
Definition crypt.c:458
#define const
Definition zconf.h:137