llvmpipe: Respect pipe_sampler_view::swizzle_r/g/b/a

This allows u_sampler_view_default_dx9_template to do its magic on DX9.
This commit is contained in:
José Fonseca
2010-04-26 00:32:13 +01:00
parent 4dd1a56840
commit 81ab19de04
3 changed files with 63 additions and 1 deletions
@@ -77,6 +77,11 @@ lp_sampler_static_state(struct lp_sampler_static_state *state,
*/
state->format = view->format;
state->swizzle_r = view->swizzle_r;
state->swizzle_g = view->swizzle_g;
state->swizzle_b = view->swizzle_b;
state->swizzle_a = view->swizzle_a;
state->target = texture->target;
state->pot_width = util_is_pot(texture->width0);
state->pot_height = util_is_pot(texture->height0);
@@ -54,8 +54,14 @@ struct lp_build_context;
*/
struct lp_sampler_static_state
{
/* pipe_texture's state */
/* pipe_sampler_view's state */
enum pipe_format format;
unsigned swizzle_r:3;
unsigned swizzle_g:3;
unsigned swizzle_b:3;
unsigned swizzle_a:3;
/* pipe_texture's state */
unsigned target:3;
unsigned pot_width:1;
unsigned pot_height:1;
@@ -185,6 +185,53 @@ texture_dims(enum pipe_texture_target tex)
}
static LLVMValueRef
lp_build_swizzle_chan_soa(struct lp_type type,
const LLVMValueRef *unswizzled,
enum util_format_swizzle swizzle)
{
switch (swizzle) {
case PIPE_SWIZZLE_RED:
case PIPE_SWIZZLE_GREEN:
case PIPE_SWIZZLE_BLUE:
case PIPE_SWIZZLE_ALPHA:
return unswizzled[swizzle];
case PIPE_SWIZZLE_ZERO:
return lp_build_zero(type);
case PIPE_SWIZZLE_ONE:
return lp_build_one(type);
default:
assert(0);
return lp_build_undef(type);
}
}
static void
lp_build_swizzle_soa(struct lp_build_sample_context *bld,
LLVMValueRef *texel)
{
LLVMValueRef unswizzled[4];
unsigned char swizzles[4];
unsigned chan;
for (chan = 0; chan < 4; ++chan) {
unswizzled[chan] = texel[chan];
}
swizzles[0] = bld->static_state->swizzle_r;
swizzles[1] = bld->static_state->swizzle_g;
swizzles[2] = bld->static_state->swizzle_b;
swizzles[3] = bld->static_state->swizzle_a;
for (chan = 0; chan < 4; ++chan) {
unsigned swizzle = swizzles[chan];
texel[chan] = lp_build_swizzle_chan_soa(bld->texel_type,
unswizzled, swizzle);
}
}
/**
* Generate code to fetch a texel from a texture at int coords (x, y, z).
@@ -285,6 +332,8 @@ lp_build_sample_texel_soa(struct lp_build_sample_context *bld,
i, j,
texel);
lp_build_swizzle_soa(bld, texel);
/*
* Note: if we find an app which frequently samples the texture border
* we might want to implement a true conditional here to avoid sampling
@@ -1954,6 +2003,8 @@ lp_build_sample_2d_linear_aos(struct lp_build_sample_context *bld,
lp_build_format_swizzle_soa(bld->format_desc,
bld->texel_type, unswizzled,
texel);
lp_build_swizzle_soa(bld, texel);
}