From c54a222442d3068ad06e502b80d6299f6249c5c7 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: (cherry picked from commit 2cd192f8799c8cc27cd76e3acae45e807aadd926) --- .pick_status.json | 2 +- src/mesa/main/teximage.c | 35 +++++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 73f155e9af7..05684e8577d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -24,7 +24,7 @@ "description": "mesa: fix CopyTexImage format compatibility checks for ES", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 023a975919f..8b5a2a23d90 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -4561,22 +4561,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; + } } }