mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 10:40:11 +01:00
i965: Index sampler program key data by linker-assigned index.
Now that most things are based on the linker-assigned index, it makes sense to convert the arrays in the VS/WM program key as well. It seems silly to leave them indexed by texture unit. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
ab17762c70
commit
f3d0daf7ea
6 changed files with 30 additions and 30 deletions
|
|
@ -2178,7 +2178,7 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||
|
||||
key.clamp_fragment_color = true;
|
||||
|
||||
for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
|
||||
for (int i = 0; i < MAX_SAMPLERS; i++) {
|
||||
/* FINISHME: depth compares might use (0,0,0,W) for example */
|
||||
key.tex.swizzles[i] = SWIZZLE_XYZW;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ public:
|
|||
fs_reg *emit_general_interpolation(ir_variable *ir);
|
||||
void emit_interpolation_setup_gen4();
|
||||
void emit_interpolation_setup_gen6();
|
||||
fs_reg emit_texcoord(ir_texture *ir, int sampler);
|
||||
fs_reg emit_texcoord(ir_texture *ir, int sampler, int texunit);
|
||||
fs_inst *emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
|
||||
fs_reg shadow_comp, fs_reg lod, fs_reg lod2);
|
||||
fs_inst *emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
|
||||
|
|
|
|||
|
|
@ -1166,7 +1166,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
|
|||
* setting this->result).
|
||||
*/
|
||||
fs_reg
|
||||
fs_visitor::emit_texcoord(ir_texture *ir, int texunit)
|
||||
fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit)
|
||||
{
|
||||
fs_inst *inst = NULL;
|
||||
|
||||
|
|
@ -1186,8 +1186,8 @@ fs_visitor::emit_texcoord(ir_texture *ir, int texunit)
|
|||
*/
|
||||
if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_RECT &&
|
||||
(intel->gen < 6 ||
|
||||
(intel->gen >= 6 && (c->key.tex.gl_clamp_mask[0] & (1 << texunit) ||
|
||||
c->key.tex.gl_clamp_mask[1] & (1 << texunit))))) {
|
||||
(intel->gen >= 6 && (c->key.tex.gl_clamp_mask[0] & (1 << sampler) ||
|
||||
c->key.tex.gl_clamp_mask[1] & (1 << sampler))))) {
|
||||
struct gl_program_parameter_list *params = c->fp->program.Base.Parameters;
|
||||
int tokens[STATE_LENGTH] = {
|
||||
STATE_INTERNAL,
|
||||
|
|
@ -1239,7 +1239,7 @@ fs_visitor::emit_texcoord(ir_texture *ir, int texunit)
|
|||
needs_gl_clamp = false;
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (c->key.tex.gl_clamp_mask[i] & (1 << texunit)) {
|
||||
if (c->key.tex.gl_clamp_mask[i] & (1 << sampler)) {
|
||||
fs_reg chan = coordinate;
|
||||
chan.reg_offset += i;
|
||||
|
||||
|
|
@ -1265,7 +1265,7 @@ fs_visitor::emit_texcoord(ir_texture *ir, int texunit)
|
|||
if (ir->coordinate && needs_gl_clamp) {
|
||||
for (unsigned int i = 0;
|
||||
i < MIN2(ir->coordinate->type->vector_elements, 3); i++) {
|
||||
if (c->key.tex.gl_clamp_mask[i] & (1 << texunit)) {
|
||||
if (c->key.tex.gl_clamp_mask[i] & (1 << sampler)) {
|
||||
fs_reg chan = coordinate;
|
||||
chan.reg_offset += i;
|
||||
|
||||
|
|
@ -1292,7 +1292,7 @@ fs_visitor::visit(ir_texture *ir)
|
|||
* done before loading any values into MRFs for the sampler message since
|
||||
* generating these values may involve SEND messages that need the MRFs.
|
||||
*/
|
||||
fs_reg coordinate = emit_texcoord(ir, texunit);
|
||||
fs_reg coordinate = emit_texcoord(ir, sampler, texunit);
|
||||
|
||||
fs_reg shadow_comparitor;
|
||||
if (ir->shadow_comparitor) {
|
||||
|
|
@ -1350,7 +1350,7 @@ fs_visitor::visit(ir_texture *ir)
|
|||
if (ir->shadow_comparitor)
|
||||
inst->shadow_compare = true;
|
||||
|
||||
swizzle_result(ir, dst, texunit);
|
||||
swizzle_result(ir, dst, sampler);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1358,7 +1358,7 @@ fs_visitor::visit(ir_texture *ir)
|
|||
* EXT_texture_swizzle as well as DEPTH_TEXTURE_MODE for shadow comparisons.
|
||||
*/
|
||||
void
|
||||
fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, int texunit)
|
||||
fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, int sampler)
|
||||
{
|
||||
this->result = orig_val;
|
||||
|
||||
|
|
@ -1368,11 +1368,11 @@ fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, int texunit)
|
|||
if (ir->type == glsl_type::float_type) {
|
||||
/* Ignore DEPTH_TEXTURE_MODE swizzling. */
|
||||
assert(ir->sampler->type->sampler_shadow);
|
||||
} else if (c->key.tex.swizzles[texunit] != SWIZZLE_NOOP) {
|
||||
} else if (c->key.tex.swizzles[sampler] != SWIZZLE_NOOP) {
|
||||
fs_reg swizzled_result = fs_reg(this, glsl_type::vec4_type);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
int swiz = GET_SWZ(c->key.tex.swizzles[texunit], i);
|
||||
int swiz = GET_SWZ(c->key.tex.swizzles[sampler], i);
|
||||
fs_reg l = swizzled_result;
|
||||
l.reg_offset += i;
|
||||
|
||||
|
|
@ -1382,7 +1382,7 @@ fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, int texunit)
|
|||
emit(BRW_OPCODE_MOV, l, fs_reg(1.0f));
|
||||
} else {
|
||||
fs_reg r = orig_val;
|
||||
r.reg_offset += GET_SWZ(c->key.tex.swizzles[texunit], i);
|
||||
r.reg_offset += GET_SWZ(c->key.tex.swizzles[sampler], i);
|
||||
emit(BRW_OPCODE_MOV, l, r);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ struct brw_sampler_prog_key_data {
|
|||
/**
|
||||
* EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzles.
|
||||
*/
|
||||
uint16_t swizzles[BRW_MAX_TEX_UNIT];
|
||||
uint16_t swizzles[MAX_SAMPLERS];
|
||||
|
||||
uint16_t gl_clamp_mask[3];
|
||||
|
||||
|
|
|
|||
|
|
@ -1833,7 +1833,6 @@ void
|
|||
vec4_visitor::visit(ir_texture *ir)
|
||||
{
|
||||
int sampler = _mesa_get_sampler_uniform_value(ir->sampler, prog, &vp->Base);
|
||||
int texunit = vp->Base.SamplerUnits[sampler];
|
||||
|
||||
/* Should be lowered by do_lower_texture_projection */
|
||||
assert(!ir->projector);
|
||||
|
|
@ -1999,15 +1998,15 @@ vec4_visitor::visit(ir_texture *ir)
|
|||
|
||||
emit(inst);
|
||||
|
||||
swizzle_result(ir, src_reg(inst->dst), texunit);
|
||||
swizzle_result(ir, src_reg(inst->dst), sampler);
|
||||
}
|
||||
|
||||
void
|
||||
vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, int texunit)
|
||||
vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, int sampler)
|
||||
{
|
||||
this->result = orig_val;
|
||||
|
||||
int s = c->key.tex.swizzles[texunit];
|
||||
int s = c->key.tex.swizzles[sampler];
|
||||
|
||||
if (ir->op == ir_txs || ir->type == glsl_type::float_type
|
||||
|| s == SWIZZLE_NOOP)
|
||||
|
|
|
|||
|
|
@ -364,7 +364,7 @@ brw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key,
|
|||
{
|
||||
bool found = false;
|
||||
|
||||
for (unsigned int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
|
||||
for (unsigned int i = 0; i < MAX_SAMPLERS; i++) {
|
||||
found |= key_debug("EXT_texture_swizzle or DEPTH_TEXTURE_MODE",
|
||||
old_key->swizzles[i], key->swizzles[i]);
|
||||
}
|
||||
|
|
@ -436,18 +436,19 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
|
|||
const struct gl_program *prog,
|
||||
struct brw_sampler_prog_key_data *key)
|
||||
{
|
||||
for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
|
||||
key->swizzles[i] = SWIZZLE_NOOP;
|
||||
for (int s = 0; s < MAX_SAMPLERS; s++) {
|
||||
key->swizzles[s] = SWIZZLE_NOOP;
|
||||
|
||||
if (!prog->TexturesUsed[i])
|
||||
if (!(prog->SamplersUsed & (1 << s)))
|
||||
continue;
|
||||
|
||||
const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
|
||||
int unit_id = prog->SamplerUnits[s];
|
||||
const struct gl_texture_unit *unit = &ctx->Texture.Unit[unit_id];
|
||||
|
||||
if (unit->_ReallyEnabled && unit->_Current->Target != GL_TEXTURE_BUFFER) {
|
||||
const struct gl_texture_object *t = unit->_Current;
|
||||
const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
|
||||
struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, i);
|
||||
struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit_id);
|
||||
int swizzles[SWIZZLE_NIL + 1] = {
|
||||
SWIZZLE_X,
|
||||
SWIZZLE_Y,
|
||||
|
|
@ -493,12 +494,12 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
|
|||
}
|
||||
|
||||
if (img->InternalFormat == GL_YCBCR_MESA) {
|
||||
key->yuvtex_mask |= 1 << i;
|
||||
key->yuvtex_mask |= 1 << s;
|
||||
if (img->TexFormat == MESA_FORMAT_YCBCR)
|
||||
key->yuvtex_swap_mask |= 1 << i;
|
||||
key->yuvtex_swap_mask |= 1 << s;
|
||||
}
|
||||
|
||||
key->swizzles[i] =
|
||||
key->swizzles[s] =
|
||||
MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
|
||||
swizzles[GET_SWZ(t->_Swizzle, 1)],
|
||||
swizzles[GET_SWZ(t->_Swizzle, 2)],
|
||||
|
|
@ -507,11 +508,11 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
|
|||
if (sampler->MinFilter != GL_NEAREST &&
|
||||
sampler->MagFilter != GL_NEAREST) {
|
||||
if (sampler->WrapS == GL_CLAMP)
|
||||
key->gl_clamp_mask[0] |= 1 << i;
|
||||
key->gl_clamp_mask[0] |= 1 << s;
|
||||
if (sampler->WrapT == GL_CLAMP)
|
||||
key->gl_clamp_mask[1] |= 1 << i;
|
||||
key->gl_clamp_mask[1] |= 1 << s;
|
||||
if (sampler->WrapR == GL_CLAMP)
|
||||
key->gl_clamp_mask[2] |= 1 << i;
|
||||
key->gl_clamp_mask[2] |= 1 << s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue