mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-16 18:00:36 +01:00
gallium: Fix texture sampling with explicit LOD in softpipe.
This commit is contained in:
parent
4bfe1c955f
commit
4440428faa
5 changed files with 113 additions and 53 deletions
|
|
@ -1509,7 +1509,8 @@ fetch_texel( struct tgsi_sampler *sampler,
|
|||
const union tgsi_exec_channel *s,
|
||||
const union tgsi_exec_channel *t,
|
||||
const union tgsi_exec_channel *p,
|
||||
const union tgsi_exec_channel *lodbias,
|
||||
const union tgsi_exec_channel *c0,
|
||||
enum tgsi_sampler_control control,
|
||||
union tgsi_exec_channel *r,
|
||||
union tgsi_exec_channel *g,
|
||||
union tgsi_exec_channel *b,
|
||||
|
|
@ -1518,7 +1519,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->f, rgba);
|
||||
sampler->get_samples(sampler, s->f, t->f, p->f, c0->f, control, rgba);
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
r->f[j] = rgba[0][j];
|
||||
|
|
@ -1542,16 +1543,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;
|
||||
const union tgsi_exec_channel *lod = &ZeroVec;
|
||||
enum tgsi_sampler_control control;
|
||||
uint chan_index;
|
||||
|
||||
if (modifier != TEX_MODIFIER_NONE) {
|
||||
FETCH(&r[3], 0, CHAN_W);
|
||||
if (modifier != TEX_MODIFIER_PROJECTED) {
|
||||
lodBias = &r[3];
|
||||
lod = &r[3];
|
||||
}
|
||||
}
|
||||
|
||||
if (modifier == TEX_MODIFIER_EXPLICIT_LOD) {
|
||||
control = tgsi_sampler_lod_explicit;
|
||||
} else {
|
||||
control = tgsi_sampler_lod_bias;
|
||||
}
|
||||
|
||||
switch (inst->Texture.Texture) {
|
||||
case TGSI_TEXTURE_1D:
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
|
|
@ -1562,8 +1570,9 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &ZeroVec, &ZeroVec, lodBias, /* S, T, P, BIAS */
|
||||
&r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */
|
||||
&r[0], &ZeroVec, &ZeroVec, lod, /* S, T, P, LOD */
|
||||
control,
|
||||
&r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_2D:
|
||||
|
|
@ -1581,7 +1590,8 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], lodBias, /* inputs */
|
||||
&r[0], &r[1], &r[2], lod, /* S, T, P, LOD */
|
||||
control,
|
||||
&r[0], &r[1], &r[2], &r[3]); /* outputs */
|
||||
break;
|
||||
|
||||
|
|
@ -1598,7 +1608,8 @@ exec_tex(struct tgsi_exec_machine *mach,
|
|||
}
|
||||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], lodBias,
|
||||
&r[0], &r[1], &r[2], lod,
|
||||
control,
|
||||
&r[0], &r[1], &r[2], &r[3]);
|
||||
break;
|
||||
|
||||
|
|
@ -1631,6 +1642,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &ZeroVec, &ZeroVec, &ZeroVec, /* S, T, P, BIAS */
|
||||
tgsi_sampler_lod_bias,
|
||||
&r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */
|
||||
break;
|
||||
|
||||
|
|
@ -1645,6 +1657,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], &ZeroVec, /* inputs */
|
||||
tgsi_sampler_lod_bias,
|
||||
&r[0], &r[1], &r[2], &r[3]); /* outputs */
|
||||
break;
|
||||
|
||||
|
|
@ -1657,6 +1670,7 @@ exec_txd(struct tgsi_exec_machine *mach,
|
|||
|
||||
fetch_texel(mach->Samplers[unit],
|
||||
&r[0], &r[1], &r[2], &ZeroVec,
|
||||
tgsi_sampler_lod_bias,
|
||||
&r[0], &r[1], &r[2], &r[3]);
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,11 @@ struct tgsi_interp_coef
|
|||
float dady[NUM_CHANNELS];
|
||||
};
|
||||
|
||||
enum tgsi_sampler_control {
|
||||
tgsi_sampler_lod_bias,
|
||||
tgsi_sampler_lod_explicit
|
||||
};
|
||||
|
||||
/**
|
||||
* Information for sampling textures, which must be implemented
|
||||
* by code outside the TGSI executor.
|
||||
|
|
@ -83,7 +88,8 @@ struct tgsi_sampler
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE]);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -1418,13 +1419,13 @@ fetch_texel( struct tgsi_sampler **sampler,
|
|||
sampler, *sampler,
|
||||
store );
|
||||
|
||||
debug_printf("lodbias %f\n", store[12]);
|
||||
|
||||
for (j = 0; j < 4; j++)
|
||||
debug_printf("sample %d texcoord %f %f\n",
|
||||
debug_printf("sample %d texcoord %f %f %f lodbias %f\n",
|
||||
j,
|
||||
store[0+j],
|
||||
store[4+j]);
|
||||
store[4+j],
|
||||
store[8 + j],
|
||||
store[12 + j]);
|
||||
#endif
|
||||
|
||||
{
|
||||
|
|
@ -1434,6 +1435,7 @@ fetch_texel( struct tgsi_sampler **sampler,
|
|||
&store[4], /* t */
|
||||
&store[8], /* r */
|
||||
&store[12], /* lodbias */
|
||||
tgsi_sampler_lod_bias,
|
||||
rgba); /* results */
|
||||
|
||||
memcpy( store, rgba, 16 * sizeof(float));
|
||||
|
|
@ -2506,7 +2508,7 @@ emit_instruction(
|
|||
break;
|
||||
|
||||
case TGSI_OPCODE_TXL:
|
||||
emit_tex( func, inst, TRUE, FALSE );
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case TGSI_OPCODE_TXP:
|
||||
|
|
|
|||
|
|
@ -751,7 +751,8 @@ 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],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -809,7 +810,8 @@ 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],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -848,7 +850,8 @@ 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],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -896,7 +899,8 @@ img_filter_1d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -931,7 +935,8 @@ img_filter_2d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -978,7 +983,8 @@ img_filter_cube_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1017,7 +1023,8 @@ img_filter_3d_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1058,7 +1065,8 @@ img_filter_1d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1097,7 +1105,8 @@ img_filter_2d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1143,7 +1152,8 @@ img_filter_cube_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1191,7 +1201,8 @@ img_filter_3d_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1266,7 +1277,8 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1275,9 +1287,14 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
if (control == tgsi_sampler_lod_bias) {
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
compute_lod(samp->sampler, lambda, c0, lod);
|
||||
} else {
|
||||
assert(control == tgsi_sampler_lod_explicit);
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
memcpy(lod, c0, sizeof(lod));
|
||||
}
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
|
|
@ -1286,11 +1303,11 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
|
||||
if (lambda < 0.0) {
|
||||
samp->level = 0;
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
samp->mag_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
else if (level0 >= texture->last_level) {
|
||||
samp->level = texture->last_level;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
samp->min_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
else {
|
||||
float levelBlend = lambda - level0;
|
||||
|
|
@ -1299,10 +1316,10 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,
|
|||
int c,j;
|
||||
|
||||
samp->level = level0;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba0 );
|
||||
samp->min_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba0);
|
||||
|
||||
samp->level = level0+1;
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba1 );
|
||||
samp->min_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba1);
|
||||
|
||||
for (j = 0; j < QUAD_SIZE; j++) {
|
||||
for (c = 0; c < 4; c++) {
|
||||
|
|
@ -1318,7 +1335,8 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1326,9 +1344,14 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
if (control == tgsi_sampler_lod_bias) {
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
compute_lod(samp->sampler, lambda, c0, lod);
|
||||
} else {
|
||||
assert(control == tgsi_sampler_lod_explicit);
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
memcpy(lod, c0, sizeof(lod));
|
||||
}
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
|
|
@ -1336,12 +1359,12 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,
|
|||
|
||||
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, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
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, NULL, rgba );
|
||||
samp->min_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
|
@ -1359,26 +1382,32 @@ mip_filter_none(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
if (control == tgsi_sampler_lod_bias) {
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
compute_lod(samp->sampler, lambda, c0, lod);
|
||||
} else {
|
||||
assert(control == tgsi_sampler_lod_explicit);
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
memcpy(lod, c0, sizeof(lod));
|
||||
}
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
lambda = lod[0];
|
||||
|
||||
if (lambda < 0.0) {
|
||||
samp->mag_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
samp->mag_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
else {
|
||||
samp->min_img_filter( tgsi_sampler, s, t, p, NULL, rgba );
|
||||
samp->min_img_filter(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1394,7 +1423,8 @@ mip_filter_linear_2d_linear_repeat_POT(
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1403,9 +1433,14 @@ mip_filter_linear_2d_linear_repeat_POT(
|
|||
float lambda;
|
||||
float lod[QUAD_SIZE];
|
||||
|
||||
lambda = compute_lambda_2d(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
if (control == tgsi_sampler_lod_bias) {
|
||||
lambda = samp->compute_lambda(samp, s, t, p) + samp->sampler->lod_bias;
|
||||
compute_lod(samp->sampler, lambda, c0, lod);
|
||||
} else {
|
||||
assert(control == tgsi_sampler_lod_explicit);
|
||||
|
||||
compute_lod(samp->sampler, lambda, lodbias, lod);
|
||||
memcpy(lod, c0, sizeof(lod));
|
||||
}
|
||||
|
||||
/* XXX: Take into account all lod values.
|
||||
*/
|
||||
|
|
@ -1420,7 +1455,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, NULL, rgba );
|
||||
img_filter_2d_linear_repeat_POT(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba);
|
||||
}
|
||||
else {
|
||||
float levelBlend = lambda - level0;
|
||||
|
|
@ -1429,10 +1464,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, NULL, rgba0 );
|
||||
img_filter_2d_linear_repeat_POT(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba0);
|
||||
|
||||
samp->level = level0+1;
|
||||
img_filter_2d_linear_repeat_POT( tgsi_sampler, s, t, p, NULL, rgba1 );
|
||||
img_filter_2d_linear_repeat_POT(tgsi_sampler, s, t, p, NULL, tgsi_sampler_lod_bias, rgba1);
|
||||
|
||||
for (j = 0; j < QUAD_SIZE; j++) {
|
||||
for (c = 0; c < 4; c++) {
|
||||
|
|
@ -1452,7 +1487,8 @@ sample_compare(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1460,7 +1496,7 @@ sample_compare(struct tgsi_sampler *tgsi_sampler,
|
|||
int j, k0, k1, k2, k3;
|
||||
float val;
|
||||
|
||||
samp->mip_filter( tgsi_sampler, s, t, p, lodbias, rgba );
|
||||
samp->mip_filter(tgsi_sampler, s, t, p, c0, control, rgba);
|
||||
|
||||
/**
|
||||
* Compare texcoord 'p' (aka R) against texture value 'rgba[0]'
|
||||
|
|
@ -1538,7 +1574,8 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||
{
|
||||
struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);
|
||||
|
|
@ -1619,7 +1656,7 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,
|
|||
* is not active, this will point somewhere deeper into the
|
||||
* pipeline, eg. to mip_filter or even img_filter.
|
||||
*/
|
||||
samp->compare(tgsi_sampler, ssss, tttt, NULL, lodbias, rgba);
|
||||
samp->compare(tgsi_sampler, ssss, tttt, NULL, c0, control, rgba);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ typedef void (*filter_func)(struct tgsi_sampler *tgsi_sampler,
|
|||
const float s[QUAD_SIZE],
|
||||
const float t[QUAD_SIZE],
|
||||
const float p[QUAD_SIZE],
|
||||
const float lodbias[QUAD_SIZE],
|
||||
const float c0[QUAD_SIZE],
|
||||
enum tgsi_sampler_control control,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE]);
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue