diff options
-rw-r--r-- | build/features_override.gypi | 2 | ||||
-rw-r--r-- | webkit/api/src/GraphicsContext3D.cpp | 90 |
2 files changed, 79 insertions, 13 deletions
diff --git a/build/features_override.gypi b/build/features_override.gypi index 2b2bf94..dfa3869 100644 --- a/build/features_override.gypi +++ b/build/features_override.gypi @@ -10,7 +10,7 @@ # features.gypi. Therefore, if an enable is listed in features.gypi # but not listed below, it will revert to its hardcoded webkit value. 'feature_defines': [ - 'ENABLE_3D_CANVAS=0', + 'ENABLE_3D_CANVAS=1', 'ENABLE_CHANNEL_MESSAGING=1', 'ENABLE_DATABASE=1', 'ENABLE_DATAGRID=0', diff --git a/webkit/api/src/GraphicsContext3D.cpp b/webkit/api/src/GraphicsContext3D.cpp index 992431d..1afe4f9 100644 --- a/webkit/api/src/GraphicsContext3D.cpp +++ b/webkit/api/src/GraphicsContext3D.cpp @@ -1299,18 +1299,70 @@ void GraphicsContext3D::generateMipmap(unsigned long target) // require a texture readback and re-upload. } -bool GraphicsContext3D::getActiveAttrib(CanvasProgram*, unsigned long, ActiveInfo&) +bool GraphicsContext3D::getActiveAttrib(CanvasProgram* program, unsigned long index, ActiveInfo& info) { - // FIXME: implement. - notImplemented(); - return false; + if (!program) + return false; + GLint numActiveAttribs = -1; + glGetProgramiv(EXTRACT(program), GL_ACTIVE_ATTRIBUTES, &numActiveAttribs); + if (numActiveAttribs < 0) + return false; + if (index >= static_cast<GLuint>(numActiveAttribs)) + return false; + GLint maxNameLength = -1; + glGetProgramiv(EXTRACT(program), GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength); + if (maxNameLength < 0) + return false; + GLchar* name = NULL; + if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) + return false; + GLsizei length = 0; + GLint size = -1; + GLenum type = 0; + glGetActiveAttrib(EXTRACT(program), index, maxNameLength, + &length, &size, &type, name); + if (size < 0) { + fastFree(name); + return false; + } + info.name = String(name, length); + info.type = type; + info.size = size; + fastFree(name); + return true; } -bool GraphicsContext3D::getActiveUniform(CanvasProgram*, unsigned long, ActiveInfo&) +bool GraphicsContext3D::getActiveUniform(CanvasProgram* program, unsigned long index, ActiveInfo& info) { - // FIXME: implement. - notImplemented(); - return false; + if (!program) + return false; + GLint numActiveUniforms = -1; + glGetProgramiv(EXTRACT(program), GL_ACTIVE_UNIFORMS, &numActiveUniforms); + if (numActiveUniforms < 0) + return false; + if (index >= static_cast<GLuint>(numActiveUniforms)) + return false; + GLint maxNameLength = -1; + glGetProgramiv(EXTRACT(program), GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); + if (maxNameLength < 0) + return false; + GLchar* name = NULL; + if (!tryFastMalloc(maxNameLength * sizeof(GLchar)).getValue(name)) + return false; + GLsizei length = 0; + GLint size = -1; + GLenum type = 0; + glGetActiveUniform(EXTRACT(program), index, maxNameLength, + &length, &size, &type, name); + if (size < 0) { + fastFree(name); + return false; + } + info.name = String(name, length); + info.type = type; + info.size = size; + fastFree(name); + return true; } int GraphicsContext3D::getAttribLocation(CanvasProgram* program, const String& name) @@ -1441,7 +1493,7 @@ String GraphicsContext3D::getProgramInfoLog(CanvasProgram* program) GLsizei returnedLogLength; glGetProgramInfoLog(programID, logLength, &returnedLogLength, log); ASSERT(logLength == returnedLogLength + 1); - String res = String::fromUTF8(log, returnedLogLength); + String res = String(log, returnedLogLength); fastFree(log); return res; } @@ -1494,7 +1546,7 @@ String GraphicsContext3D::getShaderInfoLog(CanvasShader* shader) GLsizei returnedLogLength; glGetShaderInfoLog(shaderID, logLength, &returnedLogLength, log); ASSERT(logLength == returnedLogLength + 1); - String res = String::fromUTF8(log, returnedLogLength); + String res = String(log, returnedLogLength); fastFree(log); return res; } @@ -1513,7 +1565,7 @@ String GraphicsContext3D::getShaderSource(CanvasShader* shader) GLsizei returnedLogLength; glGetShaderSource(shaderID, logLength, &returnedLogLength, log); ASSERT(logLength == returnedLogLength + 1); - String res = String::fromUTF8(log, returnedLogLength); + String res = String(log, returnedLogLength); fastFree(log); return res; } @@ -1521,7 +1573,7 @@ String GraphicsContext3D::getShaderSource(CanvasShader* shader) String GraphicsContext3D::getString(unsigned long name) { makeContextCurrent(); - return String::fromUTF8(reinterpret_cast<const char*>(glGetString(name))); + return String(reinterpret_cast<const char*>(glGetString(name))); } float GraphicsContext3D::getTexParameterf(unsigned long target, unsigned long pname) @@ -1713,6 +1765,20 @@ void GraphicsContext3D::pixelStorei(unsigned long pname, long param) GL_SAME_METHOD_2(PolygonOffset, polygonOffset, double, double) +PassRefPtr<CanvasArray> GraphicsContext3D::readPixels(long x, long y, + unsigned long width, unsigned long height, + unsigned long format, unsigned long type) { + // FIXME: support more pixel formats and types. + if (!((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE))) { + return 0; + } + + // FIXME: take into account pack alignment. + RefPtr<CanvasUnsignedByteArray> array = CanvasUnsignedByteArray::create(width * height * 4); + glReadPixels(x, y, width, height, format, type, array->baseAddress()); + return array; +} + void GraphicsContext3D::releaseShaderCompiler() { } |