From f4ba457e1e6c4c8bd232e3c99f301964b9a1cb4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 10 Jan 2020 18:22:27 -0500 Subject: [PATCH] radeonsi: clean up si_shader_info Reviewed-by: Timothy Arceri --- src/gallium/drivers/radeonsi/si_shader.c | 3 +- src/gallium/drivers/radeonsi/si_shader.h | 150 ++++++------------- src/gallium/drivers/radeonsi/si_shader_nir.c | 23 +-- 3 files changed, 45 insertions(+), 131 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index e5581b9e25c..e4429a1ee0f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1584,7 +1584,7 @@ static LLVMValueRef load_const_buffer_desc_fast_path(struct si_shader_context *c LLVMValueRef desc_elems[] = { desc0, desc1, - LLVMConstInt(ctx->i32, (sel->info.const_file_max[0] + 1) * 16, 0), + LLVMConstInt(ctx->i32, sel->info.constbuf0_num_slots * 16, 0), LLVMConstInt(ctx->i32, rsrc3, false) }; @@ -5028,7 +5028,6 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, */ if (ctx->screen->info.chip_class >= GFX9) { if (!shader->is_monolithic && - sel->info.num_instructions > 1 && /* not empty shader */ (shader->key.as_es || shader->key.as_ls) && (ctx->type == PIPE_SHADER_TESS_EVAL || (ctx->type == PIPE_SHADER_VERTEX && diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 058bb35cf0a..633f59d2620 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -307,8 +307,6 @@ struct si_compiler_ctx_state { }; struct si_shader_info { - uint num_tokens; - ubyte num_inputs; ubyte num_outputs; ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */ @@ -316,94 +314,68 @@ struct si_shader_info { ubyte input_interpolate[PIPE_MAX_SHADER_INPUTS]; ubyte input_interpolate_loc[PIPE_MAX_SHADER_INPUTS]; ubyte input_usage_mask[PIPE_MAX_SHADER_INPUTS]; - ubyte input_cylindrical_wrap[PIPE_MAX_SHADER_INPUTS]; ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */ ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; ubyte output_usagemask[PIPE_MAX_SHADER_OUTPUTS]; ubyte output_streams[PIPE_MAX_SHADER_OUTPUTS]; - ubyte num_system_values; - ubyte system_value_semantic_name[PIPE_MAX_SHADER_INPUTS]; - ubyte processor; - uint file_mask[TGSI_FILE_COUNT]; /**< bitmask of declared registers */ - uint file_count[TGSI_FILE_COUNT]; /**< number of declared registers */ - int file_max[TGSI_FILE_COUNT]; /**< highest index of declared registers */ - int const_file_max[PIPE_MAX_CONSTANT_BUFFERS]; + int constbuf0_num_slots; unsigned const_buffers_declared; /**< bitmask of declared const buffers */ unsigned samplers_declared; /**< bitmask of declared samplers */ - ubyte sampler_targets[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_TEXTURE_x values */ - ubyte sampler_type[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_RETURN_TYPE_x */ ubyte num_stream_output_components[4]; - ubyte input_array_first[PIPE_MAX_SHADER_INPUTS]; - ubyte input_array_last[PIPE_MAX_SHADER_INPUTS]; - ubyte output_array_first[PIPE_MAX_SHADER_OUTPUTS]; - ubyte output_array_last[PIPE_MAX_SHADER_OUTPUTS]; - unsigned array_max[TGSI_FILE_COUNT]; /**< highest index array per register file */ - - uint immediate_count; /**< number of immediates declared */ - uint num_instructions; uint num_memory_instructions; /**< sampler, buffer, and image instructions */ - uint opcode_count[TGSI_OPCODE_LAST]; /**< opcode histogram */ - /** * If a tessellation control shader reads outputs, this describes which ones. */ - boolean reads_pervertex_outputs; - boolean reads_perpatch_outputs; - boolean reads_tessfactor_outputs; + bool reads_pervertex_outputs; + bool reads_perpatch_outputs; + bool reads_tessfactor_outputs; ubyte colors_read; /**< which color components are read by the FS */ ubyte colors_written; - boolean reads_position; /**< does fragment shader read position? */ - boolean reads_z; /**< does fragment shader read depth? */ - boolean reads_samplemask; /**< does fragment shader read sample mask? */ - boolean reads_tess_factors; /**< If TES reads TESSINNER or TESSOUTER */ - boolean writes_z; /**< does fragment shader write Z value? */ - boolean writes_stencil; /**< does fragment shader write stencil value? */ - boolean writes_samplemask; /**< does fragment shader write sample mask? */ - boolean writes_edgeflag; /**< vertex shader outputs edgeflag */ - boolean uses_kill; /**< KILL or KILL_IF instruction used? */ - boolean uses_persp_center; - boolean uses_persp_centroid; - boolean uses_persp_sample; - boolean uses_linear_center; - boolean uses_linear_centroid; - boolean uses_linear_sample; - boolean uses_persp_opcode_interp_centroid; - boolean uses_persp_opcode_interp_offset; - boolean uses_persp_opcode_interp_sample; - boolean uses_linear_opcode_interp_centroid; - boolean uses_linear_opcode_interp_offset; - boolean uses_linear_opcode_interp_sample; - boolean uses_instanceid; - boolean uses_vertexid; - boolean uses_vertexid_nobase; - boolean uses_basevertex; - boolean uses_drawid; - boolean uses_primid; - boolean uses_frontface; - boolean uses_invocationid; - boolean uses_thread_id[3]; - boolean uses_block_id[3]; - boolean uses_block_size; - boolean uses_grid_size; - boolean uses_subgroup_info; - boolean writes_position; - boolean writes_psize; - boolean writes_clipvertex; - boolean writes_primid; - boolean writes_viewport_index; - boolean writes_layer; - boolean writes_memory; /**< contains stores or atomics to buffers or images */ - boolean uses_doubles; /**< uses any of the double instructions */ - boolean uses_derivatives; - boolean uses_bindless_samplers; - boolean uses_bindless_images; - boolean uses_fbfetch; + bool reads_samplemask; /**< does fragment shader read sample mask? */ + bool reads_tess_factors; /**< If TES reads TESSINNER or TESSOUTER */ + bool writes_z; /**< does fragment shader write Z value? */ + bool writes_stencil; /**< does fragment shader write stencil value? */ + bool writes_samplemask; /**< does fragment shader write sample mask? */ + bool writes_edgeflag; /**< vertex shader outputs edgeflag */ + bool uses_kill; /**< KILL or KILL_IF instruction used? */ + bool uses_persp_center; + bool uses_persp_centroid; + bool uses_persp_sample; + bool uses_linear_center; + bool uses_linear_centroid; + bool uses_linear_sample; + bool uses_persp_opcode_interp_sample; + bool uses_linear_opcode_interp_sample; + bool uses_instanceid; + bool uses_vertexid; + bool uses_vertexid_nobase; + bool uses_basevertex; + bool uses_drawid; + bool uses_primid; + bool uses_frontface; + bool uses_invocationid; + bool uses_thread_id[3]; + bool uses_block_id[3]; + bool uses_block_size; + bool uses_grid_size; + bool uses_subgroup_info; + bool writes_position; + bool writes_psize; + bool writes_clipvertex; + bool writes_primid; + bool writes_viewport_index; + bool writes_layer; + bool writes_memory; /**< contains stores or atomics to buffers or images */ + bool uses_derivatives; + bool uses_bindless_samplers; + bool uses_bindless_images; + bool uses_fbfetch; unsigned clipdist_writemask; unsigned culldist_writemask; unsigned num_written_culldistance; @@ -411,46 +383,10 @@ struct si_shader_info { unsigned images_declared; /**< bitmask of declared images */ unsigned msaa_images_declared; /**< bitmask of declared MSAA images */ - - /** - * Bitmask indicating which declared image is a buffer. - */ - unsigned images_buffers; - unsigned images_load; /**< bitmask of images using loads */ - unsigned images_store; /**< bitmask of images using stores */ - unsigned images_atomic; /**< bitmask of images using atomics */ unsigned shader_buffers_declared; /**< bitmask of declared shader buffers */ - unsigned shader_buffers_load; /**< bitmask of shader buffers using loads */ - unsigned shader_buffers_store; /**< bitmask of shader buffers using stores */ - unsigned shader_buffers_atomic; /**< bitmask of shader buffers using atomics */ - bool uses_bindless_buffer_load; - bool uses_bindless_buffer_store; - bool uses_bindless_buffer_atomic; - bool uses_bindless_image_load; - bool uses_bindless_image_store; - bool uses_bindless_image_atomic; - - /** - * Bitmask indicating which register files are accessed with - * indirect addressing. The bits are (1 << TGSI_FILE_x), etc. - */ - unsigned indirect_files; - /** - * Bitmask indicating which register files are read / written with - * indirect addressing. The bits are (1 << TGSI_FILE_x). - */ - unsigned indirect_files_read; - unsigned indirect_files_written; - unsigned dim_indirect_files; /**< shader resource indexing */ - unsigned const_buffers_indirect; /**< const buffers using indirect addressing */ unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */ - /** - * Max nesting limit of loops/if's - */ - unsigned max_depth; - /** Whether all codepaths write tess factors in all invocations. */ bool tessfactors_are_def_in_all_invocs; }; diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 6aa85ef6c7b..a9bc34a5e75 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -282,25 +282,12 @@ static void scan_instruction(const struct nir_shader *nir, info->reads_tess_factors = true; break; case nir_intrinsic_bindless_image_load: - info->uses_bindless_images = true; - - if (nir_intrinsic_image_dim(intr) == GLSL_SAMPLER_DIM_BUF) - info->uses_bindless_buffer_load = true; - else - info->uses_bindless_image_load = true; - break; case nir_intrinsic_bindless_image_size: case nir_intrinsic_bindless_image_samples: info->uses_bindless_images = true; break; case nir_intrinsic_bindless_image_store: info->uses_bindless_images = true; - - if (nir_intrinsic_image_dim(intr) == GLSL_SAMPLER_DIM_BUF) - info->uses_bindless_buffer_store = true; - else - info->uses_bindless_image_store = true; - info->writes_memory = true; info->num_memory_instructions++; /* we only care about stores */ break; @@ -319,12 +306,6 @@ static void scan_instruction(const struct nir_shader *nir, case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: info->uses_bindless_images = true; - - if (nir_intrinsic_image_dim(intr) == GLSL_SAMPLER_DIM_BUF) - info->uses_bindless_buffer_atomic = true; - else - info->uses_bindless_image_atomic = true; - info->writes_memory = true; info->num_memory_instructions++; /* we only care about stores */ break; @@ -585,8 +566,6 @@ void si_nir_scan_shader(const struct nir_shader *nir, unsigned i; info->processor = pipe_shader_type_from_mesa(nir->info.stage); - info->num_tokens = 2; /* indicate that the shader is non-empty */ - info->num_instructions = 2; info->properties[TGSI_PROPERTY_NEXT_SHADER] = pipe_shader_type_from_mesa(nir->info.next_stage); @@ -770,7 +749,7 @@ void si_nir_scan_shader(const struct nir_shader *nir, info->num_inputs = nir->num_inputs; info->num_outputs = nir->num_outputs; - info->const_file_max[0] = nir->num_uniforms - 1; + info->constbuf0_num_slots = nir->num_uniforms; info->shader_buffers_declared = u_bit_consecutive(0, nir->info.num_ssbos); info->const_buffers_declared = u_bit_consecutive(1, nir->info.num_ubos); if (nir->num_uniforms > 0) -- 2.30.2