From f956920ce7932e20e315656e72282007087b6ab9 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 25 Sep 2016 22:19:57 +0200 Subject: [PATCH 6/9] Establish compatibility with latest ANGLE --- .../platform/graphics/ANGLEWebKitBridge.cpp | 126 ++++----------------- .../WebCore/platform/graphics/ANGLEWebKitBridge.h | 17 +-- .../graphics/cairo/GraphicsContext3DCairo.cpp | 2 +- .../platform/graphics/efl/GraphicsContext3DEfl.cpp | 2 +- .../graphics/opengl/Extensions3DOpenGLCommon.cpp | 4 +- .../platform/graphics/qt/GraphicsContext3DQt.cpp | 2 +- 6 files changed, 33 insertions(+), 120 deletions(-) diff --git a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp index 9876c9f04..84d3a2f34 100644 --- a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp +++ b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.cpp @@ -32,98 +32,25 @@ namespace WebCore { -// Temporary typedef to support an incompatible change in the ANGLE API. -#if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 -typedef int ANGLEGetInfoType; -#else -typedef size_t ANGLEGetInfoType; -#endif - -inline static ANGLEGetInfoType getValidationResultValue(const ShHandle compiler, ShShaderInfo shaderInfo) -{ - ANGLEGetInfoType value = 0; - ShGetInfo(compiler, shaderInfo, &value); - return value; -} - -static bool getSymbolInfo(ShHandle compiler, ShShaderInfo symbolType, Vector& symbols) -{ - ShShaderInfo symbolMaxNameLengthType; - - switch (symbolType) { - case SH_ACTIVE_ATTRIBUTES: - symbolMaxNameLengthType = SH_ACTIVE_ATTRIBUTE_MAX_LENGTH; - break; - case SH_ACTIVE_UNIFORMS: - symbolMaxNameLengthType = SH_ACTIVE_UNIFORM_MAX_LENGTH; - break; - default: - ASSERT_NOT_REACHED(); +template +bool readSymbols(const vectype *vec, Vector &symbols) { + if(!vec) { return false; } - - ANGLEGetInfoType numSymbols = getValidationResultValue(compiler, symbolType); - - ANGLEGetInfoType maxNameLength = getValidationResultValue(compiler, symbolMaxNameLengthType); - if (maxNameLength <= 1) - return false; - - ANGLEGetInfoType maxMappedNameLength = getValidationResultValue(compiler, SH_MAPPED_NAME_MAX_LENGTH); - if (maxMappedNameLength <= 1) - return false; - - // The maximum allowed symbol name length is 256 characters. - Vector nameBuffer(maxNameLength); - Vector mappedNameBuffer(maxMappedNameLength); - - for (ANGLEGetInfoType i = 0; i < numSymbols; ++i) { + for(typename vectype::const_iterator i = vec->begin(), end = vec->end(); i != end; ++i) { ANGLEShaderSymbol symbol; - ANGLEGetInfoType nameLength = 0; - switch (symbolType) { - case SH_ACTIVE_ATTRIBUTES: - symbol.symbolType = SHADER_SYMBOL_TYPE_ATTRIBUTE; - ShGetActiveAttrib(compiler, i, &nameLength, &symbol.size, &symbol.dataType, nameBuffer.data(), mappedNameBuffer.data()); - break; - case SH_ACTIVE_UNIFORMS: - symbol.symbolType = SHADER_SYMBOL_TYPE_UNIFORM; - ShGetActiveUniform(compiler, i, &nameLength, &symbol.size, &symbol.dataType, nameBuffer.data(), mappedNameBuffer.data()); - break; - default: - ASSERT_NOT_REACHED(); - return false; - } - if (!nameLength) - return false; - - // The ShGetActive* calls above are guaranteed to produce null-terminated strings for - // nameBuffer and mappedNameBuffer. Also, the character set for symbol names - // is a subset of Latin-1 as specified by the OpenGL ES Shading Language, Section 3.1 and - // WebGL, Section "Characters Outside the GLSL Source Character Set". - - String name = String(nameBuffer.data()); - String mappedName = String(mappedNameBuffer.data()); - - // ANGLE returns array names in the format "array[0]". - // The only way to know if a symbol is an array is to check if it ends with "[0]". - // We can't check the size because regular symbols and arrays of length 1 both have a size of 1. - symbol.isArray = name.endsWith("[0]") && mappedName.endsWith("[0]"); - if (symbol.isArray) { - // Add a symbol for the array name without the "[0]" suffix. - name.truncate(name.length() - 3); - mappedName.truncate(mappedName.length() - 3); - } - - symbol.name = name; - symbol.mappedName = mappedName; + symbol.name = i->name.data(); + symbol.mappedName = i->mappedName.data(); + symbol.isArray = i->isArray(); symbols.append(symbol); - if (symbol.isArray) { // Add symbols for each array element. + symbol.size = i->arraySize; symbol.isArray = false; - for (int i = 0; i < symbol.size; i++) { - String arrayBrackets = "[" + String::number(i) + "]"; - symbol.name = name + arrayBrackets; - symbol.mappedName = mappedName + arrayBrackets; + for (int index = 0; index < symbol.size; index++) { + String arrayBrackets = "[" + String::number(index) + "]"; + symbol.name = i->name.data() + arrayBrackets; + symbol.mappedName = i->mappedName.data() + arrayBrackets; symbols.append(symbol); } } @@ -163,15 +90,14 @@ void ANGLEWebKitBridge::setResources(ShBuiltInResources resources) { // Resources are (possibly) changing - cleanup compilers if we had them already cleanupCompilers(); - m_resources = resources; } bool ANGLEWebKitBridge::compileShaderSource(const char* shaderSource, ANGLEShaderType shaderType, String& translatedShaderSource, String& shaderValidationLog, Vector& symbols, int extraCompileOptions) { if (!builtCompilers) { - m_fragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); - m_vertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); + m_fragmentCompiler = ShConstructCompiler(GL_FRAGMENT_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); + m_vertexCompiler = ShConstructCompiler(GL_VERTEX_SHADER, m_shaderSpec, m_shaderOutput, &m_resources); if (!m_fragmentCompiler || !m_vertexCompiler) { cleanupCompilers(); return false; @@ -189,31 +115,17 @@ bool ANGLEWebKitBridge::compileShaderSource(const char* shaderSource, ANGLEShade const char* const shaderSourceStrings[] = { shaderSource }; - bool validateSuccess = ShCompile(compiler, shaderSourceStrings, 1, SH_OBJECT_CODE | SH_ATTRIBUTES_UNIFORMS | extraCompileOptions); + bool validateSuccess = ShCompile(compiler, shaderSourceStrings, 1, SH_OBJECT_CODE | SH_VARIABLES | extraCompileOptions); if (!validateSuccess) { - int logSize = getValidationResultValue(compiler, SH_INFO_LOG_LENGTH); - if (logSize > 1) { - OwnArrayPtr logBuffer = adoptArrayPtr(new char[logSize]); - if (logBuffer) { - ShGetInfoLog(compiler, logBuffer.get()); - shaderValidationLog = logBuffer.get(); - } - } + shaderValidationLog = ShGetInfoLog(compiler).data(); return false; } - int translationLength = getValidationResultValue(compiler, SH_OBJECT_CODE_LENGTH); - if (translationLength > 1) { - OwnArrayPtr translationBuffer = adoptArrayPtr(new char[translationLength]); - if (!translationBuffer) - return false; - ShGetObjectCode(compiler, translationBuffer.get()); - translatedShaderSource = translationBuffer.get(); - } + translatedShaderSource = ShGetObjectCode(compiler).data(); - if (!getSymbolInfo(compiler, SH_ACTIVE_ATTRIBUTES, symbols)) + if (!readSymbols(ShGetAttributes(compiler), symbols)) return false; - if (!getSymbolInfo(compiler, SH_ACTIVE_UNIFORMS, symbols)) + if (!readSymbols(ShGetUniforms(compiler), symbols)) return false; return true; diff --git a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h index 83c2e004c..825c2d0bc 100644 --- a/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h +++ b/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h @@ -35,13 +35,14 @@ #include "GLSLANG/ShaderLang.h" #else #include "ShaderLang.h" +#include "angle_gl.h" #endif namespace WebCore { enum ANGLEShaderType { - SHADER_TYPE_VERTEX = SH_VERTEX_SHADER, - SHADER_TYPE_FRAGMENT = SH_FRAGMENT_SHADER, + SHADER_TYPE_VERTEX = GL_VERTEX_SHADER, + SHADER_TYPE_FRAGMENT = GL_FRAGMENT_SHADER, }; enum ANGLEShaderSymbolType { @@ -53,24 +54,24 @@ struct ANGLEShaderSymbol { ANGLEShaderSymbolType symbolType; String name; String mappedName; - ShDataType dataType; + sh::GLenum dataType; int size; bool isArray; bool isSampler() const { return symbolType == SHADER_SYMBOL_TYPE_UNIFORM - && (dataType == SH_SAMPLER_2D - || dataType == SH_SAMPLER_CUBE - || dataType == SH_SAMPLER_2D_RECT_ARB - || dataType == SH_SAMPLER_EXTERNAL_OES); + && (dataType == GL_SAMPLER_2D + || dataType == GL_SAMPLER_CUBE + || dataType == GL_SAMPLER_2D_RECT_ARB + || dataType == GL_SAMPLER_EXTERNAL_OES); } }; class ANGLEWebKitBridge { public: - ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC); + ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_COMPATIBILITY_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC); ~ANGLEWebKitBridge(); ShBuiltInResources getResources() { return m_resources; } diff --git a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp index d31adf326..3b99ad9d9 100644 --- a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp +++ b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp @@ -80,7 +80,7 @@ PassRefPtr GraphicsContext3D::create(GraphicsContext3D::Attri GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, HostWindow*, GraphicsContext3D::RenderStyle renderStyle) : m_currentWidth(0) , m_currentHeight(0) - , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT) + , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_COMPATIBILITY_OUTPUT) , m_attrs(attributes) , m_texture(0) , m_fbo(0) diff --git a/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp b/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp index ea25e4355..a28c55ff4 100644 --- a/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp +++ b/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp @@ -41,7 +41,7 @@ PassRefPtr GraphicsContext3D::create(GraphicsContext3D::Attri GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle) : m_currentWidth(0) , m_currentHeight(0) - , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT) + , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_COMPATIBILITY_OUTPUT) , m_attrs(attrs) , m_renderStyle(renderStyle) , m_texture(0) diff --git a/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp b/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp index 29a13c842..11f88f183 100644 --- a/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp +++ b/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGLCommon.cpp @@ -172,10 +172,10 @@ String Extensions3DOpenGLCommon::getTranslatedShaderSourceANGLE(Platform3DObject String translatedShaderSource; String shaderInfoLog; - int extraCompileOptions = SH_MAP_LONG_VARIABLE_NAMES | SH_CLAMP_INDIRECT_ARRAY_BOUNDS; + int extraCompileOptions = SH_CLAMP_INDIRECT_ARRAY_BOUNDS; if (m_requiresBuiltInFunctionEmulation) - extraCompileOptions |= SH_EMULATE_BUILT_IN_FUNCTIONS; + extraCompileOptions |= SH_EMULATE_ABS_INT_FUNCTION; Vector symbols; bool isValid = compiler.compileShaderSource(entry.source.utf8().data(), shaderType, translatedShaderSource, shaderInfoLog, symbols, extraCompileOptions); diff --git a/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp b/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp index 43b546d18..73b61e2cd 100644 --- a/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp +++ b/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp @@ -428,7 +428,7 @@ GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWi , m_multisampleColorBuffer(0) , m_functions(0) , m_private(adoptPtr(new GraphicsContext3DPrivate(this, hostWindow, renderStyle))) - , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT) + , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_COMPATIBILITY_OUTPUT) { if (!m_private->m_surface || !m_private->m_platformContext) { LOG_ERROR("GraphicsContext3D: GL context creation failed."); -- 2.13.0