summaryrefslogtreecommitdiffstats
path: root/src/mesa/program
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-07-27 15:10:38 -0700
committerEric Anholt <[email protected]>2010-07-27 15:10:38 -0700
commit9a670c2e9b7e07ba43d175f3bfb23951296794c4 (patch)
tree07587f7d985e2825a5b6e8f79fb4e1e1ca781958 /src/mesa/program
parent59c45e9e6cf80be149c6e5d94763e98312f49be2 (diff)
ir_to_mesa: Provide a restricted type size to _mesa_add_uniform.
Fixes: glsl-uniform-out-of-bounds.
Diffstat (limited to 'src/mesa/program')
-rw-r--r--src/mesa/program/ir_to_mesa.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index bd79913dcf4..fe0c19acea0 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -1061,6 +1061,7 @@ ir_to_mesa_visitor::visit(ir_dereference_variable *ir)
ir_to_mesa_src_reg src_reg;
variable_storage *entry = find_variable_storage(ir->var);
unsigned int loc;
+ int len;
if (!entry) {
switch (ir->var->mode) {
@@ -1089,9 +1090,17 @@ ir_to_mesa_visitor::visit(ir_dereference_variable *ir)
assert(ir->var->type->gl_type != 0 &&
ir->var->type->gl_type != GL_INVALID_ENUM);
+
+ if (ir->var->type->is_vector() ||
+ ir->var->type->is_scalar()) {
+ len = ir->var->type->vector_elements;
+ } else {
+ len = type_size(ir->var->type) * 4;
+ }
+
loc = _mesa_add_uniform(this->prog->Parameters,
ir->var->name,
- type_size(ir->var->type) * 4,
+ len,
ir->var->type->gl_type,
NULL);