Chromium Code Reviews| Index: Source/WebCore/bindings/dart/custom/DartWebGLRenderingContextCustom.cpp |
| diff --git a/Source/WebCore/bindings/dart/custom/DartWebGLRenderingContextCustom.cpp b/Source/WebCore/bindings/dart/custom/DartWebGLRenderingContextCustom.cpp |
| index b8f74a299519d963314a2fb4aa2cb4646b7be043..4c22da7bca43da5d224db0b8404365fec41c32c8 100644 |
| --- a/Source/WebCore/bindings/dart/custom/DartWebGLRenderingContextCustom.cpp |
| +++ b/Source/WebCore/bindings/dart/custom/DartWebGLRenderingContextCustom.cpp |
| @@ -32,170 +32,713 @@ |
| #if ENABLE(WEBGL) |
| +#include "DartArrayBufferView.h" |
| +#include "DartDOMWrapper.h" |
| +#include "DartFloat32Array.h" |
| +#include "DartHTMLCanvasElement.h" |
| +#include "DartHTMLImageElement.h" |
| +#include "DartHTMLVideoElement.h" |
| +#include "DartImageData.h" |
| +#include "DartInt16Array.h" |
| +#include "DartInt32Array.h" |
| +#include "DartInt8Array.h" |
| +#include "DartOESStandardDerivatives.h" |
| +#include "DartOESTextureFloat.h" |
| +#include "DartOESVertexArrayObject.h" |
| +#include "DartUint16Array.h" |
| +#include "DartUint32Array.h" |
| +#include "DartUint8Array.h" |
| +#include "DartWebGLBuffer.h" |
| +#include "DartWebGLDebugRendererInfo.h" |
| +#include "DartWebGLDebugShaders.h" |
| +#include "DartWebGLFramebuffer.h" |
| +#include "DartWebGLLoseContext.h" |
| +#include "DartWebGLProgram.h" |
| +#include "DartWebGLRenderbuffer.h" |
| +#include "DartWebGLShader.h" |
| +#include "DartWebGLTexture.h" |
| +#include "DartWebGLUniformLocation.h" |
| +#include "DartWebGLVertexArrayObjectOES.h" |
| +#include "ExceptionCode.h" |
| +#include "NotImplemented.h" |
| +#include "WebGLRenderingContext.h" |
| + |
| +#include <limits> |
| +#include <wtf/FastMalloc.h> |
| + |
| namespace WebCore { |
| namespace DartWebGLRenderingContextInternal { |
| -void getAttachedShadersCallback(Dart_NativeArguments) |
| +static Dart_Handle toDartValueInternal(WebGLExtension* extension) |
| +{ |
| + if (!extension) |
| + return 0; |
| + switch (extension->getName()) { |
| + case WebGLExtension::WebKitWebGLLoseContextName: |
| + return toDartValue(static_cast<WebGLLoseContext*>(extension)); |
| + case WebGLExtension::OESStandardDerivativesName: |
| + return toDartValue(static_cast<OESStandardDerivatives*>(extension)); |
| + case WebGLExtension::OESTextureFloatName: |
| + return toDartValue(static_cast<OESTextureFloat*>(extension)); |
| + case WebGLExtension::OESVertexArrayObjectName: |
| + return toDartValue(static_cast<OESVertexArrayObject*>(extension)); |
| + case WebGLExtension::WebGLDebugRendererInfoName: |
| + return toDartValue(static_cast<WebGLDebugRendererInfo*>(extension)); |
| + case WebGLExtension::WebGLDebugShadersName: |
| + return toDartValue(static_cast<WebGLDebugShaders*>(extension)); |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + return 0; |
| + } |
| +} |
| + |
| +static Dart_Handle toDartValueInternal(const WebGLGetInfo& info) |
| +{ |
| + switch (info.getType()) { |
| + case WebGLGetInfo::kTypeBool: |
| + return toDartValue(info.getBool()); |
| + case WebGLGetInfo::kTypeBoolArray: |
| + return DartUtilities::vectorToDartList(info.getBoolArray()); |
| + case WebGLGetInfo::kTypeFloat: |
| + return toDartValue(info.getFloat()); |
| + case WebGLGetInfo::kTypeInt: |
| + return toDartValue(info.getInt()); |
| + case WebGLGetInfo::kTypeNull: |
| + return 0; |
| + case WebGLGetInfo::kTypeString: |
| + return toDartValue(info.getString()); |
| + case WebGLGetInfo::kTypeUnsignedInt: |
| + return toDartValue(static_cast<intptr_t>(info.getUnsignedInt())); |
| + case WebGLGetInfo::kTypeWebGLBuffer: |
| + return toDartValue(info.getWebGLBuffer()); |
| + case WebGLGetInfo::kTypeWebGLFloatArray: |
| + return toDartValue(info.getWebGLFloatArray()); |
| + case WebGLGetInfo::kTypeWebGLFramebuffer: |
| + return toDartValue(info.getWebGLFramebuffer()); |
| + case WebGLGetInfo::kTypeWebGLIntArray: |
| + return toDartValue(info.getWebGLIntArray()); |
| + // FIXME: implement WebGLObjectArray |
| + // case WebGLGetInfo::kTypeWebGLObjectArray: |
| + case WebGLGetInfo::kTypeWebGLProgram: |
| + return toDartValue(info.getWebGLProgram()); |
| + case WebGLGetInfo::kTypeWebGLRenderbuffer: |
| + return toDartValue(info.getWebGLRenderbuffer()); |
| + case WebGLGetInfo::kTypeWebGLTexture: |
| + return toDartValue(info.getWebGLTexture()); |
| + case WebGLGetInfo::kTypeWebGLUnsignedByteArray: |
| + return toDartValue(info.getWebGLUnsignedByteArray()); |
| + case WebGLGetInfo::kTypeWebGLVertexArrayObjectOES: |
| + return toDartValue(info.getWebGLVertexArrayObjectOES()); |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + return 0; |
| + } |
| +} |
| + |
| +enum ObjectType { |
| + kBuffer, kRenderbuffer, kTexture, kVertexAttrib |
| +}; |
| + |
| +static void getObjectParameter(Dart_NativeArguments args, ObjectType objectType) |
| +{ |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + ExceptionCode ec = 0; |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<int> target(Dart_GetNativeArgument(args, 1)); |
| + if (!target.conversionSuccessful()) { |
| + exception = target.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<int> pname(Dart_GetNativeArgument(args, 2)); |
| + if (!pname.conversionSuccessful()) { |
| + exception = pname.exception(); |
| + goto fail; |
| + } |
| + |
| + WebGLGetInfo info; |
| + switch (objectType) { |
| + case kBuffer: |
| + info = context->getBufferParameter(target, pname, ec); |
| + break; |
| + case kRenderbuffer: |
| + info = context->getRenderbufferParameter(target, pname, ec); |
| + break; |
| + case kTexture: |
| + info = context->getTexParameter(target, pname, ec); |
| + break; |
| + case kVertexAttrib: |
| + // target => index |
| + info = context->getVertexAttrib(target, pname, ec); |
| + break; |
| + default: |
| + notImplemented(); |
| + break; |
| + } |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result = toDartValueInternal(info); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + |
| + Dart_SetReturnValue(args, result); |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| +} |
| + |
| +void getAttachedShadersCallback(Dart_NativeArguments args) |
| +{ |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception = 0; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<RefPtr<WebGLProgram>, DartWebGLProgram> program(Dart_GetNativeArgument(args, 1)); |
| + if (!program.conversionSuccessful()) { |
| + exception = program.exception(); |
| + goto fail; |
| + } |
| + |
| + Vector<RefPtr<WebGLShader> > shaders; |
| + ExceptionCode ec = 0; |
| + bool succeed = context->getAttachedShaders(program, shaders, ec); |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result; |
| + if (succeed) { |
| + result = DartUtilities::vectorToDartList(shaders); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + } else |
| + result = 0; |
| + 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) |
| +{ |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<String> name(Dart_GetNativeArgument(args, 1)); |
| + if (!name.conversionSuccessful()) { |
| + exception = name.exception(); |
| + goto fail; |
| + } |
| + |
| + WebGLExtension* extension = context->getExtension(name); |
| + Dart_Handle result = toDartValueInternal(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) |
| +{ |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<int> target(Dart_GetNativeArgument(args, 1)); |
| + if (!target.conversionSuccessful()) { |
| + exception = target.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<int> attachment(Dart_GetNativeArgument(args, 2)); |
| + if (!attachment.conversionSuccessful()) { |
| + exception = attachment.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<int> pname(Dart_GetNativeArgument(args, 3)); |
| + if (!pname.conversionSuccessful()) { |
| + exception = pname.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + WebGLGetInfo info = context->getFramebufferAttachmentParameter(target, attachment, pname, ec); |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result = toDartValueInternal(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) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception = 0; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<int> pname(Dart_GetNativeArgument(args, 1)); |
| + if (!pname.conversionSuccessful()) { |
| + exception = pname.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + WebGLGetInfo info = context->getParameter(pname, ec); |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result = toDartValueInternal(info); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + |
| + Dart_SetReturnValue(args, result); |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getBufferParameterCallback(Dart_NativeArguments) |
| +void getProgramParameterCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<WebGLProgram, DartWebGLProgram> program(Dart_GetNativeArgument(args, 1)); |
| + if (!program.conversionSuccessful()) { |
| + exception = program.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<int> pname(Dart_GetNativeArgument(args, 2)); |
| + if (!pname.conversionSuccessful()) { |
| + exception = pname.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + WebGLGetInfo info = context->getProgramParameter(program, pname, ec); |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result = toDartValueInternal(info); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + |
| + Dart_SetReturnValue(args, result); |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getExtensionCallback(Dart_NativeArguments) |
| +void getRenderbufferParameterCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + getObjectParameter(args, kRenderbuffer); |
| } |
| -void getFramebufferAttachmentParameterCallback(Dart_NativeArguments) |
| +void getShaderParameterCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + const ParameterAdapter<WebGLShader, DartWebGLShader> shader(Dart_GetNativeArgument(args, 1)); |
| + if (!shader.conversionSuccessful()) { |
| + exception = shader.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<int> pname(Dart_GetNativeArgument(args, 2)); |
| + if (!pname.conversionSuccessful()) { |
| + exception = pname.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + WebGLGetInfo info = context->getShaderParameter(shader, pname, ec); |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + Dart_Handle result = toDartValueInternal(info); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + |
| + Dart_SetReturnValue(args, result); |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getParameterCallback(Dart_NativeArguments) |
| +void getSupportedExtensionsCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception = 0; |
| + { |
| + WebGLRenderingContext* context = DartDOMWrapper::receiver<WebGLRenderingContext>(args); |
| + Vector<String> value = context->getSupportedExtensions(); |
| + Dart_Handle result = DartUtilities::vectorToDartList(value); |
| + if (!DartUtilities::checkResult(result, exception)) |
| + goto fail; |
| + |
| + Dart_SetReturnValue(args, result); |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getProgramParameterCallback(Dart_NativeArguments) |
| +void getTexParameterCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + getObjectParameter(args, kTexture); |
| } |
| -void getRenderbufferParameterCallback(Dart_NativeArguments) |
| +void getUniformCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + getObjectParameter(args, kVertexAttrib); |
| } |
| -void getShaderParameterCallback(Dart_NativeArguments) |
| +void getVertexAttribCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + getObjectParameter(args, kVertexAttrib); |
| } |
| -void getSupportedExtensionsCallback(Dart_NativeArguments) |
| +enum FunctionToCall { |
| + kUniform1v, kUniform2v, kUniform3v, kUniform4v, |
| + kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v |
| +}; |
| + |
| +static inline bool isFunctionToCallForAttribute(FunctionToCall functionToCall) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + switch (functionToCall) { |
| + case kVertexAttrib1v: |
| + case kVertexAttrib2v: |
| + case kVertexAttrib3v: |
| + case kVertexAttrib4v: |
| + return true; |
| + default: |
| + break; |
| + } |
| + return false; |
| } |
| -void getTexParameterCallback(Dart_NativeArguments) |
| +static void vertexAttribAndUniformHelperf(Dart_NativeArguments args, FunctionToCall functionToCall) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + // 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)) { |
| + const ParameterAdapter<int> indexParam(Dart_GetNativeArgument(args, 1)); |
| + if (!indexParam.conversionSuccessful()) { |
| + exception = indexParam.exception(); |
| + goto fail; |
| + } |
| + index = indexParam; |
| + } else { |
| + const ParameterAdapter<WebGLUniformLocation, DartWebGLUniformLocation> locationParam(Dart_GetNativeArgument(args, 1)); |
| + if (!locationParam.conversionSuccessful()) { |
| + exception = locationParam.exception(); |
| + goto fail; |
| + } |
| + location = locationParam; |
| + } |
| + |
| + // FIXME: process Dart lists as parameters |
|
antonm
2012/01/18 15:12:23
nit: trailing dot is missing.
Nikolay
2012/01/19 13:27:34
Done.
|
| + const ParameterAdapter<Float32Array, DartFloat32Array> array(Dart_GetNativeArgument(args, 2)); |
| + if (!array.conversionSuccessful()) { |
| + exception = array.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + switch (functionToCall) { |
| + case kUniform1v: |
| + context->uniform1fv(location, array, ec); |
| + break; |
| + case kUniform2v: |
| + context->uniform2fv(location, array, ec); |
| + break; |
| + case kUniform3v: |
| + context->uniform3fv(location, array, ec); |
| + break; |
| + case kUniform4v: |
| + context->uniform4fv(location, array, ec); |
| + 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; |
| + } |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getUniformCallback(Dart_NativeArguments) |
| +static void uniformHelperi(Dart_NativeArguments args, FunctionToCall functionToCall) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + // 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); |
| + const ParameterAdapter<WebGLUniformLocation, DartWebGLUniformLocation> location(Dart_GetNativeArgument(args, 1)); |
| + if (!location.conversionSuccessful()) { |
| + exception = location.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<Int32Array, DartInt32Array> array(Dart_GetNativeArgument(args, 2)); |
| + // FIXME: maybe process Dart lists ars parameters too? |
| + if (!array.conversionSuccessful()) { |
| + exception = array.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + switch (functionToCall) { |
| + case kUniform1v: |
| + context->uniform1iv(location, array, ec); |
| + break; |
| + case kUniform2v: |
| + context->uniform2iv(location, array, ec); |
| + break; |
| + case kUniform3v: |
| + context->uniform3iv(location, array, ec); |
| + break; |
| + case kUniform4v: |
| + context->uniform4iv(location, array, ec); |
| + break; |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + break; |
| + } |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void getVertexAttribCallback(Dart_NativeArguments) |
| +static void uniformMatrixHelper(Dart_NativeArguments args, int matrixSize) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + DartApiScope dartApiScope; |
| + Dart_Handle exception; |
| + { |
| + // 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); |
| + const ParameterAdapter<WebGLUniformLocation, DartWebGLUniformLocation> location(Dart_GetNativeArgument(args, 1)); |
| + if (!location.conversionSuccessful()) { |
| + exception = location.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<bool> transpose(Dart_GetNativeArgument(args, 2)); |
| + if (!transpose.conversionSuccessful()) { |
| + exception = transpose.exception(); |
| + goto fail; |
| + } |
| + const ParameterAdapter<Float32Array, DartFloat32Array> array(Dart_GetNativeArgument(args, 3)); |
| + if (!array.conversionSuccessful()) { |
| + exception = array.exception(); |
| + goto fail; |
| + } |
| + |
| + ExceptionCode ec = 0; |
| + switch (matrixSize) { |
| + case 2: |
| + context->uniformMatrix2fv(location, transpose, array, ec); |
| + break; |
| + case 3: |
| + context->uniformMatrix3fv(location, transpose, array, ec); |
| + break; |
| + case 4: |
| + context->uniformMatrix4fv(location, transpose, array, ec); |
| + break; |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + break; |
| + } |
| + if (UNLIKELY(ec)) { |
| + exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
| + goto fail; |
| + } |
| + return; |
| + } |
| + |
| +fail: |
| + Dart_ThrowException(exception); |
| + ASSERT_NOT_REACHED(); |
| } |
| -void uniform1fvCallback(Dart_NativeArguments) |
| +void uniform1fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kUniform1v); |
| } |
| -void uniform1ivCallback(Dart_NativeArguments) |
| +void uniform1ivCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformHelperi(args, kUniform1v); |
| } |
| -void uniform2fvCallback(Dart_NativeArguments) |
| +void uniform2fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kUniform2v); |
| } |
| -void uniform2ivCallback(Dart_NativeArguments) |
| +void uniform2ivCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformHelperi(args, kUniform2v); |
| } |
| -void uniform3fvCallback(Dart_NativeArguments) |
| +void uniform3fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kUniform3v); |
| } |
| -void uniform3ivCallback(Dart_NativeArguments) |
| +void uniform3ivCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformHelperi(args, kUniform3v); |
| } |
| -void uniform4fvCallback(Dart_NativeArguments) |
| +void uniform4fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kUniform4v); |
| } |
| -void uniform4ivCallback(Dart_NativeArguments) |
| +void uniform4ivCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformHelperi(args, kUniform4v); |
| } |
| -void uniformMatrix2fvCallback(Dart_NativeArguments) |
| +void uniformMatrix2fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformMatrixHelper(args, 2); |
| } |
| -void uniformMatrix3fvCallback(Dart_NativeArguments) |
| +void uniformMatrix3fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformMatrixHelper(args, 3); |
| } |
| -void uniformMatrix4fvCallback(Dart_NativeArguments) |
| +void uniformMatrix4fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + uniformMatrixHelper(args, 4); |
| } |
| -void vertexAttrib1fvCallback(Dart_NativeArguments) |
| +void vertexAttrib1fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kVertexAttrib1v); |
| } |
| -void vertexAttrib2fvCallback(Dart_NativeArguments) |
| +void vertexAttrib2fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kVertexAttrib2v); |
| } |
| -void vertexAttrib3fvCallback(Dart_NativeArguments) |
| +void vertexAttrib3fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kVertexAttrib3v); |
| } |
| -void vertexAttrib4fvCallback(Dart_NativeArguments) |
| +void vertexAttrib4fvCallback(Dart_NativeArguments args) |
| { |
| - // FIXME: proper implementation. |
| - DART_UNIMPLEMENTED(); |
| + vertexAttribAndUniformHelperf(args, kVertexAttrib4v); |
| } |
| } |