Signed-off-by: Zebediah Figura zfigura@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;
We are already branching in the caller, and we need to access the view desc in order to pass partial ranges.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/context_vk.c | 11 ++++++++--- dlls/wined3d/wined3d_private.h | 6 ------ 2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 7a2a9d2bfb3..fa611411285 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -3025,6 +3025,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * srv_vk = wined3d_shader_resource_view_vk(srv); if (srv->resource->type == WINED3D_RTYPE_BUFFER) { + buffer_vk = wined3d_buffer_vk(buffer_from_resource(srv->resource)); + if (!srv_vk->view_vk.bo_user.valid) { wined3d_shader_resource_view_vk_update(srv_vk, context_vk); @@ -3033,13 +3035,16 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * else context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_SHADER_RESOURCE_BINDING); } - wined3d_buffer_load(buffer_from_resource(srv->resource), &context_vk->c, state); + wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE); } else { - wined3d_texture_load(texture_from_resource(srv->resource), &context_vk->c, FALSE); + struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(srv->resource)); + + wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE); + wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE); } - wined3d_shader_resource_view_vk_barrier(srv_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE); break;
case WINED3D_SHADER_DESCRIPTOR_TYPE_UAV: diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ca85f811673..3a496231fe7 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -5144,12 +5144,6 @@ static inline struct wined3d_shader_resource_view_vk *wined3d_shader_resource_vi return CONTAINING_RECORD(view, struct wined3d_shader_resource_view_vk, v); }
-static inline void wined3d_shader_resource_view_vk_barrier(struct wined3d_shader_resource_view_vk *srv_vk, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) -{ - wined3d_resource_vk_barrier(srv_vk->v.resource, context_vk, bind_mask); -} - void wined3d_shader_resource_view_vk_generate_mipmap(struct wined3d_shader_resource_view_vk *srv_vk, struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN; HRESULT wined3d_shader_resource_view_vk_init(struct wined3d_shader_resource_view_vk *view_vk,
We are already branching in the caller, and we need to access the view desc in order to pass partial ranges.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/context_vk.c | 11 ++++++++--- dlls/wined3d/wined3d_private.h | 6 ------ 2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index fa611411285..856adc4ad1a 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -3054,6 +3054,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * uav_vk = wined3d_unordered_access_view_vk(uav); if (uav->resource->type == WINED3D_RTYPE_BUFFER) { + buffer_vk = wined3d_buffer_vk(buffer_from_resource(uav->resource)); + if (!uav_vk->view_vk.bo_user.valid) { wined3d_unordered_access_view_vk_update(uav_vk, context_vk); @@ -3063,15 +3065,18 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING); } - wined3d_buffer_load(buffer_from_resource(uav->resource), &context_vk->c, state); + wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_BUFFER); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS); } else { - wined3d_texture_load(texture_from_resource(uav->resource), &context_vk->c, FALSE); + struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(uav->resource)); + + wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE); wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS); } - wined3d_unordered_access_view_vk_barrier(uav_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS); break;
case WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER: diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 3a496231fe7..7e31579945f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -5211,12 +5211,6 @@ static inline struct wined3d_unordered_access_view_vk *wined3d_unordered_access_ return CONTAINING_RECORD(view, struct wined3d_unordered_access_view_vk, v); }
-static inline void wined3d_unordered_access_view_vk_barrier(struct wined3d_unordered_access_view_vk *uav_vk, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) -{ - wined3d_resource_vk_barrier(uav_vk->v.resource, context_vk, bind_mask); -} - void wined3d_unordered_access_view_vk_clear(struct wined3d_unordered_access_view_vk *view_vk, const struct wined3d_uvec4 *clear_value, struct wined3d_context_vk *context_vk, bool fp) DECLSPEC_HIDDEN; HRESULT wined3d_unordered_access_view_vk_init(struct wined3d_unordered_access_view_vk *view_vk,
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/wined3d_private.h | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 7e31579945f..98cb1c9e2f7 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4987,15 +4987,6 @@ HRESULT wined3d_buffer_vk_init(struct wined3d_buffer_vk *buffer_vk, struct wined const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
-static inline void wined3d_resource_vk_barrier(struct wined3d_resource *resource, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) -{ - if (resource->type == WINED3D_RTYPE_BUFFER) - wined3d_buffer_vk_barrier(wined3d_buffer_vk(buffer_from_resource(resource)), context_vk, bind_mask); - else - wined3d_texture_vk_barrier(wined3d_texture_vk(texture_from_resource(resource)), context_vk, bind_mask); -} - struct wined3d_rendertarget_view { LONG refcount; @@ -5064,7 +5055,9 @@ static inline struct wined3d_rendertarget_view_vk *wined3d_rendertarget_view_vk( static inline void wined3d_rendertarget_view_vk_barrier(struct wined3d_rendertarget_view_vk *rtv_vk, struct wined3d_context_vk *context_vk, uint32_t bind_mask) { - wined3d_resource_vk_barrier(rtv_vk->v.resource, context_vk, bind_mask); + struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(rtv_vk->v.resource)); + + wined3d_texture_vk_barrier(texture_vk, context_vk, bind_mask); }
static inline VkImageView wined3d_rendertarget_view_vk_get_image_view(struct wined3d_rendertarget_view_vk *rtv_vk,
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- I don't know if this (or the next patch) offers a measurable performance benefit, but it seems like probably a good idea...
dlls/wined3d/context_vk.c | 4 ++-- dlls/wined3d/texture.c | 10 +++++----- dlls/wined3d/wined3d_private.h | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 856adc4ad1a..6af857fac4e 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -3043,7 +3043,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(srv->resource));
wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE); - wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE); + wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE, &srv->desc); } break;
@@ -3075,7 +3075,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE); wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_TEXTURE_RGB); - wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS); + wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS, &uav->desc); } break;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index c1247fbc56b..3a467c4aa06 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -5242,7 +5242,7 @@ HRESULT wined3d_texture_vk_init(struct wined3d_texture_vk *texture_vk, struct wi }
void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) + struct wined3d_context_vk *context_vk, uint32_t bind_mask, const struct wined3d_view_desc *view_desc) { VkImageSubresourceRange vk_range;
@@ -5255,10 +5255,10 @@ void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, wined3d_debug_bind_flags(texture_vk->bind_mask), wined3d_debug_bind_flags(bind_mask));
vk_range.aspectMask = vk_aspect_mask_from_format(texture_vk->t.resource.format); - vk_range.baseMipLevel = 0; - vk_range.levelCount = VK_REMAINING_MIP_LEVELS; - vk_range.baseArrayLayer = 0; - vk_range.layerCount = VK_REMAINING_ARRAY_LAYERS; + vk_range.baseMipLevel = view_desc->u.texture.level_idx; + vk_range.levelCount = view_desc->u.texture.level_count; + vk_range.baseArrayLayer = view_desc->u.texture.layer_idx; + vk_range.layerCount = view_desc->u.texture.layer_count;
wined3d_context_vk_image_barrier(context_vk, wined3d_context_vk_get_command_buffer(context_vk), vk_pipeline_stage_mask_from_bind_flags(texture_vk->bind_mask), diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 98cb1c9e2f7..7783a68bd7e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4488,8 +4488,8 @@ static inline struct wined3d_texture_vk *wined3d_texture_vk(struct wined3d_textu return CONTAINING_RECORD(texture, struct wined3d_texture_vk, t); }
-void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) DECLSPEC_HIDDEN; +void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, struct wined3d_context_vk *context_vk, + uint32_t bind_mask, const struct wined3d_view_desc *view_desc) DECLSPEC_HIDDEN; const VkDescriptorImageInfo *wined3d_texture_vk_get_default_image_info(struct wined3d_texture_vk *texture_vk, struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN; HRESULT wined3d_texture_vk_init(struct wined3d_texture_vk *texture_vk, struct wined3d_device *device, @@ -5057,7 +5057,7 @@ static inline void wined3d_rendertarget_view_vk_barrier(struct wined3d_rendertar { struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(rtv_vk->v.resource));
- wined3d_texture_vk_barrier(texture_vk, context_vk, bind_mask); + wined3d_texture_vk_barrier(texture_vk, context_vk, bind_mask, &rtv_vk->v.desc); }
static inline VkImageView wined3d_rendertarget_view_vk_get_image_view(struct wined3d_rendertarget_view_vk *rtv_vk,
On Tue, 20 Jul 2021 at 05:24, Zebediah Figura zfigura@codeweavers.com wrote:
I don't know if this (or the next patch) offers a measurable performance benefit, but it seems like probably a good idea...
With the "right" combination of application and GPU, quite possibly. However:
- It's always good to have some data to back this kind of change, even if only for future reference. - I think it's a little harder than this patch, unfortunately. In particular, we track "bind_mask" per texture, not per sub-resource. So if after this patch we e.g. were to first call wined3d_texture_vk_barrier() for SRV usage of one level/layer of a texture, and then subsequently for a different level/layer, we wouldn't create a Vulkan barrier for the second call.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/adapter_vk.c | 20 ++++--------- dlls/wined3d/buffer.c | 6 ++-- dlls/wined3d/context_vk.c | 55 +++++++++++++++++++++++----------- dlls/wined3d/view.c | 13 ++++---- dlls/wined3d/wined3d_private.h | 8 +++-- 5 files changed, 58 insertions(+), 44 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 850e2a6dfdb..7dbe0540e8e 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -1607,7 +1607,6 @@ static void adapter_vk_flush_context(struct wined3d_context *context) static void adapter_vk_draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters) { - struct wined3d_buffer_vk *indirect_vk = NULL; const struct wined3d_vk_info *vk_info; struct wined3d_context_vk *context_vk; VkCommandBuffer vk_command_buffer; @@ -1619,11 +1618,7 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device, context_vk = wined3d_context_vk(context_acquire(device, NULL, 0)); vk_info = context_vk->vk_info;
- if (parameters->indirect) - indirect_vk = wined3d_buffer_vk(parameters->u.indirect.buffer); - - if (!(vk_command_buffer = wined3d_context_vk_apply_draw_state(context_vk, - state, indirect_vk, parameters->indexed))) + if (!(vk_command_buffer = wined3d_context_vk_apply_draw_state(context_vk, state, parameters))) { ERR("Failed to apply draw state.\n"); context_release(&context_vk->c); @@ -1656,11 +1651,12 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device,
if (parameters->indirect) { - struct wined3d_bo_vk *bo = &indirect_vk->bo; + struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer); + struct wined3d_bo_vk *bo = &buffer_vk->bo; uint32_t stride, size;
wined3d_context_vk_reference_bo(context_vk, bo); - size = indirect_vk->b.resource.size - parameters->u.indirect.offset; + size = buffer_vk->b.resource.size - parameters->u.indirect.offset;
if (parameters->indexed) { @@ -1706,7 +1702,6 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device, static void adapter_vk_dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters) { - struct wined3d_buffer_vk *indirect_vk = NULL; const struct wined3d_vk_info *vk_info; struct wined3d_context_vk *context_vk; VkCommandBuffer vk_command_buffer; @@ -1716,10 +1711,7 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device, context_vk = wined3d_context_vk(context_acquire(device, NULL, 0)); vk_info = context_vk->vk_info;
- if (parameters->indirect) - indirect_vk = wined3d_buffer_vk(parameters->u.indirect.buffer); - - if (!(vk_command_buffer = wined3d_context_vk_apply_compute_state(context_vk, state, indirect_vk))) + if (!(vk_command_buffer = wined3d_context_vk_apply_compute_state(context_vk, state, parameters))) { ERR("Failed to apply compute state.\n"); context_release(&context_vk->c); @@ -1728,7 +1720,7 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device,
if (parameters->indirect) { - struct wined3d_bo_vk *bo = &indirect_vk->bo; + struct wined3d_bo_vk *bo = &wined3d_buffer_vk(parameters->u.indirect.buffer)->bo;
wined3d_context_vk_reference_bo(context_vk, bo); VK_CALL(vkCmdDispatchIndirect(vk_command_buffer, bo->vk_buffer, diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 2dbff2310ad..f7510e94ec8 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1574,7 +1574,7 @@ HRESULT wined3d_buffer_vk_init(struct wined3d_buffer_vk *buffer_vk, struct wined }
void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk, - struct wined3d_context_vk *context_vk, uint32_t bind_mask) + struct wined3d_context_vk *context_vk, uint32_t bind_mask, size_t offset, size_t range) { TRACE("buffer_vk %p, context_vk %p, bind_mask %s.\n", buffer_vk, context_vk, wined3d_debug_bind_flags(bind_mask)); @@ -1596,8 +1596,8 @@ void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk, vk_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier.buffer = buffer_vk->bo.vk_buffer; - vk_barrier.offset = buffer_vk->bo.buffer_offset; - vk_barrier.size = buffer_vk->b.resource.size; + vk_barrier.offset = buffer_vk->bo.buffer_offset + offset; + vk_barrier.size = range; VK_CALL(vkCmdPipelineBarrier(wined3d_context_vk_get_command_buffer(context_vk), vk_pipeline_stage_mask_from_bind_flags(buffer_vk->bind_mask), vk_pipeline_stage_mask_from_bind_flags(bind_mask), diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 6af857fac4e..55a97baa033 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -3014,7 +3014,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * else context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_CONSTANT_BUFFER); } - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_CONSTANT_BUFFER); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, + WINED3D_BIND_CONSTANT_BUFFER, cb_state->offset, cb_state->size); break; }
@@ -3025,6 +3026,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * srv_vk = wined3d_shader_resource_view_vk(srv); if (srv->resource->type == WINED3D_RTYPE_BUFFER) { + unsigned int offset, size; + buffer_vk = wined3d_buffer_vk(buffer_from_resource(srv->resource));
if (!srv_vk->view_vk.bo_user.valid) @@ -3036,7 +3039,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_SHADER_RESOURCE_BINDING); } wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE); + buffer_get_view_range(&buffer_vk->b, &srv->desc, srv->format, &offset, &size); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE, offset, size); } else { @@ -3054,6 +3058,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * uav_vk = wined3d_unordered_access_view_vk(uav); if (uav->resource->type == WINED3D_RTYPE_BUFFER) { + unsigned int offset, size; + buffer_vk = wined3d_buffer_vk(buffer_from_resource(uav->resource));
if (!uav_vk->view_vk.bo_user.valid) @@ -3067,7 +3073,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * } wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_BUFFER); - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS); + buffer_get_view_range(&buffer_vk->b, &uav->desc, uav->format, &offset, &size); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS, offset, size); } else { @@ -3095,7 +3102,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * }
VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *context_vk, - const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk, bool indexed) + const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters) { struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); const struct wined3d_vk_info *vk_info = context_vk->vk_info; @@ -3178,12 +3185,15 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
for (i = 0; i < ARRAY_SIZE(state->streams); ++i) { - if (!(buffer = state->streams[i].buffer)) + const struct wined3d_stream_state *stream = &state->streams[i]; + + if (!(buffer = stream->buffer)) continue;
buffer_vk = wined3d_buffer_vk(buffer); wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_VERTEX_BUFFER); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_VERTEX_BUFFER, + stream->offset, buffer_vk->b.resource.size - stream->offset); if (!buffer_vk->bo_user.valid) context_invalidate_state(&context_vk->c, STATE_STREAMSRC); } @@ -3192,12 +3202,15 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c { for (i = 0; i < ARRAY_SIZE(state->stream_output); ++i) { - if (!(buffer = state->stream_output[i].buffer)) + const struct wined3d_stream_output *stream = &state->stream_output[i]; + + if (!(buffer = stream->buffer)) continue;
buffer_vk = wined3d_buffer_vk(buffer); wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_STREAM_OUTPUT); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_STREAM_OUTPUT, + stream->offset, buffer_vk->b.resource.size - stream->offset); wined3d_buffer_invalidate_location(&buffer_vk->b, ~WINED3D_LOCATION_BUFFER); if (!buffer_vk->bo_user.valid) context_vk->update_stream_output = 1; @@ -3205,19 +3218,24 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c context_vk->c.transform_feedback_active = 1; }
- if (indexed || (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_INDEXBUFFER) && state->index_buffer)) + if (parameters->indexed + || (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_INDEXBUFFER) && state->index_buffer)) { buffer_vk = wined3d_buffer_vk(state->index_buffer); wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); - wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDEX_BUFFER); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDEX_BUFFER, + state->index_offset, buffer_vk->b.resource.size - state->index_offset); if (!buffer_vk->bo_user.valid) context_invalidate_state(&context_vk->c, STATE_INDEXBUFFER); }
- if (indirect_vk) + if (parameters->indirect) { - wined3d_buffer_load(&indirect_vk->b, &context_vk->c, state); - wined3d_buffer_vk_barrier(indirect_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER); + struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer); + + wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER, + parameters->u.indirect.offset, buffer_vk->b.resource.size - parameters->u.indirect.offset); }
if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk))) @@ -3325,7 +3343,7 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c }
VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk *context_vk, - const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk) + const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters) { struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); const struct wined3d_vk_info *vk_info = context_vk->vk_info; @@ -3351,10 +3369,13 @@ VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk
wined3d_context_vk_load_shader_resources(context_vk, state, WINED3D_PIPELINE_COMPUTE);
- if (indirect_vk) + if (parameters->indirect) { - wined3d_buffer_load_location(&indirect_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER); - wined3d_buffer_vk_barrier(indirect_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER); + struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer); + + wined3d_buffer_load_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER); + wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER, + parameters->u.indirect.offset, buffer_vk->b.resource.size - parameters->u.indirect.offset); }
if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk))) diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c index 0adb0a115dc..1ca0340d8d7 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -285,9 +285,8 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c context_invalidate_state(&context_gl->c, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); }
-static void get_buffer_view_range(const struct wined3d_buffer *buffer, - const struct wined3d_view_desc *desc, const struct wined3d_format *view_format, - unsigned int *offset, unsigned int *size) +void buffer_get_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc, + const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size) { if (desc->format_id == WINED3DFMT_UNKNOWN) { @@ -307,7 +306,7 @@ static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_cont { unsigned int offset, size;
- get_buffer_view_range(buffer, desc, view_format, &offset, &size); + buffer_get_view_range(buffer, desc, view_format, &offset, &size); create_buffer_texture(view, wined3d_context_gl(context), wined3d_buffer_gl(buffer), wined3d_format_gl(view_format), offset, size); } @@ -664,7 +663,7 @@ static VkBufferView wined3d_view_vk_create_vk_buffer_view(struct wined3d_context unsigned int offset, size; VkResult vr;
- get_buffer_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size); + buffer_get_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size); wined3d_buffer_prepare_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
create_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; @@ -1569,7 +1568,7 @@ void wined3d_unordered_access_view_gl_clear(struct wined3d_unordered_access_view wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER); wined3d_unordered_access_view_invalidate_location(&view_gl->v, ~WINED3D_LOCATION_BUFFER);
- get_buffer_view_range(&buffer_gl->b, &view_gl->v.desc, &format_gl->f, &offset, &size); + buffer_get_view_range(&buffer_gl->b, &view_gl->v.desc, &format_gl->f, &offset, &size); wined3d_context_gl_bind_bo(context_gl, buffer_gl->bo.binding, buffer_gl->bo.id); GL_EXTCALL(glClearBufferSubData(buffer_gl->bo.binding, format_gl->internal, offset, size, format_gl->format, format_gl->type, clear_value)); @@ -1740,7 +1739,7 @@ void wined3d_unordered_access_view_vk_clear(struct wined3d_unordered_access_view wined3d_buffer_load_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER); wined3d_buffer_invalidate_location(&buffer_vk->b, ~WINED3D_LOCATION_BUFFER);
- get_buffer_view_range(&buffer_vk->b, &view_vk->v.desc, format, &offset, &size); + buffer_get_view_range(&buffer_vk->b, &view_vk->v.desc, format, &offset, &size);
if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk))) return; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 7783a68bd7e..abfd4031692 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2610,9 +2610,9 @@ bool wined3d_context_vk_allocate_query(struct wined3d_context_vk *context_vk, VkDeviceMemory wined3d_context_vk_allocate_vram_chunk_memory(struct wined3d_context_vk *context_vk, unsigned int pool, size_t size) DECLSPEC_HIDDEN; VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk *context_vk, - const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk) DECLSPEC_HIDDEN; + const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters) DECLSPEC_HIDDEN; VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *context_vk, - const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk, bool indexed) DECLSPEC_HIDDEN; + const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters) DECLSPEC_HIDDEN; void wined3d_context_vk_cleanup(struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN; BOOL wined3d_context_vk_create_bo(struct wined3d_context_vk *context_vk, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags memory_type, struct wined3d_bo_vk *bo) DECLSPEC_HIDDEN; @@ -4921,6 +4921,8 @@ static inline struct wined3d_buffer *buffer_from_resource(struct wined3d_resourc return CONTAINING_RECORD(resource, struct wined3d_buffer, resource); }
+void buffer_get_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc, + const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size) DECLSPEC_HIDDEN; void wined3d_buffer_cleanup(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset, struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN; @@ -4980,7 +4982,7 @@ 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; + struct wined3d_context_vk *context_vk, uint32_t bind_mask, size_t offset, size_t range) 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,
On Tue, 20 Jul 2021 at 05:23, Zebediah Figura zfigura@codeweavers.com wrote:
-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;
}
That seems like somewhat of a gratuitous change. There may be an argument for it, but it doesn't have a lot to do with constant buffer offsetting.
@@ -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))
We do this in a couple of other places, but I'm generally not a fan of creating a new scope for case labels like that. As a rule of thumb, I'd say that in the cases where it's really worth creating a new scope, introducing a separate function tends to be the better solution. This specific case may be in that category as well; wined3d_context_vk_update_descriptors() is already a moderately sized function before this change, and introducing separate functions for the different descriptor types may very well end up improving readability.