summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2019-03-01 21:35:41 +1100
committerTimothy Arceri <[email protected]>2019-03-12 14:47:21 +1100
commitcb2898f4786f9e80e0a2dd061d620fc7ced6f1ea (patch)
treea8a02a8fc0b8555b1de06fc0ee0a45b3242207d2
parent02c2863df514cf24ec6464f6daa9f299bcf542e1 (diff)
st/glsl_to_nir: fix incorrect arrary access
This fixes a segfault when we try to access the array using a -1 when the array wasn't allocated in the first place. Before 7536af670b75 we would just access a pre-allocated array that was also load/stored to/from the shader cache. But now the cache will no longer allocate these arrays if they are empty. The change resulted in tests such as the following segfaulting when run with a warm shader cache. tests/spec/arb_arrays_of_arrays/execution/sampler/fs-struct-const-index.shader_test
-rw-r--r--src/mesa/state_tracker/st_glsl_to_nir.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 7b339e9e043..03637299ca4 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -288,13 +288,16 @@ st_nir_assign_uniform_locations(struct gl_context *ctx,
} else {
loc = st_nir_lookup_parameter_index(prog->Parameters, uniform->name);
- if (ctx->Const.PackedDriverUniformStorage) {
+ /* We need to check that loc is not -1 here before accessing the
+ * array. It can be negative for example when we have a struct that
+ * only contains opaque types.
+ */
+ if (loc >= 0 && ctx->Const.PackedDriverUniformStorage) {
loc = prog->Parameters->ParameterValueOffset[loc];
}
}
uniform->data.driver_location = loc;
-
max = MAX2(max, loc + type_size(uniform->type));
}
*size = max;