[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.17-1283-gcf603cf
eric at webkit.org
eric at webkit.org
Tue Jan 5 23:45:31 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 04f0cfb0127d1db5aae643f6e59a14757d98514e
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Dec 9 02:38:06 2009 +0000
2009-12-08 Peterson Trethewey <petersont at google.com>
Reviewed by Oliver Hunt.
Implement WebGLUniformLocation and change API to use it.
https://bugs.webkit.org/show_bug.cgi?id=31173
* fast/canvas/webgl/resources/structUniformShader.vert: Added.
* fast/canvas/webgl/script-tests/uniform-location.js: Added.
* fast/canvas/webgl/uniform-location-expected.txt: Added.
* fast/canvas/webgl/uniform-location.html: Added.
2009-12-08 Peterson Trethewey <petersont at google.com>
Reviewed by Oliver Hunt.
Implement WebGLUniformLocation and change API to use it.
https://bugs.webkit.org/show_bug.cgi?id=31173
Test: fast/canvas/webgl/uniform-location.html
* DerivedSources.make:
* WebCore.gypi:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSWebGLRenderingContextCustom.cpp:
(WebCore::JSWebGLRenderingContext::getProgramParameter):
(WebCore::JSWebGLRenderingContext::getUniform):
(WebCore::functionForUniform):
(WebCore::dataFunctionf):
(WebCore::dataFunctioni):
(WebCore::dataFunctionMatrix):
* bindings/scripts/CodeGeneratorV8.pm:
* bindings/v8/DerivedSourcesAllInOne.cpp:
* bindings/v8/V8Index.cpp:
* bindings/v8/V8Index.h:
* bindings/v8/custom/V8WebGLRenderingContextCustom.cpp:
(WebCore::toWebGLUniformLocation):
(WebCore::):
(WebCore::CALLBACK_FUNC_DECL):
(WebCore::isFunctionToCallForAttribute):
(WebCore::vertexAttribAndUniformHelperf):
(WebCore::uniformHelperi):
(WebCore::uniformMatrixHelper):
* html/canvas/WebGLRenderingContext.cpp:
(WebCore::WebGLRenderingContext::getUniform):
(WebCore::WebGLRenderingContext::getUniformLocation):
(WebCore::WebGLRenderingContext::uniform1f):
(WebCore::WebGLRenderingContext::uniform1fv):
(WebCore::WebGLRenderingContext::uniform1i):
(WebCore::WebGLRenderingContext::uniform1iv):
(WebCore::WebGLRenderingContext::uniform2f):
(WebCore::WebGLRenderingContext::uniform2fv):
(WebCore::WebGLRenderingContext::uniform2i):
(WebCore::WebGLRenderingContext::uniform2iv):
(WebCore::WebGLRenderingContext::uniform3f):
(WebCore::WebGLRenderingContext::uniform3fv):
(WebCore::WebGLRenderingContext::uniform3i):
(WebCore::WebGLRenderingContext::uniform3iv):
(WebCore::WebGLRenderingContext::uniform4f):
(WebCore::WebGLRenderingContext::uniform4fv):
(WebCore::WebGLRenderingContext::uniform4i):
(WebCore::WebGLRenderingContext::uniform4iv):
(WebCore::WebGLRenderingContext::uniformMatrix2fv):
(WebCore::WebGLRenderingContext::uniformMatrix3fv):
(WebCore::WebGLRenderingContext::uniformMatrix4fv):
* html/canvas/WebGLRenderingContext.h:
* html/canvas/WebGLRenderingContext.idl:
* html/canvas/WebGLUniformLocation.cpp: Added.
(WebCore::WebGLUniformLocation::create):
(WebCore::WebGLUniformLocation::WebGLUniformLocation):
* html/canvas/WebGLUniformLocation.h: Added.
(WebCore::WebGLUniformLocation::~WebGLUniformLocation):
(WebCore::WebGLUniformLocation::program):
(WebCore::WebGLUniformLocation::location):
* html/canvas/WebGLUniformLocation.idl: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@51884 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 233b0a3..c08fea9 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2009-12-08 Peterson Trethewey <petersont at google.com>
+
+ Reviewed by Oliver Hunt.
+
+ Implement WebGLUniformLocation and change API to use it.
+ https://bugs.webkit.org/show_bug.cgi?id=31173
+
+ * fast/canvas/webgl/resources/structUniformShader.vert: Added.
+ * fast/canvas/webgl/script-tests/uniform-location.js: Added.
+ * fast/canvas/webgl/uniform-location-expected.txt: Added.
+ * fast/canvas/webgl/uniform-location.html: Added.
+
2009-12-08 Adam Langley <agl at google.com>
Reviewed by Darin Adler.
diff --git a/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert b/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert
new file mode 100644
index 0000000..ce73a21
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/resources/structUniformShader.vert
@@ -0,0 +1,23 @@
+attribute vec4 a_vertex;
+attribute vec3 a_normal;
+
+uniform mat4 u_modelViewProjMatrix;
+
+struct MyStruct
+{
+ int x;
+ int y;
+};
+
+uniform MyStruct u_struct;
+uniform float u_array[4];
+
+varying vec3 v_normal;
+
+void main()
+{
+ v_normal = a_normal;
+ gl_Position = u_modelViewProjMatrix * a_vertex +
+ vec4(u_struct.x, u_struct.y, 0, 1) +
+ vec4(u_array[0], u_array[1], u_array[2], u_array[3]);
+}
diff --git a/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js b/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js
new file mode 100644
index 0000000..bc6c2f2
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/script-tests/uniform-location.js
@@ -0,0 +1,36 @@
+description("Tests calling WebGL APIs with objects from other contexts");
+
+var contextA = create3DContext();
+var contextB = create3DContext();
+var programA1 = loadStandardProgram(contextA);
+var programA2 = loadStandardProgram(contextA);
+var programB = loadStandardProgram(contextB);
+var programS = loadProgram(contextA, "resources/structUniformShader.vert", "resources/fragmentShader.frag");
+var programV = loadProgram(contextA, "resources/floatUniformShader.vert", "resources/noopUniformShader.frag");
+var locationA = contextA.getUniformLocation(programA1, 'u_modelViewProjMatrix');
+var locationB = contextB.getUniformLocation(programB, 'u_modelViewProjMatrix');
+var locationSx = contextA.getUniformLocation(programS, "u_struct.x");
+var locationArray0 = contextA.getUniformLocation(programS, "u_array[0]");
+var locationVec4 = contextA.getUniformLocation(programV, "fval4");
+
+var vec = [1, 2, 3, 4];
+var mat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+
+shouldBeUndefined("contextA.useProgram(programA2)");
+shouldThrow("contextA.uniformMatrix4fv(locationA, false, mat)");
+shouldBeUndefined("contextA.useProgram(programA1)");
+shouldBeUndefined("contextA.uniformMatrix4fv(locationA, false, mat)");
+shouldThrow("contextA.uniformMatrix4fv(0, false, mat)");
+
+shouldBeUndefined("contextA.useProgram(programS)");
+shouldBeUndefined("contextA.uniform1i(locationSx, 3)");
+shouldBeUndefined("contextA.uniform1f(locationArray0, 4.0)");
+
+shouldBe("contextA.getUniform(programS, locationSx)", "3");
+shouldBe("contextA.getUniform(programS, locationArray0)", "4.0");
+
+shouldBeUndefined("contextA.useProgram(programV)");
+shouldBeUndefined("contextA.uniform4fv(locationVec4, vec)");
+shouldBe("contextA.getUniform(programV, locationVec4)", "vec");
+
+successfullyParsed = true;
diff --git a/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt b/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt
new file mode 100644
index 0000000..babdaab
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/uniform-location-expected.txt
@@ -0,0 +1,21 @@
+Tests calling WebGL APIs with objects from other contexts
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS contextA.useProgram(programA2) is undefined.
+PASS contextA.uniformMatrix4fv(locationA, false, mat) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS contextA.useProgram(programA1) is undefined.
+PASS contextA.uniformMatrix4fv(locationA, false, mat) is undefined.
+PASS contextA.uniformMatrix4fv(0, false, mat) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS contextA.useProgram(programS) is undefined.
+PASS contextA.uniform1i(locationSx, 3) is undefined.
+PASS contextA.uniform1f(locationArray0, 4.0) is undefined.
+PASS contextA.getUniform(programS, locationSx) is 3
+PASS contextA.getUniform(programS, locationArray0) is 4.0
+PASS contextA.useProgram(programV) is undefined.
+PASS contextA.uniform4fv(locationVec4, vec) is undefined.
+PASS contextA.getUniform(programV, locationVec4) is vec
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/uniform-location.html b/LayoutTests/fast/canvas/webgl/uniform-location.html
new file mode 100644
index 0000000..c98f659
--- /dev/null
+++ b/LayoutTests/fast/canvas/webgl/uniform-location.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css"/>
+<script src="../../js/resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+
+<script src="script-tests/uniform-location.js"></script>
+
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 6f5b02c..dcd46fc 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,67 @@
+2009-12-08 Peterson Trethewey <petersont at google.com>
+
+ Reviewed by Oliver Hunt.
+
+ Implement WebGLUniformLocation and change API to use it.
+ https://bugs.webkit.org/show_bug.cgi?id=31173
+
+ Test: fast/canvas/webgl/uniform-location.html
+
+ * DerivedSources.make:
+ * WebCore.gypi:
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSWebGLRenderingContextCustom.cpp:
+ (WebCore::JSWebGLRenderingContext::getProgramParameter):
+ (WebCore::JSWebGLRenderingContext::getUniform):
+ (WebCore::functionForUniform):
+ (WebCore::dataFunctionf):
+ (WebCore::dataFunctioni):
+ (WebCore::dataFunctionMatrix):
+ * bindings/scripts/CodeGeneratorV8.pm:
+ * bindings/v8/DerivedSourcesAllInOne.cpp:
+ * bindings/v8/V8Index.cpp:
+ * bindings/v8/V8Index.h:
+ * bindings/v8/custom/V8WebGLRenderingContextCustom.cpp:
+ (WebCore::toWebGLUniformLocation):
+ (WebCore::):
+ (WebCore::CALLBACK_FUNC_DECL):
+ (WebCore::isFunctionToCallForAttribute):
+ (WebCore::vertexAttribAndUniformHelperf):
+ (WebCore::uniformHelperi):
+ (WebCore::uniformMatrixHelper):
+ * html/canvas/WebGLRenderingContext.cpp:
+ (WebCore::WebGLRenderingContext::getUniform):
+ (WebCore::WebGLRenderingContext::getUniformLocation):
+ (WebCore::WebGLRenderingContext::uniform1f):
+ (WebCore::WebGLRenderingContext::uniform1fv):
+ (WebCore::WebGLRenderingContext::uniform1i):
+ (WebCore::WebGLRenderingContext::uniform1iv):
+ (WebCore::WebGLRenderingContext::uniform2f):
+ (WebCore::WebGLRenderingContext::uniform2fv):
+ (WebCore::WebGLRenderingContext::uniform2i):
+ (WebCore::WebGLRenderingContext::uniform2iv):
+ (WebCore::WebGLRenderingContext::uniform3f):
+ (WebCore::WebGLRenderingContext::uniform3fv):
+ (WebCore::WebGLRenderingContext::uniform3i):
+ (WebCore::WebGLRenderingContext::uniform3iv):
+ (WebCore::WebGLRenderingContext::uniform4f):
+ (WebCore::WebGLRenderingContext::uniform4fv):
+ (WebCore::WebGLRenderingContext::uniform4i):
+ (WebCore::WebGLRenderingContext::uniform4iv):
+ (WebCore::WebGLRenderingContext::uniformMatrix2fv):
+ (WebCore::WebGLRenderingContext::uniformMatrix3fv):
+ (WebCore::WebGLRenderingContext::uniformMatrix4fv):
+ * html/canvas/WebGLRenderingContext.h:
+ * html/canvas/WebGLRenderingContext.idl:
+ * html/canvas/WebGLUniformLocation.cpp: Added.
+ (WebCore::WebGLUniformLocation::create):
+ (WebCore::WebGLUniformLocation::WebGLUniformLocation):
+ * html/canvas/WebGLUniformLocation.h: Added.
+ (WebCore::WebGLUniformLocation::~WebGLUniformLocation):
+ (WebCore::WebGLUniformLocation::program):
+ (WebCore::WebGLUniformLocation::location):
+ * html/canvas/WebGLUniformLocation.idl: Added.
+
2009-12-08 Adam Langley <agl at google.com>
Reviewed by Darin Adler.
diff --git a/WebCore/DerivedSources.make b/WebCore/DerivedSources.make
index fbd514e..8191222 100644
--- a/WebCore/DerivedSources.make
+++ b/WebCore/DerivedSources.make
@@ -88,6 +88,7 @@ DOM_CLASSES = \
WebGLShader \
WebGLShortArray \
WebGLTexture \
+ WebGLUniformLocation \
WebGLUnsignedByteArray \
WebGLUnsignedIntArray \
WebGLUnsignedShortArray \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 9624300..2a020ed 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -96,6 +96,7 @@
'html/canvas/WebGLRenderingContext.idl',
'html/canvas/WebGLShader.idl',
'html/canvas/WebGLShortArray.idl',
+ 'html/canvas/WebGLUniformLocation.idl',
'html/canvas/WebGLUnsignedByteArray.idl',
'html/canvas/WebGLUnsignedIntArray.idl',
'html/canvas/WebGLUnsignedShortArray.idl',
@@ -1324,6 +1325,8 @@
'html/canvas/CanvasStyle.h',
'html/canvas/WebGLTexture.cpp',
'html/canvas/WebGLTexture.h',
+ 'html/canvas/WebGLUniformLocation.cpp',
+ 'html/canvas/WebGLUniformLocation.h',
'html/canvas/WebGLUnsignedByteArray.cpp',
'html/canvas/WebGLUnsignedByteArray.h',
'html/canvas/WebGLUnsignedIntArray.cpp',
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 9a65a1b..375c20a 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -156,6 +156,11 @@
0B9056F80F2685F30095FF6A /* WorkerThreadableLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */; };
0B9056F90F2685F30095FF6A /* WorkerThreadableLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */; settings = {ATTRIBUTES = (); }; };
0BE030A20F3112FB003C1A46 /* RenderLineBoxList.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */; };
+ 0C3F1F5B10C8871200D72CE1 /* WebGLUniformLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */; };
+ 0C3F1F5C10C8871200D72CE1 /* WebGLUniformLocation.idl in Resources */ = {isa = PBXBuildFile; fileRef = 0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */; };
+ 0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */; };
+ 0C45342810CDBBFA00869157 /* JSWebGLUniformLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */; };
0F11A54F0F39233100C37884 /* RenderSelectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */; };
0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */; };
0F500AAF0F54DB1B00EEF928 /* TransformState.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F500AAE0F54DB1B00EEF928 /* TransformState.h */; };
@@ -5351,6 +5356,11 @@
0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerThreadableLoader.cpp; sourceTree = "<group>"; };
0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerThreadableLoader.h; sourceTree = "<group>"; };
0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderLineBoxList.h; sourceTree = "<group>"; };
+ 0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLUniformLocation.cpp; path = canvas/WebGLUniformLocation.cpp; sourceTree = "<group>"; };
+ 0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebGLUniformLocation.h; path = canvas/WebGLUniformLocation.h; sourceTree = "<group>"; };
+ 0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebGLUniformLocation.idl; path = canvas/WebGLUniformLocation.idl; sourceTree = "<group>"; };
+ 0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLUniformLocation.cpp; sourceTree = "<group>"; };
+ 0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLUniformLocation.h; sourceTree = "<group>"; };
0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSelectionInfo.h; sourceTree = "<group>"; };
0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnimationControllerPrivate.h; path = animation/AnimationControllerPrivate.h; sourceTree = "<group>"; };
0F500AAE0F54DB1B00EEF928 /* TransformState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformState.h; sourceTree = "<group>"; };
@@ -10739,6 +10749,9 @@
49C7B9C51042D32F0009D447 /* WebGLTexture.cpp */,
49C7B9C61042D32F0009D447 /* WebGLTexture.h */,
49C7B9C71042D32F0009D447 /* WebGLTexture.idl */,
+ 0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */,
+ 0C3F1F5810C8871200D72CE1 /* WebGLUniformLocation.h */,
+ 0C3F1F5910C8871200D72CE1 /* WebGLUniformLocation.idl */,
49EECDD610503C2300099FAB /* WebGLUnsignedByteArray.cpp */,
49EECDD710503C2300099FAB /* WebGLUnsignedByteArray.h */,
49EECDD810503C2300099FAB /* WebGLUnsignedByteArray.idl */,
@@ -12899,6 +12912,8 @@
49EECEF9105070C400099FAB /* JSWebGLShortArray.h */,
49C7B9911042D2D30009D447 /* JSWebGLTexture.cpp */,
49C7B9921042D2D30009D447 /* JSWebGLTexture.h */,
+ 0C45342510CDBBFA00869157 /* JSWebGLUniformLocation.cpp */,
+ 0C45342610CDBBFA00869157 /* JSWebGLUniformLocation.h */,
49EECEFA105070C400099FAB /* JSWebGLUnsignedByteArray.cpp */,
49EECEFB105070C400099FAB /* JSWebGLUnsignedByteArray.h */,
49EECEFC105070C400099FAB /* JSWebGLUnsignedIntArray.cpp */,
@@ -18229,6 +18244,8 @@
F4EAF4AF10C742B1009100D3 /* OpenTypeSanitizer.h in Headers */,
599D1E3310C97D6E00E0EF12 /* jni_utility_private.h in Headers */,
7ADE722610CBBB9B006B3B3A /* ContextMenuSelectionHandler.h in Headers */,
+ 0C3F1F5B10C8871200D72CE1 /* WebGLUniformLocation.h in Headers */,
+ 0C45342810CDBBFA00869157 /* JSWebGLUniformLocation.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -18330,6 +18347,7 @@
1AB1AE7A0C051FDE00139F4F /* zoomInCursor.png in Resources */,
1AB1AE7B0C051FDE00139F4F /* zoomOutCursor.png in Resources */,
5174E20C10A1F49A00F95E6F /* PopStateEvent.idl in Resources */,
+ 0C3F1F5C10C8871200D72CE1 /* WebGLUniformLocation.idl in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -20383,6 +20401,8 @@
7A0E771E10C00DB100A0276E /* JSInspectorFrontendHost.cpp in Sources */,
F4EAF4AE10C742B1009100D3 /* OpenTypeSanitizer.cpp in Sources */,
599D1E3210C97D6E00E0EF12 /* jni_utility_private.cpp in Sources */,
+ 0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */,
+ 0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp b/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
index 47fb793..77875fc 100644
--- a/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
+++ b/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
@@ -43,6 +43,7 @@
#include "JSWebGLRenderbuffer.h"
#include "JSWebGLShader.h"
#include "JSWebGLTexture.h"
+#include "JSWebGLUniformLocation.h"
#include "JSWebGLUnsignedByteArray.h"
#include "JSWebKitCSSMatrix.h"
#include "NotImplemented.h"
@@ -187,37 +188,6 @@ enum WhichProgramCall {
kProgramParameter, kUniform
};
-static JSValue getProgramParameterHelper(JSWebGLRenderingContext* obj, ExecState* exec, const ArgList& args, WhichProgramCall programCall)
-{
- if (args.size() != 2)
- return throwError(exec, SyntaxError);
-
- ExceptionCode ec = 0;
- WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(obj->impl());
- WebGLProgram* program = toWebGLProgram(args.at(0));
- unsigned pname = args.at(1).toInt32(exec);
- if (exec->hadException())
- return jsUndefined();
- WebGLGetInfo info;
- switch (programCall) {
- case kProgramParameter:
- info = context->getProgramParameter(program, pname, ec);
- break;
- case kUniform:
- // pname -> location
- info = context->getUniform(program, pname, ec);
- break;
- default:
- notImplemented();
- break;
- }
- if (ec) {
- setDOMException(exec, ec);
- return jsUndefined();
- }
- return toJS(exec, obj->globalObject(), info);
-}
-
JSValue JSWebGLRenderingContext::getBufferParameter(ExecState* exec, const ArgList& args)
{
return getObjectParameter(this, exec, args, kBuffer);
@@ -267,7 +237,21 @@ JSValue JSWebGLRenderingContext::getParameter(ExecState* exec, const ArgList& ar
JSValue JSWebGLRenderingContext::getProgramParameter(ExecState* exec, const ArgList& args)
{
- return getProgramParameterHelper(this, exec, args, kProgramParameter);
+ if (args.size() != 2)
+ return throwError(exec, SyntaxError);
+
+ ExceptionCode ec = 0;
+ WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
+ WebGLProgram* program = toWebGLProgram(args.at(0));
+ unsigned pname = args.at(1).toInt32(exec);
+ if (exec->hadException())
+ return jsUndefined();
+ WebGLGetInfo info = context->getProgramParameter(program, pname, ec);
+ if (ec) {
+ setDOMException(exec, ec);
+ return jsUndefined();
+ }
+ return toJS(exec, globalObject(), info);
}
JSValue JSWebGLRenderingContext::getRenderbufferParameter(ExecState* exec, const ArgList& args)
@@ -301,7 +285,21 @@ JSValue JSWebGLRenderingContext::getTexParameter(ExecState* exec, const ArgList&
JSValue JSWebGLRenderingContext::getUniform(ExecState* exec, const ArgList& args)
{
- return getProgramParameterHelper(this, exec, args, kUniform);
+ if (args.size() != 2)
+ return throwError(exec, SyntaxError);
+
+ ExceptionCode ec = 0;
+ WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl());
+ WebGLProgram* program = toWebGLProgram(args.at(0));
+ WebGLUniformLocation* loc = toWebGLUniformLocation(args.at(1));
+ if (exec->hadException())
+ return jsUndefined();
+ WebGLGetInfo info = context->getUniform(program, loc, ec);
+ if (ec) {
+ setDOMException(exec, ec);
+ return jsUndefined();
+ }
+ return toJS(exec, globalObject(), info);
}
JSValue JSWebGLRenderingContext::getVertexAttrib(ExecState* exec, const ArgList& args)
@@ -463,30 +461,54 @@ enum DataFunctionMatrixToCall {
f_uniformMatrix2fv, f_uniformMatrix3fv, f_uniformMatrix4fv
};
+bool functionForUniform(DataFunctionToCall f)
+{
+ switch (f) {
+ case f_uniform1v:
+ case f_uniform2v:
+ case f_uniform3v:
+ case f_uniform4v:
+ return true;
+ break;
+ default: break;
+ }
+ return false;
+}
+
static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, const JSC::ArgList& args, WebGLRenderingContext* context)
{
if (args.size() != 2)
return throwError(exec, SyntaxError);
+
+ WebGLUniformLocation* location = 0;
+ long index = -1;
+
+ if (functionForUniform(f))
+ location = toWebGLUniformLocation(args.at(0));
+ else
+ index = args.at(0).toInt32(exec);
- long location = args.at(0).toInt32(exec);
- if (exec->hadException())
+ if (exec->hadException())
return jsUndefined();
RefPtr<WebGLFloatArray> webGLArray = toWebGLFloatArray(args.at(1));
if (exec->hadException())
return jsUndefined();
+ ExceptionCode ec = 0;
if (webGLArray) {
switch(f) {
- case f_uniform1v: context->uniform1fv(location, webGLArray.get()); break;
- case f_uniform2v: context->uniform2fv(location, webGLArray.get()); break;
- case f_uniform3v: context->uniform3fv(location, webGLArray.get()); break;
- case f_uniform4v: context->uniform4fv(location, webGLArray.get()); break;
- case f_vertexAttrib1v: context->vertexAttrib1fv(location, webGLArray.get()); break;
- case f_vertexAttrib2v: context->vertexAttrib2fv(location, webGLArray.get()); break;
- case f_vertexAttrib3v: context->vertexAttrib3fv(location, webGLArray.get()); break;
- case f_vertexAttrib4v: context->vertexAttrib4fv(location, webGLArray.get()); break;
+ case f_uniform1v: context->uniform1fv(location, webGLArray.get(), ec); break;
+ case f_uniform2v: context->uniform2fv(location, webGLArray.get(), ec); break;
+ case f_uniform3v: context->uniform3fv(location, webGLArray.get(), ec); break;
+ case f_uniform4v: context->uniform4fv(location, webGLArray.get(), ec); break;
+ case f_vertexAttrib1v: context->vertexAttrib1fv(index, webGLArray.get()); break;
+ case f_vertexAttrib2v: context->vertexAttrib2fv(index, webGLArray.get()); break;
+ case f_vertexAttrib3v: context->vertexAttrib3fv(index, webGLArray.get()); break;
+ case f_vertexAttrib4v: context->vertexAttrib4fv(index, webGLArray.get()); break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
@@ -498,15 +520,17 @@ static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, co
return throwError(exec, TypeError);
switch(f) {
- case f_uniform1v: context->uniform1fv(location, array, size); break;
- case f_uniform2v: context->uniform2fv(location, array, size); break;
- case f_uniform3v: context->uniform3fv(location, array, size); break;
- case f_uniform4v: context->uniform4fv(location, array, size); break;
- case f_vertexAttrib1v: context->vertexAttrib1fv(location, array, size); break;
- case f_vertexAttrib2v: context->vertexAttrib2fv(location, array, size); break;
- case f_vertexAttrib3v: context->vertexAttrib3fv(location, array, size); break;
- case f_vertexAttrib4v: context->vertexAttrib4fv(location, array, size); break;
+ case f_uniform1v: context->uniform1fv(location, array, size, ec); break;
+ case f_uniform2v: context->uniform2fv(location, array, size, ec); break;
+ case f_uniform3v: context->uniform3fv(location, array, size, ec); break;
+ case f_uniform4v: context->uniform4fv(location, array, size, ec); break;
+ case f_vertexAttrib1v: context->vertexAttrib1fv(index, array, size); break;
+ case f_vertexAttrib2v: context->vertexAttrib2fv(index, array, size); break;
+ case f_vertexAttrib3v: context->vertexAttrib3fv(index, array, size); break;
+ case f_vertexAttrib4v: context->vertexAttrib4fv(index, array, size); break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
@@ -515,22 +539,26 @@ static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, co
if (args.size() != 2)
return throwError(exec, SyntaxError);
- long location = args.at(0).toInt32(exec);
- if (exec->hadException())
+ WebGLUniformLocation* location = toWebGLUniformLocation(args.at(0));
+
+ if (exec->hadException())
return jsUndefined();
RefPtr<WebGLIntArray> webGLArray = toWebGLIntArray(args.at(1));
if (exec->hadException())
return jsUndefined();
+ ExceptionCode ec = 0;
if (webGLArray) {
switch(f) {
- case f_uniform1v: context->uniform1iv(location, webGLArray.get()); break;
- case f_uniform2v: context->uniform2iv(location, webGLArray.get()); break;
- case f_uniform3v: context->uniform3iv(location, webGLArray.get()); break;
- case f_uniform4v: context->uniform4iv(location, webGLArray.get()); break;
+ case f_uniform1v: context->uniform1iv(location, webGLArray.get(), ec); break;
+ case f_uniform2v: context->uniform2iv(location, webGLArray.get(), ec); break;
+ case f_uniform3v: context->uniform3iv(location, webGLArray.get(), ec); break;
+ case f_uniform4v: context->uniform4iv(location, webGLArray.get(), ec); break;
default: break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
@@ -542,12 +570,14 @@ static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, co
return throwError(exec, TypeError);
switch(f) {
- case f_uniform1v: context->uniform1iv(location, array, size); break;
- case f_uniform2v: context->uniform2iv(location, array, size); break;
- case f_uniform3v: context->uniform3iv(location, array, size); break;
- case f_uniform4v: context->uniform4iv(location, array, size); break;
+ case f_uniform1v: context->uniform1iv(location, array, size, ec); break;
+ case f_uniform2v: context->uniform2iv(location, array, size, ec); break;
+ case f_uniform3v: context->uniform3iv(location, array, size, ec); break;
+ case f_uniform4v: context->uniform4iv(location, array, size, ec); break;
default: break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
@@ -556,7 +586,8 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
if (args.size() != 3)
return throwError(exec, SyntaxError);
- long location = args.at(0).toInt32(exec);
+ WebGLUniformLocation* location = toWebGLUniformLocation(args.at(0));
+
if (exec->hadException())
return jsUndefined();
@@ -568,12 +599,15 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
if (exec->hadException())
return jsUndefined();
+ ExceptionCode ec = 0;
if (webGLArray) {
switch(f) {
- case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, webGLArray.get()); break;
- case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, webGLArray.get()); break;
- case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, webGLArray.get()); break;
+ case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, webGLArray.get(), ec); break;
+ case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, webGLArray.get(), ec); break;
+ case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, webGLArray.get(), ec); break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
@@ -585,10 +619,12 @@ static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecStat
return throwError(exec, TypeError);
switch(f) {
- case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, array, size); break;
- case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, array, size); break;
- case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, array, size); break;
+ case f_uniformMatrix2fv: context->uniformMatrix2fv(location, transpose, array, size, ec); break;
+ case f_uniformMatrix3fv: context->uniformMatrix3fv(location, transpose, array, size, ec); break;
+ case f_uniformMatrix4fv: context->uniformMatrix4fv(location, transpose, array, size, ec); break;
}
+ if (ec != 0)
+ setDOMException(exec, ec);
return jsUndefined();
}
diff --git a/WebCore/bindings/scripts/CodeGeneratorV8.pm b/WebCore/bindings/scripts/CodeGeneratorV8.pm
index 8f63e0d..89cf13d 100644
--- a/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -1816,6 +1816,7 @@ sub IsRefPtrType
return 1 if $type eq "WebGLShader";
return 1 if $type eq "WebGLShortArray";
return 1 if $type eq "WebGLTexture";
+ return 1 if $type eq "WebGLUniformLocation";
return 1 if $type eq "WebGLUnsignedByteArray";
return 1 if $type eq "WebGLUnsignedIntArray";
return 1 if $type eq "WebGLUnsignedShortArray";
@@ -1918,6 +1919,7 @@ my %typeCanFailConversion = (
"WebGLShader" => 0,
"WebGLShortArray" => 0,
"WebGLTexture" => 0,
+ "WebGLUniformLocation" => 0,
"CompareHow" => 0,
"DataGridColumn" => 0,
"DOMString" => 0,
diff --git a/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp b/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
index b32d7d4..4344c96 100644
--- a/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
+++ b/WebCore/bindings/v8/DerivedSourcesAllInOne.cpp
@@ -57,6 +57,7 @@
#include "bindings/V8WebGLShader.cpp"
#include "bindings/V8WebGLShortArray.cpp"
#include "bindings/V8WebGLTexture.cpp"
+#include "bindings/V8WebGLUniformLocation.cpp"
#include "bindings/V8WebGLUnsignedByteArray.cpp"
#include "bindings/V8WebGLUnsignedIntArray.cpp"
#include "bindings/V8WebGLUnsignedShortArray.cpp"
diff --git a/WebCore/bindings/v8/V8Index.cpp b/WebCore/bindings/v8/V8Index.cpp
index 2b9a922..ff88710 100644
--- a/WebCore/bindings/v8/V8Index.cpp
+++ b/WebCore/bindings/v8/V8Index.cpp
@@ -407,6 +407,7 @@
#include "V8WebGLShader.h"
#include "V8WebGLShortArray.h"
#include "V8WebGLTexture.h"
+#include "V8WebGLUniformLocation.h"
#include "V8WebGLUnsignedByteArray.h"
#include "V8WebGLUnsignedIntArray.h"
#include "V8WebGLUnsignedShortArray.h"
diff --git a/WebCore/bindings/v8/V8Index.h b/WebCore/bindings/v8/V8Index.h
index 1c87d25..cebb382 100644
--- a/WebCore/bindings/v8/V8Index.h
+++ b/WebCore/bindings/v8/V8Index.h
@@ -460,6 +460,7 @@ typedef v8::Persistent<v8::FunctionTemplate> (*FunctionTemplateFactory)();
V(WEBGLSHADER, WebGLShader) \
V(WEBGLSHORTARRAY, WebGLShortArray) \
V(WEBGLTEXTURE, WebGLTexture) \
+ V(WEBGLUNIFORMLOCATION, WebGLUniformLocation) \
V(WEBGLUNSIGNEDBYTEARRAY, WebGLUnsignedByteArray) \
V(WEBGLUNSIGNEDINTARRAY, WebGLUnsignedIntArray) \
V(WEBGLUNSIGNEDSHORTARRAY, WebGLUnsignedShortArray)
diff --git a/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp b/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
index 45a8626..c5f18da 100644
--- a/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
+++ b/WebCore/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp
@@ -48,6 +48,7 @@
#include "V8WebGLProgram.h"
#include "V8WebGLShader.h"
#include "V8WebGLShortArray.h"
+#include "V8WebGLUniformLocation.h"
#include "V8WebGLUnsignedByteArray.h"
#include "V8WebGLUnsignedIntArray.h"
#include "V8WebGLUnsignedShortArray.h"
@@ -262,47 +263,21 @@ static v8::Handle<v8::Value> getObjectParameter(const v8::Arguments& args, Objec
return toV8(info);
}
-enum WhichProgramCall {
- kProgramParameter, kUniform
-};
-
-static v8::Handle<v8::Value> getProgramParameter(const v8::Arguments& args, WhichProgramCall programCall)
+static WebGLUniformLocation* toWebGLUniformLocation(v8::Handle<v8::Value> value, bool& ok)
{
- if (args.Length() != 2) {
- V8Proxy::setDOMException(SYNTAX_ERR);
- return notHandledByInterceptor();
+ ok = false;
+ WebGLUniformLocation* location = 0;
+ if (V8WebGLUniformLocation::HasInstance(value)) {
+ location = V8DOMWrapper::convertToNativeObject<WebGLUniformLocation>(
+ V8ClassIndex::WEBGLUNIFORMLOCATION, value->ToObject());
+ ok = true;
}
-
- ExceptionCode ec = 0;
- WebGLRenderingContext* context =
- V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
- WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
- bool ok;
- unsigned pname = toInt32(args[1], ok);
- if (!ok) {
- V8Proxy::setDOMException(SYNTAX_ERR);
- return notHandledByInterceptor();
- }
- WebGLGetInfo info;
- switch (programCall) {
- case kProgramParameter:
- info = context->getProgramParameter(program, pname, ec);
- break;
- case kUniform:
- // pname -> location
- info = context->getUniform(program, pname, ec);
- break;
- default:
- notImplemented();
- break;
- }
- if (ec) {
- V8Proxy::setDOMException(ec);
- return v8::Undefined();
- }
- return toV8(info);
+ return location;
}
+enum WhichProgramCall {
+ kProgramParameter, kUniform
+};
CALLBACK_FUNC_DECL(WebGLRenderingContextGetBufferParameter)
{
@@ -375,7 +350,28 @@ CALLBACK_FUNC_DECL(WebGLRenderingContextGetParameter)
CALLBACK_FUNC_DECL(WebGLRenderingContextGetProgramParameter)
{
INC_STATS("DOM.WebGLRenderingContext.getProgramParameter()");
- return getProgramParameter(args, kProgramParameter);
+
+ if (args.Length() != 2) {
+ V8Proxy::setDOMException(SYNTAX_ERR);
+ return notHandledByInterceptor();
+ }
+
+ ExceptionCode ec = 0;
+ WebGLRenderingContext* context =
+ V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
+ WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
+ bool ok;
+ unsigned pname = toInt32(args[1], ok);
+ if (!ok) {
+ V8Proxy::setDOMException(SYNTAX_ERR);
+ return notHandledByInterceptor();
+ }
+ WebGLGetInfo info = context->getProgramParameter(program, pname, ec);
+ if (ec) {
+ V8Proxy::setDOMException(ec);
+ return v8::Undefined();
+ }
+ return toV8(info);
}
CALLBACK_FUNC_DECL(WebGLRenderingContextGetRenderbufferParameter)
@@ -420,7 +416,30 @@ CALLBACK_FUNC_DECL(WebGLRenderingContextGetTexParameter)
CALLBACK_FUNC_DECL(WebGLRenderingContextGetUniform)
{
INC_STATS("DOM.WebGLRenderingContext.getUniform()");
- return getProgramParameter(args, kUniform);
+
+ if (args.Length() != 2) {
+ V8Proxy::setDOMException(SYNTAX_ERR);
+ return notHandledByInterceptor();
+ }
+
+ ExceptionCode ec = 0;
+ WebGLRenderingContext* context =
+ V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
+ WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? v8DOMWrapperTo<WebGLProgram>(V8ClassIndex::WEBGLPROGRAM, v8::Handle<v8::Object>::Cast(args[0])) : 0;
+
+ bool ok = false;
+ WebGLUniformLocation* location = toWebGLUniformLocation(args[1], ok);
+
+ if (!ok) {
+ V8Proxy::setDOMException(SYNTAX_ERR);
+ return notHandledByInterceptor();
+ }
+ WebGLGetInfo info = context->getUniform(program, location, ec);
+ if (ec) {
+ V8Proxy::setDOMException(ec);
+ return v8::Undefined();
+ }
+ return toV8(info);
}
CALLBACK_FUNC_DECL(WebGLRenderingContextGetVertexAttrib)
@@ -560,35 +579,57 @@ enum FunctionToCall {
kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v
};
+bool isFunctionToCallForAttribute(FunctionToCall functionToCall)
+{
+ switch (functionToCall) {
+ case kVertexAttrib1v:
+ case kVertexAttrib2v:
+ case kVertexAttrib3v:
+ case kVertexAttrib4v:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments& args,
FunctionToCall functionToCall) {
// Forms:
- // * glUniform1fv(GLint location, Array data);
- // * glUniform1fv(GLint location, WebGLFloatArray data);
- // * glUniform2fv(GLint location, Array data);
- // * glUniform2fv(GLint location, WebGLFloatArray data);
- // * glUniform3fv(GLint location, Array data);
- // * glUniform3fv(GLint location, WebGLFloatArray data);
- // * glUniform4fv(GLint location, Array data);
- // * glUniform4fv(GLint location, WebGLFloatArray data);
- // * glVertexAttrib1fv(GLint location, Array data);
- // * glVertexAttrib1fv(GLint location, WebGLFloatArray data);
- // * glVertexAttrib2fv(GLint location, Array data);
- // * glVertexAttrib2fv(GLint location, WebGLFloatArray data);
- // * glVertexAttrib3fv(GLint location, Array data);
- // * glVertexAttrib3fv(GLint location, WebGLFloatArray data);
- // * glVertexAttrib4fv(GLint location, Array data);
- // * glVertexAttrib4fv(GLint location, WebGLFloatArray data);
+ // * glUniform1fv(WebGLUniformLocation location, Array data);
+ // * glUniform1fv(WebGLUniformLocation location, WebGLFloatArray data);
+ // * glUniform2fv(WebGLUniformLocation location, Array data);
+ // * glUniform2fv(WebGLUniformLocation location, WebGLFloatArray data);
+ // * glUniform3fv(WebGLUniformLocation location, Array data);
+ // * glUniform3fv(WebGLUniformLocation location, WebGLFloatArray data);
+ // * glUniform4fv(WebGLUniformLocation location, Array data);
+ // * glUniform4fv(WebGLUniformLocation location, WebGLFloatArray data);
+ // * glVertexAttrib1fv(GLint index, Array data);
+ // * glVertexAttrib1fv(GLint index, WebGLFloatArray data);
+ // * glVertexAttrib2fv(GLint index, Array data);
+ // * glVertexAttrib2fv(GLint index, WebGLFloatArray data);
+ // * glVertexAttrib3fv(GLint index, Array data);
+ // * glVertexAttrib3fv(GLint index, WebGLFloatArray data);
+ // * glVertexAttrib4fv(GLint index, Array data);
+ // * glVertexAttrib4fv(GLint index, WebGLFloatArray data);
if (args.Length() != 3) {
V8Proxy::setDOMException(SYNTAX_ERR);
return notHandledByInterceptor();
}
+ bool ok = false;
+ int index = -1;
+ WebGLUniformLocation* location = 0;
+
+ if (isFunctionToCallForAttribute(functionToCall))
+ index = toInt32(args[0], ok);
+ else
+ location = toWebGLUniformLocation(args[0], ok);
+
WebGLRenderingContext* context =
V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
- bool ok;
- int location = toInt32(args[0], ok);
+
if (!ok) {
V8Proxy::setDOMException(SYNTAX_ERR);
return notHandledByInterceptor();
@@ -602,10 +643,10 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
case kUniform2v: context->uniform2fv(location, array); break;
case kUniform3v: context->uniform3fv(location, array); break;
case kUniform4v: context->uniform4fv(location, array); break;
- case kVertexAttrib1v: context->vertexAttrib1fv(location, array); break;
- case kVertexAttrib2v: context->vertexAttrib2fv(location, array); break;
- case kVertexAttrib3v: context->vertexAttrib3fv(location, array); break;
- case kVertexAttrib4v: context->vertexAttrib4fv(location, array); break;
+ case kVertexAttrib1v: context->vertexAttrib1fv(index, array); break;
+ case kVertexAttrib2v: context->vertexAttrib2fv(index, array); break;
+ case kVertexAttrib3v: context->vertexAttrib3fv(index, array); break;
+ case kVertexAttrib4v: context->vertexAttrib4fv(index, array); break;
default: ASSERT_NOT_REACHED(); break;
}
return v8::Undefined();
@@ -629,10 +670,10 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
case kUniform2v: context->uniform2fv(location, data, len); break;
case kUniform3v: context->uniform3fv(location, data, len); break;
case kUniform4v: context->uniform4fv(location, data, len); break;
- case kVertexAttrib1v: context->vertexAttrib1fv(location, data, len); break;
- case kVertexAttrib2v: context->vertexAttrib2fv(location, data, len); break;
- case kVertexAttrib3v: context->vertexAttrib3fv(location, data, len); break;
- case kVertexAttrib4v: context->vertexAttrib4fv(location, data, len); break;
+ case kVertexAttrib1v: context->vertexAttrib1fv(index, data, len); break;
+ case kVertexAttrib2v: context->vertexAttrib2fv(index, data, len); break;
+ case kVertexAttrib3v: context->vertexAttrib3fv(index, data, len); break;
+ case kVertexAttrib4v: context->vertexAttrib4fv(index, data, len); break;
default: ASSERT_NOT_REACHED(); break;
}
fastFree(data);
@@ -642,14 +683,14 @@ static v8::Handle<v8::Value> vertexAttribAndUniformHelperf(const v8::Arguments&
static v8::Handle<v8::Value> uniformHelperi(const v8::Arguments& args,
FunctionToCall functionToCall) {
// Forms:
- // * glUniform1iv(GLint location, Array data);
- // * glUniform1iv(GLint location, WebGLIntArray data);
- // * glUniform2iv(GLint location, Array data);
- // * glUniform2iv(GLint location, WebGLIntArray data);
- // * glUniform3iv(GLint location, Array data);
- // * glUniform3iv(GLint location, WebGLIntArray data);
- // * glUniform4iv(GLint location, Array data);
- // * glUniform4iv(GLint location, WebGLIntArray data);
+ // * glUniform1iv(GLUniformLocation location, Array data);
+ // * glUniform1iv(GLUniformLocation location, WebGLIntArray data);
+ // * glUniform2iv(GLUniformLocation location, Array data);
+ // * glUniform2iv(GLUniformLocation location, WebGLIntArray data);
+ // * glUniform3iv(GLUniformLocation location, Array data);
+ // * glUniform3iv(GLUniformLocation location, WebGLIntArray data);
+ // * glUniform4iv(GLUniformLocation location, Array data);
+ // * glUniform4iv(GLUniformLocation location, WebGLIntArray data);
if (args.Length() != 3) {
V8Proxy::setDOMException(SYNTAX_ERR);
@@ -658,8 +699,9 @@ static v8::Handle<v8::Value> uniformHelperi(const v8::Arguments& args,
WebGLRenderingContext* context =
V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
- bool ok;
- int location = toInt32(args[0], ok);
+ bool ok = false;
+ WebGLUniformLocation* location = toWebGLUniformLocation(args[0], ok);
+
if (!ok) {
V8Proxy::setDOMException(SYNTAX_ERR);
return notHandledByInterceptor();
@@ -769,8 +811,10 @@ static v8::Handle<v8::Value> uniformMatrixHelper(const v8::Arguments& args,
WebGLRenderingContext* context =
V8DOMWrapper::convertDOMWrapperToNative<WebGLRenderingContext>(args.Holder());
- bool ok;
- int location = toInt32(args[0], ok);
+
+ bool ok = false;
+ WebGLUniformLocation* location = toWebGLUniformLocation(args[0], ok);
+
if (!ok) {
V8Proxy::setDOMException(SYNTAX_ERR);
return notHandledByInterceptor();
diff --git a/WebCore/html/canvas/WebGLRenderingContext.cpp b/WebCore/html/canvas/WebGLRenderingContext.cpp
index a19d5c6..aadcbb4 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.cpp
+++ b/WebCore/html/canvas/WebGLRenderingContext.cpp
@@ -36,6 +36,7 @@
#include "WebGLRenderbuffer.h"
#include "WebGLTexture.h"
#include "WebGLShader.h"
+#include "WebGLUniformLocation.h"
#include "HTMLCanvasElement.h"
#include "HTMLImageElement.h"
#include "ImageBuffer.h"
@@ -1147,13 +1148,15 @@ WebGLGetInfo WebGLRenderingContext::getTexParameter(unsigned long target, unsign
}
}
-WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, long location, ExceptionCode& ec)
+WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebGLUniformLocation* uniformLocation, ExceptionCode& ec)
{
- if (!program || program->context() != this) {
+ if (!program || uniformLocation->program() != program || program->context() != this) {
// FIXME: raise GL_INVALID_VALUE error
ec = TYPE_MISMATCH_ERR;
return WebGLGetInfo();
}
+ long location = uniformLocation->location();
+
WebGLStateRestorer(this, false);
// FIXME: make this more efficient using WebGLUniformLocation and caching types in it
int activeUniforms = 0;
@@ -1275,13 +1278,14 @@ WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, long locat
return WebGLGetInfo();
}
-long WebGLRenderingContext::getUniformLocation(WebGLProgram* program, const String& name, ExceptionCode& ec)
+PassRefPtr<WebGLUniformLocation> WebGLRenderingContext::getUniformLocation(WebGLProgram* program, const String& name, ExceptionCode& ec)
{
if (!program || program->context() != this) {
ec = TYPE_MISMATCH_ERR;
return 0;
}
- return m_context->getUniformLocation(program, name);
+ WebGLStateRestorer(this, false);
+ return WebGLUniformLocation::create(program, m_context->getUniformLocation(program, name));
}
WebGLGetInfo WebGLRenderingContext::getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode& ec)
@@ -1646,289 +1650,469 @@ void WebGLRenderingContext::texSubImage2D(unsigned target, unsigned level, unsig
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1f(long location, float x)
+void WebGLRenderingContext::uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode& ec)
{
- m_context->uniform1f(location, x);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform1f(location->location(), x);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
- m_context->uniform1fv(location, v->data(), v->length());
+ m_context->uniform1fv(location->location(), v->data(), v->length());
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
- m_context->uniform1fv(location, v, size);
+ m_context->uniform1fv(location->location(), v, size);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1i(long location, int x)
+void WebGLRenderingContext::uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode& ec)
{
- m_context->uniform1i(location, x);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform1i(location->location(), x);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
- m_context->uniform1iv(location, v->data(), v->length());
+ m_context->uniform1iv(location->location(), v->data(), v->length());
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform1iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
- m_context->uniform1iv(location, v, size);
+ m_context->uniform1iv(location->location(), v, size);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2f(long location, float x, float y)
+void WebGLRenderingContext::uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode& ec)
{
- m_context->uniform2f(location, x, y);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform2f(location->location(), x, y);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 2
- m_context->uniform2fv(location, v->data(), v->length() / 2);
+ m_context->uniform2fv(location->location(), v->data(), v->length() / 2);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 2
- m_context->uniform2fv(location, v, size / 2);
+ m_context->uniform2fv(location->location(), v, size / 2);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2i(long location, int x, int y)
+void WebGLRenderingContext::uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode& ec)
{
- m_context->uniform2i(location, x, y);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform2i(location->location(), x, y);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 2
- m_context->uniform2iv(location, v->data(), v->length() / 2);
+ m_context->uniform2iv(location->location(), v->data(), v->length() / 2);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform2iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 2
- m_context->uniform2iv(location, v, size / 2);
+ m_context->uniform2iv(location->location(), v, size / 2);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3f(long location, float x, float y, float z)
+void WebGLRenderingContext::uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode& ec)
{
- m_context->uniform3f(location, x, y, z);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform3f(location->location(), x, y, z);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 3
- m_context->uniform3fv(location, v->data(), v->length() / 3);
+ m_context->uniform3fv(location->location(), v->data(), v->length() / 3);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 3
- m_context->uniform3fv(location, v, size / 3);
+ m_context->uniform3fv(location->location(), v, size / 3);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3i(long location, int x, int y, int z)
+void WebGLRenderingContext::uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode& ec)
{
- m_context->uniform3i(location, x, y, z);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform3i(location->location(), x, y, z);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 3
- m_context->uniform3iv(location, v->data(), v->length() / 3);
+ m_context->uniform3iv(location->location(), v->data(), v->length() / 3);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform3iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 3
- m_context->uniform3iv(location, v, size / 3);
+ m_context->uniform3iv(location->location(), v, size / 3);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4f(long location, float x, float y, float z, float w)
+void WebGLRenderingContext::uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode& ec)
{
- m_context->uniform4f(location, x, y, z, w);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform4f(location->location(), x, y, z, w);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4fv(long location, WebGLFloatArray* v)
+void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniform4fv(location, v->data(), v->length() / 4);
+ m_context->uniform4fv(location->location(), v->data(), v->length() / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4fv(long location, float* v, int size)
+void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniform4fv(location, v, size / 4);
+ m_context->uniform4fv(location->location(), v, size / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4i(long location, int x, int y, int z, int w)
+void WebGLRenderingContext::uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode& ec)
{
- m_context->uniform4i(location, x, y, z, w);
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ m_context->uniform4i(location->location(), x, y, z, w);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4iv(long location, WebGLIntArray* v)
+void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniform4iv(location, v->data(), v->length() / 4);
+ m_context->uniform4iv(location->location(), v->data(), v->length() / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniform4iv(long location, int* v, int size)
+void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniform4iv(location, v, size / 4);
+ m_context->uniform4iv(location->location(), v, size / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix2fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniformMatrix2fv(location, transpose, v->data(), v->length() / 4);
+ m_context->uniformMatrix2fv(location->location(), transpose, v->data(), v->length() / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix2fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 4
- m_context->uniformMatrix2fv(location, transpose, v, size / 4);
+ m_context->uniformMatrix2fv(location->location(), transpose, v, size / 4);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix3fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 9
- m_context->uniformMatrix3fv(location, transpose, v->data(), v->length() / 9);
+ m_context->uniformMatrix3fv(location->location(), transpose, v->data(), v->length() / 9);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix3fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 9
- m_context->uniformMatrix3fv(location, transpose, v, size / 9);
+ m_context->uniformMatrix3fv(location->location(), transpose, v, size / 9);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix4fv(long location, bool transpose, WebGLFloatArray* v)
+void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* v, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 16
- m_context->uniformMatrix4fv(location, transpose, v->data(), v->length() / 16);
+ m_context->uniformMatrix4fv(location->location(), transpose, v->data(), v->length() / 16);
cleanupAfterGraphicsCall(false);
}
-void WebGLRenderingContext::uniformMatrix4fv(long location, bool transpose, float* v, int size)
+void WebGLRenderingContext::uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* v, int size, ExceptionCode& ec)
{
+ if (!location || location->program() != m_currentProgram) {
+ // FIXME: raise GL_INVALID_OPERATION error
+ ec = TYPE_MISMATCH_ERR;
+ return;
+ }
+
// FIXME: we need to throw if no array passed in
if (!v)
return;
// FIXME: length needs to be a multiple of 16
- m_context->uniformMatrix4fv(location, transpose, v, size / 16);
+ m_context->uniformMatrix4fv(location->location(), transpose, v, size / 16);
cleanupAfterGraphicsCall(false);
}
diff --git a/WebCore/html/canvas/WebGLRenderingContext.h b/WebCore/html/canvas/WebGLRenderingContext.h
index 62b8899..399b155 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.h
+++ b/WebCore/html/canvas/WebGLRenderingContext.h
@@ -45,6 +45,7 @@ class WebGLProgram;
class WebGLRenderbuffer;
class WebGLShader;
class WebGLTexture;
+class WebGLUniformLocation;
class HTMLImageElement;
class HTMLVideoElement;
class ImageData;
@@ -157,9 +158,9 @@ class WebKitCSSMatrix;
WebGLGetInfo getTexParameter(unsigned long target, unsigned long pname, ExceptionCode&);
- WebGLGetInfo getUniform(WebGLProgram* program, long location, ExceptionCode& ec);
+ WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&);
- long getUniformLocation(WebGLProgram*, const String& name, ExceptionCode&);
+ PassRefPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&, ExceptionCode&);
WebGLGetInfo getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode&);
@@ -224,36 +225,36 @@ class WebKitCSSMatrix;
unsigned width, unsigned height, HTMLVideoElement* video,
bool flipY, bool premultiplyAlpha, ExceptionCode&);
- void uniform1f(long location, float x);
- void uniform1fv(long location, WebGLFloatArray* v);
- void uniform1fv(long location, float* v, int size);
- void uniform1i(long location, int x);
- void uniform1iv(long location, WebGLIntArray* v);
- void uniform1iv(long location, int* v, int size);
- void uniform2f(long location, float x, float y);
- void uniform2fv(long location, WebGLFloatArray* v);
- void uniform2fv(long location, float* v, int size);
- void uniform2i(long location, int x, int y);
- void uniform2iv(long location, WebGLIntArray* v);
- void uniform2iv(long location, int* v, int size);
- void uniform3f(long location, float x, float y, float z);
- void uniform3fv(long location, WebGLFloatArray* v);
- void uniform3fv(long location, float* v, int size);
- void uniform3i(long location, int x, int y, int z);
- void uniform3iv(long location, WebGLIntArray* v);
- void uniform3iv(long location, int* v, int size);
- void uniform4f(long location, float x, float y, float z, float w);
- void uniform4fv(long location, WebGLFloatArray* v);
- void uniform4fv(long location, float* v, int size);
- void uniform4i(long location, int x, int y, int z, int w);
- void uniform4iv(long location, WebGLIntArray* v);
- void uniform4iv(long location, int* v, int size);
- void uniformMatrix2fv(long location, bool transpose, WebGLFloatArray* value);
- void uniformMatrix2fv(long location, bool transpose, float* value, int size);
- void uniformMatrix3fv(long location, bool transpose, WebGLFloatArray* value);
- void uniformMatrix3fv(long location, bool transpose, float* value, int size);
- void uniformMatrix4fv(long location, bool transpose, WebGLFloatArray* value);
- void uniformMatrix4fv(long location, bool transpose, float* value, int size);
+ void uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode&);
+ void uniform1fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+ void uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+ void uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode&);
+ void uniform1iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+ void uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+ void uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode&);
+ void uniform2fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+ void uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+ void uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode&);
+ void uniform2iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+ void uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+ void uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode&);
+ void uniform3fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+ void uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+ void uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode&);
+ void uniform3iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+ void uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+ void uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode&);
+ void uniform4fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&);
+ void uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&);
+ void uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode&);
+ void uniform4iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&);
+ void uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&);
+ void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+ void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
+ void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+ void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
+ void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&);
+ void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&);
void useProgram(WebGLProgram*, ExceptionCode&);
void validateProgram(WebGLProgram*, ExceptionCode&);
diff --git a/WebCore/html/canvas/WebGLRenderingContext.idl b/WebCore/html/canvas/WebGLRenderingContext.idl
index 8f3c531..78de8c8 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.idl
+++ b/WebCore/html/canvas/WebGLRenderingContext.idl
@@ -567,10 +567,10 @@ module html {
// any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
[Custom] void getTexParameter();
- // any getUniform(in WebGLProgram program, in long location) raises(DOMException);
+ // any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
[Custom] void getUniform();
-
- long getUniformLocation(in WebGLProgram program, in DOMString name) raises(DOMException);
+
+ WebGLUniformLocation getUniformLocation(in WebGLProgram program, in DOMString name) raises(DOMException);
// any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
[Custom] void getVertexAttrib();
@@ -638,26 +638,26 @@ module html {
// [Optional] GLboolean flipY, [Optional] in premultiplyAlpha);
[Custom] void texSubImage2D();
- void uniform1f(in long location, in float x);
- [Custom] void uniform1fv(in long location, in WebGLFloatArray v);
- void uniform1i(in long location, in long x);
- [Custom] void uniform1iv(in long location, in WebGLIntArray v);
- void uniform2f(in long location, in float x, in float y);
- [Custom] void uniform2fv(in long location, in WebGLFloatArray v);
- void uniform2i(in long location, in long x, in long y);
- [Custom] void uniform2iv(in long location, in WebGLIntArray v);
- void uniform3f(in long location, in float x, in float y, in float z);
- [Custom] void uniform3fv(in long location, in WebGLFloatArray v);
- void uniform3i(in long location, in long x, in long y, in long z);
- [Custom] void uniform3iv(in long location, in WebGLIntArray v);
- void uniform4f(in long location, in float x, in float y, in float z, in float w);
- [Custom] void uniform4fv(in long location, in WebGLFloatArray v);
- void uniform4i(in long location, in long x, in long y, in long z, in long w);
- [Custom] void uniform4iv(in long location, in WebGLIntArray v);
-
- [Custom] void uniformMatrix2fv(in long location, in boolean transpose, in WebGLFloatArray array);
- [Custom] void uniformMatrix3fv(in long location, in boolean transpose, in WebGLFloatArray array);
- [Custom] void uniformMatrix4fv(in long location, in boolean transpose, in WebGLFloatArray array);
+ void uniform1f(in WebGLUniformLocation location, in float x) raises(DOMException);
+ [Custom] void uniform1fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+ void uniform1i(in WebGLUniformLocation location, in long x) raises(DOMException);
+ [Custom] void uniform1iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+ void uniform2f(in WebGLUniformLocation location, in float x, in float y) raises(DOMException);
+ [Custom] void uniform2fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+ void uniform2i(in WebGLUniformLocation location, in long x, in long y) raises(DOMException);
+ [Custom] void uniform2iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+ void uniform3f(in WebGLUniformLocation location, in float x, in float y, in float z) raises(DOMException);
+ [Custom] void uniform3fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+ void uniform3i(in WebGLUniformLocation location, in long x, in long y, in long z) raises(DOMException);
+ [Custom] void uniform3iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+ void uniform4f(in WebGLUniformLocation location, in float x, in float y, in float z, in float w) raises(DOMException);
+ [Custom] void uniform4fv(in WebGLUniformLocation location, in WebGLFloatArray v) raises(DOMException);
+ void uniform4i(in WebGLUniformLocation location, in long x, in long y, in long z, in long w) raises(DOMException);
+ [Custom] void uniform4iv(in WebGLUniformLocation location, in WebGLIntArray v) raises(DOMException);
+
+ [Custom] void uniformMatrix2fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
+ [Custom] void uniformMatrix3fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
+ [Custom] void uniformMatrix4fv(in WebGLUniformLocation location, in boolean transpose, in WebGLFloatArray array) raises(DOMException);
void useProgram(in WebGLProgram program) raises(DOMException);
void validateProgram(in WebGLProgram program) raises(DOMException);
diff --git a/WebCore/html/canvas/WebGLUniformLocation.cpp b/WebCore/html/canvas/WebGLUniformLocation.cpp
new file mode 100644
index 0000000..2157470
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(3D_CANVAS)
+
+#include "WebGLUniformLocation.h"
+
+namespace WebCore {
+
+PassRefPtr<WebGLUniformLocation> WebGLUniformLocation::create(WebGLProgram* program, long location)
+{
+ return adoptRef(new WebGLUniformLocation(program, location));
+}
+
+WebGLUniformLocation::WebGLUniformLocation(WebGLProgram* program, long location)
+ : m_program(program)
+ , m_location(location)
+{
+}
+
+}
+
+#endif // ENABLE(3D_CANVAS)
diff --git a/WebCore/html/canvas/WebGLUniformLocation.h b/WebCore/html/canvas/WebGLUniformLocation.h
new file mode 100644
index 0000000..f9f7a11
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebGLUniformLocation_h
+#define WebGLUniformLocation_h
+
+#include "CanvasObject.h"
+#include "WebGLProgram.h"
+
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class WebGLUniformLocation : public RefCounted<WebGLUniformLocation> {
+public:
+ virtual ~WebGLUniformLocation() { }
+
+ static PassRefPtr<WebGLUniformLocation> create(WebGLProgram* program, long location);
+
+ WebGLProgram* program() const { return m_program.get(); }
+
+ long location() const { return m_location; }
+
+protected:
+ WebGLUniformLocation(WebGLProgram* program, long location);
+
+private:
+ RefPtr<WebGLProgram> m_program;
+ long m_location;
+};
+
+} // namespace WebCore
+
+#endif // WebGLUniformLocation_h
diff --git a/WebCore/html/canvas/WebGLUniformLocation.idl b/WebCore/html/canvas/WebGLUniformLocation.idl
new file mode 100644
index 0000000..b080241
--- /dev/null
+++ b/WebCore/html/canvas/WebGLUniformLocation.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+ interface [Conditional=3D_CANVAS] WebGLUniformLocation {
+ };
+}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list