diff options
author | Pierre-Eric Pelloux-Prayer <[email protected]> | 2019-07-12 15:47:26 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-08-06 17:40:53 -0400 |
commit | 5db28b0cf748cdcd50408cb8391cdf5df03cfd92 (patch) | |
tree | 8c0ce450a512d30929db20de81c651482f37778f /src/mesa/main/shaderimage.c | |
parent | 71e619a82549d9212c58a91ac0de53c0f21059dd (diff) |
mesa: add EXT_shader_image_load_store glBindImageTextureEXT function
The implementation is almost identical to glBindImageTexture except for error
checking.
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/main/shaderimage.c')
-rw-r--r-- | src/mesa/main/shaderimage.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index 242a8c29909..1712483c415 100644 --- a/src/mesa/main/shaderimage.c +++ b/src/mesa/main/shaderimage.c @@ -541,7 +541,7 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u) static GLboolean validate_bind_image_texture(struct gl_context *ctx, GLuint unit, GLuint texture, GLint level, GLint layer, - GLenum access, GLenum format) + GLenum access, GLenum format, bool check_level_layer) { assert(ctx->Const.MaxImageUnits <= MAX_IMAGE_UNITS); @@ -550,14 +550,19 @@ validate_bind_image_texture(struct gl_context *ctx, GLuint unit, return GL_FALSE; } - if (level < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(level)"); - return GL_FALSE; - } + if (check_level_layer) { + /* EXT_shader_image_load_store doesn't throw an error if level or + * layer is negative. + */ + if (level < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(level)"); + return GL_FALSE; + } - if (layer < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(layer)"); - return GL_FALSE; + if (layer < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(layer)"); + return GL_FALSE; + } } if (access != GL_READ_ONLY && @@ -637,7 +642,7 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level, GET_CURRENT_CONTEXT(ctx); if (!validate_bind_image_texture(ctx, unit, texture, level, layer, access, - format)) + format, true)) return; if (texture) { @@ -669,6 +674,31 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level, bind_image_texture(ctx, texObj, unit, level, layered, layer, access, format); } +void GLAPIENTRY +_mesa_BindImageTextureEXT(GLuint index, GLuint texture, GLint level, + GLboolean layered, GLint layer, GLenum access, + GLint format) +{ + struct gl_texture_object *texObj = NULL; + + GET_CURRENT_CONTEXT(ctx); + + if (!validate_bind_image_texture(ctx, index, texture, level, layer, access, + format, false)) + return; + + if (texture) { + texObj = _mesa_lookup_texture(ctx, texture); + + if (!texObj) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTextureEXT(texture)"); + return; + } + } + + bind_image_texture(ctx, texObj, index, level, layered, layer, access, format); +} + static ALWAYS_INLINE void bind_image_textures(struct gl_context *ctx, GLuint first, GLuint count, const GLuint *textures, bool no_error) |