[PATCH vkd3d 3/5] vkd3d: Compile pipelines with tessellation state create info.
Józef Kucia
joseph.kucia at gmail.com
Fri Feb 1 02:42:50 CST 2019
From: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Józef Kucia <jkucia at 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;
--
2.19.2
More information about the wine-devel
mailing list