mesa: add R/RG floating-point formats
This commit is contained in:
@@ -728,6 +728,42 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
|
|||||||
0, 16, 0, 0, 0,
|
0, 16, 0, 0, 0,
|
||||||
1, 1, 2
|
1, 1, 2
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_R_FLOAT32,
|
||||||
|
"MESA_FORMAT_R_FLOAT32",
|
||||||
|
GL_RED,
|
||||||
|
GL_FLOAT,
|
||||||
|
32, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
1, 1, 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_R_FLOAT16,
|
||||||
|
"MESA_FORMAT_R_FLOAT16",
|
||||||
|
GL_RED,
|
||||||
|
GL_FLOAT,
|
||||||
|
16, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
1, 1, 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_RG_FLOAT32,
|
||||||
|
"MESA_FORMAT_RG_FLOAT32",
|
||||||
|
GL_RG,
|
||||||
|
GL_FLOAT,
|
||||||
|
32, 32, 0, 0,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
1, 1, 8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_RG_FLOAT16,
|
||||||
|
"MESA_FORMAT_RG_FLOAT16",
|
||||||
|
GL_RG,
|
||||||
|
GL_FLOAT,
|
||||||
|
16, 16, 0, 0,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
1, 1, 4
|
||||||
|
},
|
||||||
|
|
||||||
/* unnormalized signed int formats */
|
/* unnormalized signed int formats */
|
||||||
{
|
{
|
||||||
@@ -1714,22 +1750,26 @@ _mesa_format_to_type_and_comps(gl_format format,
|
|||||||
*comps = 3;
|
*comps = 3;
|
||||||
return;
|
return;
|
||||||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
|
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
|
||||||
|
case MESA_FORMAT_RG_FLOAT32:
|
||||||
*datatype = GL_FLOAT;
|
*datatype = GL_FLOAT;
|
||||||
*comps = 2;
|
*comps = 2;
|
||||||
return;
|
return;
|
||||||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
|
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
|
||||||
|
case MESA_FORMAT_RG_FLOAT16:
|
||||||
*datatype = GL_HALF_FLOAT_ARB;
|
*datatype = GL_HALF_FLOAT_ARB;
|
||||||
*comps = 2;
|
*comps = 2;
|
||||||
return;
|
return;
|
||||||
case MESA_FORMAT_ALPHA_FLOAT32:
|
case MESA_FORMAT_ALPHA_FLOAT32:
|
||||||
case MESA_FORMAT_LUMINANCE_FLOAT32:
|
case MESA_FORMAT_LUMINANCE_FLOAT32:
|
||||||
case MESA_FORMAT_INTENSITY_FLOAT32:
|
case MESA_FORMAT_INTENSITY_FLOAT32:
|
||||||
|
case MESA_FORMAT_R_FLOAT32:
|
||||||
*datatype = GL_FLOAT;
|
*datatype = GL_FLOAT;
|
||||||
*comps = 1;
|
*comps = 1;
|
||||||
return;
|
return;
|
||||||
case MESA_FORMAT_ALPHA_FLOAT16:
|
case MESA_FORMAT_ALPHA_FLOAT16:
|
||||||
case MESA_FORMAT_LUMINANCE_FLOAT16:
|
case MESA_FORMAT_LUMINANCE_FLOAT16:
|
||||||
case MESA_FORMAT_INTENSITY_FLOAT16:
|
case MESA_FORMAT_INTENSITY_FLOAT16:
|
||||||
|
case MESA_FORMAT_R_FLOAT16:
|
||||||
*datatype = GL_HALF_FLOAT_ARB;
|
*datatype = GL_HALF_FLOAT_ARB;
|
||||||
*comps = 1;
|
*comps = 1;
|
||||||
return;
|
return;
|
||||||
|
@@ -142,6 +142,10 @@ typedef enum
|
|||||||
MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
|
MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
|
||||||
MESA_FORMAT_INTENSITY_FLOAT32,
|
MESA_FORMAT_INTENSITY_FLOAT32,
|
||||||
MESA_FORMAT_INTENSITY_FLOAT16,
|
MESA_FORMAT_INTENSITY_FLOAT16,
|
||||||
|
MESA_FORMAT_R_FLOAT32,
|
||||||
|
MESA_FORMAT_R_FLOAT16,
|
||||||
|
MESA_FORMAT_RG_FLOAT32,
|
||||||
|
MESA_FORMAT_RG_FLOAT16,
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -631,6 +631,34 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
|
|||||||
fetch_texel_3d_f_intensity_f16,
|
fetch_texel_3d_f_intensity_f16,
|
||||||
store_texel_intensity_f16
|
store_texel_intensity_f16
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_R_FLOAT32,
|
||||||
|
fetch_texel_1d_f_r_f32,
|
||||||
|
fetch_texel_2d_f_r_f32,
|
||||||
|
fetch_texel_3d_f_r_f32,
|
||||||
|
store_texel_r_f32
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_R_FLOAT16,
|
||||||
|
fetch_texel_1d_f_r_f16,
|
||||||
|
fetch_texel_2d_f_r_f16,
|
||||||
|
fetch_texel_3d_f_r_f16,
|
||||||
|
store_texel_r_f16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_RG_FLOAT32,
|
||||||
|
fetch_texel_1d_f_rg_f32,
|
||||||
|
fetch_texel_2d_f_rg_f32,
|
||||||
|
fetch_texel_3d_f_rg_f32,
|
||||||
|
store_texel_rg_f32
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MESA_FORMAT_RG_FLOAT16,
|
||||||
|
fetch_texel_1d_f_rg_f16,
|
||||||
|
fetch_texel_2d_f_rg_f16,
|
||||||
|
fetch_texel_3d_f_rg_f16,
|
||||||
|
store_texel_rg_f16
|
||||||
|
},
|
||||||
|
|
||||||
/* non-normalized, signed int */
|
/* non-normalized, signed int */
|
||||||
{
|
{
|
||||||
|
@@ -438,6 +438,110 @@ static void store_texel_intensity_f16(struct gl_texture_image *texImage,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* MESA_FORMAT_R_FLOAT32 *****************************************************/
|
||||||
|
|
||||||
|
/* Fetch texel from 1D, 2D or 3D R_FLOAT32 texture,
|
||||||
|
* returning 4 GLfloats.
|
||||||
|
*/
|
||||||
|
static void FETCH(f_r_f32)( const struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||||
|
{
|
||||||
|
const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
|
||||||
|
texel[RCOMP] = src[0];
|
||||||
|
texel[GCOMP] = 0.0F;
|
||||||
|
texel[BCOMP] = 0.0F;
|
||||||
|
texel[ACOMP] = 1.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DIM == 3
|
||||||
|
static void store_texel_r_f32(struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, const void *texel)
|
||||||
|
{
|
||||||
|
const GLfloat *rgba = (const GLfloat *) texel;
|
||||||
|
GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
|
||||||
|
dst[0] = rgba[RCOMP];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* MESA_FORMAT_R_FLOAT16 *****************************************************/
|
||||||
|
|
||||||
|
/* Fetch texel from 1D, 2D or 3D R_FLOAT16 texture,
|
||||||
|
* returning 4 GLfloats.
|
||||||
|
*/
|
||||||
|
static void FETCH(f_r_f16)( const struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||||
|
{
|
||||||
|
const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
|
||||||
|
texel[RCOMP] = _mesa_half_to_float(src[0]);
|
||||||
|
texel[GCOMP] = 0.0F;
|
||||||
|
texel[BCOMP] = 0.0F;
|
||||||
|
texel[ACOMP] = 1.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DIM == 3
|
||||||
|
static void store_texel_r_f16(struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, const void *texel)
|
||||||
|
{
|
||||||
|
const GLfloat *rgba = (const GLfloat *) texel;
|
||||||
|
GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
|
||||||
|
dst[0] = _mesa_float_to_half(rgba[RCOMP]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* MESA_FORMAT_RG_FLOAT32 ****************************************************/
|
||||||
|
|
||||||
|
/* Fetch texel from 1D, 2D or 3D RG_FLOAT32 texture,
|
||||||
|
* returning 4 GLfloats.
|
||||||
|
*/
|
||||||
|
static void FETCH(f_rg_f32)( const struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||||
|
{
|
||||||
|
const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
|
||||||
|
texel[RCOMP] = src[0];
|
||||||
|
texel[GCOMP] = src[1];
|
||||||
|
texel[BCOMP] = 0.0F;
|
||||||
|
texel[ACOMP] = 1.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DIM == 3
|
||||||
|
static void store_texel_rg_f32(struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, const void *texel)
|
||||||
|
{
|
||||||
|
const GLfloat *rgba = (const GLfloat *) texel;
|
||||||
|
GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
|
||||||
|
dst[0] = rgba[RCOMP];
|
||||||
|
dst[1] = rgba[GCOMP];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* MESA_FORMAT_RG_FLOAT16 ****************************************************/
|
||||||
|
|
||||||
|
/* Fetch texel from 1D, 2D or 3D RG_FLOAT16 texture,
|
||||||
|
* returning 4 GLfloats.
|
||||||
|
*/
|
||||||
|
static void FETCH(f_rg_f16)( const struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||||
|
{
|
||||||
|
const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
|
||||||
|
texel[RCOMP] = _mesa_half_to_float(src[0]);
|
||||||
|
texel[GCOMP] = _mesa_half_to_float(src[1]);
|
||||||
|
texel[BCOMP] = 0.0F;
|
||||||
|
texel[ACOMP] = 1.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DIM == 3
|
||||||
|
static void store_texel_rg_f16(struct gl_texture_image *texImage,
|
||||||
|
GLint i, GLint j, GLint k, const void *texel)
|
||||||
|
{
|
||||||
|
const GLfloat *rgba = (const GLfloat *) texel;
|
||||||
|
GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
|
||||||
|
dst[0] = _mesa_float_to_half(rgba[RCOMP]);
|
||||||
|
dst[1] = _mesa_float_to_half(rgba[GCOMP]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -628,6 +628,22 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
|
||||||
|
switch (internalFormat) {
|
||||||
|
case GL_R16F:
|
||||||
|
return MESA_FORMAT_R_FLOAT16;
|
||||||
|
case GL_R32F:
|
||||||
|
return MESA_FORMAT_R_FLOAT32;
|
||||||
|
case GL_RG16F:
|
||||||
|
return MESA_FORMAT_RG_FLOAT16;
|
||||||
|
case GL_RG32F:
|
||||||
|
return MESA_FORMAT_RG_FLOAT32;
|
||||||
|
|
||||||
|
default:
|
||||||
|
; /* fallthrough */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ctx->Extensions.EXT_texture_format_BGRA8888) {
|
if (ctx->Extensions.EXT_texture_format_BGRA8888) {
|
||||||
switch (internalFormat) {
|
switch (internalFormat) {
|
||||||
case GL_BGRA:
|
case GL_BGRA:
|
||||||
|
@@ -3535,13 +3535,17 @@ _mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
|
|||||||
dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
|
dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
|
||||||
dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
|
dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
|
||||||
dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
|
dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
|
||||||
dstFormat == MESA_FORMAT_INTENSITY_FLOAT32);
|
dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
|
||||||
|
dstFormat == MESA_FORMAT_R_FLOAT32 ||
|
||||||
|
dstFormat == MESA_FORMAT_RG_FLOAT32);
|
||||||
ASSERT(baseInternalFormat == GL_RGBA ||
|
ASSERT(baseInternalFormat == GL_RGBA ||
|
||||||
baseInternalFormat == GL_RGB ||
|
baseInternalFormat == GL_RGB ||
|
||||||
baseInternalFormat == GL_ALPHA ||
|
baseInternalFormat == GL_ALPHA ||
|
||||||
baseInternalFormat == GL_LUMINANCE ||
|
baseInternalFormat == GL_LUMINANCE ||
|
||||||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
|
baseInternalFormat == GL_LUMINANCE_ALPHA ||
|
||||||
baseInternalFormat == GL_INTENSITY);
|
baseInternalFormat == GL_INTENSITY ||
|
||||||
|
baseInternalFormat == GL_RED ||
|
||||||
|
baseInternalFormat == GL_RG);
|
||||||
ASSERT(texelBytes == components * sizeof(GLfloat));
|
ASSERT(texelBytes == components * sizeof(GLfloat));
|
||||||
|
|
||||||
if (!ctx->_ImageTransferState &&
|
if (!ctx->_ImageTransferState &&
|
||||||
@@ -3605,13 +3609,17 @@ _mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
|
|||||||
dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
|
dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
|
||||||
dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
|
dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
|
||||||
dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
|
dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
|
||||||
dstFormat == MESA_FORMAT_INTENSITY_FLOAT16);
|
dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
|
||||||
|
dstFormat == MESA_FORMAT_R_FLOAT16 ||
|
||||||
|
dstFormat == MESA_FORMAT_RG_FLOAT16);
|
||||||
ASSERT(baseInternalFormat == GL_RGBA ||
|
ASSERT(baseInternalFormat == GL_RGBA ||
|
||||||
baseInternalFormat == GL_RGB ||
|
baseInternalFormat == GL_RGB ||
|
||||||
baseInternalFormat == GL_ALPHA ||
|
baseInternalFormat == GL_ALPHA ||
|
||||||
baseInternalFormat == GL_LUMINANCE ||
|
baseInternalFormat == GL_LUMINANCE ||
|
||||||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
|
baseInternalFormat == GL_LUMINANCE_ALPHA ||
|
||||||
baseInternalFormat == GL_INTENSITY);
|
baseInternalFormat == GL_INTENSITY ||
|
||||||
|
baseInternalFormat == GL_RED ||
|
||||||
|
baseInternalFormat == GL_RG);
|
||||||
ASSERT(texelBytes == components * sizeof(GLhalfARB));
|
ASSERT(texelBytes == components * sizeof(GLhalfARB));
|
||||||
|
|
||||||
if (!ctx->_ImageTransferState &&
|
if (!ctx->_ImageTransferState &&
|
||||||
@@ -4252,6 +4260,10 @@ texstore_funcs[MESA_FORMAT_COUNT] =
|
|||||||
{ MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
|
{ MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
|
||||||
{ MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
|
{ MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
|
||||||
{ MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
|
{ MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
|
||||||
|
{ MESA_FORMAT_R_FLOAT32, _mesa_texstore_rgba_float32 },
|
||||||
|
{ MESA_FORMAT_R_FLOAT16, _mesa_texstore_rgba_float16 },
|
||||||
|
{ MESA_FORMAT_RG_FLOAT32, _mesa_texstore_rgba_float32 },
|
||||||
|
{ MESA_FORMAT_RG_FLOAT16, _mesa_texstore_rgba_float16 },
|
||||||
|
|
||||||
{ MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
|
{ MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
|
||||||
{ MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
|
{ MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
|
||||||
|
Reference in New Issue
Block a user