diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m index 5aa8ec3e386b14..f05264703d2680 100644 --- a/src/gpu/metal/SDL_gpu_metal.m +++ b/src/gpu/metal/SDL_gpu_metal.m @@ -1121,11 +1121,12 @@ static void METAL_ReleaseGraphicsPipeline( if (createinfo->target_info.has_depth_stencil_target) { pipelineDescriptor.depthAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); + pipelineDescriptor.stencilAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); - if (createinfo->depth_stencil_state.enable_stencil_test) { - pipelineDescriptor.stencilAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); + frontStencilDescriptor = [MTLStencilDescriptor new]; + backStencilDescriptor = [MTLStencilDescriptor new]; - frontStencilDescriptor = [MTLStencilDescriptor new]; + if (createinfo->depth_stencil_state.enable_stencil_test) { frontStencilDescriptor.stencilCompareFunction = SDLToMetal_CompareOp[createinfo->depth_stencil_state.front_stencil_state.compare_op]; frontStencilDescriptor.stencilFailureOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.front_stencil_state.fail_op]; frontStencilDescriptor.depthStencilPassOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.front_stencil_state.pass_op]; @@ -1133,13 +1134,28 @@ static void METAL_ReleaseGraphicsPipeline( frontStencilDescriptor.readMask = createinfo->depth_stencil_state.compare_mask; frontStencilDescriptor.writeMask = createinfo->depth_stencil_state.write_mask; - backStencilDescriptor = [MTLStencilDescriptor new]; backStencilDescriptor.stencilCompareFunction = SDLToMetal_CompareOp[createinfo->depth_stencil_state.back_stencil_state.compare_op]; backStencilDescriptor.stencilFailureOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.back_stencil_state.fail_op]; backStencilDescriptor.depthStencilPassOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.back_stencil_state.pass_op]; backStencilDescriptor.depthFailureOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.back_stencil_state.depth_fail_op]; backStencilDescriptor.readMask = createinfo->depth_stencil_state.compare_mask; backStencilDescriptor.writeMask = createinfo->depth_stencil_state.write_mask; + } else { + // This is just a safe default that avoids doing anything to the stencil buffer + + frontStencilDescriptor.stencilCompareFunction = MTLCompareFunctionNever; + frontStencilDescriptor.stencilFailureOperation = MTLStencilOperationKeep; + frontStencilDescriptor.depthStencilPassOperation = MTLStencilOperationKeep; + frontStencilDescriptor.depthFailureOperation = MTLStencilOperationKeep; + frontStencilDescriptor.readMask = createinfo->depth_stencil_state.compare_mask; + frontStencilDescriptor.writeMask = createinfo->depth_stencil_state.write_mask; + + backStencilDescriptor.stencilCompareFunction = MTLCompareFunctionNever; + backStencilDescriptor.stencilFailureOperation = MTLStencilOperationKeep; + backStencilDescriptor.depthStencilPassOperation = MTLStencilOperationKeep; + backStencilDescriptor.depthFailureOperation = MTLStencilOperationKeep; + backStencilDescriptor.readMask = createinfo->depth_stencil_state.compare_mask; + backStencilDescriptor.writeMask = createinfo->depth_stencil_state.write_mask; } depthStencilDescriptor = [MTLDepthStencilDescriptor new];