linker: Calculate the sampler to texture target mapping during linking
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>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user