Hi Brian, Thanks for your review, I've noticed a few problems with this series while working on the R600 LLVM backend. I'll post updated patches that incorporate your comments once I get everything sorted out.
On Wed, Nov 07, 2012 at 05:48:38PM -0700, Brian Paul wrote: > On 11/05/2012 01:14 PM, Tom Stellard wrote: > >From: Tom Stellard<thomas.stell...@amd.com> > > > >--- > > src/mesa/main/mtypes.h | 1 + > > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 31 > > +++++++++++++++++++++++++++++- > > 2 files changed, 31 insertions(+), 1 deletion(-) > > > >diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > >index c8f2ca3..4aba5e8 100644 > >--- a/src/mesa/main/mtypes.h > >+++ b/src/mesa/main/mtypes.h > >@@ -1861,6 +1861,7 @@ typedef enum > > PROGRAM_SAMPLER, /**< for shader samplers, compile-time only */ > > PROGRAM_SYSTEM_VALUE,/**< InstanceId, PrimitiveID, etc. */ > > PROGRAM_UNDEFINED, /**< Invalid/TBD value */ > >+ PROGRAM_ARRAY, /**< Values used by indirect addressing. */ > > PROGRAM_FILE_MAX > > } gl_register_file; > > > >diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >index 14b72dc..151d40b 100644 > >--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >@@ -306,6 +306,7 @@ public: > > > > int glsl_version; > > bool native_integers; > >+ bool temp_array_supported; > > > > variable_storage *find_variable_storage(ir_variable *var); > > > >@@ -992,6 +993,12 @@ glsl_to_tgsi_visitor::get_temp(const glsl_type *type) > > } else { > > src.swizzle = swizzle_for_size(type->vector_elements); > > } > >+ > >+ if (this->temp_array_supported&& > >+ (type->is_array() || type->is_matrix())) { > >+ src.file = PROGRAM_ARRAY; > >+ } > > So any GLSL array will wind up as PROGRAM_ARRAY / > TGSI_FILE_TEMPORARY_ARRAY even if it's only indexed with > compile-time constant expressions? > This is how the code works now. I think I'll add an optimization pass that converts PROGRAM_ARRAY to PROGRAM_TEMP in in this case. I'm not sure there is a good way to handle this during the GLSL->TGSI conversion. -Tom > > >+ > > src.negate = 0; > > > > return src; > >@@ -2860,6 +2867,8 @@ glsl_to_tgsi_visitor::glsl_to_tgsi_visitor() > > indirect_addr_consts = false; > > glsl_version = 0; > > native_integers = false; > >+ temp_array_supported = false; > >+ > > mem_ctx = ralloc_context(NULL); > > ctx = NULL; > > prog = NULL; > >@@ -3690,6 +3699,7 @@ get_pixel_transfer_visitor(struct st_fragment_program > >*fp, > > v->shader_program = NULL; > > v->glsl_version = original->glsl_version; > > v->native_integers = original->native_integers; > >+ v->temp_array_supported = original->temp_array_supported; > > v->options = original->options; > > v->next_temp = original->next_temp; > > v->num_address_regs = original->num_address_regs; > >@@ -3821,6 +3831,7 @@ get_bitmap_visitor(struct st_fragment_program *fp, > > v->shader_program = NULL; > > v->glsl_version = original->glsl_version; > > v->native_integers = original->native_integers; > >+ v->temp_array_supported = original->temp_array_supported; > > v->options = original->options; > > v->next_temp = original->next_temp; > > v->num_address_regs = original->num_address_regs; > >@@ -3887,6 +3898,7 @@ struct st_translate { > > struct ureg_program *ureg; > > > > struct ureg_dst temps[MAX_TEMPS]; > >+ struct ureg_dst array_temps[MAX_TEMPS]; > > struct ureg_src *constants; > > struct ureg_src *immediates; > > struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; > >@@ -4030,6 +4042,11 @@ dst_register(struct st_translate *t, > > case PROGRAM_ADDRESS: > > return t->address[index]; > > > >+ case PROGRAM_ARRAY: > >+ if (ureg_dst_is_undef(t->array_temps[index])) > >+ t->array_temps[index] = ureg_DECL_temporary_array(t->ureg, index); > >+ return t->array_temps[index]; > >+ > > default: > > assert(!"unknown dst register file"); > > return ureg_dst_undef(); > >@@ -4085,6 +4102,12 @@ src_register(struct st_translate *t, > > assert(index< (int) Elements(t->systemValues)); > > return t->systemValues[index]; > > > >+ case PROGRAM_ARRAY: > >+ assert(index< (int) Elements(t->array_temps)); > >+ if (ureg_dst_is_undef(t->array_temps[index])) > >+ t->array_temps[index] = ureg_DECL_temporary_array(t->ureg, index); > >+ return ureg_src(t->array_temps[index]); > >+ > > default: > > assert(!"unknown src register file"); > > return ureg_src_undef(); > >@@ -4684,7 +4707,6 @@ st_translate_program( > > * (Note: the number of temporaries is equal to program->next_temp) > > */ > > for (i = 0; i< (unsigned)program->next_temp; i++) { > >- /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */ > > t->temps[i] = ureg_DECL_local_temporary(t->ureg); > > } > > } > >@@ -4816,19 +4838,24 @@ get_mesa_program(struct gl_context *ctx, > > bool progress; > > struct gl_shader_compiler_options *options = > > > > &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)]; > >+ struct pipe_screen *pscreen = st_context(ctx)->pipe->screen; > >+ unsigned processor_type; > > > > switch (shader->Type) { > > case GL_VERTEX_SHADER: > > target = GL_VERTEX_PROGRAM_ARB; > > target_string = "vertex"; > >+ processor_type = PIPE_SHADER_VERTEX; > > break; > > case GL_FRAGMENT_SHADER: > > target = GL_FRAGMENT_PROGRAM_ARB; > > target_string = "fragment"; > >+ processor_type = PIPE_SHADER_FRAGMENT; > > break; > > case GL_GEOMETRY_SHADER: > > target = GL_GEOMETRY_PROGRAM_NV; > > target_string = "geometry"; > >+ processor_type = PIPE_SHADER_GEOMETRY; > > break; > > default: > > assert(!"should not be reached"); > >@@ -4848,6 +4875,8 @@ get_mesa_program(struct gl_context *ctx, > > v->options = options; > > v->glsl_version = ctx->Const.GLSLVersion; > > v->native_integers = ctx->Const.NativeIntegers; > >+ v->temp_array_supported = pscreen->get_shader_param(pscreen, > >processor_type, > >+ > >PIPE_SHADER_CAP_INDIRECT_TEMP_ARRAY_ADDR ); > > > > _mesa_generate_parameters_list_for_uniforms(shader_program, shader, > > prog->Parameters); > > Reviewed-by: Brian Paul <bri...@vmware.com> > > Patch 4 looks OK too, but I'm not an r600 person. > > -Brian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev