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 <imirkin@alum.mit.edu>
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ilia Mirkin 2014-07-21 21:59:37 -04:00 committed by Marek Olšák
parent 61846f222f
commit 567f1b2ee8
4 changed files with 12 additions and 7 deletions

View file

@ -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,

View file

@ -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);
}

View file

@ -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);

View file

@ -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);