1/*
2 * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if USE(LIBEPOXY)
29// libepoxy headers have to be included before <ANGLE/ShaderLang.h> in order to avoid
30// picking up khrplatform.h inclusion that's done in ANGLE.
31#include <epoxy/gl.h>
32#endif
33
34#include <ANGLE/ShaderLang.h>
35#include <wtf/text/WTFString.h>
36
37#if PLATFORM(COCOA)
38
39#if USE(OPENGL_ES)
40#import <OpenGLES/ES2/glext.h>
41#else
42#include <OpenGL/gl.h>
43#endif
44
45#elif PLATFORM(WIN)
46#include "OpenGLESShims.h"
47
48#elif USE(LIBEPOXY)
49// <epoxy/gl.h> already included above.
50
51#elif USE(OPENGL_ES)
52#include <GLES2/gl2.h>
53
54#else
55#include "OpenGLShims.h"
56#endif
57
58namespace WebCore {
59
60enum ANGLEShaderType {
61 SHADER_TYPE_VERTEX = GL_VERTEX_SHADER,
62 SHADER_TYPE_FRAGMENT = GL_FRAGMENT_SHADER,
63};
64
65enum ANGLEShaderSymbolType {
66 SHADER_SYMBOL_TYPE_ATTRIBUTE,
67 SHADER_SYMBOL_TYPE_UNIFORM,
68 SHADER_SYMBOL_TYPE_VARYING
69};
70
71class ANGLEWebKitBridge {
72public:
73
74 ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_COMPATIBILITY_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC);
75 ~ANGLEWebKitBridge();
76
77 const ShBuiltInResources& getResources() { return m_resources; }
78 void setResources(const ShBuiltInResources&);
79
80 bool compileShaderSource(const char* shaderSource, ANGLEShaderType, String& translatedShaderSource, String& shaderValidationLog, Vector<std::pair<ANGLEShaderSymbolType, sh::ShaderVariable>>& symbols, uint64_t extraCompileOptions = 0);
81
82private:
83
84 void cleanupCompilers();
85
86 bool builtCompilers;
87
88 ShHandle m_fragmentCompiler;
89 ShHandle m_vertexCompiler;
90
91 ShShaderOutput m_shaderOutput;
92 ShShaderSpec m_shaderSpec;
93
94 ShBuiltInResources m_resources;
95};
96
97} // namespace WebCore
98