aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/glsl/ast_function.cpp
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2011-08-09 08:25:48 +0200
committermarha <marha@users.sourceforge.net>2011-08-09 08:25:48 +0200
commit8a2c8f93072dc4c9a1f9275b09ac3f2af481f56a (patch)
tree24b60778dfbd64e217b8b08ae4ce465687128d80 /mesalib/src/glsl/ast_function.cpp
parentf8e53281a55d43ae1b17f848f28579d74d877835 (diff)
parent93ed12672618a2e321cb79a3b3a656aae63d6beb (diff)
downloadvcxsrv-8a2c8f93072dc4c9a1f9275b09ac3f2af481f56a.tar.gz
vcxsrv-8a2c8f93072dc4c9a1f9275b09ac3f2af481f56a.tar.bz2
vcxsrv-8a2c8f93072dc4c9a1f9275b09ac3f2af481f56a.zip
Merge remote-tracking branch 'origin/released'
Conflicts: X11/extensions/randr.h mesalib/src/glsl/ast_function.cpp mesalib/src/glsl/ast_to_hir.cpp mesalib/src/glsl/glsl_parser_extras.h mesalib/src/glsl/link_functions.cpp mesalib/src/glsl/linker.cpp mesalib/src/mesa/state_tracker/st_program.c
Diffstat (limited to 'mesalib/src/glsl/ast_function.cpp')
-rw-r--r--mesalib/src/glsl/ast_function.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/mesalib/src/glsl/ast_function.cpp b/mesalib/src/glsl/ast_function.cpp
index 463db9499..adb88706f 100644
--- a/mesalib/src/glsl/ast_function.cpp
+++ b/mesalib/src/glsl/ast_function.cpp
@@ -125,7 +125,7 @@ match_function_by_name(exec_list *instructions, const char *name,
if (f == NULL) {
f = new(ctx) ir_function(name);
state->symbols->add_global_function(f);
- emit_function(state, instructions, f);
+ emit_function(state, f);
}
f->add_signature(sig->clone_prototype(f, NULL));
@@ -199,6 +199,20 @@ match_function_by_name(exec_list *instructions, const char *name,
*/
ir_call *call = new(ctx) ir_call(sig, actual_parameters);
if (!sig->return_type->is_void()) {
+ /* If the function call is a constant expression, don't
+ * generate the instructions to call it; just generate an
+ * ir_constant representing the constant value.
+ *
+ * Function calls can only be constant expressions starting
+ * in GLSL 1.20.
+ */
+ if (state->language_version >= 120) {
+ ir_constant *const_val = call->constant_expression_value();
+ if (const_val) {
+ return const_val;
+ }
+ }
+
ir_variable *var;
ir_dereference_variable *deref;
@@ -211,8 +225,6 @@ match_function_by_name(exec_list *instructions, const char *name,
deref = new(ctx) ir_dereference_variable(var);
ir_assignment *assign = new(ctx) ir_assignment(deref, call, NULL);
instructions->push_tail(assign);
- if (state->language_version >= 120)
- var->constant_value = call->constant_expression_value();
deref = new(ctx) ir_dereference_variable(var);
return deref;