This test regresses a large number of tests in piglit and dEQP, for example:
piglit.spec.oes_texture_float.oes_texture_float.snbgt2m64 (from piglit) Standard Output /tmp/build_root/m64/lib/piglit/bin/oes_texture_float -auto -fbo oes-texture-float: error 0x502 at /var/lib/jenkins/jobs/Leeroy/workspace@2/repos/piglit/tests/spec/oes_texture_float/oes_texture_float.c:343 oes-texture-float: error 0x502 at /var/lib/jenkins/jobs/Leeroy/workspace@2/repos/piglit/tests/spec/oes_texture_float/oes_texture_float.c:343 oes-texture-float: error 0x502 at /var/lib/jenkins/jobs/Leeroy/workspace@2/repos/piglit/tests/spec/oes_texture_float/oes_texture_float.c:343 oes-texture-float: error 0x502 at /var/lib/jenkins/jobs/Leeroy/workspace@2/repos/piglit/tests/spec/oes_texture_float/oes_texture_float.c:343 oes-texture-float: error 0x502 at /var/lib/jenkins/jobs/Leeroy/workspace@2/repos/piglit/tests/spec/oes_texture_float/oes_texture_float.c:343 Standard Error Mesa: User error: GL_INVALID_OPERATION in glTexImage%dD(format = GL_RGBA, type = GL_FLOAT, effective internalformat = GL_FALSE) Mesa: User error: GL_INVALID_OPERATION in glTexImage%dD(format = GL_RGB, type = GL_FLOAT, effective internalformat = GL_FALSE) Mesa: User error: GL_INVALID_OPERATION in glTexImage%dD(format = GL_ALPHA, type = GL_FLOAT, effective internalformat = GL_FALSE) Mesa: User error: GL_INVALID_OPERATION in glTexImage%dD(format = GL_LUMINANCE, type = GL_FLOAT, effective internalformat = GL_FALSE) Mesa: User error: GL_INVALID_OPERATION in glTexImage%dD(format = GL_LUMINANCE_ALPHA, type = GL_FLOAT, effective internalformat = GL_FALSE) Eduardo Lima Mitev <el...@igalia.com> writes: > When validating format+type+internalFormat for texture pixel operations > on GLES3, the effective internal format should be used if the one > specified is an unsized internal format. Page 127, section "3.8 Texturing" > of the GLES 3.0.4 spec says: > > "if internalformat is a base internal format, the effective internal > format is a sized internal format that is derived from the format and > type for internal use by the GL. Table 3.12 specifies the mapping of > format and type to effective internal formats. The effective internal > format is used by the GL for purposes such as texture completeness or > type checks for CopyTex* commands. In these cases, the GL is required > to operate as if the effective internal format was used as the > internalformat when specifying the texture data." > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91582 > --- > src/mesa/main/glformats.c | 48 > +++++++++++++++++++++++++++++++++++++++++++++++ > src/mesa/main/glformats.h | 4 ++++ > src/mesa/main/teximage.c | 27 ++++++++++++++++++++++++++ > 3 files changed, 79 insertions(+) > > diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c > index 3eb66da..fd83e9c 100644 > --- a/src/mesa/main/glformats.c > +++ b/src/mesa/main/glformats.c > @@ -2824,3 +2824,51 @@ _mesa_format_from_format_and_type(GLenum format, > GLenum type) > */ > unreachable("Unsupported format"); > } > + > +/** > + * Returns the effective internal format from a texture format and type. > + * This is used by texture image operations internally for validation, when > + * the specified internal format is a base (unsized) format. > + * > + * \param format the texture format > + * \param type the texture type > + */ > +GLenum > +_mesa_es3_effective_internal_format_for_format_and_type(GLenum format, > + GLenum type) > +{ > + switch (format) { > + case GL_RGBA: > + switch (type) { > + case GL_UNSIGNED_BYTE: > + return GL_RGBA8; > + case GL_UNSIGNED_SHORT_4_4_4_4: > + return GL_RGBA4; > + case GL_UNSIGNED_SHORT_5_5_5_1: > + return GL_RGB5_A1; > + } > + break; > + case GL_RGB: > + switch (type) { > + case GL_UNSIGNED_BYTE: > + return GL_RGB8; > + case GL_UNSIGNED_SHORT_5_6_5: > + return GL_RGB565; > + } > + break; > + case GL_LUMINANCE_ALPHA: > + if (type == GL_UNSIGNED_BYTE) > + return GL_LUMINANCE8_ALPHA8; > + case GL_LUMINANCE: > + if (type == GL_UNSIGNED_BYTE) > + return GL_LUMINANCE8; > + case GL_ALPHA: > + if (type == GL_UNSIGNED_BYTE) > + return GL_ALPHA8; > + default: > + /* fall through and return NONE */ > + break; > + } > + > + return GL_NONE; > +} > diff --git a/src/mesa/main/glformats.h b/src/mesa/main/glformats.h > index 419955a..0686c71 100644 > --- a/src/mesa/main/glformats.h > +++ b/src/mesa/main/glformats.h > @@ -135,6 +135,10 @@ _mesa_es3_error_check_format_and_type(const struct > gl_context *ctx, > extern uint32_t > _mesa_format_from_format_and_type(GLenum format, GLenum type); > > +extern GLenum > +_mesa_es3_effective_internal_format_for_format_and_type(GLenum format, > + GLenum type); > + > #ifdef __cplusplus > } > #endif > diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c > index 3a556a6..c3dea8c 100644 > --- a/src/mesa/main/teximage.c > +++ b/src/mesa/main/teximage.c > @@ -2111,6 +2111,33 @@ texture_format_error_check_gles(struct gl_context > *ctx, GLenum format, > GLenum err; > > if (_mesa_is_gles3(ctx)) { > + /* Page 127, section "3.8 Texturing" of the GLES 3.0.4 spec says: > + * > + * "if internalformat is a base internal format, the effective > + * internal format is a sized internal format that is derived > + * from the format and type for internal use by the GL. > + * Table 3.12 specifies the mapping of format and type to effective > + * internal formats. The effective internal format is used by the > GL > + * for purposes such as texture completeness or type checks for > + * CopyTex* commands. In these cases, the GL is required to operate > + * as if the effective internal format was used as the > internalformat > + * when specifying the texture data." > + */ > + if (_mesa_is_enum_format_unsized(internalFormat)) { > + internalFormat = > + _mesa_es3_effective_internal_format_for_format_and_type(format, > + type); > + if (internalFormat == GL_NONE) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "%s(format = %s, type = %s, effective " > + "internalformat = %s)", > + callerName, _mesa_enum_to_string(format), > + _mesa_enum_to_string(type), > + _mesa_enum_to_string(internalFormat)); > + return true; > + } > + } > + > err = _mesa_es3_error_check_format_and_type(ctx, format, type, > internalFormat); > if (err != GL_NO_ERROR) { > -- > 2.4.6 > > _______________________________________________ > 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