From: Ilia Mirkin <imir...@alum.mit.edu> Tessellation control outputs can be read in directly without first having been written. Accessing these will require some special logic anyways, so just let them through.
V2: Never lower tess control output reads, whether patch or not -- both can be read back by other threads. Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> Signed-off-by: Chris Forbes <chr...@ijw.co.nz> --- src/glsl/ir_optimization.h | 2 +- src/glsl/lower_output_reads.cpp | 13 +++++++++---- src/mesa/drivers/dri/i965/brw_shader.cpp | 2 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h index a174c96..766b723 100644 --- a/src/glsl/ir_optimization.h +++ b/src/glsl/ir_optimization.h @@ -120,7 +120,7 @@ bool lower_variable_index_to_cond_assign(gl_shader_stage stage, bool lower_quadop_vector(exec_list *instructions, bool dont_lower_swz); bool lower_const_arrays_to_uniforms(exec_list *instructions); bool lower_clip_distance(gl_shader *shader); -void lower_output_reads(exec_list *instructions); +void lower_output_reads(unsigned stage, exec_list *instructions); bool lower_packing_builtins(exec_list *instructions, int op_mask); void lower_ubo_reference(struct gl_shader *shader, exec_list *instructions); void lower_packed_varyings(void *mem_ctx, diff --git a/src/glsl/lower_output_reads.cpp b/src/glsl/lower_output_reads.cpp index 1ee815d..79488df 100644 --- a/src/glsl/lower_output_reads.cpp +++ b/src/glsl/lower_output_reads.cpp @@ -48,8 +48,10 @@ protected: hash_table *replacements; void *mem_ctx; + + unsigned stage; public: - output_read_remover(); + output_read_remover(unsigned stage); ~output_read_remover(); virtual ir_visitor_status visit(class ir_dereference_variable *); virtual ir_visitor_status visit_leave(class ir_emit_vertex *); @@ -75,8 +77,9 @@ hash_table_var_hash(const void *key) return hash_table_string_hash(var->name); } -output_read_remover::output_read_remover() +output_read_remover::output_read_remover(unsigned stage) { + this->stage = stage; mem_ctx = ralloc_context(NULL); replacements = hash_table_ctor(0, hash_table_var_hash, hash_table_pointer_compare); @@ -93,6 +96,8 @@ output_read_remover::visit(ir_dereference_variable *ir) { if (ir->var->data.mode != ir_var_shader_out) return visit_continue; + if (stage == MESA_SHADER_TESS_CTRL) + return visit_continue; ir_variable *temp = (ir_variable *) hash_table_find(replacements, ir->var); @@ -166,8 +171,8 @@ output_read_remover::visit_leave(ir_function_signature *sig) } void -lower_output_reads(exec_list *instructions) +lower_output_reads(unsigned stage, exec_list *instructions) { - output_read_remover v; + output_read_remover v(stage); visit_list_elements(&v, instructions); } diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 8b5bb72..37bba17 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -220,7 +220,7 @@ process_glsl_ir(gl_shader_stage stage, } while (progress); if (options->NirOptions != NULL) - lower_output_reads(shader->ir); + lower_output_reads(stage, shader->ir); validate_ir_tree(shader->ir); diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index e440aef..9d10eef 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5639,7 +5639,7 @@ get_mesa_program(struct gl_context *ctx, prog->Parameters); /* Remove reads from output registers. */ - lower_output_reads(shader->ir); + lower_output_reads(shader->Stage, shader->ir); /* Emit intermediate IR for main(). */ visit_exec_list(shader->ir, v); -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev