[Mesa-dev] [PATCH 14/14] i965: Add support for deprecated texture buffer object formats.
Eric Anholt
eric at anholt.net
Wed Mar 28 10:58:58 PDT 2012
GL 3.1 promoted GL_RGBA to core, and added GL_R and GL_RG. It dropped
A/I/L/LA formats. Our hardware doesn't support the A/I/L/LA formats,
so if we want to support GL_ARB_texture_buffer_object on its own, we
have to map them to RG and swizzle their data into place.
---
src/mesa/drivers/dri/i965/brw_wm.c | 89 +++++++++++++++------
src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 36 ++++++++-
2 files changed, 99 insertions(+), 26 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index b358306..18a4bd4 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -328,22 +328,64 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
{
const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
- if (unit->_ReallyEnabled && unit->_Current->Target != GL_TEXTURE_BUFFER) {
- const struct gl_texture_object *t = unit->_Current;
- const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
- struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, i);
- int swizzles[SWIZZLE_NIL + 1] = {
- SWIZZLE_X,
- SWIZZLE_Y,
- SWIZZLE_Z,
- SWIZZLE_W,
- SWIZZLE_ZERO,
- SWIZZLE_ONE,
- SWIZZLE_NIL
- };
-
- if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
- img->_BaseFormat == GL_DEPTH_STENCIL) {
+ if (!unit->_ReallyEnabled) {
+ key->swizzles[i] = SWIZZLE_NOOP;
+ return;
+ }
+
+ const struct gl_texture_object *t = unit->_Current;
+ const struct gl_texture_image *img;
+ struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, i);
+ int swizzles[SWIZZLE_NIL + 1] = {
+ SWIZZLE_X,
+ SWIZZLE_Y,
+ SWIZZLE_Z,
+ SWIZZLE_W,
+ SWIZZLE_ZERO,
+ SWIZZLE_ONE,
+ SWIZZLE_NIL
+ };
+
+ if (t->Target != GL_TEXTURE_BUFFER)
+ img = t->Image[0][t->BaseLevel];
+ else
+ img = NULL;
+
+ if (t->Target == GL_TEXTURE_BUFFER) {
+ /* The hardware doesn't have support for the deprecated integer formats,
+ * so we map them to R/RG in the surface, and swizzle the channels here.
+ */
+ if (_mesa_is_format_integer_color(t->_BufferObjectFormat)) {
+ switch (_mesa_get_format_base_format(t->_BufferObjectFormat)) {
+ case GL_ALPHA:
+ swizzles[0] = SWIZZLE_ZERO;
+ swizzles[1] = SWIZZLE_ZERO;
+ swizzles[2] = SWIZZLE_ZERO;
+ swizzles[3] = SWIZZLE_X;
+ break;
+ case GL_LUMINANCE:
+ swizzles[0] = SWIZZLE_X;
+ swizzles[1] = SWIZZLE_X;
+ swizzles[2] = SWIZZLE_X;
+ swizzles[3] = SWIZZLE_ONE;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ swizzles[0] = SWIZZLE_X;
+ swizzles[1] = SWIZZLE_X;
+ swizzles[2] = SWIZZLE_X;
+ swizzles[3] = SWIZZLE_Y;
+ break;
+ case GL_INTENSITY:
+ swizzles[0] = SWIZZLE_X;
+ swizzles[1] = SWIZZLE_X;
+ swizzles[2] = SWIZZLE_X;
+ swizzles[3] = SWIZZLE_X;
+ break;
+ }
+ }
+ } else {
+ if ((img->_BaseFormat == GL_DEPTH_COMPONENT ||
+ img->_BaseFormat == GL_DEPTH_STENCIL)) {
if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
key->compare_funcs[i] = sampler->CompareFunc;
@@ -385,12 +427,6 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
key->yuvtex_swap_mask |= 1 << i;
}
- key->swizzles[i] =
- MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
- swizzles[GET_SWZ(t->_Swizzle, 1)],
- swizzles[GET_SWZ(t->_Swizzle, 2)],
- swizzles[GET_SWZ(t->_Swizzle, 3)]);
-
if (sampler->MinFilter != GL_NEAREST &&
sampler->MagFilter != GL_NEAREST) {
if (sampler->WrapS == GL_CLAMP)
@@ -401,9 +437,12 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
key->gl_clamp_mask[2] |= 1 << i;
}
}
- else {
- key->swizzles[i] = SWIZZLE_NOOP;
- }
+
+ key->swizzles[i] =
+ MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
+ swizzles[GET_SWZ(t->_Swizzle, 1)],
+ swizzles[GET_SWZ(t->_Swizzle, 2)],
+ swizzles[GET_SWZ(t->_Swizzle, 3)]);
}
static void brw_wm_populate_key( struct brw_context *brw,
diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
index 1ebecc7..c093975 100644
--- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
@@ -54,6 +54,36 @@ gen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling)
}
}
+const uint32_t buffer_format_overrides[MESA_FORMAT_COUNT] = {
+ [MESA_FORMAT_ALPHA_INT8] = BRW_SURFACEFORMAT_R8_SINT,
+ [MESA_FORMAT_ALPHA_INT16] = BRW_SURFACEFORMAT_R16_SINT,
+ [MESA_FORMAT_ALPHA_INT32] = BRW_SURFACEFORMAT_R32_SINT,
+ [MESA_FORMAT_ALPHA_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
+ [MESA_FORMAT_ALPHA_UINT16] = BRW_SURFACEFORMAT_R16_UINT,
+ [MESA_FORMAT_ALPHA_UINT32] = BRW_SURFACEFORMAT_R32_UINT,
+
+ [MESA_FORMAT_INTENSITY_INT8] = BRW_SURFACEFORMAT_R8_SINT,
+ [MESA_FORMAT_INTENSITY_INT16] = BRW_SURFACEFORMAT_R16_SINT,
+ [MESA_FORMAT_INTENSITY_INT32] = BRW_SURFACEFORMAT_R32_SINT,
+ [MESA_FORMAT_INTENSITY_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
+ [MESA_FORMAT_INTENSITY_UINT16] = BRW_SURFACEFORMAT_R16_UINT,
+ [MESA_FORMAT_INTENSITY_UINT32] = BRW_SURFACEFORMAT_R32_UINT,
+
+ [MESA_FORMAT_LUMINANCE_INT8] = BRW_SURFACEFORMAT_R8_SINT,
+ [MESA_FORMAT_LUMINANCE_INT16] = BRW_SURFACEFORMAT_R16_SINT,
+ [MESA_FORMAT_LUMINANCE_INT32] = BRW_SURFACEFORMAT_R32_SINT,
+ [MESA_FORMAT_LUMINANCE_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
+ [MESA_FORMAT_LUMINANCE_UINT16] = BRW_SURFACEFORMAT_R16_UINT,
+ [MESA_FORMAT_LUMINANCE_UINT32] = BRW_SURFACEFORMAT_R32_UINT,
+
+ [MESA_FORMAT_LUMINANCE_ALPHA_INT8] = BRW_SURFACEFORMAT_R8G8_SINT,
+ [MESA_FORMAT_LUMINANCE_ALPHA_INT16] = BRW_SURFACEFORMAT_R16G16_SINT,
+ [MESA_FORMAT_LUMINANCE_ALPHA_INT32] = BRW_SURFACEFORMAT_R32G32_SINT,
+ [MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = BRW_SURFACEFORMAT_R8G8_UINT,
+ [MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = BRW_SURFACEFORMAT_R16G16_UINT,
+ [MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = BRW_SURFACEFORMAT_R32G32_UINT,
+};
+
static void
gen7_update_buffer_texture_surface(struct gl_context *ctx, GLuint unit)
{
@@ -72,7 +102,11 @@ gen7_update_buffer_texture_surface(struct gl_context *ctx, GLuint unit)
memset(surf, 0, sizeof(*surf));
surf->ss0.surface_type = BRW_SURFACE_BUFFER;
- surf->ss0.surface_format = brw_format_for_mesa_format(format);
+
+ if (buffer_format_overrides[format])
+ surf->ss0.surface_format = buffer_format_overrides[format];
+ else
+ surf->ss0.surface_format = brw_format_for_mesa_format(format);
surf->ss0.render_cache_read_write = 1;
--
1.7.9.1
More information about the mesa-dev
mailing list