wined3d: Implement Vulkan image shader resource view descriptors.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Henri Verbeet 2020-05-13 19:16:49 +04:30 committed by Alexandre Julliard
parent 3000b6ea1a
commit bd63ec2f63
2 changed files with 57 additions and 0 deletions

View File

@ -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;

View File

@ -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)
{