mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader: Store sampler comparison mode information in the descriptor scan info.
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
e560db5027
commit
760bafd620
@@ -617,6 +617,7 @@ enum vkd3d_shader_descriptor_info_flag
|
|||||||
{
|
{
|
||||||
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER = 0x00000001,
|
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER = 0x00000001,
|
||||||
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ = 0x00000002,
|
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ = 0x00000002,
|
||||||
|
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE = 0x00000004,
|
||||||
|
|
||||||
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_DESCRIPTOR_INFO_FLAG),
|
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_DESCRIPTOR_INFO_FLAG),
|
||||||
};
|
};
|
||||||
@@ -640,7 +641,6 @@ struct vkd3d_shader_scan_info
|
|||||||
struct vkd3d_shader_descriptor_info *descriptors;
|
struct vkd3d_shader_descriptor_info *descriptors;
|
||||||
unsigned int descriptor_count;
|
unsigned int descriptor_count;
|
||||||
|
|
||||||
unsigned int sampler_comparison_mode_mask; /* 16 */
|
|
||||||
bool use_vocp;
|
bool use_vocp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5218,12 +5218,12 @@ static void vkd3d_dxbc_compiler_emit_combined_sampler_declarations(struct vkd3d_
|
|||||||
unsigned int structure_stride, bool raw, const struct vkd3d_spirv_resource_type *resource_type_info)
|
unsigned int structure_stride, bool raw, const struct vkd3d_spirv_resource_type *resource_type_info)
|
||||||
{
|
{
|
||||||
const struct vkd3d_shader_interface_info *shader_interface = &compiler->shader_interface;
|
const struct vkd3d_shader_interface_info *shader_interface = &compiler->shader_interface;
|
||||||
const struct vkd3d_shader_scan_info *scan_info = compiler->scan_info;
|
|
||||||
const SpvStorageClass storage_class = SpvStorageClassUniformConstant;
|
const SpvStorageClass storage_class = SpvStorageClassUniformConstant;
|
||||||
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||||
const struct vkd3d_shader_combined_resource_sampler *current;
|
const struct vkd3d_shader_combined_resource_sampler *current;
|
||||||
uint32_t image_type_id, type_id, ptr_type_id, var_id;
|
uint32_t image_type_id, type_id, ptr_type_id, var_id;
|
||||||
enum vkd3d_shader_binding_flag resource_type_flag;
|
enum vkd3d_shader_binding_flag resource_type_flag;
|
||||||
|
const struct vkd3d_shader_descriptor_info *d;
|
||||||
struct vkd3d_symbol symbol;
|
struct vkd3d_symbol symbol;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
bool depth;
|
bool depth;
|
||||||
@@ -5244,8 +5244,10 @@ static void vkd3d_dxbc_compiler_emit_combined_sampler_declarations(struct vkd3d_
|
|||||||
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
d = vkd3d_dxbc_compiler_get_descriptor_info(compiler,
|
||||||
|
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, 0, current->sampler_index);
|
||||||
depth = current->sampler_index != VKD3D_DUMMY_SAMPLER_INDEX
|
depth = current->sampler_index != VKD3D_DUMMY_SAMPLER_INDEX
|
||||||
&& scan_info->sampler_comparison_mode_mask & (1u << current->sampler_index);
|
&& (d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE);
|
||||||
|
|
||||||
image_type_id = vkd3d_dxbc_compiler_get_image_type_id(compiler, resource, resource_space,
|
image_type_id = vkd3d_dxbc_compiler_get_image_type_id(compiler, resource, resource_space,
|
||||||
resource_index, resource_type_info, sampled_type, structure_stride || raw, depth);
|
resource_index, resource_type_info, sampled_type, structure_stride || raw, depth);
|
||||||
|
@@ -253,7 +253,8 @@ static void vkd3d_shader_scan_record_uav_counter(struct vkd3d_shader_scan_contex
|
|||||||
|
|
||||||
static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context,
|
static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context,
|
||||||
enum vkd3d_shader_descriptor_type type, unsigned int register_space, unsigned int register_index,
|
enum vkd3d_shader_descriptor_type type, unsigned int register_space, unsigned int register_index,
|
||||||
enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type)
|
enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type,
|
||||||
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
struct vkd3d_shader_scan_info *scan_info = context->scan_info;
|
struct vkd3d_shader_scan_info *scan_info = context->scan_info;
|
||||||
struct vkd3d_shader_descriptor_info *d;
|
struct vkd3d_shader_descriptor_info *d;
|
||||||
@@ -271,7 +272,7 @@ static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *c
|
|||||||
d->register_index = register_index;
|
d->register_index = register_index;
|
||||||
d->resource_type = resource_type;
|
d->resource_type = resource_type;
|
||||||
d->resource_data_type = resource_data_type;
|
d->resource_data_type = resource_data_type;
|
||||||
d->flags = 0;
|
d->flags = flags;
|
||||||
d->count = 1;
|
d->count = 1;
|
||||||
++scan_info->descriptor_count;
|
++scan_info->descriptor_count;
|
||||||
|
|
||||||
@@ -301,7 +302,7 @@ static void vkd3d_shader_scan_constant_buffer_declaration(struct vkd3d_shader_sc
|
|||||||
const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb;
|
const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb;
|
||||||
|
|
||||||
vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, cb->register_space,
|
vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, cb->register_space,
|
||||||
cb->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
cb->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vkd3d_shader_scan_input_declaration(struct vkd3d_shader_scan_info *scan_info,
|
static void vkd3d_shader_scan_input_declaration(struct vkd3d_shader_scan_info *scan_info,
|
||||||
@@ -317,17 +318,14 @@ static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_conte
|
|||||||
const struct vkd3d_shader_instruction *instruction)
|
const struct vkd3d_shader_instruction *instruction)
|
||||||
{
|
{
|
||||||
const struct vkd3d_shader_sampler *sampler = &instruction->declaration.sampler;
|
const struct vkd3d_shader_sampler *sampler = &instruction->declaration.sampler;
|
||||||
struct vkd3d_shader_scan_info *scan_info = context->scan_info;
|
unsigned int flags;
|
||||||
unsigned int sampler_index = sampler->register_index;
|
|
||||||
|
|
||||||
if (instruction->flags & VKD3DSI_SAMPLER_COMPARISON_MODE)
|
if (instruction->flags & VKD3DSI_SAMPLER_COMPARISON_MODE)
|
||||||
{
|
flags = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE;
|
||||||
assert(sampler_index < CHAR_BIT * sizeof(scan_info->sampler_comparison_mode_mask));
|
else
|
||||||
scan_info->sampler_comparison_mode_mask |= 1u << sampler_index;
|
flags = 0;
|
||||||
}
|
|
||||||
|
|
||||||
vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, sampler->register_space,
|
vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, sampler->register_space,
|
||||||
sampler->register_index, VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
sampler->register_index, VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context,
|
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context,
|
||||||
@@ -364,7 +362,7 @@ static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_cont
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
vkd3d_shader_scan_add_descriptor(context, type, semantic->register_space,
|
vkd3d_shader_scan_add_descriptor(context, type, semantic->register_space,
|
||||||
semantic->register_index, semantic->resource_type, resource_data_type);
|
semantic->register_index, semantic->resource_type, resource_data_type, 0);
|
||||||
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
||||||
vkd3d_shader_scan_add_uav_range(context, semantic->reg.reg.idx[0].offset,
|
vkd3d_shader_scan_add_uav_range(context, semantic->reg.reg.idx[0].offset,
|
||||||
context->scan_info->descriptor_count - 1);
|
context->scan_info->descriptor_count - 1);
|
||||||
@@ -381,7 +379,7 @@ static void vkd3d_shader_scan_resource_declaration_raw(struct vkd3d_shader_scan_
|
|||||||
else
|
else
|
||||||
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
|
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
|
||||||
vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
|
vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
|
||||||
resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0);
|
||||||
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
||||||
vkd3d_shader_scan_add_uav_range(context, resource->dst.reg.idx[0].offset,
|
vkd3d_shader_scan_add_uav_range(context, resource->dst.reg.idx[0].offset,
|
||||||
context->scan_info->descriptor_count - 1);
|
context->scan_info->descriptor_count - 1);
|
||||||
@@ -398,7 +396,7 @@ static void vkd3d_shader_scan_resource_declaration_structured(struct vkd3d_shade
|
|||||||
else
|
else
|
||||||
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
|
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
|
||||||
vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
|
vkd3d_shader_scan_add_descriptor(context, type, resource->register_space,
|
||||||
resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
resource->register_index, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0);
|
||||||
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
if (type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
|
||||||
vkd3d_shader_scan_add_uav_range(context, resource->reg.reg.idx[0].offset,
|
vkd3d_shader_scan_add_uav_range(context, resource->reg.reg.idx[0].offset,
|
||||||
context->scan_info->descriptor_count - 1);
|
context->scan_info->descriptor_count - 1);
|
||||||
|
Reference in New Issue
Block a user