From 3b70f7900ba14e83081d8ebcd1b827ba605a8e8b Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Mon, 17 Aug 2015 02:00:48 +0300 Subject: [PATCH] mesa: Reset image unit state to the default values when a bound image is deleted. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The ES31-CTS.shader_image_load_store.basic-api-bind conformance test expects the whole image unit state to be reset when the bound texture object is deleted. The ARB_shader_image_load_store extension is rather vague regarding what should happen with image unit state other than the texture object in that case, but the GL 4.2 and GLES 3.1 specifications (section "Automatic Unbinding of Deleted Objects") explicitly require it to be reset to the default values. Reviewed-by: Tapani Pälli Reviewed-by: Ian Romanick --- src/mesa/main/shaderimage.c | 19 +++++++++++++------ src/mesa/main/shaderimage.h | 6 ++++++ src/mesa/main/texobj.c | 5 ++++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index 2d8693150b1..48e3e09dd5d 100644 --- a/src/mesa/main/shaderimage.c +++ b/src/mesa/main/shaderimage.c @@ -394,17 +394,24 @@ is_image_format_supported(const struct gl_context *ctx, GLenum format) } } +struct gl_image_unit +_mesa_default_image_unit(struct gl_context *ctx) +{ + const struct gl_image_unit u = { + .Access = GL_READ_ONLY, + .Format = GL_R8, + ._ActualFormat = _mesa_get_shader_image_format(GL_R8) + }; + return u; +} + void _mesa_init_image_units(struct gl_context *ctx) { unsigned i; - for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i) { - struct gl_image_unit *u = &ctx->ImageUnits[i]; - u->Access = GL_READ_ONLY; - u->Format = GL_R8; - u->_ActualFormat = _mesa_get_shader_image_format(u->Format); - } + for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i) + ctx->ImageUnits[i] = _mesa_default_image_unit(ctx); } static GLboolean diff --git a/src/mesa/main/shaderimage.h b/src/mesa/main/shaderimage.h index d08ece81f11..bbe088a2459 100644 --- a/src/mesa/main/shaderimage.h +++ b/src/mesa/main/shaderimage.h @@ -42,6 +42,12 @@ struct gl_context; mesa_format _mesa_get_shader_image_format(GLenum format); +/** + * Get a single image unit struct with the default state. + */ +struct gl_image_unit +_mesa_default_image_unit(struct gl_context *ctx); + /** * Initialize a context's shader image units to the default state. */ diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index cd7cfd6a4fb..395e4d3359f 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -37,6 +37,7 @@ #include "hash.h" #include "imports.h" #include "macros.h" +#include "shaderimage.h" #include "teximage.h" #include "texobj.h" #include "texstate.h" @@ -1411,8 +1412,10 @@ unbind_texobj_from_image_units(struct gl_context *ctx, for (i = 0; i < ctx->Const.MaxImageUnits; i++) { struct gl_image_unit *unit = &ctx->ImageUnits[i]; - if (texObj == unit->TexObj) + if (texObj == unit->TexObj) { _mesa_reference_texobj(&unit->TexObj, NULL); + *unit = _mesa_default_image_unit(ctx); + } } } -- 2.30.2