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; if (!t->_BaseComplete && !t->_MipmapComplete) _mesa_test_texobj_completeness(ctx, t); if (u->Level < t->BaseLevel || u->Level > t->_MaxLevel || (u->Level == t->BaseLevel && !t->_BaseComplete) || (u->Level != t->BaseLevel && !t->_MipmapComplete)) return GL_FALSE; if (_mesa_tex_target_is_layered(t->Target) && u->_Layer >= _mesa_get_texture_layers(t, u->Level)) return GL_FALSE; if (t->Target == GL_TEXTURE_BUFFER) { tex_format = _mesa_get_shader_image_format(t->BufferObjectFormat); } else { struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ? t->Image[u->_Layer][u->Level] : t->Image[0][u->Level]); if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples) return GL_FALSE; tex_format = _mesa_get_shader_image_format(img->InternalFormat); } if (!tex_format) return GL_FALSE; switch (t->ImageFormatCompatibilityType) { case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE: if (_mesa_get_format_bytes(tex_format) != _mesa_get_format_bytes(u->_ActualFormat)) return GL_FALSE; break; case GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS: if (get_image_format_class(tex_format) != get_image_format_class(u->_ActualFormat)) return GL_FALSE; break; default: assert(!"Unexpected image format compatibility type"); } return GL_TRUE; }
static GLboolean validate_image_unit(struct gl_context *ctx, struct gl_image_unit *u) { struct gl_texture_object *t = u->TexObj; struct gl_texture_image *img; if (!t || u->Level < t->BaseLevel || u->Level > t->_MaxLevel) return GL_FALSE; _mesa_test_texobj_completeness(ctx, t); if ((u->Level == t->BaseLevel && !t->_BaseComplete) || (u->Level != t->BaseLevel && !t->_MipmapComplete)) return GL_FALSE; if (_mesa_tex_target_is_layered(t->Target) && u->Layer >= _mesa_get_texture_layers(t, u->Level)) return GL_FALSE; if (t->Target == GL_TEXTURE_CUBE_MAP) img = t->Image[u->Layer][u->Level]; else img = t->Image[0][u->Level]; if (!img || img->Border || get_image_format_class(img->TexFormat) == IMAGE_FORMAT_CLASS_NONE || img->NumSamples > ctx->Const.MaxImageSamples) return GL_FALSE; switch (t->ImageFormatCompatibilityType) { case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE: if (_mesa_get_format_bytes(img->TexFormat) != _mesa_get_format_bytes(u->_ActualFormat)) return GL_FALSE; break; case GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS: if (get_image_format_class(img->TexFormat) != get_image_format_class(u->_ActualFormat)) return GL_FALSE; break; default: assert(!"Unexpected image format compatibility type"); } return GL_TRUE; }