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