mesa: initial EXT_texture_snorm support

The component ordering of some formats has been been reversed to match
Gallium types.
This commit is contained in:
Marek Olšák
2011-03-18 13:44:51 +01:00
parent 47e3896dfd
commit 0be369975f
10 changed files with 233 additions and 37 deletions

View File

@@ -203,6 +203,7 @@ static const struct extension extension_table[] = {
{ "GL_EXT_texture", o(EXT_texture), GL, 1996 },
{ "GL_EXT_texture_rectangle", o(NV_texture_rectangle), GL, 2004 },
{ "GL_EXT_texture_shared_exponent", o(EXT_texture_shared_exponent), GL, 2004 },
{ "GL_EXT_texture_snorm", o(EXT_texture_snorm), GL, 2009 },
{ "GL_EXT_texture_sRGB", o(EXT_texture_sRGB), GL, 2004 },
{ "GL_EXT_texture_sRGB_decode", o(EXT_texture_sRGB_decode), GL, 2006 },
{ "GL_EXT_texture_swizzle", o(EXT_texture_swizzle), GL, 2008 },
@@ -274,7 +275,7 @@ static const struct extension extension_table[] = {
{ "GL_MESA_pack_invert", o(MESA_pack_invert), GL, 2002 },
{ "GL_MESA_resize_buffers", o(MESA_resize_buffers), GL, 1999 },
{ "GL_MESA_texture_array", o(MESA_texture_array), GL, 2007 },
{ "GL_MESA_texture_signed_rgba", o(MESA_texture_signed_rgba), GL, 2009 },
{ "GL_MESA_texture_signed_rgba", o(EXT_texture_snorm), GL, 2009 },
{ "GL_MESA_window_pos", o(ARB_window_pos), GL, 2000 },
{ "GL_MESAX_texture_float", o(ARB_texture_float), GL, 2009 },
{ "GL_MESA_ycbcr_texture", o(MESA_ycbcr_texture), GL, 2002 },

View File

@@ -1081,7 +1081,6 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
case GL_RGBA16_SNORM:
case GL_SRGB8_ALPHA8_EXT:
return GL_RGBA;
case GL_STENCIL_INDEX:
@@ -1109,6 +1108,43 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
case GL_RG8:
case GL_RG16:
return ctx->Extensions.ARB_texture_rg ? GL_RG : 0;
/* signed normalized texture formats */
case GL_RED_SNORM:
case GL_R8_SNORM:
case GL_R16_SNORM:
return ctx->Extensions.EXT_texture_snorm ? GL_RED : 0;
case GL_RG_SNORM:
case GL_RG8_SNORM:
case GL_RG16_SNORM:
return ctx->Extensions.EXT_texture_snorm ? GL_RG : 0;
case GL_RGB_SNORM:
case GL_RGB8_SNORM:
case GL_RGB16_SNORM:
return ctx->Extensions.EXT_texture_snorm ? GL_RGB : 0;
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
case GL_RGBA16_SNORM:
return ctx->Extensions.EXT_texture_snorm ? GL_RGBA : 0;
case GL_ALPHA_SNORM:
case GL_ALPHA8_SNORM:
case GL_ALPHA16_SNORM:
return ctx->Extensions.EXT_texture_snorm &&
ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
case GL_LUMINANCE_SNORM:
case GL_LUMINANCE8_SNORM:
case GL_LUMINANCE16_SNORM:
return ctx->Extensions.EXT_texture_snorm &&
ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
case GL_LUMINANCE_ALPHA_SNORM:
case GL_LUMINANCE8_ALPHA8_SNORM:
case GL_LUMINANCE16_ALPHA16_SNORM:
return ctx->Extensions.EXT_texture_snorm &&
ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
case GL_INTENSITY_SNORM:
case GL_INTENSITY8_SNORM:
case GL_INTENSITY16_SNORM:
return ctx->Extensions.EXT_texture_snorm &&
ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
/* XXX add floating point and integer formats eventually */
default:
return 0;

View File

@@ -809,8 +809,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
1, 1, 1 /* BlockWidth/Height,Bytes */
},
{
MESA_FORMAT_SIGNED_RG88,
"MESA_FORMAT_SIGNED_RG88",
MESA_FORMAT_SIGNED_RG88_REV,
"MESA_FORMAT_SIGNED_RG88_REV",
GL_RG,
GL_SIGNED_NORMALIZED,
8, 8, 0, 0,
@@ -847,8 +847,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
/* Signed 16 bits / channel */
{
MESA_FORMAT_SIGNED_R_16,
"MESA_FORMAT_SIGNED_R_16",
MESA_FORMAT_SIGNED_R16,
"MESA_FORMAT_SIGNED_R16",
GL_RED,
GL_SIGNED_NORMALIZED,
16, 0, 0, 0,
@@ -856,8 +856,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
1, 1, 2
},
{
MESA_FORMAT_SIGNED_RG_16,
"MESA_FORMAT_SIGNED_RG_16",
MESA_FORMAT_SIGNED_GR1616,
"MESA_FORMAT_SIGNED_GR1616",
GL_RG,
GL_SIGNED_NORMALIZED,
16, 16, 0, 0,
@@ -963,6 +963,80 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
4, 0, 0, 0, 0,
4, 4, 16 /* 16 bytes per 4x4 block */
},
/* Signed formats from EXT_texture_snorm that are not in GL3.1 */
{
MESA_FORMAT_SIGNED_A8,
"MESA_FORMAT_SIGNED_A8",
GL_ALPHA,
GL_SIGNED_NORMALIZED,
0, 0, 0, 8,
0, 0, 0, 0, 0,
1, 1, 1
},
{
MESA_FORMAT_SIGNED_L8,
"MESA_FORMAT_SIGNED_L8",
GL_LUMINANCE,
GL_SIGNED_NORMALIZED,
0, 0, 0, 0,
8, 0, 0, 0, 0,
1, 1, 1
},
{
MESA_FORMAT_SIGNED_AL88,
"MESA_FORMAT_SIGNED_AL88",
GL_LUMINANCE_ALPHA,
GL_SIGNED_NORMALIZED,
0, 0, 0, 8,
8, 0, 0, 0, 0,
1, 1, 2
},
{
MESA_FORMAT_SIGNED_I8,
"MESA_FORMAT_SIGNED_I8",
GL_INTENSITY,
GL_SIGNED_NORMALIZED,
0, 0, 0, 0,
0, 8, 0, 0, 0,
1, 1, 1
},
{
MESA_FORMAT_SIGNED_A16,
"MESA_FORMAT_SIGNED_A16",
GL_ALPHA,
GL_SIGNED_NORMALIZED,
0, 0, 0, 16,
0, 0, 0, 0, 0,
1, 1, 2
},
{
MESA_FORMAT_SIGNED_L16,
"MESA_FORMAT_SIGNED_L16",
GL_LUMINANCE,
GL_SIGNED_NORMALIZED,
0, 0, 0, 0,
16, 0, 0, 0, 0,
1, 1, 2
},
{
MESA_FORMAT_SIGNED_AL1616,
"MESA_FORMAT_SIGNED_AL1616",
GL_LUMINANCE_ALPHA,
GL_SIGNED_NORMALIZED,
0, 0, 0, 16,
16, 0, 0, 0, 0,
1, 1, 4
},
{
MESA_FORMAT_SIGNED_I16,
"MESA_FORMAT_SIGNED_I16",
GL_INTENSITY,
GL_SIGNED_NORMALIZED,
0, 0, 0, 0,
0, 16, 0, 0, 0,
1, 1, 2
}
};
@@ -1530,10 +1604,14 @@ _mesa_format_to_type_and_comps(gl_format format,
return;
case MESA_FORMAT_SIGNED_R8:
case MESA_FORMAT_SIGNED_A8:
case MESA_FORMAT_SIGNED_L8:
case MESA_FORMAT_SIGNED_I8:
*datatype = GL_BYTE;
*comps = 1;
return;
case MESA_FORMAT_SIGNED_RG88:
case MESA_FORMAT_SIGNED_RG88_REV:
case MESA_FORMAT_SIGNED_AL88:
*datatype = GL_BYTE;
*comps = 2;
return;
@@ -1549,11 +1627,15 @@ _mesa_format_to_type_and_comps(gl_format format,
*comps = 4;
return;
case MESA_FORMAT_SIGNED_R_16:
case MESA_FORMAT_SIGNED_R16:
case MESA_FORMAT_SIGNED_A16:
case MESA_FORMAT_SIGNED_L16:
case MESA_FORMAT_SIGNED_I16:
*datatype = GL_SHORT;
*comps = 1;
return;
case MESA_FORMAT_SIGNED_RG_16:
case MESA_FORMAT_SIGNED_GR1616:
case MESA_FORMAT_SIGNED_AL1616:
*datatype = GL_SHORT;
*comps = 2;
return;

View File

@@ -168,12 +168,12 @@ typedef enum
/*@{*/
MESA_FORMAT_DUDV8, /* DUDU DUDU DVDV DVDV */
MESA_FORMAT_SIGNED_R8, /* RRRR RRRR */
MESA_FORMAT_SIGNED_RG88, /* RRRR RRRR GGGG GGGG */
MESA_FORMAT_SIGNED_RG88_REV, /* GGGG GGGG RRRR RRRR */
MESA_FORMAT_SIGNED_RGBX8888, /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
MESA_FORMAT_SIGNED_RGBA8888, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
MESA_FORMAT_SIGNED_RGBA8888_REV,/*AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
MESA_FORMAT_SIGNED_R_16, /* ushort[0]=R */
MESA_FORMAT_SIGNED_RG_16, /* ushort[0]=R, ushort[1]=G */
MESA_FORMAT_SIGNED_R16, /* RRRR RRRR RRRR RRRR */
MESA_FORMAT_SIGNED_GR1616, /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
MESA_FORMAT_SIGNED_RGB_16, /* ushort[0]=R, ushort[1]=G, ushort[2]=B */
MESA_FORMAT_SIGNED_RGBA_16, /* ... */
MESA_FORMAT_RGBA_16, /* ... */
@@ -193,6 +193,15 @@ typedef enum
MESA_FORMAT_SIGNED_LA_LATC2,
/*@}*/
MESA_FORMAT_SIGNED_A8, /* AAAA AAAA */
MESA_FORMAT_SIGNED_L8, /* LLLL LLLL */
MESA_FORMAT_SIGNED_AL88, /* AAAA AAAA LLLL LLLL */
MESA_FORMAT_SIGNED_I8, /* IIII IIII */
MESA_FORMAT_SIGNED_A16, /* AAAA AAAA AAAA AAAA */
MESA_FORMAT_SIGNED_L16, /* LLLL LLLL LLLL LLLL */
MESA_FORMAT_SIGNED_AL1616, /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
MESA_FORMAT_SIGNED_I16, /* IIII IIII IIII IIII */
MESA_FORMAT_COUNT
} gl_format;

View File

@@ -748,9 +748,6 @@ _mesa_is_color_format(GLenum format)
case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
/* signed, normalized texture formats */
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
/* generic integer formats */
case GL_RED_INTEGER_EXT:
case GL_GREEN_INTEGER_EXT:
@@ -799,6 +796,31 @@ _mesa_is_color_format(GLenum format)
case GL_INTENSITY8I_EXT:
case GL_LUMINANCE8I_EXT:
case GL_LUMINANCE_ALPHA8I_EXT:
/* signed, normalized texture formats */
case GL_RED_SNORM:
case GL_R8_SNORM:
case GL_R16_SNORM:
case GL_RG_SNORM:
case GL_RG8_SNORM:
case GL_RG16_SNORM:
case GL_RGB_SNORM:
case GL_RGB8_SNORM:
case GL_RGB16_SNORM:
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
case GL_RGBA16_SNORM:
case GL_ALPHA_SNORM:
case GL_ALPHA8_SNORM:
case GL_ALPHA16_SNORM:
case GL_LUMINANCE_SNORM:
case GL_LUMINANCE8_SNORM:
case GL_LUMINANCE16_SNORM:
case GL_LUMINANCE_ALPHA_SNORM:
case GL_LUMINANCE8_ALPHA8_SNORM:
case GL_LUMINANCE16_ALPHA16_SNORM:
case GL_INTENSITY_SNORM:
case GL_INTENSITY8_SNORM:
case GL_INTENSITY16_SNORM:
return GL_TRUE;
case GL_YCBCR_MESA: /* not considered to be RGB */
/* fall-through */

View File

@@ -58,8 +58,7 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256];
#define BYTE_TO_FLOAT_TEX(B) ((B) == -128 ? -1.0F : (B) * (1.0F/127.0F))
/** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127], texture/fb data */
#define FLOAT_TO_BYTE_TEX(X) ( (GLint) (127.0F * (X)) )
#define FLOAT_TO_BYTE_TEX(X) CLAMP( (GLint) (127.0F * (X)), -128, 127 )
/** Convert GLushort in [0,65535] to GLfloat in [0.0,1.0] */
#define USHORT_TO_FLOAT(S) ((GLfloat) (S) * (1.0F / 65535.0F))

View File

@@ -2828,6 +2828,7 @@ struct gl_extensions
GLboolean EXT_texture_lod_bias;
GLboolean EXT_texture_mirror_clamp;
GLboolean EXT_texture_shared_exponent;
GLboolean EXT_texture_snorm;
GLboolean EXT_texture_sRGB;
GLboolean EXT_texture_sRGB_decode;
GLboolean EXT_texture_swizzle;
@@ -2855,7 +2856,6 @@ struct gl_extensions
GLboolean MESA_resize_buffers;
GLboolean MESA_ycbcr_texture;
GLboolean MESA_texture_array;
GLboolean MESA_texture_signed_rgba;
GLboolean NV_blend_square;
GLboolean NV_conditional_render;
GLboolean NV_fragment_program;

View File

@@ -389,19 +389,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
}
}
if (ctx->Extensions.MESA_texture_signed_rgba) {
switch (internalFormat) {
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
break;
default:
; /* fallthrough */
}
}
if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) {
if (ctx->Extensions.EXT_texture_snorm) {
switch (internalFormat) {
case GL_RED_SNORM:
case GL_R8_SNORM:
@@ -409,7 +397,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
break;
case GL_RG_SNORM:
case GL_RG8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88);
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
break;
case GL_RGB_SNORM:
case GL_RGB8_SNORM:
@@ -418,12 +406,29 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
break;
case GL_ALPHA_SNORM:
case GL_ALPHA8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
break;
case GL_LUMINANCE_SNORM:
case GL_LUMINANCE8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
break;
case GL_LUMINANCE_ALPHA_SNORM:
case GL_LUMINANCE8_ALPHA8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
break;
case GL_INTENSITY_SNORM:
case GL_INTENSITY8_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
break;
case GL_R16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R_16);
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
break;
case GL_RG16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_16);
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
break;
case GL_RGB16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
@@ -431,6 +436,18 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
case GL_RGBA16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
break;
case GL_ALPHA16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
break;
case GL_LUMINANCE16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
break;
case GL_LUMINANCE16_ALPHA16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
break;
case GL_INTENSITY16_SNORM:
RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
break;
default:
; /* fall-through */
}

View File

@@ -311,11 +311,40 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
}
}
if (ctx->Extensions.MESA_texture_signed_rgba) {
if (ctx->Extensions.EXT_texture_snorm) {
switch (internalFormat) {
case GL_RED_SNORM:
case GL_R8_SNORM:
case GL_R16_SNORM:
return GL_RED;
case GL_RG_SNORM:
case GL_RG8_SNORM:
case GL_RG16_SNORM:
return GL_RG;
case GL_RGB_SNORM:
case GL_RGB8_SNORM:
case GL_RGB16_SNORM:
return GL_RGB;
case GL_RGBA_SNORM:
case GL_RGBA8_SNORM:
case GL_RGBA16_SNORM:
return GL_RGBA;
case GL_ALPHA_SNORM:
case GL_ALPHA8_SNORM:
case GL_ALPHA16_SNORM:
return GL_ALPHA;
case GL_LUMINANCE_SNORM:
case GL_LUMINANCE8_SNORM:
case GL_LUMINANCE16_SNORM:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA_SNORM:
case GL_LUMINANCE8_ALPHA8_SNORM:
case GL_LUMINANCE16_ALPHA16_SNORM:
return GL_LUMINANCE_ALPHA;
case GL_INTENSITY_SNORM:
case GL_INTENSITY8_SNORM:
case GL_INTENSITY16_SNORM:
return GL_INTENSITY;
default:
; /* fallthrough */
}

View File

@@ -114,6 +114,7 @@ compute_version(struct gl_context *ctx)
ctx->Extensions.ARB_draw_instanced &&
ctx->Extensions.ARB_texture_buffer_object &&
ctx->Extensions.ARB_uniform_buffer_object &&
ctx->Extensions.EXT_texture_snorm &&
ctx->Extensions.NV_primitive_restart &&
ctx->Extensions.NV_texture_rectangle &&
ctx->Const.MaxVertexTextureImageUnits >= 16);