linker: Calculate the sampler to texture target mapping during linking
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 15 Nov 2011 02:12:16 +0000 (18:12 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 11 Jan 2012 20:51:24 +0000 (12:51 -0800)
Track the calculated data in gl_shader_program instead of the
individual assembly shaders.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_uniforms.cpp
src/mesa/main/ff_fragment_shader.cpp
src/mesa/main/mtypes.h
src/mesa/main/uniform_query.cpp
src/mesa/main/uniforms.c
src/mesa/main/uniforms.h
src/mesa/program/ir_to_mesa.cpp
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index b331db705cf8f433daa8731cc7674e6900374aa1..47d34cf0b7906054a3f095a705e0014d0a739148 100644 (file)
@@ -209,7 +209,7 @@ public:
                              union gl_constant_value *values)
       : map(map), uniforms(uniforms), next_sampler(0), values(values)
    {
-      /* empty */
+      memset(this->targets, 0, sizeof(this->targets));
    }
 
 private:
@@ -249,6 +249,14 @@ private:
          * array elements for arrays.
          */
         this->next_sampler += MAX2(1, this->uniforms[id].array_elements);
+
+        const gl_texture_index target = base_type->sampler_index();
+        for (unsigned i = this->uniforms[id].sampler
+                ; i < this->next_sampler
+                ; i++) {
+           this->targets[i] = target;
+        }
+
       } else {
         this->uniforms[id].sampler = ~0;
       }
@@ -270,6 +278,8 @@ private:
 
 public:
    union gl_constant_value *values;
+
+   gl_texture_index targets[MAX_SAMPLERS];
 };
 
 void
@@ -361,6 +371,9 @@ link_assign_uniform_locations(struct gl_shader_program *prog)
       }
    }
 
+   assert(sizeof(prog->SamplerTargets) == sizeof(parcel.targets));
+   memcpy(prog->SamplerTargets, parcel.targets, sizeof(prog->SamplerTargets));
+
 #ifndef NDEBUG
    for (unsigned i = 0; i < num_user_uniforms; i++) {
       assert(uniforms[i].storage != NULL);
index 165230c13b1c4b80afb2a0a407a215a8d9a1547b..3596a3d3e0cecc410a000d45be1aace61e1400b5 100644 (file)
@@ -1540,7 +1540,7 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
         _mesa_propagate_uniforms_to_driver_storage(storage, 0, 1);
       }
    }
-   _mesa_update_shader_textures_used(fp);
+   _mesa_update_shader_textures_used(p.shader_program, fp);
    (void) ctx->Driver.ProgramStringNotify(ctx, fp->Target, fp);
 
    if (!p.shader_program->LinkStatus)
index aca47379ca161df1aa637d85c4beda5547bc9419..25597950ede93685a2bc6a393c7fee5caad5a9dc 100644 (file)
@@ -1894,8 +1894,6 @@ struct gl_program
 
    /** Map from sampler unit to texture unit (set by glUniform1i()) */
    GLubyte SamplerUnits[MAX_SAMPLERS];
-   /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */
-   gl_texture_index SamplerTargets[MAX_SAMPLERS];
 
    /** Bitmask of which register files are read/written with indirect
     * addressing.  Mask of (1 << PROGRAM_x) bits.
index a5a85cd9c1324c11230dfc289e8902ea64820b53..d156cae5050c115becb4245c9a59016ef14d4120 100644 (file)
@@ -728,7 +728,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
                   shProg->SamplerUnits,
                   sizeof(shProg->SamplerUnits));
 
-           _mesa_update_shader_textures_used(prog);
+           _mesa_update_shader_textures_used(shProg, prog);
            (void) ctx->Driver.ProgramStringNotify(ctx, prog->Target, prog);
         }
       }
index 685c0f13fcf2e2ab27745049a1d41ea70d774ac0..e0214a88a7a76a3854262d8828f760ef0e81bf8c 100644 (file)
@@ -60,7 +60,8 @@
  * We'll use that info for state validation before rendering.
  */
 void
-_mesa_update_shader_textures_used(struct gl_program *prog)
+_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
+                                 struct gl_program *prog)
 {
    GLuint s;
 
@@ -68,8 +69,8 @@ _mesa_update_shader_textures_used(struct gl_program *prog)
 
    for (s = 0; s < MAX_SAMPLERS; s++) {
       if (prog->SamplersUsed & (1 << s)) {
-         GLuint unit = prog->SamplerUnits[s];
-         GLuint tgt = prog->SamplerTargets[s];
+         GLuint unit = shProg->SamplerUnits[s];
+         GLuint tgt = shProg->SamplerTargets[s];
          assert(unit < Elements(prog->TexturesUsed));
          assert(tgt < NUM_TEXTURE_TARGETS);
          prog->TexturesUsed[unit] |= (1 << tgt);
index f796f82766ed5cf6e61ca2b92907f23d32f41f8b..7b512a527597b5fd0d7a246ce3453936f53a7f4c 100644 (file)
@@ -212,7 +212,8 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
                                           unsigned count);
 
 extern void
-_mesa_update_shader_textures_used(struct gl_program *prog);
+_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
+                                 struct gl_program *prog);
 
 extern bool
 _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
index 5a68fc51d084881fee177103956aa491ffcc5d0d..8280efefe822dd9078ada72d0441a4da28ad8b84 100644 (file)
@@ -2496,7 +2496,7 @@ print_program(struct prog_instruction *mesa_instructions,
  * samplers, etc).
  */
 static void
-count_resources(struct gl_program *prog)
+count_resources(struct gl_shader_program *shProg, struct gl_program *prog)
 {
    unsigned int i;
 
@@ -2506,8 +2506,6 @@ count_resources(struct gl_program *prog)
       struct prog_instruction *inst = &prog->Instructions[i];
 
       if (_mesa_is_tex_instruction(inst->Opcode)) {
-        prog->SamplerTargets[inst->TexSrcUnit] =
-           (gl_texture_index)inst->TexSrcTarget;
         prog->SamplersUsed |= 1 << inst->TexSrcUnit;
         if (inst->TexShadow) {
            prog->ShadowSamplers |= 1 << inst->TexSrcUnit;
@@ -2515,7 +2513,7 @@ count_resources(struct gl_program *prog)
       }
    }
 
-   _mesa_update_shader_textures_used(prog);
+   _mesa_update_shader_textures_used(shProg, prog);
 }
 
 class add_uniform_to_shader : public uniform_field_visitor {
@@ -3197,7 +3195,7 @@ get_mesa_program(struct gl_context *ctx,
    mesa_instructions = NULL;
 
    do_set_program_inouts(shader->ir, prog, shader->Type == GL_FRAGMENT_SHADER);
-   count_resources(prog);
+   count_resources(shader_program, prog);
 
    /* Set the gl_FragDepth layout. */
    if (target == GL_FRAGMENT_PROGRAM_ARB) {
index 555f88bc2d92fd7f3fab9d0dc64e9735346e1cc6..f5bee013d1e70249677108bded1df6bd857e8d01 100644 (file)
@@ -2843,8 +2843,6 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
       if (is_tex_instruction(inst->op)) {
          v->samplers_used |= 1 << inst->sampler;
 
-         prog->SamplerTargets[inst->sampler] =
-            (gl_texture_index)inst->tex_target;
          if (inst->tex_shadow) {
             prog->ShadowSamplers |= 1 << inst->sampler;
          }
@@ -2852,7 +2850,9 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
    }
    
    prog->SamplersUsed = v->samplers_used;
-   _mesa_update_shader_textures_used(prog);
+
+   if (v->shader_program != NULL)
+      _mesa_update_shader_textures_used(v->shader_program, prog);
 }
 
 static void