=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Add FIXME() for unsupported strip cut values.

Alexandre Julliard julliard at winehq.org
Mon Dec 3 15:24:00 CST 2018


Module: vkd3d
Branch: master
Commit: a1ad45be69aa4be6525f120f79264ddd3000caff
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=a1ad45be69aa4be6525f120f79264ddd3000caff

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Dec  3 11:31:30 2018 +0100

vkd3d: Add FIXME() for unsupported strip cut values.

In Vulkan, the strip cut value is derived from the current index buffer
format. We could recompile the pipeline to handle more cases.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/command.c       | 18 ++++++++++++++++++
 libs/vkd3d/state.c         |  6 ++----
 libs/vkd3d/vkd3d_private.h |  4 +++-
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 3d5e898..2e6357a 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1703,6 +1703,8 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list,
     memset(list->strides, 0, sizeof(list->strides));
     list->primitive_topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
 
+    list->index_buffer_format = DXGI_FORMAT_UNKNOWN;
+
     memset(list->views, 0, sizeof(list->views));
     list->fb_width = 0;
     list->fb_height = 0;
@@ -2293,6 +2295,20 @@ static void STDMETHODCALLTYPE d3d12_command_list_DrawIndexedInstanced(ID3D12Grap
         return;
     }
 
+    switch (list->state->u.graphics.index_buffer_strip_cut_value)
+    {
+        case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF:
+            if (list->index_buffer_format != DXGI_FORMAT_R16_UINT)
+                FIXME("Strip cut value 0xffff is not supported with index buffer format %#x.\n", list->index_buffer_format);
+            break;
+        case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF:
+            if (list->index_buffer_format != DXGI_FORMAT_R32_UINT)
+                FIXME("Strip cut value 0xffffffff is not supported with index buffer format %#x.\n", list->index_buffer_format);
+            break;
+        default:
+            break;
+    }
+
     VK_CALL(vkCmdDrawIndexed(list->vk_command_buffer, index_count_per_instance,
             instance_count, start_vertex_location, base_vertex_location, start_instance_location));
 }
@@ -3475,6 +3491,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetIndexBuffer(ID3D12Graphics
             return;
     }
 
+    list->index_buffer_format = view->Format;
+
     resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, view->BufferLocation);
     VK_CALL(vkCmdBindIndexBuffer(list->vk_command_buffer, resource->u.vk_buffer,
             view->BufferLocation - resource->gpu_address, index_type));
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 03d8ef3..64c2158 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -2236,11 +2236,9 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
     switch (desc->IBStripCutValue)
     {
         case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED:
-            graphics->primitive_restart_enable = VK_FALSE;
-            break;
         case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF:
         case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF:
-            graphics->primitive_restart_enable = VK_TRUE;
+            graphics->index_buffer_strip_cut_value = desc->IBStripCutValue;
             break;
         default:
             WARN("Invalid index buffer strip cut value %#x.\n", desc->IBStripCutValue);
@@ -2506,7 +2504,7 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta
     ia_desc.pNext = NULL;
     ia_desc.flags = 0;
     ia_desc.topology = topology;
-    ia_desc.primitiveRestartEnable = graphics->primitive_restart_enable;
+    ia_desc.primitiveRestartEnable = !!graphics->index_buffer_strip_cut_value;
 
     blend_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
     blend_desc.pNext = NULL;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index f977559..7e04dc3 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -531,7 +531,7 @@ struct d3d12_graphics_pipeline_state
     size_t attachment_count, rt_idx;
     VkRenderPass render_pass;
 
-    VkBool32 primitive_restart_enable;
+    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE index_buffer_strip_cut_value;
     struct VkPipelineRasterizationStateCreateInfo rs_desc;
     struct VkPipelineMultisampleStateCreateInfo ms_desc;
     struct VkPipelineDepthStencilStateCreateInfo ds_desc;
@@ -696,6 +696,8 @@ struct d3d12_command_list
     uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
     VkPrimitiveTopology primitive_topology;
 
+    DXGI_FORMAT index_buffer_format;
+
     VkImageView views[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
     unsigned int fb_width;
     unsigned int fb_height;




More information about the wine-cvs mailing list