Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 14 +++-------
dlls/wined3d/context_vk.c | 49 ++++++++++++++++++++++------------
dlls/wined3d/wined3d_private.h | 4 +--
3 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 4c5e2054fe0..2dbff2310ad 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1431,17 +1431,11 @@ static BOOL wined3d_buffer_vk_create_buffer_object(struct wined3d_buffer_vk *buf
return TRUE;
}
-const VkDescriptorBufferInfo *wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk)
+void wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk, VkDescriptorBufferInfo *buffer_info)
{
- if (buffer_vk->bo_user.valid)
- return &buffer_vk->buffer_info;
-
- buffer_vk->buffer_info.buffer = buffer_vk->bo.vk_buffer;
- buffer_vk->buffer_info.offset = buffer_vk->bo.buffer_offset;
- buffer_vk->buffer_info.range = buffer_vk->b.resource.size;
- buffer_vk->bo_user.valid = true;
-
- return &buffer_vk->buffer_info;
+ buffer_info->buffer = buffer_vk->bo.vk_buffer;
+ buffer_info->offset = buffer_vk->bo.buffer_offset;
+ buffer_info->range = buffer_vk->b.resource.size;
}
static BOOL wined3d_buffer_vk_prepare_location(struct wined3d_buffer *buffer,
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index d1a113d1f81..7a2a9d2bfb3 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -2418,8 +2418,8 @@ static void wined3d_context_vk_bind_vertex_buffers(struct wined3d_context_vk *co
VkDeviceSize offsets[ARRAY_SIZE(state->streams)] = {0};
VkBuffer buffers[ARRAY_SIZE(state->streams)];
const struct wined3d_stream_state *stream;
- const VkDescriptorBufferInfo *buffer_info;
struct wined3d_buffer_vk *buffer_vk;
+ VkDescriptorBufferInfo buffer_info;
struct wined3d_buffer *buffer;
unsigned int i, first, count;
@@ -2432,10 +2432,10 @@ static void wined3d_context_vk_bind_vertex_buffers(struct wined3d_context_vk *co
if ((buffer = stream->buffer))
{
buffer_vk = wined3d_buffer_vk(buffer);
- buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
+ wined3d_buffer_vk_get_buffer_info(buffer_vk, &buffer_info);
wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
- buffers[count] = buffer_info->buffer;
- offsets[count] = buffer_info->offset + stream->offset;
+ buffers[count] = buffer_info.buffer;
+ offsets[count] = buffer_info.offset + stream->offset;
++count;
continue;
}
@@ -2457,8 +2457,8 @@ static void wined3d_context_vk_bind_stream_output_buffers(struct wined3d_context
VkDeviceSize sizes[ARRAY_SIZE(state->stream_output)];
VkBuffer buffers[ARRAY_SIZE(state->stream_output)];
const struct wined3d_stream_output *stream;
- const VkDescriptorBufferInfo *buffer_info;
struct wined3d_buffer_vk *buffer_vk;
+ VkDescriptorBufferInfo buffer_info;
struct wined3d_buffer *buffer;
unsigned int i, first, count;
@@ -2471,16 +2471,16 @@ static void wined3d_context_vk_bind_stream_output_buffers(struct wined3d_context
if ((buffer = stream->buffer))
{
buffer_vk = wined3d_buffer_vk(buffer);
- buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
+ wined3d_buffer_vk_get_buffer_info(buffer_vk, &buffer_info);
wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
- buffers[count] = buffer_info->buffer;
+ buffers[count] = buffer_info.buffer;
if ((offsets[count] = stream->offset) == ~0u)
{
FIXME("Appending to stream output buffers not implemented.\n");
offsets[count] = 0;
}
- sizes[count] = buffer_info->range - offsets[count];
- offsets[count] += buffer_info->offset;
+ sizes[count] = buffer_info.range - offsets[count];
+ offsets[count] += buffer_info.offset;
++count;
continue;
}
@@ -2654,6 +2654,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;
@@ -2661,7 +2662,6 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
struct wined3d_unordered_access_view_vk *uav_vk;
struct wined3d_shader_resource_view_vk *srv_vk;
struct wined3d_unordered_access_view *uav;
- const VkDescriptorBufferInfo *buffer_info;
struct wined3d_shader_resource_view *srv;
const VkDescriptorImageInfo *image_info;
struct wined3d_buffer_vk *buffer_vk;
@@ -2713,7 +2713,13 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
switch (binding->shader_descriptor_type)
{
case WINED3D_SHADER_DESCRIPTOR_TYPE_CBV:
- if (!(buffer = state->cb[binding->shader_type][binding->resource_idx].buffer))
+ {
+ enum wined3d_shader_type shader_type = binding->shader_type;
+ size_t resource_idx = binding->resource_idx;
+ const struct wined3d_constant_buffer_state *cb_state = &state->cb[shader_type][resource_idx];
+ VkDescriptorBufferInfo *buffer_info = &buffers[shader_type][resource_idx];
+
+ if (!(buffer = cb_state->buffer))
{
if (!wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set,
binding->binding_idx, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
@@ -2722,12 +2728,16 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
break;
}
buffer_vk = wined3d_buffer_vk(buffer);
- buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
+ wined3d_buffer_vk_get_buffer_info(buffer_vk, buffer_info);
+ buffer_info->offset += cb_state->offset;
+ buffer_info->range = cb_state->size;
+
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;
wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
break;
+ }
case WINED3D_SHADER_DESCRIPTOR_TYPE_SRV:
if (!(srv = state->shader_resource_view[binding->shader_type][binding->resource_idx]))
@@ -2988,7 +2998,11 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
switch (binding->shader_descriptor_type)
{
case WINED3D_SHADER_DESCRIPTOR_TYPE_CBV:
- if (!(buffer = state->cb[binding->shader_type][binding->resource_idx].buffer))
+ {
+ const struct wined3d_constant_buffer_state *cb_state
+ = &state->cb[binding->shader_type][binding->resource_idx];
+
+ if (!(buffer = cb_state->buffer))
break;
buffer_vk = wined3d_buffer_vk(buffer);
@@ -3002,6 +3016,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
}
wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_CONSTANT_BUFFER);
break;
+ }
case WINED3D_SHADER_DESCRIPTOR_TYPE_SRV:
if (!(srv = state->shader_resource_view[binding->shader_type][binding->resource_idx]))
@@ -3250,7 +3265,7 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_INDEXBUFFER) && state->index_buffer)
{
- const VkDescriptorBufferInfo *buffer_info;
+ VkDescriptorBufferInfo buffer_info;
VkIndexType idx_type;
if (state->index_format == WINED3DFMT_R16_UINT)
@@ -3258,10 +3273,10 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
else
idx_type = VK_INDEX_TYPE_UINT32;
buffer_vk = wined3d_buffer_vk(state->index_buffer);
- buffer_info = wined3d_buffer_vk_get_buffer_info(buffer_vk);
+ wined3d_buffer_vk_get_buffer_info(buffer_vk, &buffer_info);
wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
- VK_CALL(vkCmdBindIndexBuffer(vk_command_buffer, buffer_info->buffer,
- buffer_info->offset + state->index_offset, idx_type));
+ VK_CALL(vkCmdBindIndexBuffer(vk_command_buffer, buffer_info.buffer,
+ buffer_info.offset + state->index_offset, idx_type));
}
if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_PIXEL))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a2048fc6ea6..ca85f811673 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4971,7 +4971,6 @@ struct wined3d_buffer_vk
struct wined3d_bo_vk bo;
struct wined3d_bo_user bo_user;
- VkDescriptorBufferInfo buffer_info;
uint32_t bind_mask;
};
@@ -4982,7 +4981,8 @@ static inline struct wined3d_buffer_vk *wined3d_buffer_vk(struct wined3d_buffer
void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk,
struct wined3d_context_vk *context_vk, uint32_t bind_mask) DECLSPEC_HIDDEN;
-const VkDescriptorBufferInfo *wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk) DECLSPEC_HIDDEN;
+void wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk,
+ VkDescriptorBufferInfo *buffer_info) DECLSPEC_HIDDEN;
HRESULT wined3d_buffer_vk_init(struct wined3d_buffer_vk *buffer_vk, struct wined3d_device *device,
const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data,
void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
--
2.32.0