From 004a6d305586948853010b67bd6371eb5d015ee6 Mon Sep 17 00:00:00 2001 From: Feifan He Date: Wed, 27 Nov 2024 22:27:15 +0800 Subject: [PATCH] tests/shader_runner_metal: Implement depth texture and state. --- tests/shader_runner_metal.m | 48 ++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tests/shader_runner_metal.m b/tests/shader_runner_metal.m index 946f9011..38731e93 100644 --- a/tests/shader_runner_metal.m +++ b/tests/shader_runner_metal.m @@ -70,6 +70,8 @@ static MTLPixelFormat get_metal_pixel_format(DXGI_FORMAT format) return MTLPixelFormatR32Float; case DXGI_FORMAT_R32_UINT: return MTLPixelFormatR32Uint; + case DXGI_FORMAT_D32_FLOAT: + return MTLPixelFormatDepth32Float; default: return MTLPixelFormatInvalid; } @@ -98,6 +100,29 @@ static MTLPrimitiveType get_metal_primitive_type(D3D_PRIMITIVE_TOPOLOGY topology } } +static MTLCompareFunction get_metal_compare_function(D3D12_COMPARISON_FUNC func) +{ + switch (func) + { + case VKD3D_SHADER_COMPARISON_FUNC_NEVER: + return MTLCompareFunctionNever; + case VKD3D_SHADER_COMPARISON_FUNC_LESS: + return MTLCompareFunctionLess; + case VKD3D_SHADER_COMPARISON_FUNC_EQUAL: + return MTLCompareFunctionEqual; + case VKD3D_SHADER_COMPARISON_FUNC_LESS_EQUAL: + return MTLCompareFunctionLessEqual; + case VKD3D_SHADER_COMPARISON_FUNC_GREATER: + return MTLCompareFunctionGreater; + case VKD3D_SHADER_COMPARISON_FUNC_NOT_EQUAL: + return MTLCompareFunctionNotEqual; + case VKD3D_SHADER_COMPARISON_FUNC_GREATER_EQUAL: + return MTLCompareFunctionGreaterEqual; + case VKD3D_SHADER_COMPARISON_FUNC_ALWAYS: + return MTLCompareFunctionAlways; + } +} + static void trace_messages(const char *messages) { const char *p, *end, *line; @@ -149,7 +174,7 @@ static void init_resource_texture(struct metal_runner *runner, id device = runner->device; MTLTextureDescriptor *desc; - if (params->desc.type != RESOURCE_TYPE_RENDER_TARGET) + if (params->desc.type != RESOURCE_TYPE_RENDER_TARGET && params->desc.type != RESOURCE_TYPE_DEPTH_STENCIL) return; if (params->desc.sample_count > 1) @@ -305,10 +330,12 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY to struct metal_runner *runner = metal_runner(r); MTLRenderPipelineDescriptor *pipeline_desc; MTLVertexBufferLayoutDescriptor *binding; + id ds_state = nil; id device = runner->device; size_t attribute_offsets[32], stride; id encoder; id command_buffer; + MTLDepthStencilDescriptor *ds_desc; MTLRenderPassDescriptor *pass_desc; id descriptors; MTLVertexDescriptor *vertex_desc; @@ -366,6 +393,22 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY to fb_height = resource->r.desc.height; break; + case RESOURCE_TYPE_DEPTH_STENCIL: + pipeline_desc.depthAttachmentPixelFormat = resource->texture.pixelFormat; + pass_desc.depthAttachment.loadAction = MTLLoadActionLoad; + pass_desc.depthAttachment.storeAction = MTLStoreActionStore; + pass_desc.depthAttachment.texture = resource->texture; + if (resource->r.desc.width < fb_width) + fb_width = resource->r.desc.width; + if (resource->r.desc.height < fb_height) + fb_height = resource->r.desc.height; + + ds_desc = [[[MTLDepthStencilDescriptor alloc] init] autorelease]; + ds_desc.depthCompareFunction = get_metal_compare_function(runner->r.depth_func); + ds_desc.depthWriteEnabled = true; + ds_state = [[device newDepthStencilStateWithDescriptor:ds_desc] autorelease]; + break; + case RESOURCE_TYPE_VERTEX_BUFFER: assert(resource->r.desc.slot < ARRAY_SIZE(vb_info)); for (j = 0, stride = 0; j < runner->r.input_element_count; ++j) @@ -455,6 +498,9 @@ static bool metal_runner_draw(struct shader_runner *r, D3D_PRIMITIVE_TOPOLOGY to goto done; } + if (ds_state) + [encoder setDepthStencilState:ds_state]; + [encoder setRenderPipelineState:pso]; [encoder setViewport:viewport]; [encoder drawPrimitives:get_metal_primitive_type(topology)