diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-02-01 20:56:13 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-09-08 17:33:08 +0300 |
commit | 6ee34c0b6e4244e6ada9c27ff5ba078b971175e8 (patch) | |
tree | 5424568bf23165f3ec5e03fb40e40cddae5aaa46 | |
parent | 2be740beb15ca46b9f560d5de3130753a3df4603 (diff) |
vkd3d: Decode MS and AS shader subobjects.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
-rw-r--r-- | libs/vkd3d/state.c | 59 | ||||
-rw-r--r-- | libs/vkd3d/vkd3d_private.h | 2 |
2 files changed, 53 insertions, 8 deletions
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 9303fd0c..635abd04 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -1721,13 +1721,37 @@ HRESULT vkd3d_pipeline_state_desc_from_d3d12_compute_desc(struct d3d12_pipeline_ #define VKD3D_HANDLE_SUBOBJECT(type_enum, type, left_side) \ VKD3D_HANDLE_SUBOBJECT_EXPLICIT(type_enum, type, left_side = subobject->data) +static VkShaderStageFlags vkd3d_pipeline_state_desc_get_shader_stages(const struct d3d12_pipeline_state_desc *desc) +{ + VkShaderStageFlags result = 0; + + if (desc->vs.BytecodeLength && desc->vs.pShaderBytecode) + result |= VK_SHADER_STAGE_VERTEX_BIT; + if (desc->hs.BytecodeLength && desc->hs.pShaderBytecode) + result |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; + if (desc->ds.BytecodeLength && desc->ds.pShaderBytecode) + result |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; + if (desc->gs.BytecodeLength && desc->gs.pShaderBytecode) + result |= VK_SHADER_STAGE_GEOMETRY_BIT; + if (desc->ps.BytecodeLength && desc->ps.pShaderBytecode) + result |= VK_SHADER_STAGE_FRAGMENT_BIT; + if (desc->as.BytecodeLength && desc->as.pShaderBytecode) + result |= VK_SHADER_STAGE_TASK_BIT_EXT; + if (desc->ms.BytecodeLength && desc->ms.pShaderBytecode) + result |= VK_SHADER_STAGE_MESH_BIT_EXT; + if (desc->cs.BytecodeLength && desc->cs.pShaderBytecode) + result |= VK_SHADER_STAGE_COMPUTE_BIT; + + return result; +} + HRESULT vkd3d_pipeline_state_desc_from_d3d12_stream_desc(struct d3d12_pipeline_state_desc *desc, const D3D12_PIPELINE_STATE_STREAM_DESC *d3d12_desc, VkPipelineBindPoint *vk_bind_point) { + VkShaderStageFlags defined_stages, disallowed_stages; D3D12_PIPELINE_STATE_SUBOBJECT_TYPE subobject_type; const char *stream_ptr, *stream_end; uint64_t defined_subobjects = 0; - bool is_graphics, is_compute; uint64_t subobject_bit; /* Initialize defaults for undefined subobjects */ @@ -1766,6 +1790,8 @@ HRESULT vkd3d_pipeline_state_desc_from_d3d12_stream_desc(struct d3d12_pipeline_s VKD3D_HANDLE_SUBOBJECT(HS, D3D12_SHADER_BYTECODE, desc->hs); VKD3D_HANDLE_SUBOBJECT(GS, D3D12_SHADER_BYTECODE, desc->gs); VKD3D_HANDLE_SUBOBJECT(CS, D3D12_SHADER_BYTECODE, desc->cs); + VKD3D_HANDLE_SUBOBJECT(AS, D3D12_SHADER_BYTECODE, desc->as); + VKD3D_HANDLE_SUBOBJECT(MS, D3D12_SHADER_BYTECODE, desc->ms); VKD3D_HANDLE_SUBOBJECT(STREAM_OUTPUT, D3D12_STREAM_OUTPUT_DESC, desc->stream_output); VKD3D_HANDLE_SUBOBJECT(BLEND, D3D12_BLEND_DESC, desc->blend_state); VKD3D_HANDLE_SUBOBJECT(SAMPLE_MASK, UINT, desc->sample_mask); @@ -1791,18 +1817,35 @@ HRESULT vkd3d_pipeline_state_desc_from_d3d12_stream_desc(struct d3d12_pipeline_s } /* Deduce pipeline type from specified shaders */ - is_graphics = desc->vs.pShaderBytecode && desc->vs.BytecodeLength; - is_compute = desc->cs.pShaderBytecode && desc->cs.BytecodeLength; + defined_stages = vkd3d_pipeline_state_desc_get_shader_stages(desc); + + if (defined_stages & VK_SHADER_STAGE_VERTEX_BIT) + { + disallowed_stages = VK_SHADER_STAGE_MESH_BIT_EXT | VK_SHADER_STAGE_COMPUTE_BIT; + *vk_bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS; + } + else if (defined_stages & VK_SHADER_STAGE_MESH_BIT_EXT) + { + disallowed_stages = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_COMPUTE_BIT; + *vk_bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS; + } + else if (defined_stages & VK_SHADER_STAGE_COMPUTE_BIT) + { + disallowed_stages = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_MESH_BIT_EXT; + *vk_bind_point = VK_PIPELINE_BIND_POINT_COMPUTE; + } + else + { + ERR("Cannot deduce pipeline type from shader stages 0x%#x.\n", defined_stages); + return E_INVALIDARG; + } - if (is_graphics == is_compute) + if (defined_stages & disallowed_stages) { - ERR("Cannot deduce pipeline type.\n"); + ERR("Invalid combination of shader stages 0x%#x.\n", defined_stages); return E_INVALIDARG; } - *vk_bind_point = is_graphics - ? VK_PIPELINE_BIND_POINT_GRAPHICS - : VK_PIPELINE_BIND_POINT_COMPUTE; return S_OK; } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 92eed5ca..1a1ee4a7 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1716,6 +1716,8 @@ struct d3d12_pipeline_state_desc D3D12_SHADER_BYTECODE hs; D3D12_SHADER_BYTECODE gs; D3D12_SHADER_BYTECODE cs; + D3D12_SHADER_BYTECODE as; + D3D12_SHADER_BYTECODE ms; D3D12_STREAM_OUTPUT_DESC stream_output; D3D12_BLEND_DESC blend_state; UINT sample_mask; |