From: Zebediah Figura zfigura@codeweavers.com
Adding more parameters, especially bare numeric parameters, gets unwieldy. --- libs/vkd3d-shader/vkd3d_shader_main.c | 86 ++++++++++++++++----------- 1 file changed, 52 insertions(+), 34 deletions(-)
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 3a2432c1..8eda1352 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -755,13 +755,15 @@ static void vkd3d_shader_scan_record_uav_atomic_op(struct vkd3d_shader_scan_cont vkd3d_shader_scan_add_uav_flag(context, reg, VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS); }
+static unsigned int count_from_register_range(const struct vkd3d_shader_register_range *range) +{ + return (range->last == ~0u) ? ~0u : range->last - range->first + 1; +} + static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context, - enum vkd3d_shader_descriptor_type type, const struct vkd3d_shader_register *reg, - const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type, - enum vkd3d_shader_resource_data_type resource_data_type, unsigned int flags) + const struct vkd3d_shader_descriptor_info1 *descriptor) { struct vkd3d_shader_scan_descriptor_info1 *info = context->scan_descriptor_info; - struct vkd3d_shader_descriptor_info1 *d;
if (!vkd3d_array_reserve((void **)&info->descriptors, &context->descriptors_size, info->descriptor_count + 1, sizeof(*info->descriptors))) @@ -769,18 +771,7 @@ static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *c ERR("Failed to allocate descriptor info.\n"); return false; } - - d = &info->descriptors[info->descriptor_count]; - d->type = type; - d->register_id = reg->idx[0].offset; - d->register_space = range->space; - d->register_index = range->first; - d->resource_type = resource_type; - d->resource_data_type = resource_data_type; - d->flags = flags; - d->count = (range->last == ~0u) ? ~0u : range->last - range->first + 1; - ++info->descriptor_count; - + info->descriptors[info->descriptor_count++] = *descriptor; return true; }
@@ -788,46 +779,67 @@ static void vkd3d_shader_scan_constant_buffer_declaration(struct vkd3d_shader_sc const struct vkd3d_shader_instruction *instruction) { const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb; + struct vkd3d_shader_descriptor_info1 descriptor = + { + .type = VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, + .register_id = cb->src.reg.idx[0].offset, + .register_space = cb->range.space, + .register_index = cb->range.first, + .resource_type = VKD3D_SHADER_RESOURCE_BUFFER, + .resource_data_type = VKD3D_SHADER_RESOURCE_DATA_UINT, + .count = count_from_register_range(&cb->range), + };
if (!context->scan_descriptor_info) return;
- vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, &cb->src.reg, &cb->range, - VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0); + vkd3d_shader_scan_add_descriptor(context, &descriptor); }
static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction) { const struct vkd3d_shader_sampler *sampler = &instruction->declaration.sampler; - unsigned int flags; + struct vkd3d_shader_descriptor_info1 descriptor = + { + .type = VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, + .register_id = sampler->src.reg.idx[0].offset, + .register_space = sampler->range.space, + .register_index = sampler->range.first, + .resource_type = VKD3D_SHADER_RESOURCE_NONE, + .resource_data_type = VKD3D_SHADER_RESOURCE_DATA_UINT, + .count = count_from_register_range(&sampler->range), + };
if (!context->scan_descriptor_info) return;
if (instruction->flags & VKD3DSI_SAMPLER_COMPARISON_MODE) - flags = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE; - else - flags = 0; - vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, &sampler->src.reg, &sampler->range, - VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT, flags); + descriptor.flags = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE; + vkd3d_shader_scan_add_descriptor(context, &descriptor); }
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_resource *resource, enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type) { - enum vkd3d_shader_descriptor_type type; + struct vkd3d_shader_descriptor_info1 descriptor = + { + .type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV, + .register_id = resource->reg.reg.idx[0].offset, + .register_space = resource->range.space, + .register_index = resource->range.first, + .resource_type = resource_type, + .resource_data_type = resource_data_type, + .count = count_from_register_range(&resource->range), + };
if (!context->scan_descriptor_info) return;
if (resource->reg.reg.type == VKD3DSPR_UAV) - type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV; - else - type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV; - vkd3d_shader_scan_add_descriptor(context, type, &resource->reg.reg, &resource->range, - resource_type, resource_data_type, 0); + descriptor.type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV; + vkd3d_shader_scan_add_descriptor(context, &descriptor); }
static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_scan_context *context, @@ -1150,12 +1162,18 @@ static int scan_with_parser(const struct vkd3d_shader_compile_info *compile_info
for (i = 0; i < ARRAY_SIZE(parser->shader_desc.flat_constant_count); ++i) { - struct vkd3d_shader_register_range range = {.space = 0, .first = i, .last = i}; - struct vkd3d_shader_register reg = {.idx[0].offset = i, .idx_count = 1}; + struct vkd3d_shader_descriptor_info1 descriptor = + { + .type = VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, + .register_id = i, + .register_index = i, + .resource_type = VKD3D_SHADER_RESOURCE_BUFFER, + .resource_data_type = VKD3D_SHADER_RESOURCE_DATA_UINT, + .count = 1, + };
if (parser->shader_desc.flat_constant_count[i].external) - vkd3d_shader_scan_add_descriptor(&context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, ®, - &range, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0); + vkd3d_shader_scan_add_descriptor(&context, &descriptor); }
if (!ret && signature_info)