mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
Code clean-ups, reorg.
This commit is contained in:
parent
e64874ac2d
commit
0f540f4b04
1 changed files with 154 additions and 185 deletions
|
|
@ -177,6 +177,41 @@ lerp_rgba_2d(GLchan result[4], GLfloat a, GLfloat b,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do trilinear interpolation of colors.
|
||||
*/
|
||||
static INLINE void
|
||||
lerp_rgba_3d(GLchan result[4], GLfloat a, GLfloat b, GLfloat c,
|
||||
const GLchan t000[4], const GLchan t100[4],
|
||||
const GLchan t010[4], const GLchan t110[4],
|
||||
const GLchan t001[4], const GLchan t101[4],
|
||||
const GLchan t011[4], const GLchan t111[4])
|
||||
{
|
||||
GLuint k;
|
||||
/* compiler should unroll these short loops */
|
||||
#if CHAN_TYPE == GL_FLOAT
|
||||
for (k = 0; k < 4; k++) {
|
||||
result[k] = lerp_3d(a, b, c, t000[k], t100[k], t010[k], t110[k],
|
||||
t001[k], t101[k], t011[k], t111[k]);
|
||||
}
|
||||
#elif CHAN_TYPE == GL_UNSIGNED_SHORT
|
||||
for (k = 0; k < 4; k++) {
|
||||
result[k] = (GLchan)(lerp_3d(a, b, c,
|
||||
t000[k], t100[k], t010[k], t110[k],
|
||||
t001[k], t101[k], t011[k], t111[k]) + 0.5F);
|
||||
}
|
||||
#else
|
||||
GLint ia = IROUND_POS(a * ILERP_SCALE);
|
||||
GLint ib = IROUND_POS(b * ILERP_SCALE);
|
||||
GLint ic = IROUND_POS(c * ILERP_SCALE);
|
||||
for (k = 0; k < 4; k++) {
|
||||
result[k] = ilerp_3d(ia, ib, ic, t000[k], t100[k], t010[k], t110[k],
|
||||
t001[k], t101[k], t011[k], t111[k]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compute the remainder of a divided by b, but be careful with
|
||||
* negative values so that GL_REPEAT mode works right.
|
||||
|
|
@ -613,13 +648,9 @@ sample_1d_nearest(GLcontext *ctx,
|
|||
{
|
||||
const GLint width = img->Width2; /* without border, power of two */
|
||||
GLint i;
|
||||
(void) ctx;
|
||||
|
||||
COMPUTE_NEAREST_TEXEL_LOCATION(tObj->WrapS, texcoord[0], width, i);
|
||||
|
||||
/* skip over the border, if any */
|
||||
i += img->Border;
|
||||
|
||||
if (i < 0 || i >= (GLint) img->Width) {
|
||||
/* Need this test for GL_CLAMP_TO_BORDER mode */
|
||||
COPY_CHAN4(rgba, tObj->_BorderChan);
|
||||
|
|
@ -630,7 +661,6 @@ sample_1d_nearest(GLcontext *ctx,
|
|||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Return the texture sample for coordinate (s) using GL_LINEAR filter.
|
||||
*/
|
||||
|
|
@ -643,12 +673,12 @@ sample_1d_linear(GLcontext *ctx,
|
|||
const GLint width = img->Width2;
|
||||
GLint i0, i1;
|
||||
GLfloat u;
|
||||
GLuint useBorderColor;
|
||||
(void) ctx;
|
||||
GLbitfield useBorderColor = 0x0;
|
||||
GLfloat a;
|
||||
GLchan t0[4], t1[4]; /* texels */
|
||||
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapS, texcoord[0], u, width, i0, i1);
|
||||
|
||||
useBorderColor = 0;
|
||||
if (img->Border) {
|
||||
i0 += img->Border;
|
||||
i1 += img->Border;
|
||||
|
|
@ -658,26 +688,22 @@ sample_1d_linear(GLcontext *ctx,
|
|||
if (i1 < 0 || i1 >= width) useBorderColor |= I1BIT;
|
||||
}
|
||||
|
||||
{
|
||||
const GLfloat a = FRAC(u);
|
||||
GLchan t0[4], t1[4]; /* texels */
|
||||
|
||||
/* fetch texel colors */
|
||||
if (useBorderColor & I0BIT) {
|
||||
COPY_CHAN4(t0, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, 0, 0, t0);
|
||||
}
|
||||
if (useBorderColor & I1BIT) {
|
||||
COPY_CHAN4(t1, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, 0, 0, t1);
|
||||
}
|
||||
|
||||
lerp_rgba(rgba, a, t0, t1);
|
||||
/* fetch texel colors */
|
||||
if (useBorderColor & I0BIT) {
|
||||
COPY_CHAN4(t0, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, 0, 0, t0);
|
||||
}
|
||||
if (useBorderColor & I1BIT) {
|
||||
COPY_CHAN4(t1, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, 0, 0, t1);
|
||||
}
|
||||
|
||||
a = FRAC(u);
|
||||
lerp_rgba(rgba, a, t0, t1);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -928,14 +954,14 @@ sample_2d_linear(GLcontext *ctx,
|
|||
const GLint width = img->Width2;
|
||||
const GLint height = img->Height2;
|
||||
GLint i0, j0, i1, j1;
|
||||
GLuint useBorderColor;
|
||||
GLbitfield useBorderColor = 0x0;
|
||||
GLfloat u, v;
|
||||
(void) ctx;
|
||||
GLfloat a, b;
|
||||
GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
|
||||
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapS, texcoord[0], u, width, i0, i1);
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapT, texcoord[1], v, height, j0, j1);
|
||||
|
||||
useBorderColor = 0;
|
||||
if (img->Border) {
|
||||
i0 += img->Border;
|
||||
i1 += img->Border;
|
||||
|
|
@ -949,39 +975,35 @@ sample_2d_linear(GLcontext *ctx,
|
|||
if (j1 < 0 || j1 >= height) useBorderColor |= J1BIT;
|
||||
}
|
||||
|
||||
{
|
||||
const GLfloat a = FRAC(u);
|
||||
const GLfloat b = FRAC(v);
|
||||
GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
|
||||
|
||||
/* fetch four texel colors */
|
||||
if (useBorderColor & (I0BIT | J0BIT)) {
|
||||
COPY_CHAN4(t00, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, 0, t00);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT)) {
|
||||
COPY_CHAN4(t10, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, 0, t10);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT)) {
|
||||
COPY_CHAN4(t01, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, 0, t01);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT)) {
|
||||
COPY_CHAN4(t11, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, 0, t11);
|
||||
}
|
||||
|
||||
lerp_rgba_2d(rgba, a, b, t00, t10, t01, t11);
|
||||
/* fetch four texel colors */
|
||||
if (useBorderColor & (I0BIT | J0BIT)) {
|
||||
COPY_CHAN4(t00, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, 0, t00);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT)) {
|
||||
COPY_CHAN4(t10, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, 0, t10);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT)) {
|
||||
COPY_CHAN4(t01, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, 0, t01);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT)) {
|
||||
COPY_CHAN4(t11, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, 0, t11);
|
||||
}
|
||||
|
||||
a = FRAC(u);
|
||||
b = FRAC(v);
|
||||
lerp_rgba_2d(rgba, a, b, t00, t10, t01, t11);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1000,9 +1022,9 @@ sample_2d_linear_repeat(GLcontext *ctx,
|
|||
const GLint height = img->Height2;
|
||||
GLint i0, j0, i1, j1;
|
||||
GLfloat u, v;
|
||||
(void) ctx;
|
||||
(void) tObj;
|
||||
|
||||
GLfloat a, b;
|
||||
GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
|
||||
|
||||
ASSERT(tObj->WrapS == GL_REPEAT);
|
||||
ASSERT(tObj->WrapT == GL_REPEAT);
|
||||
ASSERT(img->Border == 0);
|
||||
|
|
@ -1012,18 +1034,14 @@ sample_2d_linear_repeat(GLcontext *ctx,
|
|||
COMPUTE_LINEAR_REPEAT_TEXEL_LOCATION(texcoord[0], u, width, i0, i1);
|
||||
COMPUTE_LINEAR_REPEAT_TEXEL_LOCATION(texcoord[1], v, height, j0, j1);
|
||||
|
||||
{
|
||||
const GLfloat a = FRAC(u);
|
||||
const GLfloat b = FRAC(v);
|
||||
GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
|
||||
img->FetchTexelc(img, i0, j0, 0, t00);
|
||||
img->FetchTexelc(img, i1, j0, 0, t10);
|
||||
img->FetchTexelc(img, i0, j1, 0, t01);
|
||||
img->FetchTexelc(img, i1, j1, 0, t11);
|
||||
|
||||
img->FetchTexelc(img, i0, j0, 0, t00);
|
||||
img->FetchTexelc(img, i1, j0, 0, t10);
|
||||
img->FetchTexelc(img, i0, j1, 0, t01);
|
||||
img->FetchTexelc(img, i1, j1, 0, t11);
|
||||
|
||||
lerp_rgba_2d(rgba, a, b, t00, t10, t01, t11);
|
||||
}
|
||||
a = FRAC(u);
|
||||
b = FRAC(v);
|
||||
lerp_rgba_2d(rgba, a, b, t00, t10, t01, t11);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1447,15 +1465,16 @@ sample_3d_linear(GLcontext *ctx,
|
|||
const GLint height = img->Height2;
|
||||
const GLint depth = img->Depth2;
|
||||
GLint i0, j0, k0, i1, j1, k1;
|
||||
GLuint useBorderColor;
|
||||
GLbitfield useBorderColor = 0x0;
|
||||
GLfloat u, v, w;
|
||||
(void) ctx;
|
||||
GLfloat a, b, c;
|
||||
GLchan t000[4], t010[4], t001[4], t011[4];
|
||||
GLchan t100[4], t110[4], t101[4], t111[4];
|
||||
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapS, texcoord[0], u, width, i0, i1);
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapT, texcoord[1], v, height, j0, j1);
|
||||
COMPUTE_LINEAR_TEXEL_LOCATIONS(tObj->WrapR, texcoord[2], w, depth, k0, k1);
|
||||
|
||||
useBorderColor = 0;
|
||||
if (img->Border) {
|
||||
i0 += img->Border;
|
||||
i1 += img->Border;
|
||||
|
|
@ -1474,112 +1493,62 @@ sample_3d_linear(GLcontext *ctx,
|
|||
if (k1 < 0 || k1 >= depth) useBorderColor |= K1BIT;
|
||||
}
|
||||
|
||||
{
|
||||
const GLfloat a = FRAC(u);
|
||||
const GLfloat b = FRAC(v);
|
||||
const GLfloat c = FRAC(w);
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
const GLint ia = IROUND_POS(a * ILERP_SCALE);
|
||||
const GLint ib = IROUND_POS(b * ILERP_SCALE);
|
||||
const GLint ic = IROUND_POS(c * ILERP_SCALE);
|
||||
#endif
|
||||
GLchan t000[4], t010[4], t001[4], t011[4];
|
||||
GLchan t100[4], t110[4], t101[4], t111[4];
|
||||
|
||||
/* Fetch texels */
|
||||
if (useBorderColor & (I0BIT | J0BIT | K0BIT)) {
|
||||
COPY_CHAN4(t000, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k0, t000);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K0BIT)) {
|
||||
COPY_CHAN4(t100, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k0, t100);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t010, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k0, t010);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t110, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k0, t110);
|
||||
}
|
||||
|
||||
if (useBorderColor & (I0BIT | J0BIT | K1BIT)) {
|
||||
COPY_CHAN4(t001, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k1, t001);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K1BIT)) {
|
||||
COPY_CHAN4(t101, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k1, t101);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t011, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k1, t011);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t111, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k1, t111);
|
||||
}
|
||||
|
||||
/* trilinear interpolation of samples */
|
||||
#if CHAN_TYPE == GL_FLOAT
|
||||
rgba[0] = lerp_3d(a, b, c,
|
||||
t000[0], t100[0], t010[0], t110[0],
|
||||
t001[0], t101[0], t011[0], t111[0]);
|
||||
rgba[1] = lerp_3d(a, b, c,
|
||||
t000[1], t100[1], t010[1], t110[1],
|
||||
t001[1], t101[1], t011[1], t111[1]);
|
||||
rgba[2] = lerp_3d(a, b, c,
|
||||
t000[2], t100[2], t010[2], t110[2],
|
||||
t001[2], t101[2], t011[2], t111[2]);
|
||||
rgba[3] = lerp_3d(a, b, c,
|
||||
t000[3], t100[3], t010[3], t110[3],
|
||||
t001[3], t101[3], t011[3], t111[3]);
|
||||
#elif CHAN_TYPE == GL_UNSIGNED_SHORT
|
||||
rgba[0] = (GLchan) (lerp_3d(a, b, c,
|
||||
t000[0], t100[0], t010[0], t110[0],
|
||||
t001[0], t101[0], t011[0], t111[0]) + 0.5F);
|
||||
rgba[1] = (GLchan) (lerp_3d(a, b, c,
|
||||
t000[1], t100[1], t010[1], t110[1],
|
||||
t001[1], t101[1], t011[1], t111[1]) + 0.5F);
|
||||
rgba[2] = (GLchan) (lerp_3d(a, b, c,
|
||||
t000[2], t100[2], t010[2], t110[2],
|
||||
t001[2], t101[2], t011[2], t111[2]) + 0.5F);
|
||||
rgba[3] = (GLchan) (lerp_3d(a, b, c,
|
||||
t000[3], t100[3], t010[3], t110[3],
|
||||
t001[3], t101[3], t011[3], t111[3]) + 0.5F);
|
||||
#else
|
||||
ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
|
||||
rgba[0] = ilerp_3d(ia, ib, ic,
|
||||
t000[0], t100[0], t010[0], t110[0],
|
||||
t001[0], t101[0], t011[0], t111[0]);
|
||||
rgba[1] = ilerp_3d(ia, ib, ic,
|
||||
t000[1], t100[1], t010[1], t110[1],
|
||||
t001[1], t101[1], t011[1], t111[1]);
|
||||
rgba[2] = ilerp_3d(ia, ib, ic,
|
||||
t000[2], t100[2], t010[2], t110[2],
|
||||
t001[2], t101[2], t011[2], t111[2]);
|
||||
rgba[3] = ilerp_3d(ia, ib, ic,
|
||||
t000[3], t100[3], t010[3], t110[3],
|
||||
t001[3], t101[3], t011[3], t111[3]);
|
||||
#endif
|
||||
/* Fetch texels */
|
||||
if (useBorderColor & (I0BIT | J0BIT | K0BIT)) {
|
||||
COPY_CHAN4(t000, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k0, t000);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K0BIT)) {
|
||||
COPY_CHAN4(t100, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k0, t100);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t010, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k0, t010);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t110, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k0, t110);
|
||||
}
|
||||
|
||||
if (useBorderColor & (I0BIT | J0BIT | K1BIT)) {
|
||||
COPY_CHAN4(t001, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k1, t001);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K1BIT)) {
|
||||
COPY_CHAN4(t101, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k1, t101);
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t011, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k1, t011);
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t111, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k1, t111);
|
||||
}
|
||||
|
||||
/* trilinear interpolation of samples */
|
||||
a = FRAC(u);
|
||||
b = FRAC(v);
|
||||
c = FRAC(w);
|
||||
lerp_rgba_3d(rgba, a, b, c, t000, t100, t010, t110, t001, t101, t011, t111);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2153,7 +2122,7 @@ sample_linear_rect(GLcontext *ctx, GLuint texUnit,
|
|||
GLint i0, j0, i1, j1;
|
||||
GLchan t00[4], t01[4], t10[4], t11[4];
|
||||
GLfloat a, b;
|
||||
GLuint useBorderColor = 0;
|
||||
GLbitfield useBorderColor = 0x0;
|
||||
|
||||
/* NOTE: we DO NOT use [0, 1] texture coordinates! */
|
||||
if (tObj->WrapS == GL_CLAMP) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue