Skip to content

Commit

Permalink
metal: SDL_RenderReadPixels on macOS synchronizes the render target's…
Browse files Browse the repository at this point in the history
… texture data if it's managed, before reading from it.
  • Loading branch information
slime73 committed Nov 4, 2018
1 parent c9fed27 commit 244b79e
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions src/render/metal/SDL_render_metal.m
Expand Up @@ -1196,14 +1196,28 @@ - (void)dealloc
METAL_RenderData *data = (__bridge METAL_RenderData *) renderer->driverdata;
METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionLoad, NULL);

// Commit any current command buffer, and waitUntilCompleted, so any output is ready to be read.
[data.mtlcmdencoder endEncoding];
id<MTLTexture> mtltexture = data.mtlpassdesc.colorAttachments[0].texture;

#ifdef __MACOSX__
/* on macOS with managed-storage textures, we need to tell the driver to
* update the CPU-side copy of the texture data.
* NOTE: Currently all of our textures are managed on macOS. We'll need some
* extra copying for any private textures. */
if (mtltexture.storageMode == MTLStorageModeManaged) {
id<MTLBlitCommandEncoder> blit = [data.mtlcmdbuffer blitCommandEncoder];
[blit synchronizeResource:mtltexture];
[blit endEncoding];
}
#endif

/* Commit the current command buffer and wait until it's completed, to make
* sure the GPU has finished rendering to it by the time we read it. */
[data.mtlcmdbuffer commit];
[data.mtlcmdbuffer waitUntilCompleted];
data.mtlcmdencoder = nil;
data.mtlcmdbuffer = nil;

id<MTLTexture> mtltexture = data.mtlpassdesc.colorAttachments[0].texture;
MTLRegion mtlregion = MTLRegionMake2D(rect->x, rect->y, rect->w, rect->h);

// we only do BGRA8 or RGBA8 at the moment, so 4 will do.
Expand Down

0 comments on commit 244b79e

Please sign in to comment.