[Mesa-dev] [PATCH] mesa: Expose GL_OES_texture_float and GL_OES_texture_half_float.
Marek Olšák
maraeo at gmail.com
Mon May 19 06:39:38 PDT 2014
You are complicating it. If we followed the specification to the
letter, the driver would have to advertise OpenGL 1.1 instead of 2.1.
The fact r300 cannot filter floating-point textures is documented by
the vendor and game developers (especially those who targeted D3D9)
knew about it.
For OpenGL ES, I propose a simpler solution:
- don't touch ARB_texture_float at all
- add OES_texture_float to gl_extensions
- add OES_texture_float_linear to gl_extensions
- define OES_texture_half_float as o(OES_texture_float)
- define OES_texture_half_float_linear as o(OES_texture_float_linear)
Then, drivers can enable the extensions as they see fit.
Marek
On Mon, May 19, 2014 at 8:34 AM, Rogovin, Kevin <kevin.rogovin at intel.com> wrote:
> Hi,
>
> Each of the four extensions are right now set to be advertised if and only if a GL context would advertise GL_ARB_texture_float:
>
> { "GL_OES_texture_float", o(ARB_texture_float), ES2, 2005 },
> { "GL_OES_texture_half_float", o(ARB_texture_float), ES2, 2005 },
> { "GL_OES_texture_float_linear", o(ARB_texture_float), ES2, 2005 },
> { "GL_OES_texture_half_float_linear", o(ARB_texture_float), ES2, 2005 },
>
> From my interpretation of ARB_texture_float, that extension requires both 16-bit and 32-bit textures and ability to filter linearly such textures. Did I misunderstand the specification? If I got the specification correct, then the r300 should not be advertising any of the extensions for otherwise it would be advertising GL_ARB_texture_float.
>
> However, the r300 does give an example of ability to support some of the OES extensions but not all. Previously Matt asked if there an example or need and I thought not. It turns out I was wrong and there is a need atleast for the r300. Supporting that granularity is going to be a bigger patch since it would require changing the data structure struct gl_extensions to have four entries and in turn additional logic to combine them to GL_ARB_texture_float. The correct and more work way to do it would be to remove ARB_texture_float from gl_extension, add a GLboolean for each of the 4 OES extensions, change each driver to correctly fill them and then additional logic in creating extension string(s) to check if each of the 4 OES extensions are TRUE then to advertise GL_ARB_texture_float; we could also instead just add the 4 OES booleans and have additional logic in mesa/main to set them each to TRUE if ARB_texture_float is true. The latter solution though easier is less clean and begging for trouble later. Regardless, lets first get this patch as-is into Mesa, then do the "right" thing to allow a backend to support a subset of the OES extensions without needing to support the ARB extension.
>
> -Kevin
>
>
>
> ________________________________________
> From: Marek Olšák [maraeo at gmail.com]
> Sent: Friday, May 16, 2014 4:33 PM
> To: Rogovin, Kevin
> Cc: mesa-dev at lists.freedesktop.org
> Subject: Re: [Mesa-dev] [PATCH] mesa: Expose GL_OES_texture_float and GL_OES_texture_half_float.
>
> Sorry, I meant the linear filtering extensions.
>
> Marek
>
> On Fri, May 16, 2014 at 3:31 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> Hi Kevin,
>>
>> r300g doesn't support filtering of floating-point textures, so the
>> extension shouldn't be advertised there.
>>
>> Marek
>>
>> On Wed, May 7, 2014 at 1:18 PM, Kevin Rogovin <kevin.rogovin at intel.com> wrote:
>>> Add support for GLES2 extensions for floating point and half
>>> floating point textures (GL_OES_texture_float, GL_OES_texture_half_float,
>>> GL_OES_texture_float_linear and GL_OES_texture_half_float_linear).
>>>
>>> ---
>>> src/mesa/main/extensions.c | 12 +++++++++-
>>> src/mesa/main/glformats.c | 25 ++++++++++++++++++++
>>> src/mesa/main/pack.c | 17 +++++++++++++
>>> src/mesa/main/teximage.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++
>>> 4 files changed, 112 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
>>> index c2ff7e3..e39f65e 100644
>>> --- a/src/mesa/main/extensions.c
>>> +++ b/src/mesa/main/extensions.c
>>> @@ -301,7 +301,17 @@ static const struct extension extension_table[] = {
>>> { "GL_OES_texture_mirrored_repeat", o(dummy_true), ES1, 2005 },
>>> { "GL_OES_texture_npot", o(ARB_texture_non_power_of_two), ES1 | ES2, 2005 },
>>> { "GL_OES_vertex_array_object", o(dummy_true), ES1 | ES2, 2010 },
>>> -
>>> + /*
>>> + * TODO:
>>> + * - rather than have an all or nothing approach for floating point textures,
>>> + * allow for driver to specify what parts of floating point texture functionality
>>> + * is supported: float/half-float and filtering for each.
>>> + */
>>> + { "GL_OES_texture_float", o(ARB_texture_float), ES2, 2005 },
>>> + { "GL_OES_texture_half_float", o(ARB_texture_float), ES2, 2005 },
>>> + { "GL_OES_texture_float_linear", o(ARB_texture_float), ES2, 2005 },
>>> + { "GL_OES_texture_half_float_linear", o(ARB_texture_float), ES2, 2005 },
>>> +
>>> /* KHR extensions */
>>> { "GL_KHR_debug", o(dummy_true), GL, 2012 },
>>>
>>> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
>>> index 9bb341c..093fd59 100644
>>> --- a/src/mesa/main/glformats.c
>>> +++ b/src/mesa/main/glformats.c
>>> @@ -93,6 +93,7 @@ _mesa_sizeof_type(GLenum type)
>>> case GL_DOUBLE:
>>> return sizeof(GLdouble);
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> return sizeof(GLhalfARB);
>>> case GL_FIXED:
>>> return sizeof(GLfixed);
>>> @@ -125,6 +126,7 @@ _mesa_sizeof_packed_type(GLenum type)
>>> case GL_INT:
>>> return sizeof(GLint);
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> return sizeof(GLhalfARB);
>>> case GL_FLOAT:
>>> return sizeof(GLfloat);
>>> @@ -243,6 +245,7 @@ _mesa_bytes_per_pixel(GLenum format, GLenum type)
>>> case GL_FLOAT:
>>> return comps * sizeof(GLfloat);
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> return comps * sizeof(GLhalfARB);
>>> case GL_UNSIGNED_BYTE_3_3_2:
>>> case GL_UNSIGNED_BYTE_2_3_3_REV:
>>> @@ -1365,6 +1368,11 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
>>> case GL_FLOAT:
>>> case GL_HALF_FLOAT:
>>> return GL_NO_ERROR;
>>> + case GL_HALF_FLOAT_OES:
>>> + return (format == GL_LUMINANCE ||
>>> + format == GL_LUMINANCE_ALPHA ||
>>> + format == GL_ALPHA)
>>> + ? GL_NO_ERROR: GL_INVALID_ENUM;
>>> default:
>>> return GL_INVALID_ENUM;
>>> }
>>> @@ -1401,6 +1409,9 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
>>> case GL_UNSIGNED_SHORT_5_6_5_REV:
>>> case GL_HALF_FLOAT:
>>> return GL_NO_ERROR;
>>> + case GL_HALF_FLOAT_OES:
>>> + return (format == GL_RGB)
>>> + ? GL_NO_ERROR: GL_INVALID_ENUM;
>>> case GL_UNSIGNED_INT_2_10_10_10_REV:
>>> /* OK by GL_EXT_texture_type_2_10_10_10_REV */
>>> return (ctx->API == API_OPENGLES2)
>>> @@ -1454,6 +1465,9 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
>>> case GL_UNSIGNED_INT_2_10_10_10_REV:
>>> case GL_HALF_FLOAT:
>>> return GL_NO_ERROR;
>>> + case GL_HALF_FLOAT_OES:
>>> + return (format == GL_RGBA)
>>> + ? GL_NO_ERROR: GL_INVALID_ENUM;
>>> default:
>>> return GL_INVALID_ENUM;
>>> }
>>> @@ -1676,6 +1690,17 @@ GLenum
>>> _mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
>>> GLenum internalFormat)
>>> {
>>> + /* special case checking for support the GLES2 extension
>>> + * GL_OES_texture_float and GL_OES_texture_half_float
>>> + */
>>> + if(format == internalFormat &&
>>> + (type == GL_HALF_FLOAT_OES || type == GL_FLOAT) &&
>>> + (format == GL_RGBA || format == GL_RGB ||
>>> + format == GL_LUMINANCE || format == GL_ALPHA ||
>>> + format == GL_LUMINANCE_ALPHA) ) {
>>> + return GL_NO_ERROR;
>>> + }
>>> +
>>> switch (format) {
>>> case GL_RGBA:
>>> switch (type) {
>>> diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c
>>> index 1df6568..4b298ea 100644
>>> --- a/src/mesa/main/pack.c
>>> +++ b/src/mesa/main/pack.c
>>> @@ -2355,6 +2355,7 @@ _mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
>>> }
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLhalfARB *dst = (GLhalfARB *) dstAddr;
>>> switch (dstFormat) {
>>> @@ -2785,6 +2786,7 @@ extract_uint_indexes(GLuint n, GLuint indexes[],
>>> srcType == GL_INT ||
>>> srcType == GL_UNSIGNED_INT_24_8_EXT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
>>>
>>> @@ -2924,6 +2926,7 @@ extract_uint_indexes(GLuint n, GLuint indexes[],
>>> }
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLuint i;
>>> const GLhalfARB *s = (const GLhalfARB *) src;
>>> @@ -3172,6 +3175,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_UNSIGNED_BYTE_3_3_2 ||
>>> srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
>>> @@ -3289,6 +3293,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
>>> PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
>>> PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
>>> PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
>>> @@ -3789,6 +3794,7 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4],
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_UNSIGNED_BYTE_3_3_2 ||
>>> srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
>>> @@ -3886,6 +3892,7 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4],
>>> PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
>>> PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
>>> PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
>>> @@ -4290,6 +4297,7 @@ _mesa_unpack_color_span_ubyte(struct gl_context *ctx,
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_UNSIGNED_BYTE_3_3_2 ||
>>> srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
>>> @@ -4543,6 +4551,7 @@ _mesa_unpack_color_span_float( struct gl_context *ctx,
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_UNSIGNED_BYTE_3_3_2 ||
>>> srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
>>> @@ -4747,6 +4756,7 @@ _mesa_unpack_color_span_uint(struct gl_context *ctx,
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_UNSIGNED_BYTE_3_3_2 ||
>>> srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
>>> @@ -4870,6 +4880,7 @@ _mesa_unpack_dudv_span_byte( struct gl_context *ctx,
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT);
>>>
>>> /* general solution */
>>> @@ -4940,6 +4951,7 @@ _mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
>>> srcType == GL_UNSIGNED_INT ||
>>> srcType == GL_INT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT);
>>>
>>> ASSERT(dstType == GL_UNSIGNED_BYTE ||
>>> @@ -5111,6 +5123,7 @@ _mesa_pack_index_span( struct gl_context *ctx, GLuint n,
>>> }
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLhalfARB *dst = (GLhalfARB *) dest;
>>> GLuint i;
>>> @@ -5160,6 +5173,7 @@ _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
>>> srcType == GL_INT ||
>>> srcType == GL_UNSIGNED_INT_24_8_EXT ||
>>> srcType == GL_HALF_FLOAT_ARB ||
>>> + srcType == GL_HALF_FLOAT_OES ||
>>> srcType == GL_FLOAT ||
>>> srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
>>>
>>> @@ -5350,6 +5364,7 @@ _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
>>> }
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLhalfARB *dst = (GLhalfARB *) dest;
>>> GLuint i;
>>> @@ -5567,6 +5582,7 @@ _mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
>>> needClamp = GL_TRUE;
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLuint i;
>>> const GLhalfARB *src = (const GLhalfARB *) source;
>>> @@ -5756,6 +5772,7 @@ _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
>>> }
>>> break;
>>> case GL_HALF_FLOAT_ARB:
>>> + case GL_HALF_FLOAT_OES:
>>> {
>>> GLhalfARB *dst = (GLhalfARB *) dest;
>>> GLuint i;
>>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
>>> index c7f301c..d06d7d0 100644
>>> --- a/src/mesa/main/teximage.c
>>> +++ b/src/mesa/main/teximage.c
>>> @@ -61,6 +61,57 @@
>>> #define NEW_COPY_TEX_STATE (_NEW_BUFFERS | _NEW_PIXEL)
>>>
>>>
>>> +/**
>>> + * Modify a texture format from as expected by GL_OES_texture_float
>>> + * and/or GL_OES_texture_half_float to as expected by GLES3 or GL3
>>> + */
>>> +static void
>>> +adjust_for_oes_float_texture(GLenum *internalFormat,
>>> + GLenum *format, GLenum *type)
>>> +{
>>> + if (*format == *internalFormat)
>>> + switch (*type) {
>>> + case GL_FLOAT:
>>> + switch (*format) {
>>> + case GL_RGBA:
>>> + *internalFormat = GL_RGBA32F;
>>> + break;
>>> + case GL_RGB:
>>> + *internalFormat = GL_RGB32F;
>>> + break;
>>> + case GL_ALPHA:
>>> + *internalFormat = GL_ALPHA32F_ARB;
>>> + break;
>>> + case GL_LUMINANCE:
>>> + *internalFormat = GL_LUMINANCE32F_ARB;
>>> + break;
>>> + case GL_LUMINANCE_ALPHA:
>>> + *internalFormat = GL_LUMINANCE_ALPHA32F_ARB;
>>> + break;
>>> + }
>>> + break;
>>> +
>>> + case GL_HALF_FLOAT_OES:
>>> + switch (*format) {
>>> + case GL_RGBA:
>>> + *internalFormat = GL_RGBA16F;
>>> + break;
>>> + case GL_RGB:
>>> + *internalFormat = GL_RGB16F;
>>> + break;
>>> + case GL_ALPHA:
>>> + *internalFormat = GL_ALPHA16F_ARB;
>>> + break;
>>> + case GL_LUMINANCE:
>>> + *internalFormat = GL_LUMINANCE16F_ARB;
>>> + break;
>>> + case GL_LUMINANCE_ALPHA:
>>> + *internalFormat = GL_LUMINANCE_ALPHA16F_ARB;
>>> + break;
>>> + }
>>> + break;
>>> + }
>>> +}
>>>
>>> /**
>>> * Return the simple base format for a given internal texture format.
>>> @@ -2976,6 +3027,14 @@ _mesa_choose_texture_format(struct gl_context *ctx,
>>> {
>>> mesa_format f;
>>>
>>> + /* Change internalFormat and type to support floating
>>> + * point textures from GLES2 extensions
>>> + * GL_OES_texture_half_float and GL_OES_texture_float
>>> + */
>>> + if (_mesa_is_gles(ctx)) {
>>> + adjust_for_oes_float_texture(&internalFormat, &format, &type);
>>> + }
>>> +
>>> /* see if we've already chosen a format for the previous level */
>>> if (level > 0) {
>>> struct gl_texture_image *prevImage =
>>> --
>>> 1.8.1.2
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list