Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
metal: Don't try to create a zero-byte vertex buffer.
(Which will cause a crash in Metal, or an assert in the validation layer.)
  • Loading branch information
icculus committed Oct 5, 2018
1 parent 1ecf4df commit 638d624
Showing 1 changed file with 21 additions and 18 deletions.
39 changes: 21 additions & 18 deletions src/render/metal/SDL_render_metal.m
Expand Up @@ -1052,6 +1052,7 @@ - (void)dealloc
{ @autoreleasepool {
METAL_RenderData *data = (__bridge METAL_RenderData *) renderer->driverdata;
METAL_DrawStateCache statecache;
id<MTLBuffer> mtlbufvertex = nil;

statecache.pipeline = nil;
statecache.constants_offset = CONSTANTS_OFFSET_INVALID;
Expand All @@ -1063,24 +1064,26 @@ - (void)dealloc
statecache.color_offset = 0;

// !!! FIXME: have a ring of pre-made MTLBuffers we cycle through? How expensive is creation?
id<MTLBuffer> mtlbufvertexstaging = [data.mtldevice newBufferWithLength:vertsize options:MTLResourceStorageModeShared];
#if !__has_feature(objc_arc)
[mtlbufvertexstaging autorelease];
#endif
mtlbufvertexstaging.label = @"SDL vertex staging data";
SDL_memcpy([mtlbufvertexstaging contents], vertices, vertsize);

// Move our new vertex buffer from system RAM to GPU memory so any draw calls can use it.
id<MTLBuffer> mtlbufvertex = [data.mtldevice newBufferWithLength:vertsize options:MTLResourceStorageModePrivate];
#if !__has_feature(objc_arc)
[mtlbufvertex autorelease];
#endif
mtlbufvertex.label = @"SDL vertex data";
id<MTLCommandBuffer> cmdbuffer = [data.mtlcmdqueue commandBuffer];
id<MTLBlitCommandEncoder> blitcmd = [cmdbuffer blitCommandEncoder];
[blitcmd copyFromBuffer:mtlbufvertexstaging sourceOffset:0 toBuffer:mtlbufvertex destinationOffset:0 size:vertsize];
[blitcmd endEncoding];
[cmdbuffer commit];
if (vertsize > 0) {
id<MTLBuffer> mtlbufvertexstaging = [data.mtldevice newBufferWithLength:vertsize options:MTLResourceStorageModeShared];
#if !__has_feature(objc_arc)
[mtlbufvertexstaging autorelease];
#endif
mtlbufvertexstaging.label = @"SDL vertex staging data";
SDL_memcpy([mtlbufvertexstaging contents], vertices, vertsize);

// Move our new vertex buffer from system RAM to GPU memory so any draw calls can use it.
mtlbufvertex = [data.mtldevice newBufferWithLength:vertsize options:MTLResourceStorageModePrivate];
#if !__has_feature(objc_arc)
[mtlbufvertex autorelease];
#endif
mtlbufvertex.label = @"SDL vertex data";
id<MTLCommandBuffer> cmdbuffer = [data.mtlcmdqueue commandBuffer];
id<MTLBlitCommandEncoder> blitcmd = [cmdbuffer blitCommandEncoder];
[blitcmd copyFromBuffer:mtlbufvertexstaging sourceOffset:0 toBuffer:mtlbufvertex destinationOffset:0 size:vertsize];
[blitcmd endEncoding];
[cmdbuffer commit];
}

// If there's a command buffer here unexpectedly (app requested one?). Commit it so we can start fresh.
[data.mtlcmdencoder endEncoding];
Expand Down

0 comments on commit 638d624

Please sign in to comment.