diff options
author | Eric Anholt <eric@anholt.net> | 2012-11-21 13:23:36 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2013-03-06 16:50:56 -0800 |
commit | 3d80d54bc948a8ef278fff04110e2b018afaa6da (patch) | |
tree | f00b9b317b376463dcc5ec4eb92791d2c9a68c3c | |
parent | 205f537b5afa836e360ff2ee506645f5c4b57c18 (diff) |
i965: Add texrect scale parameters before pointers to ParameterValues.
If adding scale parameters during program compile caused a realloc of
ParameterValues, then the driver uniform storage set up by
_mesa_associate_uniform_storage() would point to potentially freed
memory.
Note that this uses TexturesUsed, which may change at runtime for GLSL
when sampler uniforms change. This is a flaw in our handling of texrect
in general, and not one I'm fixing currently.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
(cherry picked from commit ffdfafb06cf3ae468ceb3e504365016347f54bee)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47169
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_program.c | 21 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_program.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_shader.cpp | 2 |
3 files changed, 24 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index 0bf72d9b5c..c1e3657f54 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -225,9 +225,30 @@ brwProgramStringNotify(struct gl_context *ctx, } } + brw_add_texrect_params(prog); + return true; } +void +brw_add_texrect_params(struct gl_program *prog) +{ + for (int texunit = 0; texunit < BRW_MAX_TEX_UNIT; texunit++) { + if (!(prog->TexturesUsed[texunit] & (1 << TEXTURE_RECT_INDEX))) + continue; + + int tokens[STATE_LENGTH] = { + STATE_INTERNAL, + STATE_TEXRECT_SCALE, + texunit, + 0, + 0 + }; + + _mesa_add_state_reference(prog->Parameters, (gl_state_index *)tokens); + } +} + /* Per-thread scratch space is a power-of-two multiple of 1KB. */ int brw_get_scratch_size(int size) diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h index 10022d48cb..182177527d 100644 --- a/src/mesa/drivers/dri/i965/brw_program.h +++ b/src/mesa/drivers/dri/i965/brw_program.h @@ -47,5 +47,6 @@ void brw_populate_sampler_prog_key_data(struct gl_context *ctx, struct brw_sampler_prog_key_data *key); bool brw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key, const struct brw_sampler_prog_key_data *key); +void brw_add_texrect_params(struct gl_program *prog); #endif diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index edb44300d4..1a90bbe56a 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -204,6 +204,8 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) _mesa_reference_program(ctx, &shader->base.Program, prog); + brw_add_texrect_params(prog); + /* This has to be done last. Any operation that can cause * prog->ParameterValues to get reallocated (e.g., anything that adds a * program constant) has to happen before creating this linkage. |