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; + } + 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); -- 1.7.11.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev