forked from Mirrors/wine-wine
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
parent
3000b6ea1a
commit
bd63ec2f63
|
@ -1330,8 +1330,13 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
|
||||||
const struct wined3d_shader_resource_binding *binding;
|
const struct wined3d_shader_resource_binding *binding;
|
||||||
struct wined3d_shader_resource_bindings *bindings;
|
struct wined3d_shader_resource_bindings *bindings;
|
||||||
const VkDescriptorBufferInfo *buffer_info;
|
const VkDescriptorBufferInfo *buffer_info;
|
||||||
|
struct wined3d_shader_resource_view *srv;
|
||||||
|
const VkDescriptorImageInfo *image_info;
|
||||||
|
struct wined3d_resource *resource;
|
||||||
VkDescriptorSet vk_descriptor_set;
|
VkDescriptorSet vk_descriptor_set;
|
||||||
|
struct wined3d_view_vk *view_vk;
|
||||||
struct wined3d_buffer *buffer;
|
struct wined3d_buffer *buffer;
|
||||||
|
VkDescriptorType type;
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -1362,6 +1367,36 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con
|
||||||
return false;
|
return false;
|
||||||
break;
|
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:
|
default:
|
||||||
FIXME("Unhandled descriptor type %#x.\n", binding->shader_descriptor_type);
|
FIXME("Unhandled descriptor type %#x.\n", binding->shader_descriptor_type);
|
||||||
return false;
|
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;
|
const struct wined3d_shader_resource_bindings *bindings = &context_vk->compute.bindings;
|
||||||
struct wined3d_shader_descriptor_writes_vk *writes = &context_vk->descriptor_writes;
|
struct wined3d_shader_descriptor_writes_vk *writes = &context_vk->descriptor_writes;
|
||||||
const struct wined3d_shader_resource_binding *binding;
|
const struct wined3d_shader_resource_binding *binding;
|
||||||
|
struct wined3d_shader_resource_view *srv;
|
||||||
struct wined3d_buffer_vk *buffer_vk;
|
struct wined3d_buffer_vk *buffer_vk;
|
||||||
struct wined3d_buffer *buffer;
|
struct wined3d_buffer *buffer;
|
||||||
size_t i;
|
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);
|
wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
|
||||||
break;
|
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:
|
case WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
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,
|
static inline BOOL wined3d_dsv_srv_conflict(const struct wined3d_rendertarget_view *dsv,
|
||||||
const struct wined3d_format *srv_format)
|
const struct wined3d_format *srv_format)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue