static GLenum _mesa_generic_type_for_internal_format(GLenum internalFormat) { if (_mesa_is_enum_format_unsigned_int(internalFormat)) return GL_UNSIGNED_BYTE; else if (_mesa_is_enum_format_signed_int(internalFormat)) return GL_BYTE; else return GL_FLOAT; }
static GLenum read_pixels_es3_error_check(GLenum format, GLenum type, const struct gl_renderbuffer *rb) { const GLenum internalFormat = rb->InternalFormat; const GLenum data_type = _mesa_get_format_datatype(rb->Format); GLboolean is_unsigned_int = GL_FALSE; GLboolean is_signed_int = GL_FALSE; if (!_mesa_is_color_format(internalFormat)) { return GL_INVALID_OPERATION; } is_unsigned_int = _mesa_is_enum_format_unsigned_int(internalFormat); if (!is_unsigned_int) { is_signed_int = _mesa_is_enum_format_signed_int(internalFormat); } switch (format) { case GL_RGBA: if (type == GL_FLOAT && data_type == GL_FLOAT) return GL_NO_ERROR; /* EXT_color_buffer_float */ if (type == GL_UNSIGNED_BYTE && data_type == GL_UNSIGNED_NORMALIZED) return GL_NO_ERROR; if (internalFormat == GL_RGB10_A2 && type == GL_UNSIGNED_INT_2_10_10_10_REV) return GL_NO_ERROR; if (internalFormat == GL_RGB10_A2UI && type == GL_UNSIGNED_BYTE) return GL_NO_ERROR; break; case GL_BGRA: /* GL_EXT_read_format_bgra */ if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_SHORT_4_4_4_4_REV || type == GL_UNSIGNED_SHORT_1_5_5_5_REV) return GL_NO_ERROR; break; case GL_RGBA_INTEGER: if ((is_signed_int && type == GL_INT) || (is_unsigned_int && type == GL_UNSIGNED_INT)) return GL_NO_ERROR; break; } return GL_INVALID_OPERATION; }
static GLenum read_pixels_es3_error_check(GLenum format, GLenum type, const struct gl_renderbuffer *rb) { const GLenum internalFormat = rb->InternalFormat; const GLenum data_type = _mesa_get_format_datatype(rb->Format); GLboolean is_unsigned_int = GL_FALSE; GLboolean is_signed_int = GL_FALSE; GLboolean is_float_depth = (internalFormat == GL_DEPTH_COMPONENT32F) || (internalFormat == GL_DEPTH32F_STENCIL8); is_unsigned_int = _mesa_is_enum_format_unsigned_int(internalFormat); if (!is_unsigned_int) { is_signed_int = _mesa_is_enum_format_signed_int(internalFormat); } switch (format) { case GL_RGBA: if (type == GL_FLOAT && data_type == GL_FLOAT) return GL_NO_ERROR; /* EXT_color_buffer_float */ if (type == GL_UNSIGNED_BYTE && data_type == GL_UNSIGNED_NORMALIZED) return GL_NO_ERROR; if (internalFormat == GL_RGB10_A2 && type == GL_UNSIGNED_INT_2_10_10_10_REV) return GL_NO_ERROR; if (internalFormat == GL_RGB10_A2UI && type == GL_UNSIGNED_BYTE) return GL_NO_ERROR; break; case GL_BGRA: /* GL_EXT_read_format_bgra */ if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_SHORT_4_4_4_4_REV || type == GL_UNSIGNED_SHORT_1_5_5_5_REV) return GL_NO_ERROR; break; case GL_RGBA_INTEGER: if ((is_signed_int && type == GL_INT) || (is_unsigned_int && type == GL_UNSIGNED_INT)) return GL_NO_ERROR; break; case GL_DEPTH_STENCIL: switch (type) { case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: if (is_float_depth) return GL_NO_ERROR; break; case GL_UNSIGNED_INT_24_8: if (!is_float_depth) return GL_NO_ERROR; break; default: return GL_INVALID_ENUM; } break; case GL_DEPTH_COMPONENT: switch (type) { case GL_FLOAT: if (is_float_depth) return GL_NO_ERROR; break; case GL_UNSIGNED_SHORT: case GL_UNSIGNED_INT: case GL_UNSIGNED_INT_24_8: if (!is_float_depth) return GL_NO_ERROR; break; default: return GL_INVALID_ENUM; } break; case GL_STENCIL_INDEX: switch (type) { case GL_UNSIGNED_BYTE: return GL_NO_ERROR; default: return GL_INVALID_ENUM; } break; } return GL_INVALID_OPERATION; }