From 2cd192f8799c8cc27cd76e3acae45e807aadd926 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 6 Mar 2024 14:32:40 -0500 Subject: [PATCH] mesa: fix CopyTexImage format compatibility checks for ES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the ES spec imposes additional requirements for copy commands, specifically that the formats have matching component sizes the existing check used the driver's internal formats to check for a match, which is broken since the spec requires the match be between the passed internalFormat and the buffer's effective internal format (i.e., this has no relation to what the driver supports) fixes KHR-GLES3.copy_tex_image_conversions.forbidden* on a bunch of drivers cc: mesa-stable Reviewed-by: Tapani Pälli Reviewed-by: Marek Olšák Part-of: --- src/mesa/main/teximage.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index e7b6bf75dc6..da85d900157 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -4563,22 +4563,33 @@ copyteximage(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texO return; } } - /* From Page 139 of OpenGL ES 3.0 spec: - * "If internalformat is sized, the internal format of the new texel - * array is internalformat, and this is also the new texel array’s - * effective internal format. If the component sizes of internalformat - * do not exactly match the corresponding component sizes of the source - * buffer’s effective internal format, described below, an - * INVALID_OPERATION error is generated. If internalformat is unsized, - * the internal format of the new texel array is the effective internal - * format of the source buffer, and this is also the new texel array’s - * effective internal format. - */ - else if (formats_differ_in_component_sizes (texFormat, rb->Format)) { + else { + /* From Page 139 of OpenGL ES 3.0 spec: + * "If internalformat is sized, the internal format of the new texel + * array is internalformat, and this is also the new texel array’s + * effective internal format. If the component sizes of internalformat + * do not exactly match the corresponding component sizes of the source + * buffer’s effective internal format, described below, an + * INVALID_OPERATION error is generated. If internalformat is unsized, + * the internal format of the new texel array is the effective internal + * format of the source buffer, and this is also the new texel array’s + * effective internal format. + */ + enum pipe_format rb_format = st_choose_format(ctx->st, rb->InternalFormat, + GL_NONE, GL_NONE, + PIPE_TEXTURE_2D, 0, 0, 0, + false, false); + enum pipe_format new_format = st_choose_format(ctx->st, internalFormat, + GL_NONE, GL_NONE, + PIPE_TEXTURE_2D, 0, 0, 0, + false, false); + /* this comparison must be done on the API format, not the driver format */ + if (formats_differ_in_component_sizes (new_format, rb_format)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexImage%uD(component size changed in" " internal format)", dims); return; + } } }