| // Copyright 2011, 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: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * 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. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "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 THE COPYRIGHT |
| // OWNER 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" |
| |
| #include "bindings/core/dart/DartWebGLRenderingContext.h" |
| |
| #include "bindings/core/dart/DartANGLEInstancedArrays.h" |
| #include "bindings/core/dart/DartDOMWrapper.h" |
| #include "bindings/core/dart/DartEXTFragDepth.h" |
| #include "bindings/core/dart/DartEXTTextureFilterAnisotropic.h" |
| #include "bindings/core/dart/DartHTMLCanvasElement.h" |
| #include "bindings/core/dart/DartHTMLImageElement.h" |
| #include "bindings/core/dart/DartHTMLVideoElement.h" |
| #include "bindings/core/dart/DartImageData.h" |
| #include "bindings/core/dart/DartOESElementIndexUint.h" |
| #include "bindings/core/dart/DartOESStandardDerivatives.h" |
| #include "bindings/core/dart/DartOESTextureFloat.h" |
| #include "bindings/core/dart/DartOESTextureFloatLinear.h" |
| #include "bindings/core/dart/DartOESTextureHalfFloat.h" |
| #include "bindings/core/dart/DartOESTextureHalfFloatLinear.h" |
| #include "bindings/core/dart/DartOESVertexArrayObject.h" |
| #include "bindings/core/dart/DartWebGLBuffer.h" |
| #include "bindings/core/dart/DartWebGLCompressedTextureATC.h" |
| #include "bindings/core/dart/DartWebGLCompressedTexturePVRTC.h" |
| #include "bindings/core/dart/DartWebGLCompressedTextureS3TC.h" |
| #include "bindings/core/dart/DartWebGLDebugRendererInfo.h" |
| #include "bindings/core/dart/DartWebGLDebugShaders.h" |
| #include "bindings/core/dart/DartWebGLDepthTexture.h" |
| #include "bindings/core/dart/DartWebGLDrawBuffers.h" |
| #include "bindings/core/dart/DartWebGLFramebuffer.h" |
| #include "bindings/core/dart/DartWebGLLoseContext.h" |
| #include "bindings/core/dart/DartWebGLProgram.h" |
| #include "bindings/core/dart/DartWebGLRenderbuffer.h" |
| #include "bindings/core/dart/DartWebGLShader.h" |
| #include "bindings/core/dart/DartWebGLTexture.h" |
| #include "bindings/core/dart/DartWebGLUniformLocation.h" |
| #include "bindings/core/dart/DartWebGLVertexArrayObjectOES.h" |
| #include "core/dom/ExceptionCode.h" |
| #include "core/html/canvas/WebGLExtensionName.h" |
| #include "core/html/canvas/WebGLRenderingContext.h" |
| #include "platform/NotImplemented.h" |
| |
| #include <limits> |
| #include <wtf/FastMalloc.h> |
| |
| namespace blink { |
| |
| namespace DartWebGLRenderingContextInternal { |
| |
| template <class Element> |
| inline Element toWebGLArrayElement(Dart_Handle, Dart_Handle& exception); |
| |
| template <> |
| inline double toWebGLArrayElement<double>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::dartToDouble(object, exception); |
| } |
| |
| template <> |
| inline float toWebGLArrayElement<float>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::dartToDouble(object, exception); |
| } |
| |
| template <> |
| inline int8_t toWebGLArrayElement<int8_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline int16_t toWebGLArrayElement<int16_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline int32_t toWebGLArrayElement<int32_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline int64_t toWebGLArrayElement<int64_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline uint8_t toWebGLArrayElement<uint8_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline uint16_t toWebGLArrayElement<uint16_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <> |
| inline uint32_t toWebGLArrayElement<uint32_t>(Dart_Handle object, Dart_Handle& exception) |
| { |
| return DartUtilities::toInteger(object, exception); |
| } |
| |
| template <class Element> |
| inline void dartListToVector(Dart_Handle list, Vector<Element>& array, Dart_Handle& exception) |
| { |
| // FIXME: create vector from list for primitive types |
| // without element-by-element copying and conversion. |
| // Need VM support. |
| DartUtilities::toVector(&toWebGLArrayElement<Element>, list, array, exception); |
| } |
| |
| template <class Array> |
| struct TypedArrayTraits; |
| |
| template <> |
| struct TypedArrayTraits<Int8Array> { |
| typedef int8_t ElementType; |
| typedef int ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Int16Array> { |
| typedef int16_t ElementType; |
| typedef int ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Int32Array> { |
| typedef int32_t ElementType; |
| typedef int ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Uint8Array> { |
| typedef uint8_t ElementType; |
| typedef unsigned ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Uint8ClampedArray> { |
| typedef uint8_t ElementType; |
| typedef unsigned ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Uint16Array> { |
| typedef uint16_t ElementType; |
| typedef unsigned ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Uint32Array> { |
| typedef uint32_t ElementType; |
| typedef unsigned ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Float32Array> { |
| typedef float ElementType; |
| typedef float ReturnedElementType; |
| }; |
| |
| template <> |
| struct TypedArrayTraits<Float64Array> { |
| typedef double ElementType; |
| typedef double ReturnedElementType; |
| }; |
| |
| template<typename ElementType> |
| struct ToDartTraits { |
| }; |
| |
| template<> |
| struct ToDartTraits<String> { |
| static Dart_Handle toDart(const String& value) { return DartUtilities::stringToDart(value); } |
| }; |
| |
| template<> |
| struct ToDartTraits<bool> { |
| static Dart_Handle toDart(bool value) { return DartUtilities::boolToDart(value); } |
| }; |
| |
| template<> |
| struct ToDartTraits<int> { |
| static Dart_Handle toDart(int value) { return DartUtilities::intToDart(value); } |
| }; |
| |
| template<> |
| struct ToDartTraits<unsigned> { |
| static Dart_Handle toDart(unsigned value) { return DartUtilities::unsignedToDart(value); } |
| }; |
| |
| template<> |
| struct ToDartTraits<float> { |
| static Dart_Handle toDart(float value) { return DartUtilities::doubleToDart(value); } |
| }; |
| |
| template<> |
| struct ToDartTraits<double> { |
| static Dart_Handle toDart(double value) { return DartUtilities::doubleToDart(value); } |
| }; |
| |
| template<typename T> |
| static Dart_Handle vectorToDart(const Vector<T>& vector) |
| { |
| Dart_Handle list = Dart_NewList(vector.size()); |
| if (Dart_IsError(list)) |
| return list; |
| for (size_t i = 0; i < vector.size(); i++) { |
| Dart_Handle element = ToDartTraits<T>::toDart(vector[i]); |
| Dart_Handle result = Dart_ListSetAt(list, i, element); |
| if (Dart_IsError(result)) |
| return result; |
| } |
| return list; |
| } |
| |
| static Dart_Handle webGLExtensionToDart(WebGLExtension* extension) |
| { |
| if (!extension) |
| return Dart_Null(); |
| switch (extension->name()) { |
| case WebGLLoseContextName: |
| return DartWebGLLoseContext::toDart(static_cast<WebGLLoseContext*>(extension)); |
| case WebGLDrawBuffersName: |
| return DartWebGLDrawBuffers::toDart(static_cast<WebGLDrawBuffers*>(extension)); |
| case ANGLEInstancedArraysName: |
| return DartANGLEInstancedArrays::toDart(static_cast<ANGLEInstancedArrays*>(extension)); |
| case EXTFragDepthName: |
| return DartEXTFragDepth::toDart(static_cast<EXTFragDepth*>(extension)); |
| case EXTTextureFilterAnisotropicName: |
| return DartEXTTextureFilterAnisotropic::toDart(static_cast<EXTTextureFilterAnisotropic*>(extension)); |
| case OESStandardDerivativesName: |
| return DartOESStandardDerivatives::toDart(static_cast<OESStandardDerivatives*>(extension)); |
| case OESTextureFloatName: |
| return DartOESTextureFloat::toDart(static_cast<OESTextureFloat*>(extension)); |
| case OESTextureFloatLinearName: |
| return DartOESTextureFloatLinear::toDart(static_cast<OESTextureFloatLinear*>(extension)); |
| case OESTextureHalfFloatName: |
| return DartOESTextureHalfFloat::toDart(static_cast<OESTextureHalfFloat*>(extension)); |
| case OESTextureHalfFloatLinearName: |
| return DartOESTextureHalfFloatLinear::toDart(static_cast<OESTextureHalfFloatLinear*>(extension)); |
| case OESVertexArrayObjectName: |
| return DartOESVertexArrayObject::toDart(static_cast<OESVertexArrayObject*>(extension)); |
| case OESElementIndexUintName: |
| return DartOESElementIndexUint::toDart(static_cast<OESElementIndexUint*>(extension)); |
| case WebGLDebugRendererInfoName: |
| return DartWebGLDebugRendererInfo::toDart(static_cast<WebGLDebugRendererInfo*>(extension)); |
| case WebGLDebugShadersName: |
| return DartWebGLDebugShaders::toDart(static_cast<WebGLDebugShaders*>(extension)); |
| case WebGLCompressedTextureATCName: |
| return DartWebGLCompressedTextureATC::toDart(static_cast<WebGLCompressedTextureATC*>(extension)); |
| case WebGLCompressedTexturePVRTCName: |
| return DartWebGLCompressedTexturePVRTC::toDart(static_cast<WebGLCompressedTexturePVRTC*>(extension)); |
| case WebGLCompressedTextureS3TCName: |
| return DartWebGLCompressedTextureS3TC::toDart(static_cast<WebGLCompressedTextureS3TC*>(extension)); |
| case WebGLDepthTextureName: |
| return DartWebGLDepthTexture::toDart(static_cast<WebGLDepthTexture*>(extension)); |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| |
| ASSERT_NOT_REACHED(); |
| return Dart_Null(); |
| } |
| |
| static Dart_Handle webGLGetInfoToDart(const WebGLGetInfo& info) |
| { |
| switch (info.getType()) { |
| case WebGLGetInfo::kTypeBool: |
| return DartUtilities::boolToDart(info.getBool()); |
| case WebGLGetInfo::kTypeBoolArray: |
| return vectorToDart(info.getBoolArray()); |
| case WebGLGetInfo::kTypeFloat: |
| return DartUtilities::doubleToDart(info.getFloat()); |
| case WebGLGetInfo::kTypeInt: |
| return DartUtilities::intToDart(info.getInt()); |
| case WebGLGetInfo::kTypeNull: |
| return Dart_Null(); |
| case WebGLGetInfo::kTypeString: |
| return DartUtilities::stringToDart(info.getString()); |
| case WebGLGetInfo::kTypeUnsignedInt: |
| return DartUtilities::unsignedToDart(info.getUnsignedInt()); |
| case WebGLGetInfo::kTypeWebGLBuffer: |
| return DartWebGLBuffer::toDart(info.getWebGLBuffer()); |
| case WebGLGetInfo::kTypeWebGLFloatArray: |
| return DartUtilities::arrayBufferViewToDart(info.getWebGLFloatArray()); |
| case WebGLGetInfo::kTypeWebGLFramebuffer: |
| return DartWebGLFramebuffer::toDart(info.getWebGLFramebuffer()); |
| case WebGLGetInfo::kTypeWebGLIntArray: |
| return DartUtilities::arrayBufferViewToDart(info.getWebGLIntArray()); |
| case WebGLGetInfo::kTypeWebGLObjectArray: |
| // FIXME: implement WebGLObjectArray. |
| return DART_UNIMPLEMENTED_EXCEPTION(); |
| case WebGLGetInfo::kTypeWebGLProgram: |
| return DartWebGLProgram::toDart(info.getWebGLProgram()); |
| case WebGLGetInfo::kTypeWebGLRenderbuffer: |
| return DartWebGLRenderbuffer::toDart(info.getWebGLRenderbuffer()); |
| case WebGLGetInfo::kTypeWebGLTexture: |
| return DartWebGLTexture::toDart(info.getWebGLTexture()); |
| case WebGLGetInfo::kTypeWebGLUnsignedByteArray: |
| return DartUtilities::arrayBufferViewToDart(info.getWebGLUnsignedByteArray()); |
| case WebGLGetInfo::kTypeWebGLUnsignedIntArray: |
| return DartUtilities::arrayBufferViewToDart(info.getWebGLUnsignedIntArray()); |
| case WebGLGetInfo::kTypeWebGLVertexArrayObjectOES: |
| return DartWebGLVertexArrayObjectOES::toDart(info.getWebGLVertexArrayObjectOES()); |
| } |
| |
| ASSERT_NOT_REACHED(); |
| return Dart_Null(); |
| } |
| |
| enum ObjectType { |
| kBuffer, kRenderbuffer, kTexture, kVertexAttrib |
| }; |
| |
| static void getObjectParameter(Dart_NativeArguments args, ObjectType objectType) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| int target = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| int pname = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| WebGLGetInfo info; |
| switch (objectType) { |
| case kBuffer: |
| info = context->getBufferParameter(target, pname); |
| break; |
| case kRenderbuffer: |
| info = context->getRenderbufferParameter(target, pname); |
| break; |
| case kTexture: |
| info = context->getTexParameter(target, pname); |
| break; |
| case kVertexAttrib: |
| // target => index |
| info = context->getVertexAttrib(target, pname); |
| break; |
| default: |
| notImplemented(); |
| break; |
| } |
| Dart_Handle result = webGLGetInfoToDart(info); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getBufferParameterCallback(Dart_NativeArguments args) |
| { |
| getObjectParameter(args, kBuffer); |
| } |
| |
| void getExtensionCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| DartStringAdapter name = DartUtilities::dartToString(args, 1, exception); |
| if (exception) |
| goto fail; |
| |
| WebGLExtension* extension = context->getExtension(name).get(); |
| Dart_Handle result = webGLExtensionToDart(extension); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getFramebufferAttachmentParameterCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| int target = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| int attachment = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| int pname = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 3), exception); |
| if (exception) |
| goto fail; |
| |
| WebGLGetInfo info = context->getFramebufferAttachmentParameter(target, attachment, pname); |
| Dart_Handle result = webGLGetInfoToDart(info); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getParameterCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| int pname = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| |
| WebGLGetInfo info = context->getParameter(pname); |
| Dart_Handle result = webGLGetInfoToDart(info); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getProgramParameterCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| WebGLProgram* program = DartWebGLProgram::toNativeWithNullCheck(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| int pname = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| WebGLGetInfo info = context->getProgramParameter(program, pname); |
| Dart_Handle result = webGLGetInfoToDart(info); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getRenderbufferParameterCallback(Dart_NativeArguments args) |
| { |
| getObjectParameter(args, kRenderbuffer); |
| } |
| |
| void getShaderParameterCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| WebGLShader* shader = DartWebGLShader::toNativeWithNullCheck(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| int pname = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| WebGLGetInfo info = context->getShaderParameter(shader, pname); |
| Dart_Handle result = webGLGetInfoToDart(info); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getSupportedExtensionsCallback(Dart_NativeArguments args) |
| { |
| Dart_Handle exception = 0; |
| { |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| Nullable<Vector<String>> value = context->getSupportedExtensions(); |
| if (value.isNull()) { |
| // Return null. |
| return; |
| } |
| |
| Dart_Handle result = vectorToDart(value.get()); |
| if (!DartUtilities::checkResult(result, exception)) |
| goto fail; |
| |
| Dart_SetReturnValue(args, result); |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void getTexParameterCallback(Dart_NativeArguments args) |
| { |
| getObjectParameter(args, kTexture); |
| } |
| |
| void getUniformCallback(Dart_NativeArguments args) |
| { |
| getObjectParameter(args, kVertexAttrib); |
| } |
| |
| void getVertexAttribCallback(Dart_NativeArguments args) |
| { |
| getObjectParameter(args, kVertexAttrib); |
| } |
| |
| enum FunctionToCall { |
| kUniform1v, kUniform2v, kUniform3v, kUniform4v, |
| kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v |
| }; |
| |
| static inline bool isFunctionToCallForAttribute(FunctionToCall functionToCall) |
| { |
| switch (functionToCall) { |
| case kVertexAttrib1v: |
| case kVertexAttrib2v: |
| case kVertexAttrib3v: |
| case kVertexAttrib4v: |
| return true; |
| default: |
| break; |
| } |
| return false; |
| } |
| |
| static void vertexAttribAndUniformHelperf(Dart_NativeArguments args, FunctionToCall functionToCall) |
| { |
| Dart_Handle exception = 0; |
| { |
| // Forms: |
| // * glUniform1fv(WebGLUniformLocation location, Array data); |
| // * glUniform1fv(WebGLUniformLocation location, Float32Array data); |
| // * glUniform2fv(WebGLUniformLocation location, Array data); |
| // * glUniform2fv(WebGLUniformLocation location, Float32Array data); |
| // * glUniform3fv(WebGLUniformLocation location, Array data); |
| // * glUniform3fv(WebGLUniformLocation location, Float32Array data); |
| // * glUniform4fv(WebGLUniformLocation location, Array data); |
| // * glUniform4fv(WebGLUniformLocation location, Float32Array data); |
| // * glVertexAttrib1fv(GLint index, Array data); |
| // * glVertexAttrib1fv(GLint index, Float32Array data); |
| // * glVertexAttrib2fv(GLint index, Array data); |
| // * glVertexAttrib2fv(GLint index, Float32Array data); |
| // * glVertexAttrib3fv(GLint index, Array data); |
| // * glVertexAttrib3fv(GLint index, Float32Array data); |
| // * glVertexAttrib4fv(GLint index, Array data); |
| // * glVertexAttrib4fv(GLint index, Float32Array data); |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| int index = -1; |
| WebGLUniformLocation* location = 0; |
| |
| if (isFunctionToCallForAttribute(functionToCall)) { |
| int indexParam = DartUtilities::dartToInt(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| index = indexParam; |
| } else { |
| WebGLUniformLocation* locationParam = DartWebGLUniformLocation::toNativeWithNullCheck(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| location = locationParam; |
| } |
| |
| RefPtr<Float32Array> array = DartUtilities::dartToFloat32Array(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| switch (functionToCall) { |
| case kUniform1v: |
| context->uniform1fv(location, array.get()); |
| break; |
| case kUniform2v: |
| context->uniform2fv(location, array.get()); |
| break; |
| case kUniform3v: |
| context->uniform3fv(location, array.get()); |
| break; |
| case kUniform4v: |
| context->uniform4fv(location, array.get()); |
| break; |
| case kVertexAttrib1v: |
| context->vertexAttrib1fv(index, array.get()); |
| break; |
| case kVertexAttrib2v: |
| context->vertexAttrib2fv(index, array.get()); |
| break; |
| case kVertexAttrib3v: |
| context->vertexAttrib3fv(index, array.get()); |
| break; |
| case kVertexAttrib4v: |
| context->vertexAttrib4fv(index, array.get()); |
| break; |
| } |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| static void uniformHelperi(Dart_NativeArguments args, FunctionToCall functionToCall) |
| { |
| Dart_Handle exception = 0; |
| { |
| // Forms: |
| // * glUniform1iv(GLUniformLocation location, Array data); |
| // * glUniform1iv(GLUniformLocation location, Int32Array data); |
| // * glUniform2iv(GLUniformLocation location, Array data); |
| // * glUniform2iv(GLUniformLocation location, Int32Array data); |
| // * glUniform3iv(GLUniformLocation location, Array data); |
| // * glUniform3iv(GLUniformLocation location, Int32Array data); |
| // * glUniform4iv(GLUniformLocation location, Array data); |
| // * glUniform4iv(GLUniformLocation location, Int32Array data); |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| WebGLUniformLocation* location = DartWebGLUniformLocation::toNativeWithNullCheck(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| |
| RefPtr<Int32Array> array = DartUtilities::dartToInt32Array(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| switch (functionToCall) { |
| case kUniform1v: |
| context->uniform1iv(location, array.get()); |
| break; |
| case kUniform2v: |
| context->uniform2iv(location, array.get()); |
| break; |
| case kUniform3v: |
| context->uniform3iv(location, array.get()); |
| break; |
| case kUniform4v: |
| context->uniform4iv(location, array.get()); |
| break; |
| default: |
| ASSERT_NOT_REACHED(); |
| break; |
| } |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| static void uniformMatrixHelper(Dart_NativeArguments args, int matrixSize) |
| { |
| Dart_Handle exception = 0; |
| { |
| // Forms: |
| // * glUniformMatrix2fv(GLint location, GLboolean transpose, Array data); |
| // * glUniformMatrix2fv(GLint location, GLboolean transpose, Float32Array data); |
| // * glUniformMatrix3fv(GLint location, GLboolean transpose, Array data); |
| // * glUniformMatrix3fv(GLint location, GLboolean transpose, Float32Array data); |
| // * glUniformMatrix4fv(GLint location, GLboolean transpose, Array data); |
| // * glUniformMatrix4fv(GLint location, GLboolean transpose, Float32Array data); |
| // |
| WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| WebGLUniformLocation* location = DartWebGLUniformLocation::toNativeWithNullCheck(Dart_GetNativeArgument(args, 1), exception); |
| if (exception) |
| goto fail; |
| bool transpose = DartUtilities::dartToBool(Dart_GetNativeArgument(args, 2), exception); |
| if (exception) |
| goto fail; |
| |
| RefPtr<Float32Array> array = DartUtilities::dartToFloat32Array(Dart_GetNativeArgument(args, 3), exception); |
| if (exception) |
| goto fail; |
| |
| switch (matrixSize) { |
| case 2: |
| context->uniformMatrix2fv(location, transpose, array.get()); |
| break; |
| case 3: |
| context->uniformMatrix3fv(location, transpose, array.get()); |
| break; |
| case 4: |
| context->uniformMatrix4fv(location, transpose, array.get()); |
| break; |
| default: |
| ASSERT_NOT_REACHED(); |
| break; |
| } |
| return; |
| } |
| |
| fail: |
| Dart_ThrowException(exception); |
| ASSERT_NOT_REACHED(); |
| } |
| |
| void uniform1fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kUniform1v); |
| } |
| |
| void uniform1ivCallback(Dart_NativeArguments args) |
| { |
| uniformHelperi(args, kUniform1v); |
| } |
| |
| void uniform2fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kUniform2v); |
| } |
| |
| void uniform2ivCallback(Dart_NativeArguments args) |
| { |
| uniformHelperi(args, kUniform2v); |
| } |
| |
| void uniform3fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kUniform3v); |
| } |
| |
| void uniform3ivCallback(Dart_NativeArguments args) |
| { |
| uniformHelperi(args, kUniform3v); |
| } |
| |
| void uniform4fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kUniform4v); |
| } |
| |
| void uniform4ivCallback(Dart_NativeArguments args) |
| { |
| uniformHelperi(args, kUniform4v); |
| } |
| |
| void uniformMatrix2fvCallback(Dart_NativeArguments args) |
| { |
| uniformMatrixHelper(args, 2); |
| } |
| |
| void uniformMatrix3fvCallback(Dart_NativeArguments args) |
| { |
| uniformMatrixHelper(args, 3); |
| } |
| |
| void uniformMatrix4fvCallback(Dart_NativeArguments args) |
| { |
| uniformMatrixHelper(args, 4); |
| } |
| |
| void vertexAttrib1fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kVertexAttrib1v); |
| } |
| |
| void vertexAttrib2fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kVertexAttrib2v); |
| } |
| |
| void vertexAttrib3fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kVertexAttrib3v); |
| } |
| |
| void vertexAttrib4fvCallback(Dart_NativeArguments args) |
| { |
| vertexAttribAndUniformHelperf(args, kVertexAttrib4v); |
| } |
| |
| } |
| |
| } |