Module: vkd3d Branch: master Commit: ae84b5210e58a9f49d93d6ad39f0df5ae4df4bd7 URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=ae84b5210e58a9f49d93d6ad...
Author: Józef Kucia jkucia@codeweavers.com Date: Mon Oct 29 11:12:16 2018 +0100
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
---
include/private/vkd3d_shader.h | 13 ++++++++++--- libs/vkd3d-shader/spirv.c | 23 ++++++++++++++++------- libs/vkd3d/state.c | 17 +++++++++-------- 3 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/include/private/vkd3d_shader.h b/include/private/vkd3d_shader.h index b9472a2..d55ed9f 100644 --- a/include/private/vkd3d_shader.h +++ b/include/private/vkd3d_shader.h @@ -19,7 +19,6 @@ #ifndef __VKD3D_SHADER_H #define __VKD3D_SHADER_H
-#include <stdbool.h> #include <stdint.h>
#ifdef __cplusplus @@ -82,12 +81,20 @@ struct vkd3d_shader_descriptor_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 { enum vkd3d_shader_descriptor_type type; unsigned int register_index; enum vkd3d_shader_visibility shader_visibility; - bool is_buffer; + unsigned int flags; /* vkd3d_shader_binding_flags */
struct vkd3d_shader_descriptor_binding binding; }; @@ -99,7 +106,7 @@ struct vkd3d_shader_combined_resource_sampler unsigned int resource_index; unsigned int sampler_index; enum vkd3d_shader_visibility shader_visibility; - bool is_buffer; + unsigned int flags; /* vkd3d_shader_binding_flags */
struct vkd3d_shader_descriptor_binding binding; }; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index d281d25..79af890 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -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; enum vkd3d_shader_descriptor_type descriptor_type; + enum vkd3d_shader_binding_flag resource_type_flag; struct vkd3d_shader_descriptor_binding binding; unsigned int reg_idx = reg->idx[0].offset; - bool is_buffer_resource; unsigned int i;
descriptor_type = VKD3D_SHADER_DESCRIPTOR_TYPE_UNKNOWN; @@ -2074,7 +2074,9 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor else 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) { 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];
+ if (!(current->flags & resource_type_flag)) + continue; + if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility)) continue;
- if (current->type == descriptor_type && current->register_index == reg_idx - && current->is_buffer == is_buffer_resource) + if (current->type == descriptor_type && current->register_index == reg_idx) return current->binding; } 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 unsigned int resource_index = resource->idx[0].offset; 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; 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) { 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;
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility)) diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 7e0b1ee..4800ff3 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -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, struct vkd3d_descriptor_set_context *context) { - unsigned int i = context->descriptor_index++; - - root_signature->descriptor_mapping[i].type = descriptor_type; - root_signature->descriptor_mapping[i].register_index = register_idx; - root_signature->descriptor_mapping[i].shader_visibility = shader_visibility; - root_signature->descriptor_mapping[i].is_buffer = buffer_descriptor; - root_signature->descriptor_mapping[i].binding.set = context->set_index; - root_signature->descriptor_mapping[i].binding.binding = context->descriptor_binding++; + struct vkd3d_shader_resource_binding *mapping + = &root_signature->descriptor_mapping[context->descriptor_index++]; + + mapping->type = descriptor_type; + mapping->register_index = register_idx; + mapping->shader_visibility = shader_visibility; + mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE; + mapping->binding.set = context->set_index; + mapping->binding.binding = context->descriptor_binding++; }
static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature,