Implement support for floating point textures.
Trac #12909
Implements GL_OES_texture_float, GL_OES_texture_half_float,
GL_OES_texture_float_linear, and GL_OES_texture_half_float_linear
when supported by the hardware.
Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch
Author: Shannon Woods <shannon.woods@transgaming.com>
git-svn-id: https://angleproject.googlecode.com/svn/trunk@404 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 25d083b..95d38b1 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1068,6 +1068,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (texture->isFloatingPoint())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->copyImage(level, internalformat, x, y, width, height, source);
}
else if (gl::IsCubemapTextureTarget(target))
@@ -1084,6 +1089,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (texture->isFloatingPoint())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->copyImage(target, level, internalformat, x, y, width, height, source);
}
else
@@ -1156,6 +1166,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (texture->isFloatingPoint())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->copySubImage(level, xoffset, yoffset, x, y, width, height, source);
}
else if (gl::IsCubemapTextureTarget(target))
@@ -1172,6 +1187,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (texture->isFloatingPoint())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, source);
}
else
@@ -4256,6 +4276,8 @@
switch (type)
{
case GL_UNSIGNED_BYTE:
+ case GL_FLOAT:
+ case GL_HALF_FLOAT_OES:
break;
default:
return error(GL_INVALID_ENUM);
@@ -4266,6 +4288,8 @@
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
+ case GL_FLOAT:
+ case GL_HALF_FLOAT_OES:
break;
default:
return error(GL_INVALID_ENUM);
@@ -4277,6 +4301,8 @@
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
+ case GL_FLOAT:
+ case GL_HALF_FLOAT_OES:
break;
default:
return error(GL_INVALID_ENUM);
@@ -4320,6 +4346,21 @@
}
}
+ if (type == GL_FLOAT)
+ {
+ if (!context->supportsFloatTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ }
+ else if (type == GL_HALF_FLOAT_OES)
+ {
+ if (!context->supportsHalfFloatTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ }
+
if (target == GL_TEXTURE_2D)
{
gl::Texture2D *texture = context->getTexture2D();
@@ -4486,6 +4527,21 @@
if (context)
{
+ if (format == GL_FLOAT)
+ {
+ if (!context->supportsFloatTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ }
+ else if (format == GL_HALF_FLOAT_OES)
+ {
+ if (!context->supportsHalfFloatTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ }
+
if (target == GL_TEXTURE_2D)
{
gl::Texture2D *texture = context->getTexture2D();
@@ -4500,6 +4556,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (format != texture->getFormat())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
}
else if (gl::IsCubemapTextureTarget(target))
@@ -4516,6 +4577,11 @@
return error(GL_INVALID_OPERATION);
}
+ if (format != texture->getFormat())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
}
else