Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-02-01 20:56:13 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-09-08 17:33:08 +0300
commit6ee34c0b6e4244e6ada9c27ff5ba078b971175e8 (patch)
tree5424568bf23165f3ec5e03fb40e40cddae5aaa46
parent2be740beb15ca46b9f560d5de3130753a3df4603 (diff)
vkd3d: Decode MS and AS shader subobjects.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
-rw-r--r--libs/vkd3d/state.c59
-rw-r--r--libs/vkd3d/vkd3d_private.h2
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;