summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2014-07-21 21:59:37 -0400
committerMarek Olšák <[email protected]>2015-07-23 00:59:28 +0200
commit567f1b2ee89bf05f0600e9e79847140555f0a035 (patch)
treea98dcb1c40df75bd078f40788b196ba71edc7a82
parent61846f222fffeba846f9f7277aba9cc7d48323ed (diff)
glsl: pass shader stage to lower_output_reads and handle tess control
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 <[email protected]> Signed-off-by: Chris Forbes <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/glsl/ir_optimization.h2
-rw-r--r--src/glsl/lower_output_reads.cpp13
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.cpp2
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp2
4 files changed, 12 insertions, 7 deletions
diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
index a174c9683a1..766b723df0b 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 1ee815d5ece..79488df2932 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 379ff4a3a1a..9d60543c167 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.cpp
+++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
@@ -316,7 +316,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 b727c5e9c93..0ed16aeab87 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -5674,7 +5674,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);