Source/WebCore: [WebGL] Support for texImage2D of type HALF_FLOAT_OES
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Dec 2013 21:25:50 +0000 (21:25 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Dec 2013 21:25:50 +0000 (21:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=110936

Reviewed by Brent Fulgham.

Add support for the HALF_FLOAT_OES texture format from texImage2D
and texSubImage2D.

A lot of this patch comes from the original patch on the bug
by Nayan Kumar, and the Blink commit:
https://codereview.chromium.org/13842017

Tests: fast/canvas/webgl/oes-texture-half-float-with-canvas.html
       fast/canvas/webgl/oes-texture-half-float-with-image.html
       fast/canvas/webgl/oes-texture-half-float-with-video.html

* html/canvas/OESTextureHalfFloat.idl: New HALF_FLOAT_OES constant value.
* html/canvas/WebGLRenderingContext.cpp:
(WebCore::WebGLRenderingContext::validateTexFunc): Remove the code that
would bail if half-float values were used.
* platform/graphics/GraphicsContext3D.cpp:
- Return appropriate DataFormats for half floating point types.
- Copy the float -> half-float code from Blink
- New pack functions for half floats
* platform/graphics/GraphicsContext3D.h: New format types.
* platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp:
(WebCore::GraphicsContext3D::texSubImage2D): Use GL_HALF_FLOAT_ARB if we're passed
a HALF_FLOAT_OES.

LayoutTests: [WebGL] Support for texImage2D/texSubImage2D of type HALF_FLOAT_OES
https://bugs.webkit.org/show_bug.cgi?id=110936

Reviewed by Brent Fulgham.

New tests for half-float textures.

* fast/canvas/webgl/oes-texture-half-float-expected.txt:
* fast/canvas/webgl/oes-texture-half-float-not-supported-expected.txt: Removed.
* fast/canvas/webgl/oes-texture-half-float-not-supported.html: Removed.
* fast/canvas/webgl/oes-texture-half-float-with-canvas-expected.txt: Added.
* fast/canvas/webgl/oes-texture-half-float-with-canvas.html: Added.
* fast/canvas/webgl/oes-texture-half-float-with-image-expected.txt: Added.
* fast/canvas/webgl/oes-texture-half-float-with-image.html: Added.
* fast/canvas/webgl/oes-texture-half-float-with-video-expected.txt: Added.
* fast/canvas/webgl/oes-texture-half-float-with-video.html: Added.
* fast/canvas/webgl/oes-texture-half-float.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@160119 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/canvas/webgl/oes-texture-half-float-expected.txt
LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported-expected.txt [deleted file]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported.html [deleted file]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas-expected.txt [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas.html [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image-expected.txt [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image.html [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video-expected.txt [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video.html [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/oes-texture-half-float.html
Source/WebCore/ChangeLog
Source/WebCore/html/canvas/OESTextureHalfFloat.idl
Source/WebCore/html/canvas/WebGLRenderingContext.cpp
Source/WebCore/platform/graphics/GraphicsContext3D.cpp
Source/WebCore/platform/graphics/GraphicsContext3D.h
Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp

index 4224396..a67c227 100644 (file)
@@ -1,3 +1,23 @@
+2013-12-03  Dean Jackson  <dino@apple.com>
+
+        [WebGL] Support for texImage2D/texSubImage2D of type HALF_FLOAT_OES
+        https://bugs.webkit.org/show_bug.cgi?id=110936
+
+        Reviewed by Brent Fulgham.
+
+        New tests for half-float textures.
+
+        * fast/canvas/webgl/oes-texture-half-float-expected.txt:
+        * fast/canvas/webgl/oes-texture-half-float-not-supported-expected.txt: Removed.
+        * fast/canvas/webgl/oes-texture-half-float-not-supported.html: Removed.
+        * fast/canvas/webgl/oes-texture-half-float-with-canvas-expected.txt: Added.
+        * fast/canvas/webgl/oes-texture-half-float-with-canvas.html: Added.
+        * fast/canvas/webgl/oes-texture-half-float-with-image-expected.txt: Added.
+        * fast/canvas/webgl/oes-texture-half-float-with-image.html: Added.
+        * fast/canvas/webgl/oes-texture-half-float-with-video-expected.txt: Added.
+        * fast/canvas/webgl/oes-texture-half-float-with-video.html: Added.
+        * fast/canvas/webgl/oes-texture-half-float.html:
+
 2013-12-04  Mihnea Ovidenie  <mihnea@adobe.com>
 
         [CSSRegions] Test dynamic change of position for out-of-flow transformed element
index bfc965f..7ef5b10 100644 (file)
@@ -1,3 +1,19 @@
+CONSOLE MESSAGE: WebGL: INVALID_ENUM: texImage2D: invalid texture type
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
+CONSOLE MESSAGE: WebGL: INVALID_OPERATION: texImage2D: type HALF_FLOAT_OES but ArrayBufferView is not NULL
 This test verifies the functionality of OES_texture_half_float with null/non-null ArrayBufferView
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -6,7 +22,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 PASS WebGL context exists
 Testing texture creation with extension disabled, format RGBA, and data null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_ENUM : Half floating point texture must be diallowed if OES_texture_half_float isn't enabled
+PASS getError was expected value: INVALID_ENUM : Half floating point texture must be disallowed if OES_texture_half_float isn't enabled
 PASS Successfully enabled OES_texture_half_float extension
 Testing texture creation with extension enabled, format RGBA, and data null. Expect Success
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
@@ -25,49 +41,49 @@ PASS getError was expected value: NO_ERROR : texture parameter setup should succ
 PASS getError was expected value: NO_ERROR : Half floating point texture allocation should succeed if OES_texture_half_float is enabled
 Testing texture creation with extension enabled, format RGBA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format RGBA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format RGBA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format RGB, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format RGB, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format RGB, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE_ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE_ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 Testing texture creation with extension enabled, format LUMINANCE_ALPHA, and data non-null. Expect Failure
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be diallowed when ArrayBufferView is not-null
+PASS getError was expected value: INVALID_OPERATION : Half floating point texture allocation must be disallowed when ArrayBufferView is not-null
 
 Testing half floating point render target
 PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported-expected.txt b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported-expected.txt
deleted file mode 100644 (file)
index 2f1b350..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-Testing not yet supported texture uploads
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-
-PASS WebGL context exists
-PASS Successfully enabled OES_texture_half_float extension
-
-Verify whether uploading ImageData via texImage2D/texSubImage2D is supported
-PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture is not yet supported
-PASS getError was expected value: NO_ERROR : Uploading null ArrayBufferView to half float texture should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture using texSubImage2D is not supported yet
-
-Verify whether uploading HTMLImageElement via texImage2D/texSubImage2D is supported
-
-Verify whether uploading HTMLCanvasElement via texImage2D/texSubImage2D is supported
-PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture is not yet supported
-PASS getError was expected value: NO_ERROR : Uploading null ArrayBufferView to half float texture should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture using texSubImage2D is not supported yet
-
-Verify whether uploading HTMLVideoElement via texImage2D/texSubImage2D is supported
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture is not yet supported
-PASS getError was expected value: NO_ERROR : Uploading null ArrayBufferView to half float texture should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture using texSubImage2D is not supported yet
-PASS getError was expected value: NO_ERROR : texture parameter setup should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture is not yet supported
-PASS getError was expected value: NO_ERROR : Uploading null ArrayBufferView to half float texture should succeed
-PASS getError was expected value: INVALID_OPERATION : Uploading to half float texture using texSubImage2D is not supported yet
-PASS successfullyParsed is true
-
-TEST COMPLETE
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported.html b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-not-supported.html
deleted file mode 100644 (file)
index 1335b9b..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>WebGL OES_texture_half_float not yet implemented Conformance Tests</title>
-<script src="resources/desktop-gl-constants.js" type="text/javascript"></script>
-<script src="../../../resources/js-test-pre.js"></script>
-<script src="resources/webgl-test.js"></script>
-<script src="resources/webgl-test-utils.js"></script>
-</head>
-<body>
-<canvas id="texcanvas" width="1" height="2"></canvas>
-<script>
-description("Testing not yet supported texture uploads");
-debug("");
-
-if (window.initNonKhronosFramework) {
-    window.initNonKhronosFramework(true);
-}
-
-if (window.internals)
-    window.internals.settings.setWebGLErrorsToConsoleEnabled(false);
-
-var wtu = WebGLTestUtils;
-var canvas = document.getElementById("canvas");
-var gl = wtu.create3DContext(canvas);
-var successfullyParsed = false;
-
-if (!gl) {
-    testFailed("WebGL context does not exists");
-} else {
-    testPassed("WebGL context exists");
-
-    if(!gl.getExtension("OES_texture_half_float")) {
-        testPassed("No OES_texture_half_float support. This is legal");
-    } else {
-        testPassed("Successfully enabled OES_texture_half_float extension");
-        
-        var canvas2d = document.getElementById("texcanvas");
-        var context2d = canvas2d.getContext("2d");
-
-        runImageDataUnsupportedTest(canvas2d, context2d);
-        runHTMLImageElementUnsupportedTest(canvas2d, context2d);
-        runHTMLCanvasElementUnsupportedTest(canvas2d, context2d);
-        runHTMLVideoElementUnsupportedTest(canvas2d, context2d);
-    }
-}
-
-function allocateTexture()
-{
-    var texture = gl.createTexture();
-    gl.bindTexture(gl.TEXTURE_2D, texture);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-    glErrorShouldBe(gl, gl.NO_ERROR, "texture parameter setup should succeed");
-    return texture;
-}
-
-function runTextureUploadTest(image)
-{
-    var texture = allocateTexture();
-    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.HALF_FLOAT_OES, image);
-    glErrorShouldBe(gl, gl.INVALID_OPERATION, "Uploading to half float texture is not yet supported");
-
-    // Check if uploading ImageData via texSubImage2D is supported
-    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 2, 0, gl.RGBA, gl.HALF_FLOAT_OES, null);
-    glErrorShouldBe(gl, gl.NO_ERROR, "Uploading null ArrayBufferView to half float texture should succeed");
-    gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.HALF_FLOAT_OES, image);
-    glErrorShouldBe(gl, gl.INVALID_OPERATION, "Uploading to half float texture using texSubImage2D is not supported yet");
-}
-
-function runImageDataUnsupportedTest(canvas2d, context2d)
-{
-    debug("");
-    debug("Verify whether uploading ImageData via texImage2D/texSubImage2D is supported");
-    
-    // Check if uploading ImageData via texImage2D is supported
-    var imageData = context2d.createImageData(1, 2);
-    var data = imageData.data;
-    data[0] = 255;
-    data[1] = 0;
-    data[2] = 0;
-    data[3] = 255;
-    data[4] = 0;
-    data[5] = 255;
-    data[6] = 0;
-    data[7] = 0;
-
-    runTextureUploadTest(imageData);    
-}
-
-function runHTMLImageElementUnsupportedTest(canvas2d, context2d)
-{
-    debug("");
-    debug("Verify whether uploading HTMLImageElement via texImage2D/texSubImage2D is supported");
-
-    var imageData = context2d.createImageData(1, 2);
-    var data = imageData.data;
-    data[0] = 255;
-    data[1] = 0;
-    data[2] = 0;
-    data[3] = 255;
-    data[4] = 0;
-    data[5] = 255;
-    data[6] = 0;
-    data[7] = 0;
-    context2d.putImageData(imageData, 0, 0);
-
-    var newImage = document.createElement("img");
-    newImage.onload = function() {
-        runTextureUploadTest(newImage);
-    }
-    newImage.src = canvas2d.toDataURL();
-}
-
-function setCanvasToRedGreen(ctx) {
-    var width = ctx.canvas.width;
-    var height = ctx.canvas.height;
-    var halfHeight = Math.floor(height / 2);
-    ctx.fillStyle = "#ff0000";
-    ctx.fillRect(0, 0, width, halfHeight);
-    ctx.fillStyle = "#00ff00";
-    ctx.fillRect(0, halfHeight, width, height - halfHeight);
-}
-
-function runHTMLCanvasElementUnsupportedTest(canvas2d, context2d)
-{
-    debug("");
-    debug("Verify whether uploading HTMLCanvasElement via texImage2D/texSubImage2D is supported");
-    
-    context2d.width = 1;
-    context2d.height = 2;
-    setCanvasToRedGreen(context2d);
-
-    runTextureUploadTest(canvas2d);
-}
-
-function runHTMLVideoElementUnsupportedTest(canvas2d, context2d)
-{
-    debug("");
-    debug("Verify whether uploading HTMLVideoElement via texImage2D/texSubImage2D is supported");
-
-    var info = { src: "resources/red-green.mp4", type: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'};
-    var video = document.createElement("video");
-    if (!video.canPlayType) {
-        testFailed("video.canPlayType required method is missing");
-        return;
-    }
-    document.body.appendChild(video);
-    video.addEventListener(
-        "playing", function() { runTextureUploadTest(video); finishTest(); }, true);
-    video.type = info.type;
-    video.src = info.src;
-    video.loop = true;
-    video.width = 1;
-    video.height = 2;
-    video.play();
-
-}
-
-debug("");
-
-</script>
-<script src="../../../resources/js-test-post.js"></script>
-</body>
-</html>
-
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas-expected.txt b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas-expected.txt
new file mode 100644 (file)
index 0000000..2574f4f
--- /dev/null
@@ -0,0 +1,30 @@
+Verify texImage2D and texSubImage2D code paths taking canvas elements (RGBA/HALF_FLOAT_OES)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Successfully enabled OES_texture_half_float extension
+Testing texImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texSubImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texSubImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+PASS getError was expected value: NO_ERROR : should be no errors
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas.html b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-canvas.html
new file mode 100644 (file)
index 0000000..f294ae4
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+
+/*
+** Copyright (c) 2013 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="resources/desktop-gl-constants.js" type="text/javascript"></script>
+<script src="../../../resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
+<script src="resources/webgl-test-utils.js"></script>
+<script src="resources/tex-image-and-sub-image-2d-with-canvas.js"></script>
+<script>
+"use strict";
+function testPrologue(gl) {
+    var ext = null;
+
+    if (!(ext = gl.getExtension("OES_texture_half_float"))) {
+        testPassed("No OES_texture_half_float support -- this is legal");
+        return false;
+    }
+
+    // Required by the test harness.
+    gl.HALF_FLOAT_OES = ext.HALF_FLOAT_OES;
+    testPassed("Successfully enabled OES_texture_half_float extension");
+    return true;
+}
+</script>
+</head>
+<body onload='generateTest("RGBA", "HALF_FLOAT_OES", testPrologue)()'>
+<canvas id="example" width="32" height="32"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+</body>
+</html>
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image-expected.txt b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image-expected.txt
new file mode 100644 (file)
index 0000000..61384aa
--- /dev/null
@@ -0,0 +1,70 @@
+Verify texImage2D and texSubImage2D code paths taking image elements (RGBA/HALF_FLOAT_OES)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Successfully enabled OES_texture_half_float extension
+Testing texImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texSubImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texSubImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texSubImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texSubImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texSubImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texSubImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+PASS getError was expected value: NO_ERROR : should be no errors
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image.html b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-image.html
new file mode 100644 (file)
index 0000000..74aae70
--- /dev/null
@@ -0,0 +1,60 @@
+<!--
+
+/*
+** Copyright (c) 2013 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="resources/desktop-gl-constants.js" type="text/javascript"></script>
+<script src="../../../resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
+<script src="resources/webgl-test-utils.js"></script>
+<script src="resources/tex-image-and-sub-image-2d-with-image.js"></script>
+<script>
+"use strict";
+function testPrologue(gl) {
+    var ext = null;
+
+    if (!(ext = gl.getExtension("OES_texture_half_float"))) {
+        testPassed("No OES_texture_half_float support -- this is legal");
+        return false;
+    }
+
+    // Required by the test harness.
+    gl.HALF_FLOAT_OES = ext.HALF_FLOAT_OES;
+
+    testPassed("Successfully enabled OES_texture_half_float extension");
+    return true;
+}
+</script>
+</head>
+<body onload='generateTest("RGBA", "HALF_FLOAT_OES", ".", testPrologue)()'>
+<canvas id="example" width="32" height="32"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+</body>
+</html>
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video-expected.txt b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video-expected.txt
new file mode 100644 (file)
index 0000000..181a38f
--- /dev/null
@@ -0,0 +1,30 @@
+Verify texImage2D and texSubImage2D code paths taking video elements (RGBA/HALF_FLOAT_OES)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Successfully enabled OES_texture_half_float extension
+Testing texImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+Testing texSubImage2D with flipY=true
+Checking lower left corner
+PASS shouldBe 0,255,0
+Checking upper left corner
+PASS shouldBe 255,0,0
+Testing texSubImage2D with flipY=false
+Checking lower left corner
+PASS shouldBe 255,0,0
+Checking upper left corner
+PASS shouldBe 0,255,0
+PASS getError was expected value: NO_ERROR : should be no errors
+PASS successfullyParsed is true
+
+TEST COMPLETE
diff --git a/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video.html b/LayoutTests/fast/canvas/webgl/oes-texture-half-float-with-video.html
new file mode 100644 (file)
index 0000000..aa361f3
--- /dev/null
@@ -0,0 +1,65 @@
+<!--
+
+/*
+** Copyright (c) 2013 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="resources/desktop-gl-constants.js" type="text/javascript"></script>
+<script src="../../../resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
+<script src="resources/webgl-test-utils.js"></script>
+<script src="resources/tex-image-and-sub-image-2d-with-video.js"></script>
+<script>
+"use strict";
+function testPrologue(gl) {
+    var ext = null;
+
+    if (!(ext = gl.getExtension("OES_texture_half_float"))) {
+        testPassed("No OES_texture_half_float support -- this is legal");
+        return false;
+    }
+
+    // Required by the test harness.
+    gl.HALF_FLOAT_OES = ext.HALF_FLOAT_OES;
+
+    testPassed("Successfully enabled OES_texture_half_float extension");
+    return true;
+}
+</script>
+</head>
+<body onload='generateTest("RGBA", "HALF_FLOAT_OES", testPrologue)()'>
+<canvas id="example" width="32" height="32"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+<video width="640" height="228" id="vid" controls>
+  <source src="resources/red-green.mp4"  type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
+  <source src="resources/red-green.webmvp8.webm" type='video/webm; codecs="vp8, vorbis"' />
+  <source src="resources/red-green.theora.ogv"  type='video/ogg; codecs="theora, vorbis"' />
+</video>
+</body>
+</html>
index e6b98f8..fd3e558 100644 (file)
@@ -1,3 +1,30 @@
+<!--
+
+/*
+** Copyright (c) 2013 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+-->
+
 <!DOCTYPE html>
 <html>
 <head>
@@ -30,7 +57,7 @@ void main()
     }
 }
 </script>
-<!-- Shaders for testing half floating-point render targets -->
+<!-- Shaders for testing half-floating-point render targets -->
 <script id="positionVertexShader" type="x-shader/x-vertex">
 attribute vec4 vPosition;
 void main()
@@ -45,15 +72,16 @@ void main()
 }
 </script>
 <script>
+"use strict"
 description("This test verifies the functionality of OES_texture_half_float with null/non-null ArrayBufferView");
-debug("");
-
-if (window.internals)
-    window.internals.settings.setWebGLErrorsToConsoleEnabled(false);
 
+debug("");
 var wtu = WebGLTestUtils;
 var canvas = document.getElementById("canvas");
 var gl = wtu.create3DContext(canvas);
+// This constant must be defined in order to run the texture creation test without the extension enabled.
+var halfFloatOESEnum = 0x8D61;
+var ext = null;
 
 if (!gl) {
     testFailed("WebGL context does not exists");
@@ -63,7 +91,7 @@ if (!gl) {
     // Verify that allocation of texture fails if extension is not enabled
     runTextureCreationTest(false);
 
-    if(!gl.getExtension("OES_texture_half_float")) {
+    if (!(ext = gl.getExtension("OES_texture_half_float"))) {
         testPassed("No OES_texture_half_float support. This is legal");
     } else {
         testPassed("Successfully enabled OES_texture_half_float extension");
@@ -73,12 +101,12 @@ if (!gl) {
         for (var i = 0; i < formats.length; i++) {
             runTextureCreationTest(true, formats[i], null);
         }
-        
+
         // Texture creation should fail when passed with non-null ArrayBufferView
         for (var i = 0; i < formats.length; i++) {
             var width = 2;
             var height = 2;
-            
+
             // Float32Array
             var float32Data = new Float32Array(width * height * getNumberOfChannels(formats[i]));
             for (var ii = 0; ii < float32Data.length; ii++) {
@@ -98,7 +126,7 @@ if (!gl) {
             for (var ii = 0; ii <  uint16Data.length; ii++) {
                 uint16Data[ii] = 1000;
             }
-            runTextureCreationTest(true, formats[i], uint16Data);            
+            runTextureCreationTest(true, formats[i], uint16Data);
         }
 
         // Check if attaching texture as FBO target succeeds (Not mandatory)
@@ -151,22 +179,22 @@ function runTextureCreationTest(extensionEnabled, opt_format, opt_data)
     var format = opt_format || gl.RGBA;
     var data = opt_data || null;
     var expectSuccess = true;
-    
+
     if (!extensionEnabled || data)
         expectSuccess = false;
     debug("Testing texture creation with extension " + (extensionEnabled ? "enabled" : "disabled") +
           ", format " + getFormatName(format) + ", and data " + (data ? "non-null" : "null") +
-          ". Expect " + (expectSuccess ? "Success" : "Failure"));   
+          ". Expect " + (expectSuccess ? "Success" : "Failure"));
 
     var texture = allocateTexture();
     var width = 2;
     var height = 2;
-    gl.texImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, format, gl.HALF_FLOAT_OES, data);
+    gl.texImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, format, halfFloatOESEnum, data);
     if(!extensionEnabled) {
-        glErrorShouldBe(gl, gl.INVALID_ENUM, "Half floating point texture must be diallowed if OES_texture_half_float isn't enabled");
+        glErrorShouldBe(gl, gl.INVALID_ENUM, "Half floating point texture must be disallowed if OES_texture_half_float isn't enabled");
         return;
     } else if (data) {
-        glErrorShouldBe(gl, gl.INVALID_OPERATION, "Half floating point texture allocation must be diallowed when ArrayBufferView is not-null");
+        glErrorShouldBe(gl, gl.INVALID_OPERATION, "Half floating point texture allocation must be disallowed when ArrayBufferView is not-null");
         return;
     } else {
         glErrorShouldBe(gl, gl.NO_ERROR, "Half floating point texture allocation should succeed if OES_texture_half_float is enabled");
@@ -186,8 +214,8 @@ function runRenderTargetTest(testProgram)
     var texture = allocateTexture();
     var width = 2;
     var height = 2;
-    
-    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.HALF_FLOAT_OES, null);
+
+    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, ext.HALF_FLOAT_OES, null);
     glErrorShouldBe(gl, gl.NO_ERROR, "Half floating point texture allocation should succeed if OES_texture_half_float is enabled");
 
     // Try to use this texture as render target
index 34b6a19..7cb546a 100644 (file)
@@ -1,3 +1,34 @@
+2013-12-03  Dean Jackson  <dino@apple.com>
+
+        [WebGL] Support for texImage2D of type HALF_FLOAT_OES
+        https://bugs.webkit.org/show_bug.cgi?id=110936
+
+        Reviewed by Brent Fulgham.
+
+        Add support for the HALF_FLOAT_OES texture format from texImage2D
+        and texSubImage2D.
+
+        A lot of this patch comes from the original patch on the bug
+        by Nayan Kumar, and the Blink commit:
+        https://codereview.chromium.org/13842017
+
+        Tests: fast/canvas/webgl/oes-texture-half-float-with-canvas.html
+               fast/canvas/webgl/oes-texture-half-float-with-image.html
+               fast/canvas/webgl/oes-texture-half-float-with-video.html
+
+        * html/canvas/OESTextureHalfFloat.idl: New HALF_FLOAT_OES constant value.
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::validateTexFunc): Remove the code that
+        would bail if half-float values were used.
+        * platform/graphics/GraphicsContext3D.cpp:
+        - Return appropriate DataFormats for half floating point types.
+        - Copy the float -> half-float code from Blink
+        - New pack functions for half floats
+        * platform/graphics/GraphicsContext3D.h: New format types.
+        * platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp:
+        (WebCore::GraphicsContext3D::texSubImage2D): Use GL_HALF_FLOAT_ARB if we're passed
+        a HALF_FLOAT_OES.
+
 2013-12-04  Daniel Bates  <dabates@apple.com>
 
         Fix the Apple Windows build after <http://trac.webkit.org/changeset/160113>
index d8acd93..a1e0ba5 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2013 Motorola Mobility LLC. All rights reserved.
+ * Copyright (C) 2013 Apple, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -28,4 +29,5 @@
     Conditional=WEBGL,
     GenerateIsReachable=ImplWebGLRenderingContext,
 ] interface OESTextureHalfFloat {
+    const GLenum HALF_FLOAT_OES = 0x8D61;
 };
index 3faaef0..73b89e7 100644 (file)
@@ -3733,13 +3733,6 @@ void WebGLRenderingContext::texImage2DImpl(GC3Denum target, GC3Dint level, GC3De
 
 bool WebGLRenderingContext::validateTexFunc(const char* functionName, TexFuncValidationFunctionType functionType, TexFuncValidationSourceType sourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset)
 {
-    // FIXME: Uploading {ImageData, HTMLImageElement, HTMLCanvasElement, HTMLVideoElement} to half floating point texture is not supported yet.
-    // See https://bugs.webkit.org/show_bug.cgi?id=110936.
-    if (sourceType != SourceArrayBufferView && type == GraphicsContext3D::HALF_FLOAT_OES) {
-        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "Operation not supported yet");
-        return false;
-    }
-
     if (!validateTexFuncParameters(functionName, functionType, target, level, internalformat, width, height, border, format, type))
         return false;
 
index 7a38d8c..d2b1abf 100644 (file)
@@ -81,6 +81,27 @@ GraphicsContext3D::DataFormat getDataFormat(GC3Denum destinationFormat, GC3Denum
     case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
         dstFormat = GraphicsContext3D::DataFormatRGB565;
         break;
+    case GraphicsContext3D::HALF_FLOAT_OES: // OES_texture_half_float
+        switch (destinationFormat) {
+        case GraphicsContext3D::RGB:
+            dstFormat = GraphicsContext3D::DataFormatRGB16F;
+            break;
+        case GraphicsContext3D::RGBA:
+            dstFormat = GraphicsContext3D::DataFormatRGBA16F;
+            break;
+        case GraphicsContext3D::ALPHA:
+            dstFormat = GraphicsContext3D::DataFormatA16F;
+            break;
+        case GraphicsContext3D::LUMINANCE:
+            dstFormat = GraphicsContext3D::DataFormatR16F;
+            break;
+        case GraphicsContext3D::LUMINANCE_ALPHA:
+            dstFormat = GraphicsContext3D::DataFormatRA16F;
+            break;
+        default:
+            ASSERT_NOT_REACHED();
+        }
+        break;
     case GraphicsContext3D::FLOAT: // OES_texture_float
         switch (destinationFormat) {
         case GraphicsContext3D::RGB:
@@ -310,6 +331,129 @@ bool GraphicsContext3D::extractTextureData(unsigned int width, unsigned int heig
 
 namespace {
 
+// Following Float to Half-Float converion code is from the implementation of ftp://www.fox-toolkit.org/pub/fasthalffloatconversion.pdf,
+// "Fast Half Float Conversions" by Jeroen van der Zijp, November 2008 (Revised September 2010).
+// Specially, the basetable[512] and shifttable[512] are generated as follows:
+/*
+unsigned short basetable[512];
+unsigned char shifttable[512];
+
+void generatetables(){
+    unsigned int i;
+    int e;
+    for (i = 0; i < 256; ++i){
+        e = i - 127;
+        if (e < -24){ // Very small numbers map to zero
+            basetable[i | 0x000] = 0x0000;
+            basetable[i | 0x100] = 0x8000;
+            shifttable[i | 0x000] = 24;
+            shifttable[i | 0x100] = 24;
+        }
+        else if (e < -14) { // Small numbers map to denorms
+            basetable[i | 0x000] = (0x0400>>(-e-14));
+            basetable[i | 0x100] = (0x0400>>(-e-14)) | 0x8000;
+            shifttable[i | 0x000] = -e-1;
+            shifttable[i | 0x100] = -e-1;
+        }
+        else if (e <= 15){ // Normal numbers just lose precision
+            basetable[i | 0x000] = ((e+15)<<10);
+            basetable[i| 0x100] = ((e+15)<<10) | 0x8000;
+            shifttable[i|0x000] = 13;
+            shifttable[i|0x100] = 13;
+        }
+        else if (e<128){ // Large numbers map to Infinity
+            basetable[i|0x000] = 0x7C00;
+            basetable[i|0x100] = 0xFC00;
+            shifttable[i|0x000] = 24;
+            shifttable[i|0x100] = 24;
+        }
+        else { // Infinity and NaN's stay Infinity and NaN's
+            basetable[i|0x000] = 0x7C00;
+            basetable[i|0x100] = 0xFC00;
+            shifttable[i|0x000] = 13;
+            shifttable[i|0x100] = 13;
+       }
+    }
+}
+*/
+
+unsigned short baseTable[512] = {
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,
+0,      0,      0,      0,      0,      0,      0,      1,      2,      4,      8,      16,     32,     64,     128,    256,
+512,    1024,   2048,   3072,   4096,   5120,   6144,   7168,   8192,   9216,   10240,  11264,  12288,  13312,  14336,  15360,
+16384,  17408,  18432,  19456,  20480,  21504,  22528,  23552,  24576,  25600,  26624,  27648,  28672,  29696,  30720,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,  31744,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,  32768,
+32768,  32768,  32768,  32768,  32768,  32768,  32768,  32769,  32770,  32772,  32776,  32784,  32800,  32832,  32896,  33024,
+33280,  33792,  34816,  35840,  36864,  37888,  38912,  39936,  40960,  41984,  43008,  44032,  45056,  46080,  47104,  48128,
+49152,  50176,  51200,  52224,  53248,  54272,  55296,  56320,  57344,  58368,  59392,  60416,  61440,  62464,  63488,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,
+64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512,  64512
+};
+
+unsigned char shiftTable[512] = {
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     23,     22,     21,     20,     19,     18,     17,     16,     15,
+14,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,
+13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     13,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     23,     22,     21,     20,     19,     18,     17,     16,     15,
+14,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,
+13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     13,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,
+24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     24,     13
+};
+
+unsigned short convertFloatToHalfFloat(float f)
+{
+    unsigned temp = *(reinterpret_cast<unsigned *>(&f));
+    unsigned signexp = (temp >> 23) & 0x1ff;
+    return baseTable[signexp] + ((temp & 0x007fffff) >> shiftTable[signexp]);
+}
+
 /* BEGIN CODE SHARED WITH MOZILLA FIREFOX */
 
 // The following packing and unpacking routines are expressed in terms of function templates and inline functions to achieve generality and speedup.
@@ -1067,17 +1211,163 @@ template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRA32F, GraphicsC
     }
 }
 
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        destination[0] = convertFloatToHalfFloat(source[0]);
+        destination[1] = convertFloatToHalfFloat(source[1]);
+        destination[2] = convertFloatToHalfFloat(source[2]);
+        destination[3] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 4;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3];
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
+        destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
+        destination[3] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 4;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
+        destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
+        destination[3] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 4;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        destination[0] = convertFloatToHalfFloat(source[0]);
+        destination[1] = convertFloatToHalfFloat(source[1]);
+        destination[2] = convertFloatToHalfFloat(source[2]);
+        source += 4;
+        destination += 3;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3];
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
+        destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
+        source += 4;
+        destination += 3;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
+        destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
+        source += 4;
+        destination += 3;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        destination[0] = convertFloatToHalfFloat(source[0]);
+        destination[1] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 2;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3];
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 2;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        destination[1] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 2;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        destination[0] = convertFloatToHalfFloat(source[0]);
+        source += 4;
+        destination += 1;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3];
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        source += 4;
+        destination += 1;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
+        destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
+        source += 4;
+        destination += 1;
+    }
+}
+
+template<> ALWAYS_INLINE void pack<GraphicsContext3D::DataFormatA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
+{
+    for (unsigned i = 0; i < pixelsPerRow; ++i) {
+        destination[0] = convertFloatToHalfFloat(source[3]);
+        source += 4;
+        destination += 1;
+    }
+}
+
 ALWAYS_INLINE bool HasAlpha(int format)
 {
     return format == GraphicsContext3D::DataFormatA8
+        || format == GraphicsContext3D::DataFormatA16F
         || format == GraphicsContext3D::DataFormatA32F
         || format == GraphicsContext3D::DataFormatRA8
         || format == GraphicsContext3D::DataFormatAR8
+        || format == GraphicsContext3D::DataFormatRA16F
         || format == GraphicsContext3D::DataFormatRA32F
         || format == GraphicsContext3D::DataFormatRGBA8
         || format == GraphicsContext3D::DataFormatBGRA8
         || format == GraphicsContext3D::DataFormatARGB8
         || format == GraphicsContext3D::DataFormatABGR8
+        || format == GraphicsContext3D::DataFormatRGBA16F
         || format == GraphicsContext3D::DataFormatRGBA32F
         || format == GraphicsContext3D::DataFormatRGBA4444
         || format == GraphicsContext3D::DataFormatRGBA5551;
@@ -1086,8 +1376,10 @@ ALWAYS_INLINE bool HasAlpha(int format)
 ALWAYS_INLINE bool HasColor(int format)
 {
     return format == GraphicsContext3D::DataFormatRGBA8
+        || format == GraphicsContext3D::DataFormatRGBA16F
         || format == GraphicsContext3D::DataFormatRGBA32F
         || format == GraphicsContext3D::DataFormatRGB8
+        || format == GraphicsContext3D::DataFormatRGB16F
         || format == GraphicsContext3D::DataFormatRGB32F
         || format == GraphicsContext3D::DataFormatBGR8
         || format == GraphicsContext3D::DataFormatBGRA8
@@ -1097,8 +1389,10 @@ ALWAYS_INLINE bool HasColor(int format)
         || format == GraphicsContext3D::DataFormatRGBA4444
         || format == GraphicsContext3D::DataFormatRGB565
         || format == GraphicsContext3D::DataFormatR8
+        || format == GraphicsContext3D::DataFormatR16F
         || format == GraphicsContext3D::DataFormatR32F
         || format == GraphicsContext3D::DataFormatRA8
+        || format == GraphicsContext3D::DataFormatRA16F
         || format == GraphicsContext3D::DataFormatRA32F
         || format == GraphicsContext3D::DataFormatAR8;
 }
@@ -1114,6 +1408,16 @@ struct IsFloatFormat {
 };
 
 template<int Format>
+struct IsHalfFloatFormat {
+    static const bool Value =
+        Format == GraphicsContext3D::DataFormatRGBA16F
+        || Format == GraphicsContext3D::DataFormatRGB16F
+        || Format == GraphicsContext3D::DataFormatRA16F
+        || Format == GraphicsContext3D::DataFormatR16F
+        || Format == GraphicsContext3D::DataFormatA16F;
+};
+
+template<int Format>
 struct Is16bppFormat {
     static const bool Value =
         Format == GraphicsContext3D::DataFormatRGBA5551
@@ -1121,24 +1425,29 @@ struct Is16bppFormat {
         || Format == GraphicsContext3D::DataFormatRGB565;
 };
 
-template<int Format, bool IsFloat = IsFloatFormat<Format>::Value, bool Is16bpp = Is16bppFormat<Format>::Value>
+template<int Format, bool IsFloat = IsFloatFormat<Format>::Value, bool IsHalfFloat = IsHalfFloatFormat<Format>::Value, bool Is16bpp = Is16bppFormat<Format>::Value>
 struct DataTypeForFormat {
     typedef uint8_t Type;
 };
 
 template<int Format>
-struct DataTypeForFormat<Format, true, false> {
+struct DataTypeForFormat<Format, true, false, false> {
     typedef float Type;
 };
 
 template<int Format>
-struct DataTypeForFormat<Format, false, true> {
+struct DataTypeForFormat<Format, false, true, false> {
+    typedef uint16_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, false, true> {
     typedef uint16_t Type;
 };
 
 template<int Format>
 struct IntermediateFormat {
-    static const int Value = IsFloatFormat<Format>::Value ? GraphicsContext3D::DataFormatRGBA32F : GraphicsContext3D::DataFormatRGBA8;
+    static const int Value = (IsFloatFormat<Format>::Value || IsHalfFloatFormat<Format>::Value) ? GraphicsContext3D::DataFormatRGBA32F : GraphicsContext3D::DataFormatRGBA8;
 };
 
 ALWAYS_INLINE unsigned TexelBytesForFormat(GraphicsContext3D::DataFormat format)
@@ -1152,6 +1461,8 @@ ALWAYS_INLINE unsigned TexelBytesForFormat(GraphicsContext3D::DataFormat format)
     case GraphicsContext3D::DataFormatRGBA5551:
     case GraphicsContext3D::DataFormatRGBA4444:
     case GraphicsContext3D::DataFormatRGB565:
+    case GraphicsContext3D::DataFormatA16F:
+    case GraphicsContext3D::DataFormatR16F:
         return 2;
     case GraphicsContext3D::DataFormatRGB8:
     case GraphicsContext3D::DataFormatBGR8:
@@ -1162,8 +1473,12 @@ ALWAYS_INLINE unsigned TexelBytesForFormat(GraphicsContext3D::DataFormat format)
     case GraphicsContext3D::DataFormatBGRA8:
     case GraphicsContext3D::DataFormatR32F:
     case GraphicsContext3D::DataFormatA32F:
+    case GraphicsContext3D::DataFormatRA16F:
         return 4;
+    case GraphicsContext3D::DataFormatRGB16F:
+        return 6;
     case GraphicsContext3D::DataFormatRA32F:
+    case GraphicsContext3D::DataFormatRGBA16F:
         return 8;
     case GraphicsContext3D::DataFormatRGB32F:
         return 12;
@@ -1250,17 +1565,22 @@ ALWAYS_INLINE void FormatConverter::convert(GraphicsContext3D::DataFormat dstFor
 
         switch (dstFormat) {
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR8)
-            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA8)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR16F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR32F)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA8)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA16F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA32F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA8)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA16F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA32F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB8)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB565)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB16F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB32F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA8)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA5551)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA4444)
+            FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA16F)
             FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA32F)
         default:
             ASSERT_NOT_REACHED();
@@ -1322,7 +1642,7 @@ ALWAYS_INLINE void FormatConverter::convert()
     typedef typename DataTypeForFormat<IntermediateSrcFormat>::Type IntermediateSrcType;
     const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType);
     const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType);
-    const bool trivialUnpack = (SrcFormat == GraphicsContext3D::DataFormatRGBA8 && !IsFloatFormat<DstFormat>::Value) || SrcFormat == GraphicsContext3D::DataFormatRGBA32F;
+    const bool trivialUnpack = (SrcFormat == GraphicsContext3D::DataFormatRGBA8 && !IsFloatFormat<DstFormat>::Value && !IsHalfFloatFormat<DstFormat>::Value) || SrcFormat == GraphicsContext3D::DataFormatRGBA32F;
     const bool trivialPack = (DstFormat == GraphicsContext3D::DataFormatRGBA8 || DstFormat == GraphicsContext3D::DataFormatRGBA32F) && alphaOp == GraphicsContext3D::AlphaDoNothing && m_dstStride > 0;
     ASSERT(!trivialUnpack || !trivialPack);
 
index f1661e9..2e7d368 100644 (file)
@@ -562,10 +562,12 @@ public:
         DataFormatRGBA8 = 0,
         DataFormatRGBA16Little,
         DataFormatRGBA16Big,
+        DataFormatRGBA16F,
         DataFormatRGBA32F,
         DataFormatRGB8,
         DataFormatRGB16Little,
         DataFormatRGB16Big,
+        DataFormatRGB16F,
         DataFormatRGB32F,
         DataFormatBGR8,
         DataFormatBGRA8,
@@ -581,10 +583,12 @@ public:
         DataFormatR8,
         DataFormatR16Little,
         DataFormatR16Big,
+        DataFormatR16F,
         DataFormatR32F,
         DataFormatRA8,
         DataFormatRA16Little,
         DataFormatRA16Big,
+        DataFormatRA16F,
         DataFormatRA32F,
         DataFormatAR8,
         DataFormatAR16Little,
@@ -592,6 +596,7 @@ public:
         DataFormatA8,
         DataFormatA16Little,
         DataFormatA16Big,
+        DataFormatA16F,
         DataFormatA32F,
         DataFormatNumFormats
     };
index 8f7d7f8..f2f70bc 100644 (file)
@@ -1357,6 +1357,9 @@ void GraphicsContext3D::texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xo
 {
     makeContextCurrent();
 
+    if (type == HALF_FLOAT_OES)
+        type = GL_HALF_FLOAT_ARB;
+
     // FIXME: we will need to deal with PixelStore params when dealing with image buffers that differ from the subimage size.
     ::glTexSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels);
 }