}
}
-/**
- * Return whether an image format should be supported based on the current API
- * version of the context.
- */
-static bool
-is_image_format_supported(const struct gl_context *ctx, GLenum format)
+static GLenum
+_image_format_class_to_glenum(enum image_format_class class)
+{
+ switch (class) {
+ case IMAGE_FORMAT_CLASS_NONE:
+ return GL_NONE;
+ case IMAGE_FORMAT_CLASS_1X8:
+ return GL_IMAGE_CLASS_1_X_8;
+ case IMAGE_FORMAT_CLASS_1X16:
+ return GL_IMAGE_CLASS_1_X_16;
+ case IMAGE_FORMAT_CLASS_1X32:
+ return GL_IMAGE_CLASS_1_X_32;
+ case IMAGE_FORMAT_CLASS_2X8:
+ return GL_IMAGE_CLASS_2_X_8;
+ case IMAGE_FORMAT_CLASS_2X16:
+ return GL_IMAGE_CLASS_2_X_16;
+ case IMAGE_FORMAT_CLASS_2X32:
+ return GL_IMAGE_CLASS_2_X_32;
+ case IMAGE_FORMAT_CLASS_10_11_11:
+ return GL_IMAGE_CLASS_11_11_10;
+ case IMAGE_FORMAT_CLASS_4X8:
+ return GL_IMAGE_CLASS_4_X_8;
+ case IMAGE_FORMAT_CLASS_4X16:
+ return GL_IMAGE_CLASS_4_X_16;
+ case IMAGE_FORMAT_CLASS_4X32:
+ return GL_IMAGE_CLASS_4_X_32;
+ case IMAGE_FORMAT_CLASS_2_10_10_10:
+ return GL_IMAGE_CLASS_10_10_10_2;
+ default:
+ assert("Invalid image_format_class");
+ return GL_NONE;
+ }
+}
+
+GLenum
+_mesa_get_image_format_class(GLenum format)
+{
+ mesa_format tex_format = _mesa_get_shader_image_format(format);
+ if (tex_format == MESA_FORMAT_NONE)
+ return GL_NONE;
+
+ enum image_format_class class = get_image_format_class(tex_format);
+ return _image_format_class_to_glenum(class);
+}
+
+bool
+_mesa_is_shader_image_format_supported(const struct gl_context *ctx,
+ GLenum format)
{
switch (format) {
/* Formats supported on both desktop and ES GL, c.f. table 8.27 of the
struct gl_image_unit
_mesa_default_image_unit(struct gl_context *ctx)
{
+ const GLenum format = _mesa_is_desktop_gl(ctx) ? GL_R8 : GL_R32UI;
const struct gl_image_unit u = {
.Access = GL_READ_ONLY,
- .Format = GL_R8,
- ._ActualFormat = _mesa_get_shader_image_format(GL_R8)
+ .Format = format,
+ ._ActualFormat = _mesa_get_shader_image_format(format)
};
return u;
}
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;
if (!t)
return GL_FALSE;
- _mesa_test_texobj_completeness(ctx, t);
+ if (!t->_BaseComplete && !t->_MipmapComplete)
+ _mesa_test_texobj_completeness(ctx, t);
if (u->Level < t->BaseLevel ||
u->Level > t->_MaxLevel ||
return GL_TRUE;
}
-void
-_mesa_validate_image_units(struct gl_context *ctx)
-{
- unsigned i;
-
- for (i = 0; i < ctx->Const.MaxImageUnits; ++i) {
- struct gl_image_unit *u = &ctx->ImageUnits[i];
- u->_Valid = validate_image_unit(ctx, u);
- }
-}
-
static GLboolean
validate_bind_image_texture(struct gl_context *ctx, GLuint unit,
GLuint texture, GLint level, GLboolean layered,
return GL_FALSE;
}
- if (!is_image_format_supported(ctx, format)) {
+ if (!_mesa_is_shader_image_format_supported(ctx, format)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(format)");
return GL_FALSE;
}
return;
}
+ /* From section 8.22 "Texture Image Loads and Stores" of the OpenGL ES
+ * 3.1 spec:
+ *
+ * "An INVALID_OPERATION error is generated if texture is not the name
+ * of an immutable texture object."
+ */
+ if (_mesa_is_gles(ctx) && !t->Immutable) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindImageTexture(!immutable)");
+ return;
+ }
+
_mesa_reference_texobj(&u->TexObj, t);
} else {
_mesa_reference_texobj(&u->TexObj, NULL);
u->Access = access;
u->Format = format;
u->_ActualFormat = _mesa_get_shader_image_format(format);
- u->_Valid = validate_image_unit(ctx, u);
if (u->TexObj && _mesa_tex_target_is_layered(u->TexObj->Target)) {
u->Layered = layered;
u->Layered = GL_FALSE;
u->Layer = 0;
}
-
- if (ctx->Driver.BindImageTexture)
- ctx->Driver.BindImageTexture(ctx, u, u->TexObj, level, layered,
- layer, access, format);
}
void GLAPIENTRY
tex_format = image->InternalFormat;
}
- if (!is_image_format_supported(ctx, tex_format)) {
+ if (!_mesa_is_shader_image_format_supported(ctx, tex_format)) {
/* The ARB_multi_bind spec says:
*
* "An INVALID_OPERATION error is generated if the internal
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);
} else {
/* Unbind the texture from the unit */
_mesa_reference_texobj(&u->TexObj, NULL);
u->Access = GL_READ_ONLY;
u->Format = GL_R8;
u->_ActualFormat = MESA_FORMAT_R_UNORM8;
- u->_Valid = GL_FALSE;
}
-
- /* Pass the BindImageTexture call down to the device driver */
- if (ctx->Driver.BindImageTexture)
- ctx->Driver.BindImageTexture(ctx, u, u->TexObj, u->Level, u->Layered,
- u->Layer, u->Access, u->Format);
}
_mesa_end_texture_lookups(ctx);
* That is, if barriers is the special value GL_ALL_BARRIER_BITS, then all
* barriers allowed by glMemoryBarrierByRegion should be activated."
*/
- if (barriers == GL_ALL_BARRIER_BITS)
- return ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
+ if (barriers == GL_ALL_BARRIER_BITS) {
+ ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
+ return;
+ }
/* From section 7.11.2 of the OpenGL ES 3.1 specification:
*