mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 18:00:13 +01:00
r300: minor texture code refactoring
This commit is contained in:
parent
4430a05a3a
commit
da73c1ed41
1 changed files with 112 additions and 79 deletions
|
|
@ -51,14 +51,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#include "r300_tex.h"
|
#include "r300_tex.h"
|
||||||
#include "r300_reg.h"
|
#include "r300_reg.h"
|
||||||
|
|
||||||
#define VALID_FORMAT(f) ( ((f) <= MESA_FORMAT_RGBA_DXT5 \
|
|
||||||
|| ((f) >= MESA_FORMAT_RGBA_FLOAT32 && \
|
|
||||||
(f) <= MESA_FORMAT_INTENSITY_FLOAT16)) \
|
|
||||||
&& tx_table[f].flag )
|
|
||||||
|
|
||||||
#define _ASSIGN(entry, format) \
|
|
||||||
[ MESA_FORMAT_ ## entry ] = { format, 0, 1}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that the _REV formats are the same as the non-REV formats. This is
|
* Note that the _REV formats are the same as the non-REV formats. This is
|
||||||
* because the REV and non-REV formats are identical as a byte string, but
|
* because the REV and non-REV formats are identical as a byte string, but
|
||||||
|
|
@ -68,67 +60,121 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
* identically. -- paulus
|
* identically. -- paulus
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const struct tx_table {
|
static uint32_t translateTexFormat(gl_format mesaFormat)
|
||||||
GLuint format, filter, flag;
|
{
|
||||||
} tx_table[] = {
|
switch (mesaFormat)
|
||||||
/* *INDENT-OFF* */
|
{
|
||||||
#ifdef MESA_LITTLE_ENDIAN
|
#ifdef MESA_LITTLE_ENDIAN
|
||||||
_ASSIGN(RGBA8888, R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
|
case MESA_FORMAT_RGBA8888:
|
||||||
_ASSIGN(RGBA8888_REV, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
|
return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8);
|
||||||
_ASSIGN(ARGB8888, R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
|
case MESA_FORMAT_RGBA8888_REV:
|
||||||
_ASSIGN(ARGB8888_REV, R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
|
return R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8);
|
||||||
|
case MESA_FORMAT_ARGB8888:
|
||||||
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
||||||
|
case MESA_FORMAT_ARGB8888_REV:
|
||||||
|
return R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8);
|
||||||
#else
|
#else
|
||||||
_ASSIGN(RGBA8888, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
|
case MESA_FORMAT_RGBA8888:
|
||||||
_ASSIGN(RGBA8888_REV, R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
|
return R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8);
|
||||||
_ASSIGN(ARGB8888, R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
|
case MESA_FORMAT_RGBA8888_REV:
|
||||||
_ASSIGN(ARGB8888_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
|
return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8);
|
||||||
|
case MESA_FORMAT_ARGB8888:
|
||||||
|
return R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8);
|
||||||
|
case MESA_FORMAT_ARGB8888_REV:
|
||||||
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
||||||
#endif
|
#endif
|
||||||
_ASSIGN(XRGB8888, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)),
|
case MESA_FORMAT_XRGB8888:
|
||||||
_ASSIGN(RGB888, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
||||||
_ASSIGN(RGB565, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
|
case MESA_FORMAT_RGB888:
|
||||||
_ASSIGN(RGB565_REV, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
||||||
_ASSIGN(ARGB4444, R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
|
case MESA_FORMAT_RGB565:
|
||||||
_ASSIGN(ARGB4444_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
||||||
_ASSIGN(ARGB1555, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
|
case MESA_FORMAT_RGB565_REV:
|
||||||
_ASSIGN(ARGB1555_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
||||||
_ASSIGN(AL88, R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
|
case MESA_FORMAT_ARGB4444:
|
||||||
_ASSIGN(AL88_REV, R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4);
|
||||||
_ASSIGN(RGB332, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z3Y3X2)),
|
case MESA_FORMAT_ARGB4444_REV:
|
||||||
_ASSIGN(A8, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4);
|
||||||
_ASSIGN(L8, R300_EASY_TX_FORMAT(X, X, X, ONE, X8)),
|
case MESA_FORMAT_ARGB1555:
|
||||||
_ASSIGN(I8, R300_EASY_TX_FORMAT(X, X, X, X, X8)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5);
|
||||||
_ASSIGN(CI8, R300_EASY_TX_FORMAT(X, X, X, X, X8)),
|
case MESA_FORMAT_ARGB1555_REV:
|
||||||
_ASSIGN(YCBCR, R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE),
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5);
|
||||||
_ASSIGN(YCBCR_REV, R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE),
|
case MESA_FORMAT_AL88:
|
||||||
_ASSIGN(RGB_DXT1, R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1)),
|
return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8);
|
||||||
_ASSIGN(RGBA_DXT1, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1)),
|
case MESA_FORMAT_AL88_REV:
|
||||||
_ASSIGN(RGBA_DXT3, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3)),
|
return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8);
|
||||||
_ASSIGN(RGBA_DXT5, R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5)),
|
case MESA_FORMAT_RGB332:
|
||||||
_ASSIGN(RGBA_FLOAT32, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z3Y3X2);
|
||||||
_ASSIGN(RGBA_FLOAT16, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16)),
|
case MESA_FORMAT_A8:
|
||||||
_ASSIGN(RGB_FLOAT32, 0xffffffff),
|
return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8);
|
||||||
_ASSIGN(RGB_FLOAT16, 0xffffffff),
|
case MESA_FORMAT_L8:
|
||||||
_ASSIGN(ALPHA_FLOAT32, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32)),
|
return R300_EASY_TX_FORMAT(X, X, X, ONE, X8);
|
||||||
_ASSIGN(ALPHA_FLOAT16, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16)),
|
case MESA_FORMAT_I8:
|
||||||
_ASSIGN(LUMINANCE_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32)),
|
return R300_EASY_TX_FORMAT(X, X, X, X, X8);
|
||||||
_ASSIGN(LUMINANCE_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16)),
|
case MESA_FORMAT_CI8:
|
||||||
_ASSIGN(LUMINANCE_ALPHA_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32)),
|
return R300_EASY_TX_FORMAT(X, X, X, X, X8);
|
||||||
_ASSIGN(LUMINANCE_ALPHA_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16)),
|
case MESA_FORMAT_YCBCR:
|
||||||
_ASSIGN(INTENSITY_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, X, FL_I32)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
|
||||||
_ASSIGN(INTENSITY_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
|
case MESA_FORMAT_YCBCR_REV:
|
||||||
_ASSIGN(Z16, R300_EASY_TX_FORMAT(X, X, X, X, X16)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
|
||||||
_ASSIGN(Z24_S8, R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8)),
|
case MESA_FORMAT_RGB_DXT1:
|
||||||
_ASSIGN(S8_Z24, R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8)),
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1);
|
||||||
_ASSIGN(Z32, R300_EASY_TX_FORMAT(X, X, X, X, X32)),
|
case MESA_FORMAT_RGBA_DXT1:
|
||||||
/* EXT_texture_sRGB */
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1);
|
||||||
_ASSIGN(SRGBA8, R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8) | R300_TX_FORMAT_GAMMA),
|
case MESA_FORMAT_RGBA_DXT3:
|
||||||
_ASSIGN(SLA8, R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8) | R300_TX_FORMAT_GAMMA),
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3);
|
||||||
_ASSIGN(SL8, R300_EASY_TX_FORMAT(X, X, X, ONE, X8) | R300_TX_FORMAT_GAMMA),
|
case MESA_FORMAT_RGBA_DXT5:
|
||||||
/* *INDENT-ON* */
|
return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5);
|
||||||
|
case MESA_FORMAT_RGBA_FLOAT32:
|
||||||
|
return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32);
|
||||||
|
case MESA_FORMAT_RGBA_FLOAT16:
|
||||||
|
return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16);
|
||||||
|
case MESA_FORMAT_ALPHA_FLOAT32:
|
||||||
|
return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32);
|
||||||
|
case MESA_FORMAT_ALPHA_FLOAT16:
|
||||||
|
return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16);
|
||||||
|
case MESA_FORMAT_LUMINANCE_FLOAT32:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32);
|
||||||
|
case MESA_FORMAT_LUMINANCE_FLOAT16:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16);
|
||||||
|
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32);
|
||||||
|
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16);
|
||||||
|
case MESA_FORMAT_INTENSITY_FLOAT32:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, X, FL_I32);
|
||||||
|
case MESA_FORMAT_INTENSITY_FLOAT16:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, X, FL_I16);
|
||||||
|
case MESA_FORMAT_Z16:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, X, X16);
|
||||||
|
case MESA_FORMAT_Z24_S8:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8);
|
||||||
|
case MESA_FORMAT_S8_Z24:
|
||||||
|
return R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8);
|
||||||
|
case MESA_FORMAT_Z32:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, X, X32);
|
||||||
|
/* EXT_texture_sRGB */
|
||||||
|
case MESA_FORMAT_SRGBA8:
|
||||||
|
return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SLA8:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SL8:
|
||||||
|
return R300_EASY_TX_FORMAT(X, X, X, ONE, X8) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SRGB_DXT1:
|
||||||
|
return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SRGBA_DXT1:
|
||||||
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SRGBA_DXT3:
|
||||||
|
return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3) | R300_TX_FORMAT_GAMMA;
|
||||||
|
case MESA_FORMAT_SRGBA_DXT5:
|
||||||
|
return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5) | R300_TX_FORMAT_GAMMA;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "%s: Invalid format %s", __FUNCTION__, _mesa_get_format_name(mesaFormat));
|
||||||
|
assert(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef _ASSIGN
|
|
||||||
|
|
||||||
void r300SetDepthTexMode(struct gl_texture_object *tObj)
|
void r300SetDepthTexMode(struct gl_texture_object *tObj)
|
||||||
{
|
{
|
||||||
static const GLuint formats[3][3] = {
|
static const GLuint formats[3][3] = {
|
||||||
|
|
@ -205,19 +251,12 @@ static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
|
||||||
const struct gl_texture_image *firstImage;
|
const struct gl_texture_image *firstImage;
|
||||||
firstImage = t->base.Image[0][t->minLod];
|
firstImage = t->base.Image[0][t->minLod];
|
||||||
|
|
||||||
if (!t->image_override
|
if (!t->image_override) {
|
||||||
&& VALID_FORMAT(firstImage->TexFormat)) {
|
|
||||||
if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
|
if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
|
||||||
r300SetDepthTexMode(&t->base);
|
r300SetDepthTexMode(&t->base);
|
||||||
} else {
|
} else {
|
||||||
t->pp_txformat = tx_table[firstImage->TexFormat].format;
|
t->pp_txformat = translateTexFormat(firstImage->TexFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
t->pp_txfilter |= tx_table[firstImage->TexFormat].filter;
|
|
||||||
} else if (!t->image_override) {
|
|
||||||
_mesa_problem(NULL, "unexpected texture format in %s",
|
|
||||||
__FUNCTION__);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->image_override && t->bo)
|
if (t->image_override && t->bo)
|
||||||
|
|
@ -357,18 +396,15 @@ void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
|
||||||
switch (depth) {
|
switch (depth) {
|
||||||
case 32:
|
case 32:
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
||||||
t->pp_txfilter |= tx_table[2].filter;
|
|
||||||
pitch_val /= 4;
|
pitch_val /= 4;
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
default:
|
default:
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
||||||
t->pp_txfilter |= tx_table[4].filter;
|
|
||||||
pitch_val /= 4;
|
pitch_val /= 4;
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
||||||
t->pp_txfilter |= tx_table[5].filter;
|
|
||||||
pitch_val /= 2;
|
pitch_val /= 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -447,18 +483,15 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
||||||
else
|
else
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
|
||||||
t->pp_txfilter |= tx_table[2].filter;
|
|
||||||
pitch_val /= 4;
|
pitch_val /= 4;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
default:
|
default:
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
|
||||||
t->pp_txfilter |= tx_table[4].filter;
|
|
||||||
pitch_val /= 4;
|
pitch_val /= 4;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
|
||||||
t->pp_txfilter |= tx_table[5].filter;
|
|
||||||
pitch_val /= 2;
|
pitch_val /= 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue