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 <marek.olsak@amd.com>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2019-07-12 15:47:26 +02:00 committed by Marek Olšák
parent 71e619a825
commit 5db28b0cf7
5 changed files with 48 additions and 11 deletions

View file

@ -61,7 +61,6 @@
<enum name="MAX_IMAGE_SAMPLES_EXT" value="0x906D"/>
<enum name="IMAGE_BINDING_FORMAT_EXT" value="0x906E"/>
<!--
<function name="BindImageTextureEXT">
<param name="index" type="GLuint"/>
<param name="texture" type="GLuint"/>
@ -71,7 +70,6 @@
<param name="access" type="GLenum"/>
<param name="format" type="GLint"/>
</function>
-->
<function name="MemoryBarrierEXT" alias="MemoryBarrier" >
<param name="barriers" type="GLbitfield"/>

View file

@ -1551,6 +1551,7 @@ offsets = {
"GetMultiTexGenfvEXT": 1515,
"GetMultiTexGenivEXT": 1516,
"MultiTexCoordPointerEXT": 1517,
"BindImageTextureEXT": 1518,
}
functions = [

View file

@ -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)

View file

@ -92,6 +92,11 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level,
GLboolean layered, GLint layer, GLenum access,
GLenum format);
void GLAPIENTRY
_mesa_BindImageTextureEXT(GLuint unit, GLuint texture, GLint level,
GLboolean layered, GLint layer, GLenum access,
GLint format);
void GLAPIENTRY
_mesa_BindImageTextures_no_error(GLuint first, GLsizei count,
const GLuint *textures);

View file

@ -1409,6 +1409,9 @@ const struct function common_desktop_functions_possible[] = {
{ "glMaxShaderCompilerThreadsKHR", 11, -1 },
/* GL_EXT_shader_image_load_store */
{ "glBindImageTextureEXT", 30, -1 },
{ NULL, 0, -1 }
};