Sorry, I meant the linear filtering extensions. Marek
On Fri, May 16, 2014 at 3:31 PM, Marek Olšák <mar...@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.rogo...@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@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev