gallium: Pass per-element (not per-quad) LOD bias values down to texture sampler.
This commit is contained in:
parent
e313dabdc7
commit
4bfe1c955f
|
@ -1509,7 +1509,7 @@ fetch_texel( struct tgsi_sampler *sampler,
|
|||
const union tgsi_exec_channel *s,
|
||||
const union tgsi_exec_channel *t,
|
||||
const union tgsi_exec_channel *p,
|
||||
float lodbias, /* XXX should be float[4] */
|
||||
const union tgsi_exec_channel *lodbias,
|
||||
union tgsi_exec_channel *r,
|
||||
union tgsi_exec_channel *g,
|
||||
union tgsi_exec_channel *b,
|
||||
|
@ -1518,7 +1518,7 @@ fetch_texel( struct tgsi_sampler *sampler,
|
|||
uint j;
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE];
|
||||
|
||||
sampler->get_samples(sampler, s->f, t->f, p->f, lodbias, rgba);
|
||||
sampler->get_samples(sampler, s->f, t->f, p->f, lodbias->f, rgba);
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
r->f[j] = rgba[0][j];
|
||||
|
@ -1542,21 +1542,23 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
{
|
||||
const uint unit = inst->Src[1].Register.Index;
|
||||
union tgsi_exec_channel r[4];
|
||||
const union tgsi_exec_channel *lodBias = &ZeroVec;
|
||||
uint chan_index;
|
||||
float lodBias = 0.0f;
|
||||
|
||||
if (modifier != TEX_MODIFIER_NONE) {
|
||||
FETCH(&r[3], 0, CHAN_W);
|
||||
if (modifier != TEX_MODIFIER_PROJECTED) {
|
||||
lodBias = &r[3];
|
||||
}
|
||||
}
|
||||
|
||||
switch (inst->Texture.Texture) {
|
||||
case TGSI_TEXTURE_1D:
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
FETCH(&r[0], 0, CHAN_X);
|
||||
|
||||
if (modifier != TEX_MODIFIER_NONE) {
|
||||
FETCH(&r[1], 0, CHAN_W);
|
||||
if (modifier == TEX_MODIFIER_PROJECTED) {
|
||||
micro_div(&r[0], &r[0], &r[1]);
|
||||
} else {
|
||||
lodBias = r[1].f[0];
|
||||
}
|
||||
micro_div(&r[0], &r[0], &r[3]);
|
||||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
|
@ -1572,15 +1574,10 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
FETCH(&r[1], 0, CHAN_Y);
|
||||
FETCH(&r[2], 0, CHAN_Z);
|
||||
|
||||
if (modifier != TEX_MODIFIER_NONE) {
|
||||
FETCH(&r[3], 0, CHAN_W);
|
||||
if (modifier == TEX_MODIFIER_PROJECTED) {
|
||||
micro_div(&r[0], &r[0], &r[3]);
|
||||
micro_div(&r[1], &r[1], &r[3]);
|
||||
micro_div(&r[2], &r[2], &r[3]);
|
||||
} else {
|
||||
lodBias = r[3].f[0];
|
||||
}
|
||||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
|
@ -1594,15 +1591,10 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
FETCH(&r[1], 0, CHAN_Y);
|
||||
FETCH(&r[2], 0, CHAN_Z);
|
||||
|
||||
if (modifier != TEX_MODIFIER_NONE) {
|
||||
FETCH(&r[3], 0, CHAN_W);
|
||||
if (modifier == TEX_MODIFIER_PROJECTED) {
|
||||
micro_div(&r[0], &r[0], &r[3]);
|
||||
micro_div(&r[1], &r[1], &r[3]);
|
||||
micro_div(&r[2], &r[2], &r[3]);
|
||||
} else {
|
||||
lodBias = r[3].f[0];
|
||||
}
|
||||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
|
@ -1638,7 +1630,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
FETCH(&r[0], 0, CHAN_X);
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &ZeroVec, &ZeroVec, 0.0f, /* S, T, P, BIAS */
|
||||
&r[0], &ZeroVec, &ZeroVec, &ZeroVec, /* S, T, P, BIAS */
|
||||
&r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */
|
||||
break;
|
||||
|
||||
|
@ -1652,7 +1644,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
FETCH(&r[2], 0, CHAN_Z);
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], 0.0f, /* inputs */
|
||||
&r[0], &r[1], &r[2], &ZeroVec, /* inputs */
|
||||
&r[0], &r[1], &r[2], &r[3]); /* outputs */
|
||||
break;
|
||||
|
||||
|
@ -1664,7 +1656,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
FETCH(&r[2], 0, CHAN_Z);
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], 0.0f,
|
||||
&r[0], &r[1], &r[2], &ZeroVec,
|
||||
&r[0], &r[1], &r[2], &r[3]);
|
||||
break;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
*
|
||||
* Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
* Copyright 2009-2010 VMware, Inc. All rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
|
@ -35,11 +36,13 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define MAX_LABELS (4 * 1024) /**< basically, max instructions */
|
||||
|
||||
#define NUM_CHANNELS 4 /* R,G,B,A */
|
||||
#define QUAD_SIZE 4 /* 4 pixel/quad */
|
||||
|
||||
|
||||
/**
|
||||
* Registers may be treated as float, signed int or unsigned int.
|
||||
*/
|
||||
|
@ -80,7 +83,7 @@ struct tgsi_sampler
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE]);
|
||||
};
|
||||
|
||||
|
|
|
@ -1433,7 +1433,7 @@ fetch_texel( struct tgsi_sampler **sampler,
|
|||
&store[0], /* s */
|
||||
&store[4], /* t */
|
||||
&store[8], /* r */
|
||||
store[12], /* lodbias */
|
||||
&store[12], /* lodbias */
|
||||
rgba); /* results */
|
||||
|
||||
memcpy( store, rgba, 16 * sizeof(float));
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
* Copyright 2008 VMware, Inc. All rights reserved.
|
||||
* Copyright 2008-2010 VMware, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
|
@ -514,21 +514,15 @@ static float
|
|||
compute_lambda_1d(const struct sp_sampler_varient *samp,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias)
|
||||
const float p[QUAD_SIZE])
|
||||
{
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
const struct pipe_sampler_state *sampler = samp->sampler;
|
||||
float dsdx = fabsf(s[QUAD_BOTTOM_RIGHT] - s[QUAD_BOTTOM_LEFT]);
|
||||
float dsdy = fabsf(s[QUAD_TOP_LEFT] - s[QUAD_BOTTOM_LEFT]);
|
||||
float rho = MAX2(dsdx, dsdy) * texture->width0;
|
||||
float lambda;
|
||||
|
||||
lambda = util_fast_log2(rho);
|
||||
lambda += lodbias + sampler->lod_bias;
|
||||
lambda = CLAMP(lambda, sampler->min_lod, sampler->max_lod);
|
||||
|
||||
return lambda;
|
||||
return util_fast_log2(rho);
|
||||
}
|
||||
|
||||
|
||||
|
@ -536,8 +530,7 @@ static float
|
|||
compute_lambda_2d(const struct sp_sampler_varient *samp,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias)
|
||||
const float p[QUAD_SIZE])
|
||||
{
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
const struct pipe_sampler_state *sampler = samp->sampler;
|
||||
|
@ -548,13 +541,8 @@ compute_lambda_2d(const struct sp_sampler_varient *samp,
|
|||
float maxx = MAX2(dsdx, dsdy) * texture->width0;
|
||||
float maxy = MAX2(dtdx, dtdy) * texture->height0;
|
||||
float rho = MAX2(maxx, maxy);
|
||||
float lambda;
|
||||
|
||||
lambda = util_fast_log2(rho);
|
||||
lambda += lodbias + sampler->lod_bias;
|
||||
lambda = CLAMP(lambda, sampler->min_lod, sampler->max_lod);
|
||||
|
||||
return lambda;
|
||||
return util_fast_log2(rho);
|
||||
}
|
||||
|
||||
|
||||
|
@ -562,8 +550,7 @@ static float
|
|||
compute_lambda_3d(const struct sp_sampler_varient *samp,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias)
|
||||
const float p[QUAD_SIZE])
|
||||
{
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
const struct pipe_sampler_state *sampler = samp->sampler;
|
||||
|
@ -576,31 +563,26 @@ compute_lambda_3d(const struct sp_sampler_varient *samp,
|
|||
float maxx = MAX2(dsdx, dsdy) * texture->width0;
|
||||
float maxy = MAX2(dtdx, dtdy) * texture->height0;
|
||||
float maxz = MAX2(dpdx, dpdy) * texture->depth0;
|
||||
float rho, lambda;
|
||||
float rho;
|
||||
|
||||
rho = MAX2(maxx, maxy);
|
||||
rho = MAX2(rho, maxz);
|
||||
|
||||
lambda = util_fast_log2(rho);
|
||||
lambda += lodbias + sampler->lod_bias;
|
||||
lambda = CLAMP(lambda, sampler->min_lod, sampler->max_lod);
|
||||
|
||||
return lambda;
|
||||
return util_fast_log2(rho);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compute lambda for a vertex texture sampler.
|
||||
* Since there aren't derivatives to use, just return the LOD bias.
|
||||
* Since there aren't derivatives to use, just return 0.
|
||||
*/
|
||||
static float
|
||||
compute_lambda_vert(const struct sp_sampler_varient *samp,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias)
|
||||
const float p[QUAD_SIZE])
|
||||
{
|
||||
return lodbias;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
|
||||
|
@ -769,7 +751,7 @@ img_filter_2d_linear_repeat_POT(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -827,7 +809,7 @@ img_filter_2d_nearest_repeat_POT(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -866,7 +848,7 @@ img_filter_2d_nearest_clamp_POT(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -914,7 +896,7 @@ img_filter_1d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -949,7 +931,7 @@ img_filter_2d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -996,7 +978,7 @@ img_filter_cube_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1035,7 +1017,7 @@ img_filter_3d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1076,7 +1058,7 @@ img_filter_1d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1115,7 +1097,7 @@ img_filter_2d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1161,7 +1143,7 @@ img_filter_cube_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1209,7 +1191,7 @@ img_filter_3d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1261,29 +1243,54 @@ img_filter_3d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
}
|
||||
|
||||
|
||||
/* Calculate level of detail for every fragment.
|
||||
* Note that lambda has already been biased by global LOD bias.
|
||||
*/
|
||||
static INLINE void
|
||||
compute_lod(const struct pipe_sampler_state *sampler,
|
||||
const float biased_lambda,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float lod[QUAD_SIZE])
|
||||
{
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < QUAD_SIZE; i++) {
|
||||
lod[i] = biased_lambda + lodbias[i];
|
||||
lod[i] = CLAMP(lod[i], sampler->min_lod, sampler->max_lod);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
int level0;
|
||||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p, lodbias);
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
lambda = lod[0];
|
||||
level0 = (int)lambda;
|
||||
|
||||
if (lambda < 0.0) {
|
||||
samp->level = 0;
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, 0, rgba );
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
else if (level0 >= texture->last_level) {
|
||||
samp->level = texture->last_level;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, 0, rgba );
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
else {
|
||||
float levelBlend = lambda - level0;
|
||||
|
@ -1292,10 +1299,10 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
int c,j;
|
||||
|
||||
samp->level = level0;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, 0, rgba0 );
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba0 );
|
||||
|
||||
samp->level = level0+1;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, 0, rgba1 );
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba1 );
|
||||
|
||||
for (j = 0; j < QUAD_SIZE; j++) {
|
||||
for (c = 0; c < 4; c++) {
|
||||
|
@ -1311,14 +1318,21 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p, lodbias);
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
lambda = lod[0];
|
||||
|
||||
if (lambda < 0.0) {
|
||||
samp->level = 0;
|
||||
|
@ -1327,7 +1341,7 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
else {
|
||||
samp->level = (int)(lambda + 0.5) ;
|
||||
samp->level = MIN2(samp->level, (int)texture->last_level);
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, 0, rgba );
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
@ -1345,17 +1359,26 @@ mip_filter_none(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
float lambda = samp->compute_lambda(samp, s, t, p, lodbias);
|
||||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
lambda = lod[0];
|
||||
|
||||
if (lambda < 0.0) {
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, 0, rgba );
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
else {
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, 0, rgba );
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1371,15 +1394,22 @@ mip_filter_linear_2d_linear_repeat_POT(
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
const struct pipe_texture *texture = samp->texture;
|
||||
int level0;
|
||||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = compute_lambda_2d(samp, s, t, p, lodbias);
|
||||
lambda = compute_lambda_2d(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
lambda = lod[0];
|
||||
level0 = (int)lambda;
|
||||
|
||||
/* Catches both negative and large values of level0:
|
||||
|
@ -1390,7 +1420,7 @@ mip_filter_linear_2d_linear_repeat_POT(
|
|||
else
|
||||
samp->level = texture->last_level;
|
||||
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, 0, rgba );
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
}
|
||||
else {
|
||||
float levelBlend = lambda - level0;
|
||||
|
@ -1399,10 +1429,10 @@ mip_filter_linear_2d_linear_repeat_POT(
|
|||
int c,j;
|
||||
|
||||
samp->level = level0;
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, 0, rgba0 );
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, NULL, rgba0 );
|
||||
|
||||
samp->level = level0+1;
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, 0, rgba1 );
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, NULL, rgba1 );
|
||||
|
||||
for (j = 0; j < QUAD_SIZE; j++) {
|
||||
for (c = 0; c < 4; c++) {
|
||||
|
@ -1422,7 +1452,7 @@ sample_compare(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
@ -1508,7 +1538,7 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
* Copyright 2010 VMware, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
|
@ -46,14 +47,13 @@ typedef void (*wrap_linear_func)(const float s[4],
|
|||
typedef float (*compute_lambda_func)(const struct sp_sampler_varient *sampler,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias);
|
||||
const float p[QUAD_SIZE]);
|
||||
|
||||
typedef void (*filter_func)(struct tgsi_sampler *tgsi_sampler,
|
||||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
float lodbias,
|
||||
const float lodbias[QUAD_SIZE],
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE]);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue