ANGLEWebKitBridge.cpp [plain text]
#include "config.h"
#if ENABLE(WEBGL)
#include "ANGLEWebKitBridge.h"
#include <wtf/OwnArrayPtr.h>
namespace WebCore {
ANGLEWebKitBridge::ANGLEWebKitBridge() :
builtCompilers(false),
m_fragmentCompiler(0),
m_vertexCompiler(0)
{
ShInitialize();
}
ANGLEWebKitBridge::~ANGLEWebKitBridge()
{
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)
{
cleanupCompilers();
m_resources = resources;
}
bool ANGLEWebKitBridge::validateShaderSource(const char* shaderSource, ANGLEShaderType shaderType, String& translatedShaderSource, String& shaderValidationLog)
{
if (!builtCompilers) {
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;
}
ShHandle compiler;
if (shaderType == SHADER_TYPE_VERTEX)
compiler = m_vertexCompiler;
else
compiler = m_fragmentCompiler;
const char* const shaderSourceStrings[] = { shaderSource };
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 = adoptArrayPtr(new char[logSize]);
if (logBuffer) {
ShGetInfoLog(compiler, logBuffer.get());
shaderValidationLog = logBuffer.get();
}
}
return false;
}
int translationLength = 0;
ShGetInfo(compiler, SH_OBJECT_CODE_LENGTH, &translationLength);
if (translationLength > 1) {
OwnArrayPtr<char> translationBuffer = adoptArrayPtr(new char[translationLength]);
if (!translationBuffer)
return false;
ShGetObjectCode(compiler, translationBuffer.get());
translatedShaderSource = translationBuffer.get();
}
return true;
}
}
#endif // ENABLE(WEBGL)