mesa: Expose function to calculate whether a shader image unit is valid.
authorFrancisco Jerez <currojerez@riseup.net>
Sat, 29 Aug 2015 13:34:50 +0000 (16:34 +0300)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 9 Oct 2015 14:48:28 +0000 (17:48 +0300)
A future commit will remove all texture object-dependent derived state
from the image unit struct to make validation unnecessary on texture
state changes.  Instead of checking gl_image_unit::_Valid drivers will
be required to call this function when needed to find out whether an
image unit is in a valid state and whether access from the shader is
allowed.

Tested-by: Ye Tian <yex.tian@intel.com>
CC: "11.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/shaderimage.c
src/mesa/main/shaderimage.h

index bd4b7c7be3b476568dbca6cdf18c133892e9e5ee..acc8fa91e950edcb7f45e81422864113d3ce7b31 100644 (file)
@@ -415,8 +415,8 @@ _mesa_init_image_units(struct gl_context *ctx)
       ctx->ImageUnits[i] = _mesa_default_image_unit(ctx);
 }
 
-static GLboolean
-validate_image_unit(struct gl_context *ctx, struct gl_image_unit *u)
+GLboolean
+_mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
 {
    struct gl_texture_object *t = u->TexObj;
    mesa_format tex_format;
@@ -567,7 +567,7 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level,
    u->Access = access;
    u->Format = format;
    u->_ActualFormat = _mesa_get_shader_image_format(format);
-   u->_Valid = validate_image_unit(ctx, u);
+   u->_Valid = _mesa_is_image_unit_valid(ctx, u);
 
    if (u->TexObj && _mesa_tex_target_is_layered(u->TexObj->Target)) {
       u->Layered = layered;
@@ -703,7 +703,7 @@ _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
          u->Access = GL_READ_WRITE;
          u->Format = tex_format;
          u->_ActualFormat = _mesa_get_shader_image_format(tex_format);
-         u->_Valid = validate_image_unit(ctx, u);
+         u->_Valid = _mesa_is_image_unit_valid(ctx, u);
       } else {
          /* Unbind the texture from the unit */
          _mesa_reference_texobj(&u->TexObj, NULL);
index bbe088a24592b3d5c0b8a76c38d842bbbda2c5c0..14a544fca8a78acad8353bc447275b923e0a68d2 100644 (file)
@@ -54,6 +54,17 @@ _mesa_default_image_unit(struct gl_context *ctx);
 void
 _mesa_init_image_units(struct gl_context *ctx);
 
+/**
+ * Return GL_TRUE if the state of the image unit passed as argument is valid
+ * and access from the shader is allowed.  Otherwise loads from this unit
+ * should return zero and stores should have no effect.
+ *
+ * The result depends on context state other than the passed image unit, part
+ * of the _NEW_TEXTURE set.
+ */
+GLboolean
+_mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u);
+
 /**
  * Recalculate the \c _Valid flag of a context's shader image units.
  *