fix some crashes in metal implementation when pathCount and eltCount are 0 #65
|
@ -952,6 +952,11 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
int pathCount = backend->pathCount - backend->pathBatchStart;
|
int pathCount = backend->pathCount - backend->pathBatchStart;
|
||||||
int eltCount = backend->eltCount - backend->eltBatchStart;
|
int eltCount = backend->eltCount - backend->eltBatchStart;
|
||||||
|
|
||||||
|
if(!pathCount || !eltCount)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//NOTE: update intermediate buffers sizes if needed
|
//NOTE: update intermediate buffers sizes if needed
|
||||||
|
|
||||||
oc_mtl_grow_buffer_if_needed(backend, &backend->pathQueueBuffer, pathCount * sizeof(oc_mtl_path_queue));
|
oc_mtl_grow_buffer_if_needed(backend, &backend->pathQueueBuffer, pathCount * sizeof(oc_mtl_path_queue));
|
||||||
|
@ -984,8 +989,6 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
[blitEncoder endEncoding];
|
[blitEncoder endEncoding];
|
||||||
|
|
||||||
//NOTE: path setup pass
|
//NOTE: path setup pass
|
||||||
if(pathCount > 0)
|
|
||||||
{
|
|
||||||
id<MTLComputeCommandEncoder> pathEncoder = [surface->commandBuffer computeCommandEncoder];
|
id<MTLComputeCommandEncoder> pathEncoder = [surface->commandBuffer computeCommandEncoder];
|
||||||
pathEncoder.label = @"path pass";
|
pathEncoder.label = @"path pass";
|
||||||
[pathEncoder setComputePipelineState:backend->pathPipeline];
|
[pathEncoder setComputePipelineState:backend->pathPipeline];
|
||||||
|
@ -1006,18 +1009,15 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
|
|
||||||
[pathEncoder dispatchThreads:pathGridSize threadsPerThreadgroup:pathGroupSize];
|
[pathEncoder dispatchThreads:pathGridSize threadsPerThreadgroup:pathGroupSize];
|
||||||
[pathEncoder endEncoding];
|
[pathEncoder endEncoding];
|
||||||
}
|
|
||||||
|
|
||||||
int tileOpMax = [backend->tileOpBuffer length] / sizeof(oc_mtl_tile_op);
|
|
||||||
int segmentMax = [backend->segmentBuffer length] / sizeof(oc_mtl_segment);
|
|
||||||
|
|
||||||
//NOTE: segment setup pass
|
//NOTE: segment setup pass
|
||||||
if(eltCount > 0)
|
|
||||||
{
|
|
||||||
id<MTLComputeCommandEncoder> segmentEncoder = [surface->commandBuffer computeCommandEncoder];
|
id<MTLComputeCommandEncoder> segmentEncoder = [surface->commandBuffer computeCommandEncoder];
|
||||||
segmentEncoder.label = @"segment pass";
|
segmentEncoder.label = @"segment pass";
|
||||||
[segmentEncoder setComputePipelineState:backend->segmentPipeline];
|
[segmentEncoder setComputePipelineState:backend->segmentPipeline];
|
||||||
|
|
||||||
|
int tileOpMax = [backend->tileOpBuffer length] / sizeof(oc_mtl_tile_op);
|
||||||
|
int segmentMax = [backend->segmentBuffer length] / sizeof(oc_mtl_segment);
|
||||||
|
|
||||||
[segmentEncoder setBytes:&eltCount length:sizeof(int) atIndex:0];
|
[segmentEncoder setBytes:&eltCount length:sizeof(int) atIndex:0];
|
||||||
[segmentEncoder setBuffer:backend->elementBuffer[backend->bufferIndex] offset:elementBufferOffset atIndex:1];
|
[segmentEncoder setBuffer:backend->elementBuffer[backend->bufferIndex] offset:elementBufferOffset atIndex:1];
|
||||||
[segmentEncoder setBuffer:backend->segmentCountBuffer offset:0 atIndex:2];
|
[segmentEncoder setBuffer:backend->segmentCountBuffer offset:0 atIndex:2];
|
||||||
|
@ -1038,11 +1038,8 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
|
|
||||||
[segmentEncoder dispatchThreads:segmentGridSize threadsPerThreadgroup:segmentGroupSize];
|
[segmentEncoder dispatchThreads:segmentGridSize threadsPerThreadgroup:segmentGroupSize];
|
||||||
[segmentEncoder endEncoding];
|
[segmentEncoder endEncoding];
|
||||||
}
|
|
||||||
|
|
||||||
//NOTE: backprop pass
|
//NOTE: backprop pass
|
||||||
if(pathCount > 0)
|
|
||||||
{
|
|
||||||
id<MTLComputeCommandEncoder> backpropEncoder = [surface->commandBuffer computeCommandEncoder];
|
id<MTLComputeCommandEncoder> backpropEncoder = [surface->commandBuffer computeCommandEncoder];
|
||||||
backpropEncoder.label = @"backprop pass";
|
backpropEncoder.label = @"backprop pass";
|
||||||
[backpropEncoder setComputePipelineState:backend->backpropPipeline];
|
[backpropEncoder setComputePipelineState:backend->backpropPipeline];
|
||||||
|
@ -1057,11 +1054,8 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
|
|
||||||
[backpropEncoder dispatchThreads:backpropGridSize threadsPerThreadgroup:backpropGroupSize];
|
[backpropEncoder dispatchThreads:backpropGridSize threadsPerThreadgroup:backpropGroupSize];
|
||||||
[backpropEncoder endEncoding];
|
[backpropEncoder endEncoding];
|
||||||
}
|
|
||||||
|
|
||||||
//NOTE: merge pass
|
//NOTE: merge pass
|
||||||
if(pathCount > 0)
|
|
||||||
{
|
|
||||||
id<MTLComputeCommandEncoder> mergeEncoder = [surface->commandBuffer computeCommandEncoder];
|
id<MTLComputeCommandEncoder> mergeEncoder = [surface->commandBuffer computeCommandEncoder];
|
||||||
mergeEncoder.label = @"merge pass";
|
mergeEncoder.label = @"merge pass";
|
||||||
[mergeEncoder setComputePipelineState:backend->mergePipeline];
|
[mergeEncoder setComputePipelineState:backend->mergePipeline];
|
||||||
|
@ -1085,7 +1079,6 @@ void oc_mtl_render_batch(oc_mtl_canvas_backend* backend,
|
||||||
|
|
||||||
[mergeEncoder dispatchThreads:mergeGridSize threadsPerThreadgroup:mergeGroupSize];
|
[mergeEncoder dispatchThreads:mergeGridSize threadsPerThreadgroup:mergeGroupSize];
|
||||||
[mergeEncoder endEncoding];
|
[mergeEncoder endEncoding];
|
||||||
}
|
|
||||||
|
|
||||||
//NOTE: raster pass
|
//NOTE: raster pass
|
||||||
id<MTLComputeCommandEncoder> rasterEncoder = [surface->commandBuffer computeCommandEncoder];
|
id<MTLComputeCommandEncoder> rasterEncoder = [surface->commandBuffer computeCommandEncoder];
|
||||||
|
|
Loading…
Reference in New Issue