mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
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:
parent
61846f222f
commit
567f1b2ee8
4 changed files with 12 additions and 7 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue