diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 871fe1e0..6c4f1b3d 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -1971,7 +1971,7 @@ struct hlsl_ir_node *hlsl_block_add_load_component(struct hlsl_ctx *ctx, struct return &load->node; } -struct hlsl_ir_node *hlsl_new_resource_load(struct hlsl_ctx *ctx, +static struct hlsl_ir_node *hlsl_new_resource_load(struct hlsl_ctx *ctx, const struct hlsl_resource_load_params *params, const struct vkd3d_shader_location *loc) { struct hlsl_ir_resource_load *load; @@ -2010,6 +2010,12 @@ struct hlsl_ir_node *hlsl_new_resource_load(struct hlsl_ctx *ctx, return &load->node; } +struct hlsl_ir_node *hlsl_block_add_resource_load(struct hlsl_ctx *ctx, struct hlsl_block *block, + const struct hlsl_resource_load_params *params, const struct vkd3d_shader_location *loc) +{ + return append_new_instr(ctx, block, hlsl_new_resource_load(ctx, params, loc)); +} + static struct hlsl_ir_node *hlsl_new_resource_store(struct hlsl_ctx *ctx, const struct hlsl_deref *resource, struct hlsl_ir_node *coords, struct hlsl_ir_node *value, const struct vkd3d_shader_location *loc) { diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index acda018f..bfd9a9f6 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -1551,6 +1551,8 @@ struct hlsl_ir_node *hlsl_block_add_load_index(struct hlsl_ctx *ctx, struct hlsl void hlsl_block_add_loop(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_block *iter, struct hlsl_block *body, enum hlsl_loop_unroll_type unroll_type, unsigned int unroll_limit, const struct vkd3d_shader_location *loc); +struct hlsl_ir_node *hlsl_block_add_resource_load(struct hlsl_ctx *ctx, struct hlsl_block *block, + const struct hlsl_resource_load_params *params, const struct vkd3d_shader_location *loc); void hlsl_block_add_resource_store(struct hlsl_ctx *ctx, struct hlsl_block *block, const struct hlsl_deref *resource, struct hlsl_ir_node *coords, struct hlsl_ir_node *value, const struct vkd3d_shader_location *loc); struct hlsl_ir_node *hlsl_block_add_simple_load(struct hlsl_ctx *ctx, struct hlsl_block *block, @@ -1676,8 +1678,6 @@ struct hlsl_ir_node *hlsl_new_interlocked(struct hlsl_ctx *ctx, enum hlsl_interl struct hlsl_ir_node *value, const struct vkd3d_shader_location *loc); struct hlsl_ir_node *hlsl_new_matrix_swizzle(struct hlsl_ctx *ctx, struct hlsl_matrix_swizzle s, unsigned int width, struct hlsl_ir_node *val, const struct vkd3d_shader_location *loc); -struct hlsl_ir_node *hlsl_new_resource_load(struct hlsl_ctx *ctx, - const struct hlsl_resource_load_params *params, const struct vkd3d_shader_location *loc); struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name, struct hlsl_struct_field *fields, size_t field_count); struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, uint32_t s, unsigned int components, diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 9bdd82a4..7eac0744 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4768,7 +4768,7 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer * unsigned int sampler_dim = hlsl_sampler_dim_count(dim); struct hlsl_resource_load_params load_params = { 0 }; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *coords, *sample; + struct hlsl_ir_node *coords; if (params->args_count != 2 && params->args_count != 4) { @@ -4909,9 +4909,7 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer * load_params.format = hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, 4); load_params.sampling_dim = dim; - if (!(sample = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(params->instrs, sample); + hlsl_block_add_resource_load(ctx, params->instrs, &load_params, loc); return true; } @@ -5736,7 +5734,6 @@ static bool add_raw_load_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bl const char *name, const struct parse_initializer *params, const struct vkd3d_shader_location *loc) { struct hlsl_resource_load_params load_params = {.type = HLSL_RESOURCE_LOAD}; - struct hlsl_ir_node *load; unsigned int value_dim; if (params->args_count != 1 && params->args_count != 2) @@ -5774,10 +5771,7 @@ static bool add_raw_load_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bl load_params.format = hlsl_get_vector_type(ctx, HLSL_TYPE_UINT, value_dim); load_params.resource = object; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -5787,7 +5781,6 @@ static bool add_load_method_call(struct hlsl_ctx *ctx, struct hlsl_block *block, const struct hlsl_type *object_type = object->data_type; struct hlsl_resource_load_params load_params = {.type = HLSL_RESOURCE_LOAD}; unsigned int sampler_dim, offset_dim; - struct hlsl_ir_node *load; bool multisampled; if (object_type->sampler_dim == HLSL_SAMPLER_DIM_RAW_BUFFER) @@ -5839,10 +5832,7 @@ static bool add_load_method_call(struct hlsl_ctx *ctx, struct hlsl_block *block, load_params.format = object_type->e.resource.format; load_params.resource = object; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -5853,7 +5843,6 @@ static bool add_sample_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bloc struct hlsl_resource_load_params load_params = {.type = HLSL_RESOURCE_SAMPLE}; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); offset_dim = hlsl_offset_dim_count(object_type->sampler_dim); @@ -5897,11 +5886,7 @@ static bool add_sample_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bloc load_params.format = object_type->e.resource.format; load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); - + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -5912,7 +5897,6 @@ static bool add_sample_cmp_method_call(struct hlsl_ctx *ctx, struct hlsl_block * struct hlsl_resource_load_params load_params = { 0 }; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); offset_dim = hlsl_offset_dim_count(object_type->sampler_dim); @@ -5966,11 +5950,7 @@ static bool add_sample_cmp_method_call(struct hlsl_ctx *ctx, struct hlsl_block * load_params.format = object_type->e.resource.format; load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); - + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -5981,7 +5961,6 @@ static bool add_gather_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bloc struct hlsl_resource_load_params load_params = {0}; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; unsigned int read_channel; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); @@ -6066,10 +6045,7 @@ static bool add_gather_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bloc load_params.format = hlsl_get_vector_type(ctx, object_type->e.resource.format->e.numeric.type, 4); load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -6080,7 +6056,6 @@ static bool add_gather_cmp_method_call(struct hlsl_ctx *ctx, struct hlsl_block * struct hlsl_resource_load_params load_params = {0}; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); offset_dim = hlsl_offset_dim_count(object_type->sampler_dim); @@ -6147,10 +6122,7 @@ static bool add_gather_cmp_method_call(struct hlsl_ctx *ctx, struct hlsl_block * load_params.format = hlsl_get_vector_type(ctx, object_type->e.resource.format->e.numeric.type, 4); load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -6283,10 +6255,7 @@ static bool add_getdimensions_method_call(struct hlsl_ctx *ctx, struct hlsl_bloc load_params.resource = object; load_params.lod = args[ARG_MIP_LEVEL]; load_params.format = hlsl_get_vector_type(ctx, uint_resinfo ? HLSL_TYPE_UINT : HLSL_TYPE_FLOAT, 4); - - if (!(res_info = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, res_info); + res_info = hlsl_block_add_resource_load(ctx, block, &load_params, loc); if (!add_assignment_from_component(ctx, block, args[ARG_WIDTH], res_info, 0, loc)) return false; @@ -6309,9 +6278,7 @@ static bool add_getdimensions_method_call(struct hlsl_ctx *ctx, struct hlsl_bloc load_params.type = HLSL_RESOURCE_SAMPLE_INFO; load_params.resource = object; load_params.format = args[ARG_SAMPLE_COUNT]->data_type; - if (!(sample_info = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, sample_info); + sample_info = hlsl_block_add_resource_load(ctx, block, &load_params, loc); if (!add_assignment(ctx, block, args[ARG_SAMPLE_COUNT], ASSIGN_OP_ASSIGN, sample_info, false)) return false; @@ -6328,7 +6295,6 @@ static bool add_sample_lod_method_call(struct hlsl_ctx *ctx, struct hlsl_block * struct hlsl_resource_load_params load_params = { 0 }; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); offset_dim = hlsl_offset_dim_count(object_type->sampler_dim); @@ -6379,10 +6345,7 @@ static bool add_sample_lod_method_call(struct hlsl_ctx *ctx, struct hlsl_block * load_params.format = object_type->e.resource.format; load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } @@ -6393,7 +6356,6 @@ static bool add_sample_grad_method_call(struct hlsl_ctx *ctx, struct hlsl_block struct hlsl_resource_load_params load_params = { 0 }; unsigned int sampler_dim, offset_dim; const struct hlsl_type *sampler_type; - struct hlsl_ir_node *load; sampler_dim = hlsl_sampler_dim_count(object_type->sampler_dim); offset_dim = hlsl_offset_dim_count(object_type->sampler_dim); @@ -6445,10 +6407,7 @@ static bool add_sample_grad_method_call(struct hlsl_ctx *ctx, struct hlsl_block load_params.format = object_type->e.resource.format; load_params.resource = object; load_params.sampler = params->args[0]; - - if (!(load = hlsl_new_resource_load(ctx, &load_params, loc))) - return false; - hlsl_block_add_instr(block, load); + hlsl_block_add_resource_load(ctx, block, &load_params, loc); return true; } diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 09eab8e8..5888fec7 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -1214,7 +1214,6 @@ static bool lower_index_loads(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, unsigned int dim_count = hlsl_sampler_dim_count(val->data_type->sampler_dim); struct hlsl_ir_node *coords = index->idx.node; struct hlsl_resource_load_params params = {0}; - struct hlsl_ir_node *resource_load; VKD3D_ASSERT(coords->data_type->class == HLSL_CLASS_VECTOR); VKD3D_ASSERT(coords->data_type->e.numeric.type == HLSL_TYPE_UINT); @@ -1227,10 +1226,7 @@ static bool lower_index_loads(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, params.resource = val; params.coords = coords; params.format = val->data_type->e.resource.format; - - if (!(resource_load = hlsl_new_resource_load(ctx, ¶ms, &instr->loc))) - return false; - hlsl_block_add_instr(block, resource_load); + hlsl_block_add_resource_load(ctx, block, ¶ms, &instr->loc); return true; }