[Mesa-dev] [PATCH 04/25] mesa: Reset image unit state to the default values when a bound image is deleted.
Tapani Pälli
tapani.palli at intel.com
Mon Aug 17 22:36:42 PDT 2015
On 08/17/2015 07:45 PM, Francisco Jerez wrote:
> 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 -- In any case it shouldn't make
FWIW this seems to be specified in the desktop GL (and ES 3.1) spec in
section "Automatic Unbinding of Deleted Objects".
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
> any practical difference because one cannot sensibly use an image unit
> not bound to any texture object without re-specifying its state, so
> just make the test happy.
> ---
> 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 2d86931..48e3e09 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 d08ece8..bbe088a 100644
> --- a/src/mesa/main/shaderimage.h
> +++ b/src/mesa/main/shaderimage.h
> @@ -43,6 +43,12 @@ 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.
> */
> void
> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
> index cd7cfd6..395e4d3 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);
> + }
> }
> }
>
>
More information about the mesa-dev
mailing list