Przeglądaj źródła

glsl: Track in each ir_variable whether it was ever assigned.

This will be used for some compile-and-link-time error checking, where
currently we've been doing error checking only at link time.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
tags/i965-primitive-restart-v2
Eric Anholt 13 lat temu
rodzic
commit
f2475ca424
3 zmienionych plików z 33 dodań i 13 usunięć
  1. 16
    13
      src/glsl/ast_function.cpp
  2. 4
    0
      src/glsl/ast_to_hir.cpp
  3. 13
    0
      src/glsl/ir.h

+ 16
- 13
src/glsl/ast_function.cpp Wyświetl plik

@@ -152,19 +152,22 @@ verify_parameter_modes(_mesa_glsl_parse_state *state,
return false;
}

if (actual->variable_referenced()
&& actual->variable_referenced()->read_only) {
_mesa_glsl_error(&loc, state,
"function parameter '%s %s' references the "
"read-only variable '%s'",
mode, formal->name,
actual->variable_referenced()->name);
return false;
} else if (!actual->is_lvalue()) {
_mesa_glsl_error(&loc, state,
"function parameter '%s %s' is not an lvalue",
mode, formal->name);
return false;
ir_variable *var = actual->variable_referenced();
if (var) {
if (var->read_only) {
_mesa_glsl_error(&loc, state,
"function parameter '%s %s' references the "
"read-only variable '%s'",
mode, formal->name,
actual->variable_referenced()->name);
return false;
} else if (!actual->is_lvalue()) {
_mesa_glsl_error(&loc, state,
"function parameter '%s %s' is not an lvalue",
mode, formal->name);
return false;
}
var->assigned = true;
}
}


+ 4
- 0
src/glsl/ast_to_hir.cpp Wyświetl plik

@@ -672,6 +672,10 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
void *ctx = state;
bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());

ir_variable *lhs_var = lhs->variable_referenced();
if (lhs_var)
lhs_var->assigned = true;

if (!error_emitted) {
if (non_lvalue_description != NULL) {
_mesa_glsl_error(&lhs_loc, state,

+ 13
- 0
src/glsl/ir.h Wyświetl plik

@@ -353,9 +353,22 @@ public:
* Several GLSL semantic checks require knowledge of whether or not a
* variable has been used. For example, it is an error to redeclare a
* variable as invariant after it has been used.
*
* This is only maintained in the ast_to_hir.cpp path, not in
* Mesa's fixed function or ARB program paths.
*/
unsigned used:1;

/**
* Has this variable been statically assigned?
*
* This answers whether the variable was assigned in any path of
* the shader during ast_to_hir. This doesn't answer whether it is
* still written after dead code removal, nor is it maintained in
* non-ast_to_hir.cpp (GLSL parsing) paths.
*/
unsigned assigned:1;

/**
* Storage class of the variable.
*

Ładowanie…
Anuluj
Zapisz