diff --git a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h
index 9b266e7842..e5a1407016 100644
--- a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h
+++ b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h
@@ -108,7 +108,10 @@ public:
             CGContextRestoreGState (cgContext);
         }
 
-        auto cpuTexture = resources->getCpuTexture();
+        auto sharedBuffer = resources->getSharedBuffer();
+        [sharedBuffer didModifyRange: { 0, sharedBuffer.length }];
+
+        auto sharedTexture = resources->getSharedTexture();
 
         memoryBlitCommandBuffer.reset ([commandQueue.get() commandBuffer]);
 
@@ -118,11 +121,11 @@ public:
         [memoryBlitCommandBuffer.get() retain];
 
         auto blitCommandEncoder = [memoryBlitCommandBuffer.get() blitCommandEncoder];
-        [blitCommandEncoder copyFromTexture: cpuTexture
+        [blitCommandEncoder copyFromTexture: sharedTexture
                                 sourceSlice: 0
                                 sourceLevel: 0
                                sourceOrigin: MTLOrigin{}
-                                 sourceSize: MTLSize { cpuTexture.width, cpuTexture.height, 1 }
+                                 sourceSize: MTLSize { sharedTexture.width, sharedTexture.height, 1 }
                                   toTexture: gpuTexture
                            destinationSlice: 0
                            destinationLevel: 0
@@ -227,21 +230,21 @@ private:
 
             const auto allocationSize = cpuRenderMemory.ensureSize (bytesPerRow * (size_t) layer.drawableSize.height);
 
-            ObjCObjectHandle<id<MTLBuffer>> buffer { [metalDevice newBufferWithBytesNoCopy: cpuRenderMemory.get()
-                                                                                    length: allocationSize
-                                                                                   options: MTLResourceStorageModeShared
-                                                                               deallocator: nullptr] };
+            buffer.reset ([metalDevice newBufferWithBytesNoCopy: cpuRenderMemory.get()
+                                                         length: allocationSize
+                                                        options: MTLResourceStorageModeManaged
+                                                    deallocator: nullptr]);
 
             auto* textureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: layer.pixelFormat
                                                                                    width: (NSUInteger) layer.drawableSize.width
                                                                                   height: (NSUInteger) layer.drawableSize.height
                                                                                mipmapped: NO];
-            textureDesc.storageMode = buffer.get().storageMode;
+            textureDesc.storageMode = MTLStorageModeManaged;
             textureDesc.usage = MTLTextureUsageShaderRead;
 
-            cpuTexture.reset ([buffer.get() newTextureWithDescriptor: textureDesc
-                                                              offset: 0
-                                                         bytesPerRow: bytesPerRow]);
+            sharedTexture.reset ([buffer.get() newTextureWithDescriptor: textureDesc
+                                                                 offset: 0
+                                                            bytesPerRow: bytesPerRow]);
 
             cgContext.reset (CGBitmapContextCreate (cpuRenderMemory.get(),
                                                     (size_t) layer.drawableSize.width,
@@ -258,9 +261,10 @@ private:
             gpuTexturePool = std::make_unique<GpuTexturePool> (metalDevice, textureDesc);
         }
 
-        CGContextRef getCGContext() const noexcept      { return cgContext.get(); }
-        id<MTLTexture> getCpuTexture() const noexcept   { return cpuTexture.get(); }
-        id<MTLTexture> getGpuTexture() noexcept         { return gpuTexturePool == nullptr ? nullptr : gpuTexturePool->take(); }
+        CGContextRef getCGContext() const noexcept       { return cgContext.get(); }
+        id<MTLBuffer> getSharedBuffer() const noexcept   { return buffer.get(); }
+        id<MTLTexture> getSharedTexture() const noexcept { return sharedTexture.get(); }
+        id<MTLTexture> getGpuTexture() noexcept          { return gpuTexturePool == nullptr ? nullptr : gpuTexturePool->take(); }
 
     private:
         class AlignedMemory
@@ -318,7 +322,8 @@ private:
 
         detail::ContextPtr cgContext;
 
-        TextureUniquePtr cpuTexture;
+        ObjCObjectHandle<id<MTLBuffer>> buffer;
+        TextureUniquePtr sharedTexture;
         std::unique_ptr<GpuTexturePool> gpuTexturePool;
 
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Resources)
