[PATCH v2 6/6] wined3d: Implement constant buffer offsetting for Vulkan.

Zebediah Figura zfigura at codeweavers.com
Thu Jul 22 11:50:45 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/wined3d/context_vk.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 0d38b9eb5ea..4b1bea38370 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -2652,19 +2652,21 @@ static bool wined3d_shader_resource_bindings_add_null_srv_binding(struct wined3d
 
 static bool wined3d_shader_descriptor_writes_vk_add_cbv_write(struct wined3d_shader_descriptor_writes_vk *writes,
         struct wined3d_context_vk *context_vk, VkDescriptorSet vk_descriptor_set, const struct wined3d_state *state,
-        const struct wined3d_shader_resource_binding *binding)
+        const struct wined3d_shader_resource_binding *binding, VkDescriptorBufferInfo *buffer_info)
 {
+    const struct wined3d_constant_buffer_state *cb_state = &state->cb[binding->shader_type][binding->resource_idx];
     struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
-    const VkDescriptorBufferInfo *buffer_info;
     struct wined3d_buffer_vk *buffer_vk;
     struct wined3d_buffer *buffer;
 
-    if (!(buffer = state->cb[binding->shader_type][binding->resource_idx].buffer))
+    if (!(buffer = cb_state->buffer))
         return wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, binding->binding_idx,
                 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &device_vk->null_resources_vk.buffer_info, NULL, NULL);
 
     buffer_vk = wined3d_buffer_vk(buffer);
-    buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
+    *buffer_info = *wined3d_buffer_vk_get_buffer_info(buffer_vk);
+    buffer_info->offset += cb_state->offset;
+    buffer_info->range = min(cb_state->size, buffer_info->range);
     if (!wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set,
             binding->binding_idx, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, buffer_info, NULL, NULL))
         return false;
@@ -2803,6 +2805,7 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
         VkCommandBuffer vk_command_buffer, const struct wined3d_state *state, enum wined3d_pipeline pipeline)
 {
     struct wined3d_shader_descriptor_writes_vk *writes = &context_vk->descriptor_writes;
+    VkDescriptorBufferInfo buffers[WINED3D_SHADER_TYPE_COUNT][MAX_CONSTANT_BUFFERS];
     struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
     const struct wined3d_vk_info *vk_info = context_vk->vk_info;
     const struct wined3d_shader_resource_binding *binding;
@@ -2849,8 +2852,8 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
         switch (binding->shader_descriptor_type)
         {
             case WINED3D_SHADER_DESCRIPTOR_TYPE_CBV:
-                if (!wined3d_shader_descriptor_writes_vk_add_cbv_write(writes,
-                        context_vk, vk_descriptor_set, state, binding))
+                if (!wined3d_shader_descriptor_writes_vk_add_cbv_write(writes, context_vk, vk_descriptor_set,
+                        state, binding, &buffers[binding->shader_type][binding->resource_idx]))
                     return false;
                 break;
 
-- 
2.30.2




More information about the wine-devel mailing list