From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- libs/vkd3d/command.c | 57 +------------------------- libs/vkd3d/state.c | 84 ++++++++++++++++++++++++++++++++------ libs/vkd3d/vkd3d_private.h | 4 +- 3 files changed, 76 insertions(+), 69 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index d3377137438b..8aa552545fb9 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -1765,7 +1765,7 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list, ID3D12GraphicsCommandList *iface = &list->ID3D12GraphicsCommandList_iface;
memset(list->strides, 0, sizeof(list->strides)); - list->primitive_topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + list->primitive_topology = D3D_PRIMITIVE_TOPOLOGY_POINTLIST;
list->index_buffer_format = DXGI_FORMAT_UNKNOWN;
@@ -2915,59 +2915,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(ID3D12Graphi VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &vk_image_resolve)); }
-static enum VkPrimitiveTopology vk_topology_from_d3d12_topology(D3D12_PRIMITIVE_TOPOLOGY topology) -{ - switch (topology) - { - case D3D_PRIMITIVE_TOPOLOGY_POINTLIST: - return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; - case D3D_PRIMITIVE_TOPOLOGY_LINELIST: - return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; - case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: - return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: - return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: - return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - case D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST: - return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; - default: - FIXME("Unhandled primitive topology %#x.\n", topology); - return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; - } -} - static void STDMETHODCALLTYPE d3d12_command_list_IASetPrimitiveTopology(ID3D12GraphicsCommandList *iface, D3D12_PRIMITIVE_TOPOLOGY topology) { @@ -2981,7 +2928,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetPrimitiveTopology(ID3D12Gr return; }
- list->primitive_topology = vk_topology_from_d3d12_topology(topology); + list->primitive_topology = topology; d3d12_command_list_invalidate_current_pipeline(list); }
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 8aff2f2c03b2..ba4c06b96a51 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -1055,7 +1055,7 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
struct vkd3d_pipeline_key { - VkPrimitiveTopology topology; + D3D12_PRIMITIVE_TOPOLOGY topology; uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; };
@@ -2428,6 +2428,59 @@ HRESULT d3d12_pipeline_state_create_graphics(struct d3d12_device *device, return S_OK; }
+static enum VkPrimitiveTopology vk_topology_from_d3d12_topology(D3D12_PRIMITIVE_TOPOLOGY topology) +{ + switch (topology) + { + case D3D_PRIMITIVE_TOPOLOGY_POINTLIST: + return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case D3D_PRIMITIVE_TOPOLOGY_LINELIST: + return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: + return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + case D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST: + return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; + default: + FIXME("Unhandled primitive topology %#x.\n", topology); + return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + } +} + static VkPipeline d3d12_pipeline_state_find_compiled_pipeline(const struct d3d12_pipeline_state *state, const struct vkd3d_pipeline_key *key) { @@ -2496,17 +2549,18 @@ static bool d3d12_pipeline_state_put_pipeline_to_cache(struct d3d12_pipeline_sta }
VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_state *state, - VkPrimitiveTopology topology, const uint32_t *strides) + D3D12_PRIMITIVE_TOPOLOGY topology, const uint32_t *strides) { - struct VkVertexInputBindingDescription bindings[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + VkVertexInputBindingDescription bindings[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs; struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; VkPipelineVertexInputDivisorStateCreateInfoEXT input_divisor_info; - struct VkPipelineVertexInputStateCreateInfo input_desc; - struct VkPipelineInputAssemblyStateCreateInfo ia_desc; - struct VkPipelineColorBlendStateCreateInfo blend_desc; - struct VkGraphicsPipelineCreateInfo pipeline_desc; + VkPipelineTessellationStateCreateInfo tessellation_info; + VkPipelineVertexInputStateCreateInfo input_desc; + VkPipelineInputAssemblyStateCreateInfo ia_desc; + VkPipelineColorBlendStateCreateInfo blend_desc; struct d3d12_device *device = state->device; + VkGraphicsPipelineCreateInfo pipeline_desc; struct vkd3d_pipeline_key pipeline_key; size_t binding_count = 0; VkPipeline vk_pipeline; @@ -2514,7 +2568,7 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta uint32_t mask; VkResult vr;
- static const struct VkPipelineViewportStateCreateInfo vp_desc = + static const VkPipelineViewportStateCreateInfo vp_desc = { .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pNext = NULL, @@ -2524,14 +2578,14 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta .scissorCount = 1, .pScissors = NULL, }; - static const enum VkDynamicState dynamic_states[] = + static const VkDynamicState dynamic_states[] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_STENCIL_REFERENCE, }; - static const struct VkPipelineDynamicStateCreateInfo dynamic_desc = + static const VkPipelineDynamicStateCreateInfo dynamic_desc = { .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, .pNext = NULL, @@ -2597,9 +2651,15 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta ia_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; ia_desc.pNext = NULL; ia_desc.flags = 0; - ia_desc.topology = topology; + ia_desc.topology = vk_topology_from_d3d12_topology(topology); ia_desc.primitiveRestartEnable = !!graphics->index_buffer_strip_cut_value;
+ tessellation_info.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; + tessellation_info.pNext = NULL; + tessellation_info.flags = 0; + tessellation_info.patchControlPoints + = max(topology - D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + 1, 1); + blend_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; blend_desc.pNext = NULL; blend_desc.flags = 0; @@ -2619,7 +2679,7 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta pipeline_desc.pStages = graphics->stages; pipeline_desc.pVertexInputState = &input_desc; pipeline_desc.pInputAssemblyState = &ia_desc; - pipeline_desc.pTessellationState = NULL; + pipeline_desc.pTessellationState = &tessellation_info; pipeline_desc.pViewportState = &vp_desc; pipeline_desc.pRasterizationState = &graphics->rs_desc; pipeline_desc.pMultisampleState = &graphics->ms_desc; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 69e2cf7281e5..dee129e80e9e 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -674,7 +674,7 @@ HRESULT d3d12_pipeline_state_create_compute(struct d3d12_device *device, HRESULT d3d12_pipeline_state_create_graphics(struct d3d12_device *device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc, struct d3d12_pipeline_state **state) DECLSPEC_HIDDEN; VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_state *state, - VkPrimitiveTopology topology, const uint32_t *strides) DECLSPEC_HIDDEN; + D3D12_PRIMITIVE_TOPOLOGY topology, const uint32_t *strides) DECLSPEC_HIDDEN; bool d3d12_pipeline_state_is_render_pass_compatible(const struct d3d12_pipeline_state *state_a, const struct d3d12_pipeline_state *state_b) DECLSPEC_HIDDEN; struct d3d12_pipeline_state *unsafe_impl_from_ID3D12PipelineState(ID3D12PipelineState *iface) DECLSPEC_HIDDEN; @@ -786,7 +786,7 @@ struct d3d12_command_list VkCommandBuffer vk_command_buffer;
uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; - VkPrimitiveTopology primitive_topology; + D3D12_PRIMITIVE_TOPOLOGY primitive_topology;
DXGI_FORMAT index_buffer_format;