From bd63ec2f63cddedc1c4aa267b58e5e49dc8f65f6 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 13 May 2020 19:16:49 +0430 Subject: [PATCH] wined3d: Implement Vulkan image shader resource view descriptors. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/context_vk.c | 45 ++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d_private.h | 12 +++++++++ 2 files changed, 57 insertions(+) diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 4c12cff7d11..4098ee6cc44 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -1330,8 +1330,13 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con const struct wined3d_shader_resource_binding *binding; struct wined3d_shader_resource_bindings *bindings; const VkDescriptorBufferInfo *buffer_info; + struct wined3d_shader_resource_view *srv; + const VkDescriptorImageInfo *image_info; + struct wined3d_resource *resource; VkDescriptorSet vk_descriptor_set; + struct wined3d_view_vk *view_vk; struct wined3d_buffer *buffer; + VkDescriptorType type; VkResult vr; size_t i; @@ -1362,6 +1367,36 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con return false; break; + case WINED3D_SHADER_DESCRIPTOR_TYPE_SRV: + if (!(srv = state->shader_resource_view[binding->shader_type][binding->resource_idx])) + { + FIXME("NULL shader resource views not implemented.\n"); + return false; + } + resource = srv->resource; + + view_vk = &wined3d_shader_resource_view_vk(srv)->view_vk; + if (resource->type == WINED3D_RTYPE_BUFFER) + { + FIXME("Buffer SRV descriptors not implemented.\n"); + return false; + } + else + { + struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(resource)); + + if (view_vk->u.vk_image_info.imageView) + image_info = &view_vk->u.vk_image_info; + else + image_info = wined3d_texture_vk_get_default_image_info(texture_vk, context_vk); + type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; + } + + if (!wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, + binding->binding_idx, type, NULL, image_info, NULL)) + return false; + break; + default: FIXME("Unhandled descriptor type %#x.\n", binding->shader_descriptor_type); return false; @@ -1465,6 +1500,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * const struct wined3d_shader_resource_bindings *bindings = &context_vk->compute.bindings; struct wined3d_shader_descriptor_writes_vk *writes = &context_vk->descriptor_writes; const struct wined3d_shader_resource_binding *binding; + struct wined3d_shader_resource_view *srv; struct wined3d_buffer_vk *buffer_vk; struct wined3d_buffer *buffer; size_t i; @@ -1487,6 +1523,15 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk * 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])) + break; + + if (srv->resource->type != WINED3D_RTYPE_BUFFER) + wined3d_texture_load(texture_from_resource(srv->resource), &context_vk->c, FALSE); + wined3d_context_vk_reference_shader_resource_view(context_vk, wined3d_shader_resource_view_vk(srv)); + break; + case WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER: break; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 321d58b0bf9..8b7fd1205f5 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -5671,6 +5671,18 @@ static inline void wined3d_context_vk_reference_rendertarget_view(const struct w rtv_vk->command_buffer_id = context_vk->current_command_buffer.id; } +static inline void wined3d_context_vk_reference_shader_resource_view(const struct wined3d_context_vk *context_vk, + struct wined3d_shader_resource_view_vk *srv_vk) +{ + struct wined3d_resource *resource = srv_vk->v.resource; + + if (resource->type == WINED3D_RTYPE_BUFFER) + wined3d_context_vk_reference_bo(context_vk, &wined3d_buffer_vk(buffer_from_resource(resource))->bo); + else + wined3d_context_vk_reference_texture(context_vk, wined3d_texture_vk(texture_from_resource(resource))); + srv_vk->view_vk.command_buffer_id = context_vk->current_command_buffer.id; +} + static inline BOOL wined3d_dsv_srv_conflict(const struct wined3d_rendertarget_view *dsv, const struct wined3d_format *srv_format) {