Module: wine Branch: master Commit: 5bd5244ba40bebb4b8f6b9558bb3843d076f871a URL: https://source.winehq.org/git/wine.git/?a=commit;h=5bd5244ba40bebb4b8f6b9558...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed May 20 18:30:30 2020 +0430
wined3d: Implement different primitive topologies for the Vulkan adapter.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/context_vk.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 0295880f0a..0600cdfcec 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -185,6 +185,39 @@ static VkCullModeFlags vk_cull_mode_from_wined3d(enum wined3d_cull mode) } }
+static VkPrimitiveTopology vk_topology_from_wined3d(enum wined3d_primitive_type t) +{ + switch (t) + { + case WINED3D_PT_POINTLIST: + return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case WINED3D_PT_LINELIST: + return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case WINED3D_PT_LINESTRIP: + return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case WINED3D_PT_TRIANGLELIST: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + case WINED3D_PT_TRIANGLESTRIP: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + case WINED3D_PT_TRIANGLEFAN: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; + case WINED3D_PT_LINELIST_ADJ: + return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY; + case WINED3D_PT_LINESTRIP_ADJ: + return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY; + case WINED3D_PT_TRIANGLELIST_ADJ: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY; + case WINED3D_PT_TRIANGLESTRIP_ADJ: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY; + case WINED3D_PT_PATCH: + return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; + default: + FIXME("Unhandled primitive type %s.\n", debug_d3dprimitivetype(t)); + case WINED3D_PT_UNDEFINED: + return ~0u; + } +} + void *wined3d_allocator_chunk_vk_map(struct wined3d_allocator_chunk_vk *chunk_vk, struct wined3d_context_vk *context_vk) { @@ -1462,7 +1495,6 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context key->input_desc.pVertexAttributeDescriptions = key->attributes;
key->ia_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - key->ia_desc.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
key->vp_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; key->vp_desc.viewportCount = 1; @@ -1644,6 +1676,7 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte struct wined3d_graphics_pipeline_key_vk *key; VkPipelineShaderStageCreateInfo *stage; struct wined3d_stream_info stream_info; + VkPrimitiveTopology vk_topology; VkShaderModule module; bool update = false; uint32_t mask; @@ -1708,6 +1741,14 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte update = true; }
+ vk_topology = vk_topology_from_wined3d(state->primitive_type); + if (key->ia_desc.topology != vk_topology) + { + key->ia_desc.topology = vk_topology; + + update = true; + } + if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_VIEWPORT) || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_SCISSORRECT) || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER))