Build ANGLE as a dynamic library
[WebKit-https.git] / Source / WebCore / platform / graphics / ANGLEWebKitBridge.h
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 ENABLE(WEBGL)
29
30 #if USE(LIBEPOXY)
31 // libepoxy headers have to be included before <ANGLE/ShaderLang.h> in order to avoid
32 // picking up khrplatform.h inclusion that's done in ANGLE.
33 #include <epoxy/gl.h>
34 #endif
35
36 #include <ANGLE/ShaderLang.h>
37 #include <wtf/text/WTFString.h>
38
39 #if USE(ANGLE)
40 #include <ANGLE/gl2.h>
41
42 #elif PLATFORM(COCOA)
43 #if USE(OPENGL_ES)
44 #import <OpenGLES/ES2/glext.h>
45 #elif USE(OPENGL)
46 #include <OpenGL/gl.h>
47 #else
48 #error Unsupported configuration
49 #endif
50
51 #elif PLATFORM(WIN)
52 #include "OpenGLESShims.h"
53
54 #elif USE(LIBEPOXY)
55 // <epoxy/gl.h> already included above.
56
57 #elif USE(OPENGL_ES)
58 #include <GLES2/gl2.h>
59
60 #else
61 #include "OpenGLShims.h"
62 #endif
63
64 // FIXME
65 #define GL_VERTEX_SHADER 0x8B31
66 #define GL_FRAGMENT_SHADER 0x8B30
67 //
68
69 namespace WebCore {
70
71 enum ANGLEShaderType {
72     SHADER_TYPE_VERTEX = GL_VERTEX_SHADER,
73     SHADER_TYPE_FRAGMENT = GL_FRAGMENT_SHADER,
74 };
75
76 enum ANGLEShaderSymbolType {
77     SHADER_SYMBOL_TYPE_ATTRIBUTE,
78     SHADER_SYMBOL_TYPE_UNIFORM,
79     SHADER_SYMBOL_TYPE_VARYING
80 };
81
82 class ANGLEWebKitBridge {
83 public:
84
85     ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_COMPATIBILITY_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC);
86     ~ANGLEWebKitBridge();
87     
88     const ShBuiltInResources& getResources() { return m_resources; }
89     void setResources(const ShBuiltInResources&);
90     
91     bool compileShaderSource(const char* shaderSource, ANGLEShaderType, String& translatedShaderSource, String& shaderValidationLog, Vector<std::pair<ANGLEShaderSymbolType, sh::ShaderVariable>>& symbols, uint64_t extraCompileOptions = 0);
92
93     static bool angleAvailable();
94
95 private:
96
97     void cleanupCompilers();
98
99     bool builtCompilers;
100     
101     ShHandle m_fragmentCompiler;
102     ShHandle m_vertexCompiler;
103
104     ShShaderOutput m_shaderOutput;
105     ShShaderSpec m_shaderSpec;
106
107     ShBuiltInResources m_resources;
108 };
109
110 } // namespace WebCore
111
112 #endif