Browse Source

i965: Move loop over texture units into brw_populate_sampler_prog_key.

The whole reason I avoided this was because it might operate on a
brw_vertex_program or a brw_fragment_program.  However, that isn't a
problem: all we need is the gl_program base type.

This avoids awkwardly passing the loop counter 'i' as a parameter,
simplifies both callers, and also plumbs prog in place for future use.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
tags/rgb10_a2ui-v3
Kenneth Graunke 13 years ago
parent
commit
fe911c1d43

+ 2
- 1
src/mesa/drivers/dri/i965/brw_program.h View File

@@ -43,6 +43,7 @@ struct brw_sampler_prog_key_data {
};

void brw_populate_sampler_prog_key_data(struct gl_context *ctx,
struct brw_sampler_prog_key_data *key, int i);
const struct gl_program *prog,
struct brw_sampler_prog_key_data *key);

#endif

+ 1
- 4
src/mesa/drivers/dri/i965/brw_vs.c View File

@@ -334,10 +334,7 @@ static void brw_upload_vs_prog(struct brw_context *brw)
}

/* _NEW_TEXTURE */
for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
if (prog->TexturesUsed[i])
brw_populate_sampler_prog_key_data(ctx, &key.tex, i);
}
brw_populate_sampler_prog_key_data(ctx, prog, &key.tex);

/* BRW_NEW_VERTICES */
for (i = 0; i < VERT_ATTRIB_MAX; i++) {

+ 78
- 77
src/mesa/drivers/dri/i965/brw_wm.c View File

@@ -345,83 +345,88 @@ bool do_wm_prog(struct brw_context *brw,

void
brw_populate_sampler_prog_key_data(struct gl_context *ctx,
struct brw_sampler_prog_key_data *key,
int i)
const struct gl_program *prog,
struct brw_sampler_prog_key_data *key)
{
const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];

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);
int swizzles[SWIZZLE_NIL + 1] = {
SWIZZLE_X,
SWIZZLE_Y,
SWIZZLE_Z,
SWIZZLE_W,
SWIZZLE_ZERO,
SWIZZLE_ONE,
SWIZZLE_NIL
};

if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
img->_BaseFormat == GL_DEPTH_STENCIL) {
/* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface format
* overrides because shadow comparison always returns the result of
* the comparison in all channels anyway.
*/
switch (sampler->DepthMode) {
case GL_ALPHA:
swizzles[0] = SWIZZLE_ZERO;
swizzles[1] = SWIZZLE_ZERO;
swizzles[2] = SWIZZLE_ZERO;
swizzles[3] = SWIZZLE_X;
break;
case GL_LUMINANCE:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_X;
swizzles[2] = SWIZZLE_X;
swizzles[3] = SWIZZLE_ONE;
break;
case GL_INTENSITY:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_X;
swizzles[2] = SWIZZLE_X;
swizzles[3] = SWIZZLE_X;
break;
case GL_RED:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_ZERO;
swizzles[2] = SWIZZLE_ZERO;
swizzles[3] = SWIZZLE_ONE;
break;
for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
if (!prog->TexturesUsed[i])
continue;

const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];

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);
int swizzles[SWIZZLE_NIL + 1] = {
SWIZZLE_X,
SWIZZLE_Y,
SWIZZLE_Z,
SWIZZLE_W,
SWIZZLE_ZERO,
SWIZZLE_ONE,
SWIZZLE_NIL
};

if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
img->_BaseFormat == GL_DEPTH_STENCIL) {
/* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface
* format overrides because shadow comparison always returns the
* result of the comparison in all channels anyway.
*/
switch (sampler->DepthMode) {
case GL_ALPHA:
swizzles[0] = SWIZZLE_ZERO;
swizzles[1] = SWIZZLE_ZERO;
swizzles[2] = SWIZZLE_ZERO;
swizzles[3] = SWIZZLE_X;
break;
case GL_LUMINANCE:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_X;
swizzles[2] = SWIZZLE_X;
swizzles[3] = SWIZZLE_ONE;
break;
case GL_INTENSITY:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_X;
swizzles[2] = SWIZZLE_X;
swizzles[3] = SWIZZLE_X;
break;
case GL_RED:
swizzles[0] = SWIZZLE_X;
swizzles[1] = SWIZZLE_ZERO;
swizzles[2] = SWIZZLE_ZERO;
swizzles[3] = SWIZZLE_ONE;
break;
}
}
}

if (img->InternalFormat == GL_YCBCR_MESA) {
key->yuvtex_mask |= 1 << i;
if (img->TexFormat == MESA_FORMAT_YCBCR)
key->yuvtex_swap_mask |= 1 << i;
}
if (img->InternalFormat == GL_YCBCR_MESA) {
key->yuvtex_mask |= 1 << i;
if (img->TexFormat == MESA_FORMAT_YCBCR)
key->yuvtex_swap_mask |= 1 << i;
}

key->swizzles[i] =
MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
swizzles[GET_SWZ(t->_Swizzle, 1)],
swizzles[GET_SWZ(t->_Swizzle, 2)],
swizzles[GET_SWZ(t->_Swizzle, 3)]);

if (sampler->MinFilter != GL_NEAREST &&
sampler->MagFilter != GL_NEAREST) {
if (sampler->WrapS == GL_CLAMP)
key->gl_clamp_mask[0] |= 1 << i;
if (sampler->WrapT == GL_CLAMP)
key->gl_clamp_mask[1] |= 1 << i;
if (sampler->WrapR == GL_CLAMP)
key->gl_clamp_mask[2] |= 1 << i;
key->swizzles[i] =
MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
swizzles[GET_SWZ(t->_Swizzle, 1)],
swizzles[GET_SWZ(t->_Swizzle, 2)],
swizzles[GET_SWZ(t->_Swizzle, 3)]);

if (sampler->MinFilter != GL_NEAREST &&
sampler->MagFilter != GL_NEAREST) {
if (sampler->WrapS == GL_CLAMP)
key->gl_clamp_mask[0] |= 1 << i;
if (sampler->WrapT == GL_CLAMP)
key->gl_clamp_mask[1] |= 1 << i;
if (sampler->WrapR == GL_CLAMP)
key->gl_clamp_mask[2] |= 1 << i;
}
}
else {
key->swizzles[i] = SWIZZLE_NOOP;
}
}
else {
key->swizzles[i] = SWIZZLE_NOOP;
}
}

@@ -436,7 +441,6 @@ static void brw_wm_populate_key( struct brw_context *brw,
const struct gl_program *prog = (struct gl_program *) brw->fragment_program;
GLuint lookup = 0;
GLuint line_aa;
GLuint i;

/* As a temporary measure we assume that all programs use dFdy() (and hence
* need to be compiled differently depending on whether we're rendering to
@@ -514,10 +518,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
key->clamp_fragment_color = ctx->Color._ClampFragmentColor;

/* _NEW_TEXTURE */
for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
if (prog->TexturesUsed[i])
brw_populate_sampler_prog_key_data(ctx, &key->tex, i);
}
brw_populate_sampler_prog_key_data(ctx, prog, &key->tex);

/* _NEW_BUFFERS */
/*

Loading…
Cancel
Save