{ "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310, false },
{ "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0, true },
{ "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0, true },
- { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, true },
{ "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0, true },
{ "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310, false },
- { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, true },
{ "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true },
- { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, true },
{ "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true },
- { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
{ "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false },
- { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
{ "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
- { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
{ "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }
};
EXT(EXT_texture_integer , EXT_texture_integer , GLL, GLC, x , x , 2006)
EXT(EXT_texture_lod_bias , dummy_true , GLL, x , ES1, x , 1999)
EXT(EXT_texture_mirror_clamp , EXT_texture_mirror_clamp , GLL, GLC, x , x , 2004)
+EXT(EXT_texture_norm16 , dummy_true , x , x , x , 31, 2014)
EXT(EXT_texture_object , dummy_true , GLL, x , x , x , 1995)
EXT(EXT_texture_rectangle , NV_texture_rectangle , GLL, x , x , x , 2004)
EXT(EXT_texture_rg , ARB_texture_rg , x , x , x , ES2, 2011)
internalformat == GL_LUMINANCE_ALPHA ||
internalformat == GL_LUMINANCE || internalformat == GL_ALPHA ||
internalformat == GL_BGRA_EXT ||
- (_mesa_is_es3_color_renderable(internalformat) &&
+ (_mesa_is_es3_color_renderable(ctx, internalformat) &&
_mesa_is_es3_texture_filterable(ctx, internalformat));
}
return GL_INVALID_OPERATION;
break;
+ case GL_UNSIGNED_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGBA16)
+ return GL_INVALID_OPERATION;
+ break;
+
+ case GL_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) ||
+ internalFormat != GL_RGBA16_SNORM)
+ return GL_INVALID_OPERATION;
+ break;
+
case GL_UNSIGNED_SHORT_4_4_4_4:
switch (internalFormat) {
case GL_RGBA:
return GL_INVALID_OPERATION;
break;
+ case GL_UNSIGNED_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGB16)
+ return GL_INVALID_OPERATION;
+ break;
+
+ case GL_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) ||
+ internalFormat != GL_RGB16_SNORM)
+ return GL_INVALID_OPERATION;
+ break;
+
case GL_UNSIGNED_SHORT_5_6_5:
switch (internalFormat) {
case GL_RGB:
return GL_INVALID_OPERATION;
break;
+ case GL_UNSIGNED_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RG16)
+ return GL_INVALID_OPERATION;
+ break;
+
+ case GL_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) ||
+ internalFormat != GL_RG16_SNORM)
+ return GL_INVALID_OPERATION;
+ break;
+
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES:
switch (internalFormat) {
return GL_INVALID_OPERATION;
break;
+ case GL_UNSIGNED_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_R16)
+ return GL_INVALID_OPERATION;
+ break;
+
+ case GL_SHORT:
+ if (!_mesa_has_EXT_texture_norm16(ctx) ||
+ internalFormat != GL_R16_SNORM)
+ return GL_INVALID_OPERATION;
+ break;
+
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES:
switch (internalFormat) {
* is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification.
*/
bool
-_mesa_is_es3_color_renderable(GLenum internal_format)
+_mesa_is_es3_color_renderable(const struct gl_context *ctx,
+ GLenum internal_format)
{
switch (internal_format) {
case GL_R8:
case GL_RGBA32I:
case GL_RGBA32UI:
return true;
+ case GL_R16:
+ case GL_RG16:
+ case GL_RGBA16:
+ return _mesa_has_EXT_texture_norm16(ctx);
default:
return false;
}
case GL_R11F_G11F_B10F:
case GL_RGB9_E5:
return true;
+ case GL_R16:
+ case GL_R16_SNORM:
+ case GL_RG16:
+ case GL_RG16_SNORM:
+ case GL_RGB16:
+ case GL_RGB16_SNORM:
+ case GL_RGBA16:
+ case GL_RGBA16_SNORM:
+ return _mesa_has_EXT_texture_norm16(ctx);
case GL_R32F:
case GL_RG32F:
case GL_RGB32F:
GLenum gl_format, GLenum type);
extern bool
-_mesa_is_es3_color_renderable(GLenum internal_format);
+_mesa_is_es3_color_renderable(const struct gl_context *ctx,
+ GLenum internal_format);
extern bool
_mesa_is_es3_texture_filterable(const struct gl_context *ctx,
static GLenum
-read_pixels_es3_error_check(GLenum format, GLenum type,
+read_pixels_es3_error_check(struct gl_context *ctx, GLenum format, GLenum type,
const struct gl_renderbuffer *rb)
{
const GLenum internalFormat = rb->InternalFormat;
return GL_NO_ERROR;
if (internalFormat == GL_RGB10_A2UI && type == GL_UNSIGNED_BYTE)
return GL_NO_ERROR;
+ if (type == GL_UNSIGNED_SHORT) {
+ switch (internalFormat) {
+ case GL_R16:
+ case GL_RG16:
+ case GL_RGB16:
+ case GL_RGBA16:
+ if (_mesa_has_EXT_texture_norm16(ctx))
+ return GL_NO_ERROR;
+ }
+ }
break;
case GL_BGRA:
/* GL_EXT_read_format_bgra */
}
}
} else {
- err = read_pixels_es3_error_check(format, type, rb);
+ err = read_pixels_es3_error_check(ctx, format, type, rb);
}
if (err != GL_NO_ERROR) {
* ARB_shader_image_load_store extension, c.f. table 3.21 of the OpenGL 4.2
* specification.
*
- * These can be supported by GLES 3.1 with GL_NV_image_formats &
- * GL_EXT_texture_norm16 extensions but we don't have support for the
- * latter in Mesa yet.
+ * Following formats are supported by GLES 3.1 with GL_NV_image_formats &
+ * GL_EXT_texture_norm16 extensions.
*/
case GL_RGBA16:
case GL_RGBA16_SNORM:
case GL_RG16_SNORM:
case GL_R16:
case GL_R16_SNORM:
- return _mesa_is_desktop_gl(ctx);
+ return _mesa_is_desktop_gl(ctx) || _mesa_has_EXT_texture_norm16(ctx);
default:
return false;