[PATCH v2 2/4] wined3d: Add push constants to wined3d_pipeline_layout_key_vk.

Jan Sikorski jsikorski at codeweavers.com
Tue Aug 17 09:02:18 CDT 2021


Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
---
 dlls/wined3d/context_vk.c      | 21 ++++++++++++++++-----
 dlls/wined3d/shader_spirv.c    |  5 +++--
 dlls/wined3d/wined3d_private.h |  5 ++++-
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 8df416851f2..88d8080f5dd 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -1746,7 +1746,10 @@ static int wined3d_pipeline_layout_vk_compare(const void *key, const struct wine
 
     if (a->binding_count != b->binding_count)
         return a->binding_count - b->binding_count;
-    return memcmp(a->bindings, b->bindings, a->binding_count * sizeof(*a->bindings));
+    if (a->push_constant_count != b->push_constant_count)
+        return a->push_constant_count - b->push_constant_count;
+    return memcmp(a->bindings, b->bindings, a->binding_count * sizeof(*a->bindings)) ||
+            memcmp(a->push_constants, b->push_constants, a->push_constant_count * sizeof(*a->push_constants));
 }
 
 static int wined3d_graphics_pipeline_vk_compare(const void *key, const struct wine_rb_entry *entry)
@@ -2946,7 +2949,8 @@ static VkResult wined3d_context_vk_create_vk_descriptor_set_layout(struct wined3
 }
 
 struct wined3d_pipeline_layout_vk *wined3d_context_vk_get_pipeline_layout(
-        struct wined3d_context_vk *context_vk, VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count)
+        struct wined3d_context_vk *context_vk, VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count,
+        VkPushConstantRange *push_constants, SIZE_T push_constant_count)
 {
     struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
     const struct wined3d_vk_info *vk_info = context_vk->vk_info;
@@ -2958,19 +2962,26 @@ struct wined3d_pipeline_layout_vk *wined3d_context_vk_get_pipeline_layout(
 
     key.bindings = bindings;
     key.binding_count = binding_count;
+    key.push_constants = push_constants;
+    key.push_constant_count = push_constant_count;
     if ((entry = wine_rb_get(&context_vk->pipeline_layouts, &key)))
         return WINE_RB_ENTRY_VALUE(entry, struct wined3d_pipeline_layout_vk, entry);
 
     if (!(layout = heap_alloc(sizeof(*layout))))
         return NULL;
 
-    if (!(layout->key.bindings = heap_alloc(sizeof(*layout->key.bindings) * key.binding_count)))
+    if (!(layout->key.bindings = heap_alloc(sizeof(*layout->key.bindings) * key.binding_count +
+            sizeof(*layout->key.push_constants) * key.push_constant_count)))
     {
         heap_free(layout);
         return NULL;
     }
     memcpy(layout->key.bindings, key.bindings, sizeof(*layout->key.bindings) * key.binding_count);
     layout->key.binding_count = key.binding_count;
+    layout->key.push_constants = (VkPushConstantRange *)(layout->key.bindings + key.binding_count);
+    memcpy(layout->key.push_constants, key.push_constants,
+            sizeof(*layout->key.push_constants) * key.push_constant_count);
+    layout->key.push_constant_count = key.push_constant_count;
 
     if ((vr = wined3d_context_vk_create_vk_descriptor_set_layout(device_vk, vk_info, &key, &layout->vk_set_layout)))
     {
@@ -2983,8 +2994,8 @@ struct wined3d_pipeline_layout_vk *wined3d_context_vk_get_pipeline_layout(
     layout_desc.flags = 0;
     layout_desc.setLayoutCount = 1;
     layout_desc.pSetLayouts = &layout->vk_set_layout;
-    layout_desc.pushConstantRangeCount = 0;
-    layout_desc.pPushConstantRanges = NULL;
+    layout_desc.pushConstantRangeCount = push_constant_count;
+    layout_desc.pPushConstantRanges = push_constants;
 
     if ((vr = VK_CALL(vkCreatePipelineLayout(device_vk->vk_device,
             &layout_desc, NULL, &layout->vk_pipeline_layout))) < 0)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c
index 7617ee9d6ef..185c5f78556 100644
--- a/dlls/wined3d/shader_spirv.c
+++ b/dlls/wined3d/shader_spirv.c
@@ -441,7 +441,7 @@ static struct shader_spirv_compute_program_vk *shader_spirv_find_compute_program
         return NULL;
 
     if (!(layout = wined3d_context_vk_get_pipeline_layout(context_vk,
-            bindings->vk_bindings, bindings->vk_binding_count)))
+            bindings->vk_bindings, bindings->vk_binding_count, NULL, 0)))
     {
         VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
         program->vk_module = VK_NULL_HANDLE;
@@ -842,7 +842,8 @@ static void shader_spirv_select(void *shader_priv, struct wined3d_context *conte
     if (context->shader_update_mask & (1u << WINED3D_SHADER_TYPE_GEOMETRY))
         context->shader_update_mask |= 1u << bindings->so_stage;
 
-    layout_vk = wined3d_context_vk_get_pipeline_layout(context_vk, bindings->vk_bindings, bindings->vk_binding_count);
+    layout_vk = wined3d_context_vk_get_pipeline_layout(context_vk, bindings->vk_bindings, bindings->vk_binding_count,
+            NULL, 0);
     context_vk->graphics.vk_set_layout = layout_vk->vk_set_layout;
     context_vk->graphics.vk_pipeline_layout = layout_vk->vk_pipeline_layout;
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 86eae149306..f7a8812c2bd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2444,6 +2444,8 @@ struct wined3d_pipeline_layout_key_vk
 {
     VkDescriptorSetLayoutBinding *bindings;
     SIZE_T binding_count;
+    VkPushConstantRange *push_constants;
+    SIZE_T push_constant_count;
 };
 
 struct wined3d_pipeline_layout_vk
@@ -2646,7 +2648,8 @@ void wined3d_context_vk_destroy_vk_sampler(struct wined3d_context_vk *context_vk
 void wined3d_context_vk_end_current_render_pass(struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;
 VkCommandBuffer wined3d_context_vk_get_command_buffer(struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;
 struct wined3d_pipeline_layout_vk *wined3d_context_vk_get_pipeline_layout(struct wined3d_context_vk *context_vk,
-        VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count) DECLSPEC_HIDDEN;
+        VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count, VkPushConstantRange *push_constants,
+        SIZE_T push_constant_count) DECLSPEC_HIDDEN;
 VkRenderPass wined3d_context_vk_get_render_pass(struct wined3d_context_vk *context_vk,
         const struct wined3d_fb_state *fb, unsigned int rt_count,
         bool depth_stencil, uint32_t clear_flags) DECLSPEC_HIDDEN;
-- 
2.30.2




More information about the wine-devel mailing list