mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
tests/shader_runner_metal: Implement depth texture and state.
This commit is contained in:
parent
949708450b
commit
004a6d3055
Notes:
Henri Verbeet
2024-11-30 14:35:45 +01:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1286
@ -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<MTLDevice> 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<MTLDepthStencilState> ds_state = nil;
|
||||
id<MTLDevice> device = runner->device;
|
||||
size_t attribute_offsets[32], stride;
|
||||
id<MTLRenderCommandEncoder> encoder;
|
||||
id<MTLCommandBuffer> command_buffer;
|
||||
MTLDepthStencilDescriptor *ds_desc;
|
||||
MTLRenderPassDescriptor *pass_desc;
|
||||
id<MTLArgumentEncoder> 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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user