i965: Add texrect scale parameters before pointers to ParameterValues.
authorEric Anholt <eric@anholt.net>
Wed, 21 Nov 2012 21:23:36 +0000 (13:23 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 28 Dec 2012 18:53:33 +0000 (10:53 -0800)
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>
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/i965/brw_program.h
src/mesa/drivers/dri/i965/brw_shader.cpp

index d7b240a8b9c72d3720c8209ce15762184fac2f29..5bfdcca216b5c975b40d2b58bb227e38ccc981ab 100644 (file)
@@ -143,9 +143,30 @@ brwProgramStringNotify(struct gl_context *ctx,
       _tnl_program_string(ctx, target, prog);
    }
 
+   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)
index 10022d48cb429f2897129c632310f088253e8142..182177527d2aa2ba806575a7019d9cbceeef2a85 100644 (file)
@@ -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
index bbde12c38066dd96ffd705990f946df7234373ff..951b5f4fedb0b1fae8668123b34c8281f52b7882 100644 (file)
@@ -208,6 +208,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.