projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
glsl: don't demote tess control shader outputs
[mesa.git]
/
src
/
glsl
/
lower_output_reads.cpp
diff --git
a/src/glsl/lower_output_reads.cpp
b/src/glsl/lower_output_reads.cpp
index 5ba9720d0dc36239a15b24bf5ed20461a6cacdc5..79488df2932da251db0baae0bbfcf8b2683da955 100644
(file)
--- a/
src/glsl/lower_output_reads.cpp
+++ b/
src/glsl/lower_output_reads.cpp
@@
-37,6
+37,8
@@
* main() function to copy the final values to the actual shader outputs.
*/
* main() function to copy the final values to the actual shader outputs.
*/
+namespace {
+
class output_read_remover : public ir_hierarchical_visitor {
protected:
/**
class output_read_remover : public ir_hierarchical_visitor {
protected:
/**
@@
-46,15
+48,19
@@
protected:
hash_table *replacements;
void *mem_ctx;
hash_table *replacements;
void *mem_ctx;
+
+ unsigned stage;
public:
public:
- output_read_remover();
+ output_read_remover(
unsigned stage
);
~output_read_remover();
virtual ir_visitor_status visit(class ir_dereference_variable *);
~output_read_remover();
virtual ir_visitor_status visit(class ir_dereference_variable *);
- virtual ir_visitor_status visit(class ir_emit_vertex *);
+ virtual ir_visitor_status visit
_leave
(class ir_emit_vertex *);
virtual ir_visitor_status visit_leave(class ir_return *);
virtual ir_visitor_status visit_leave(class ir_function_signature *);
};
virtual ir_visitor_status visit_leave(class ir_return *);
virtual ir_visitor_status visit_leave(class ir_function_signature *);
};
+} /* anonymous namespace */
+
/**
* Hash function for the output variables - computes the hash of the name.
* NOTE: We're using the name string to ensure that the hash doesn't depend
/**
* Hash function for the output variables - computes the hash of the name.
* NOTE: We're using the name string to ensure that the hash doesn't depend
@@
-71,8
+77,9
@@
hash_table_var_hash(const void *key)
return hash_table_string_hash(var->name);
}
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);
mem_ctx = ralloc_context(NULL);
replacements =
hash_table_ctor(0, hash_table_var_hash, hash_table_pointer_compare);
@@
-87,7
+94,9
@@
output_read_remover::~output_read_remover()
ir_visitor_status
output_read_remover::visit(ir_dereference_variable *ir)
{
ir_visitor_status
output_read_remover::visit(ir_dereference_variable *ir)
{
- if (ir->var->mode != ir_var_shader_out)
+ 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);
return visit_continue;
ir_variable *temp = (ir_variable *) hash_table_find(replacements, ir->var);
@@
-144,7
+153,7
@@
output_read_remover::visit_leave(ir_return *ir)
}
ir_visitor_status
}
ir_visitor_status
-output_read_remover::visit(ir_emit_vertex *ir)
+output_read_remover::visit
_leave
(ir_emit_vertex *ir)
{
hash_table_call_foreach(replacements, emit_return_copy, ir);
hash_table_clear(replacements);
{
hash_table_call_foreach(replacements, emit_return_copy, ir);
hash_table_clear(replacements);
@@
-162,8
+171,8
@@
output_read_remover::visit_leave(ir_function_signature *sig)
}
void
}
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);
}
visit_list_elements(&v, instructions);
}