summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-16 16:25:10 +0100
committerBen Murdoch <benm@google.com>2011-05-23 18:54:14 +0100
commitab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb (patch)
treedb769fadd053248f85db67434a5b275224defef7 /Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
parent52e2557aeb8477967e97fd24f20f8f407a10fa15 (diff)
downloadexternal_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.zip
external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.gz
external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.bz2
Merge WebKit at r76408: Initial merge by git.
Change-Id: I5b91decbd693ccbf5c1b8354b37cd68cc9a1ea53
Diffstat (limited to 'Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp')
-rw-r--r--Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp61
1 files changed, 52 insertions, 9 deletions
diff --git a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
index 64f19c4..f416b47 100644
--- a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
+++ b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp
@@ -28,29 +28,53 @@
#if ENABLE(3D_CANVAS)
#include "ANGLEWebKitBridge.h"
+#include <wtf/OwnArrayPtr.h>
namespace WebCore {
ANGLEWebKitBridge::ANGLEWebKitBridge() :
- builtCompilers(false)
+ builtCompilers(false),
+ m_fragmentCompiler(0),
+ m_vertexCompiler(0)
{
ShInitialize();
}
ANGLEWebKitBridge::~ANGLEWebKitBridge()
{
- if (builtCompilers) {
+ cleanupCompilers();
+}
+
+void ANGLEWebKitBridge::cleanupCompilers()
+{
+ if (m_fragmentCompiler)
ShDestruct(m_fragmentCompiler);
+ m_fragmentCompiler = 0;
+ if (m_vertexCompiler)
ShDestruct(m_vertexCompiler);
- }
+ m_vertexCompiler = 0;
+
+ builtCompilers = false;
+}
+
+void ANGLEWebKitBridge::setResources(ShBuiltInResources resources)
+{
+ // Resources are (possibly) changing - cleanup compilers if we had them already
+ cleanupCompilers();
+
+ m_resources = resources;
}
bool ANGLEWebKitBridge::validateShaderSource(const char* shaderSource, ANGLEShaderType shaderType, String& translatedShaderSource, String& shaderValidationLog)
{
if (!builtCompilers) {
- m_fragmentCompiler = ShConstructCompiler(EShLangFragment, EShSpecWebGL, &m_resources);
- m_vertexCompiler = ShConstructCompiler(EShLangVertex, EShSpecWebGL, &m_resources);
+ m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_WEBGL_SPEC, &m_resources);
+ m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_WEBGL_SPEC, &m_resources);
+ if (!m_fragmentCompiler || !m_vertexCompiler) {
+ cleanupCompilers();
+ return false;
+ }
builtCompilers = true;
}
@@ -64,12 +88,31 @@ bool ANGLEWebKitBridge::validateShaderSource(const char* shaderSource, ANGLEShad
const char* const shaderSourceStrings[] = { shaderSource };
- bool validateSuccess = ShCompile(compiler, shaderSourceStrings, 1, EShOptNone, EDebugOpIntermediate);
+ bool validateSuccess = ShCompile(compiler, shaderSourceStrings, 1, SH_OBJECT_CODE);
+ if (!validateSuccess) {
+ int logSize = 0;
+ ShGetInfo(compiler, SH_INFO_LOG_LENGTH, &logSize);
+ if (logSize > 1) {
+ OwnArrayPtr<char> logBuffer(new char[logSize]);
+ if (logBuffer) {
+ ShGetInfoLog(compiler, logBuffer.get());
+ shaderValidationLog = logBuffer.get();
+ }
+ }
+ return false;
+ }
- translatedShaderSource = ShGetObjectCode(compiler);
- shaderValidationLog = ShGetInfoLog(compiler);
+ int translationLength = 0;
+ ShGetInfo(compiler, SH_OBJECT_CODE_LENGTH, &translationLength);
+ if (translationLength > 1) {
+ OwnArrayPtr<char> translationBuffer(new char[translationLength]);
+ if (!translationBuffer)
+ return false;
+ ShGetObjectCode(compiler, translationBuffer.get());
+ translatedShaderSource = translationBuffer.get();
+ }
- return validateSuccess;
+ return true;
}
}