vkd3d-shader: Introduce vkd3d_shader_binding_flags.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia
2018-10-29 11:12:16 +01:00
committed by Alexandre Julliard
parent feeb2b49df
commit ae84b5210e
3 changed files with 34 additions and 17 deletions

View File

@ -19,7 +19,6 @@
#ifndef __VKD3D_SHADER_H #ifndef __VKD3D_SHADER_H
#define __VKD3D_SHADER_H #define __VKD3D_SHADER_H
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#ifdef __cplusplus #ifdef __cplusplus
@ -82,12 +81,20 @@ struct vkd3d_shader_descriptor_binding
uint32_t binding; uint32_t binding;
}; };
enum vkd3d_shader_binding_flag
{
VKD3D_SHADER_BINDING_FLAG_BUFFER = 0x00000001,
VKD3D_SHADER_BINDING_FLAG_IMAGE = 0x00000002,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_BINDING_FLAG),
};
struct vkd3d_shader_resource_binding struct vkd3d_shader_resource_binding
{ {
enum vkd3d_shader_descriptor_type type; enum vkd3d_shader_descriptor_type type;
unsigned int register_index; unsigned int register_index;
enum vkd3d_shader_visibility shader_visibility; enum vkd3d_shader_visibility shader_visibility;
bool is_buffer; unsigned int flags; /* vkd3d_shader_binding_flags */
struct vkd3d_shader_descriptor_binding binding; struct vkd3d_shader_descriptor_binding binding;
}; };
@ -99,7 +106,7 @@ struct vkd3d_shader_combined_resource_sampler
unsigned int resource_index; unsigned int resource_index;
unsigned int sampler_index; unsigned int sampler_index;
enum vkd3d_shader_visibility shader_visibility; enum vkd3d_shader_visibility shader_visibility;
bool is_buffer; unsigned int flags; /* vkd3d_shader_binding_flags */
struct vkd3d_shader_descriptor_binding binding; struct vkd3d_shader_descriptor_binding binding;
}; };

View File

@ -2057,9 +2057,9 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
{ {
const struct vkd3d_shader_interface *shader_interface = &compiler->shader_interface; const struct vkd3d_shader_interface *shader_interface = &compiler->shader_interface;
enum vkd3d_shader_descriptor_type descriptor_type; enum vkd3d_shader_descriptor_type descriptor_type;
enum vkd3d_shader_binding_flag resource_type_flag;
struct vkd3d_shader_descriptor_binding binding; struct vkd3d_shader_descriptor_binding binding;
unsigned int reg_idx = reg->idx[0].offset; unsigned int reg_idx = reg->idx[0].offset;
bool is_buffer_resource;
unsigned int i; unsigned int i;
descriptor_type = VKD3D_SHADER_DESCRIPTOR_TYPE_UNKNOWN; descriptor_type = VKD3D_SHADER_DESCRIPTOR_TYPE_UNKNOWN;
@ -2074,7 +2074,9 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
else else
FIXME("Unhandled register type %#x.\n", reg->type); FIXME("Unhandled register type %#x.\n", reg->type);
is_buffer_resource = resource_type == VKD3D_SHADER_RESOURCE_BUFFER; resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
if (is_uav_counter) if (is_uav_counter)
{ {
assert(descriptor_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV); assert(descriptor_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV);
@ -2098,11 +2100,13 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
{ {
const struct vkd3d_shader_resource_binding *current = &shader_interface->bindings[i]; const struct vkd3d_shader_resource_binding *current = &shader_interface->bindings[i];
if (!(current->flags & resource_type_flag))
continue;
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility)) if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
continue; continue;
if (current->type == descriptor_type && current->register_index == reg_idx if (current->type == descriptor_type && current->register_index == reg_idx)
&& current->is_buffer == is_buffer_resource)
return current->binding; return current->binding;
} }
if (shader_interface->binding_count) if (shader_interface->binding_count)
@ -3908,17 +3912,22 @@ static void vkd3d_dxbc_compiler_emit_combined_sampler_declarations(struct vkd3d_
const struct vkd3d_shader_combined_resource_sampler *current; const struct vkd3d_shader_combined_resource_sampler *current;
const unsigned int resource_index = resource->idx[0].offset; const unsigned int resource_index = resource->idx[0].offset;
uint32_t image_type_id, type_id, ptr_type_id, var_id; uint32_t image_type_id, type_id, ptr_type_id, var_id;
bool is_buffer_resource, depth; enum vkd3d_shader_binding_flag resource_type_flag;
struct vkd3d_symbol symbol; struct vkd3d_symbol symbol;
unsigned int i; unsigned int i;
bool depth;
is_buffer_resource = resource_type == VKD3D_SHADER_RESOURCE_BUFFER; resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
for (i = 0; i < shader_interface->combined_sampler_count; ++i) for (i = 0; i < shader_interface->combined_sampler_count; ++i)
{ {
current = &shader_interface->combined_samplers[i]; current = &shader_interface->combined_samplers[i];
if (current->resource_index != resource_index || current->is_buffer != is_buffer_resource) if (current->resource_index != resource_index)
continue;
if (!(current->flags & resource_type_flag))
continue; continue;
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility)) if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))

View File

@ -607,14 +607,15 @@ static void d3d12_root_signature_append_vk_binding(struct d3d12_root_signature *
bool buffer_descriptor, enum vkd3d_shader_visibility shader_visibility, bool buffer_descriptor, enum vkd3d_shader_visibility shader_visibility,
struct vkd3d_descriptor_set_context *context) struct vkd3d_descriptor_set_context *context)
{ {
unsigned int i = context->descriptor_index++; struct vkd3d_shader_resource_binding *mapping
= &root_signature->descriptor_mapping[context->descriptor_index++];
root_signature->descriptor_mapping[i].type = descriptor_type; mapping->type = descriptor_type;
root_signature->descriptor_mapping[i].register_index = register_idx; mapping->register_index = register_idx;
root_signature->descriptor_mapping[i].shader_visibility = shader_visibility; mapping->shader_visibility = shader_visibility;
root_signature->descriptor_mapping[i].is_buffer = buffer_descriptor; mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
root_signature->descriptor_mapping[i].binding.set = context->set_index; mapping->binding.set = context->set_index;
root_signature->descriptor_mapping[i].binding.binding = context->descriptor_binding++; mapping->binding.binding = context->descriptor_binding++;
} }
static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature, static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature,