• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ContextImpl:
7 //   Implementation-specific functionality associated with a GL Context.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_CONTEXTIMPL_H_
11 #define LIBANGLE_RENDERER_CONTEXTIMPL_H_
12 
13 #include <vector>
14 
15 #include "common/angleutils.h"
16 #include "libANGLE/State.h"
17 #include "libANGLE/renderer/GLImplFactory.h"
18 
19 namespace gl
20 {
21 class ErrorSet;
22 class MemoryProgramCache;
23 class Path;
24 class Semaphore;
25 struct Workarounds;
26 }  // namespace gl
27 
28 namespace rx
29 {
30 class ContextImpl : public GLImplFactory
31 {
32   public:
33     ContextImpl(const gl::State &state, gl::ErrorSet *errorSet);
34     ~ContextImpl() override;
35 
onDestroy(const gl::Context * context)36     virtual void onDestroy(const gl::Context *context) {}
37 
38     virtual angle::Result initialize() = 0;
39 
40     // Flush and finish.
41     virtual angle::Result flush(const gl::Context *context)  = 0;
42     virtual angle::Result finish(const gl::Context *context) = 0;
43 
44     // Drawing methods.
45     virtual angle::Result drawArrays(const gl::Context *context,
46                                      gl::PrimitiveMode mode,
47                                      GLint first,
48                                      GLsizei count)                  = 0;
49     virtual angle::Result drawArraysInstanced(const gl::Context *context,
50                                               gl::PrimitiveMode mode,
51                                               GLint first,
52                                               GLsizei count,
53                                               GLsizei instanceCount) = 0;
54     // Necessary for Vulkan since gl_InstanceIndex includes baseInstance
55     virtual angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
56                                                           gl::PrimitiveMode mode,
57                                                           GLint first,
58                                                           GLsizei count,
59                                                           GLsizei instanceCount,
60                                                           GLuint baseInstance) = 0;
61 
62     virtual angle::Result drawElements(const gl::Context *context,
63                                        gl::PrimitiveMode mode,
64                                        GLsizei count,
65                                        gl::DrawElementsType type,
66                                        const void *indices)                                = 0;
67     virtual angle::Result drawElementsBaseVertex(const gl::Context *context,
68                                                  gl::PrimitiveMode mode,
69                                                  GLsizei count,
70                                                  gl::DrawElementsType type,
71                                                  const void *indices,
72                                                  GLint baseVertex)                         = 0;
73     virtual angle::Result drawElementsInstanced(const gl::Context *context,
74                                                 gl::PrimitiveMode mode,
75                                                 GLsizei count,
76                                                 gl::DrawElementsType type,
77                                                 const void *indices,
78                                                 GLsizei instances)                         = 0;
79     virtual angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
80                                                           gl::PrimitiveMode mode,
81                                                           GLsizei count,
82                                                           gl::DrawElementsType type,
83                                                           const void *indices,
84                                                           GLsizei instances,
85                                                           GLint baseVertex)                = 0;
86     virtual angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
87                                                                       gl::PrimitiveMode mode,
88                                                                       GLsizei count,
89                                                                       gl::DrawElementsType type,
90                                                                       const void *indices,
91                                                                       GLsizei instances,
92                                                                       GLint baseVertex,
93                                                                       GLuint baseInstance) = 0;
94     virtual angle::Result drawRangeElements(const gl::Context *context,
95                                             gl::PrimitiveMode mode,
96                                             GLuint start,
97                                             GLuint end,
98                                             GLsizei count,
99                                             gl::DrawElementsType type,
100                                             const void *indices)                           = 0;
101     virtual angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
102                                                       gl::PrimitiveMode mode,
103                                                       GLuint start,
104                                                       GLuint end,
105                                                       GLsizei count,
106                                                       gl::DrawElementsType type,
107                                                       const void *indices,
108                                                       GLint baseVertex)                    = 0;
109 
110     virtual angle::Result drawArraysIndirect(const gl::Context *context,
111                                              gl::PrimitiveMode mode,
112                                              const void *indirect)   = 0;
113     virtual angle::Result drawElementsIndirect(const gl::Context *context,
114                                                gl::PrimitiveMode mode,
115                                                gl::DrawElementsType type,
116                                                const void *indirect) = 0;
117 
118     // MultiDraw* impl added as we need workaround for promoting dynamic attributes in D3D backend
119     virtual angle::Result multiDrawArrays(const gl::Context *context,
120                                           gl::PrimitiveMode mode,
121                                           const GLint *firsts,
122                                           const GLsizei *counts,
123                                           GLsizei drawcount)                      = 0;
124     virtual angle::Result multiDrawArraysInstanced(const gl::Context *context,
125                                                    gl::PrimitiveMode mode,
126                                                    const GLint *firsts,
127                                                    const GLsizei *counts,
128                                                    const GLsizei *instanceCounts,
129                                                    GLsizei drawcount)             = 0;
130     virtual angle::Result multiDrawElements(const gl::Context *context,
131                                             gl::PrimitiveMode mode,
132                                             const GLsizei *counts,
133                                             gl::DrawElementsType type,
134                                             const GLvoid *const *indices,
135                                             GLsizei drawcount)                    = 0;
136     virtual angle::Result multiDrawElementsInstanced(const gl::Context *context,
137                                                      gl::PrimitiveMode mode,
138                                                      const GLsizei *counts,
139                                                      gl::DrawElementsType type,
140                                                      const GLvoid *const *indices,
141                                                      const GLsizei *instanceCounts,
142                                                      GLsizei drawcount)           = 0;
143     virtual angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
144                                                                gl::PrimitiveMode mode,
145                                                                const GLint *firsts,
146                                                                const GLsizei *counts,
147                                                                const GLsizei *instanceCounts,
148                                                                const GLuint *baseInstances,
149                                                                GLsizei drawcount) = 0;
150     virtual angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(
151         const gl::Context *context,
152         gl::PrimitiveMode mode,
153         const GLsizei *counts,
154         gl::DrawElementsType type,
155         const GLvoid *const *indices,
156         const GLsizei *instanceCounts,
157         const GLint *baseVertices,
158         const GLuint *baseInstances,
159         GLsizei drawcount) = 0;
160 
161     // Device loss
162     virtual gl::GraphicsResetStatus getResetStatus() = 0;
163 
164     // EXT_debug_marker
165     virtual angle::Result insertEventMarker(GLsizei length, const char *marker) = 0;
166     virtual angle::Result pushGroupMarker(GLsizei length, const char *marker)   = 0;
167     virtual angle::Result popGroupMarker()                                      = 0;
168 
169     // KHR_debug
170     virtual angle::Result pushDebugGroup(const gl::Context *context,
171                                          GLenum source,
172                                          GLuint id,
173                                          const std::string &message) = 0;
174     virtual angle::Result popDebugGroup(const gl::Context *context)  = 0;
175     virtual angle::Result handleNoopDrawEvent();
176 
177     // KHR_parallel_shader_compile
setMaxShaderCompilerThreads(GLuint count)178     virtual void setMaxShaderCompilerThreads(GLuint count) {}
179 
180     // GL_ANGLE_texture_storage_external
181     virtual void invalidateTexture(gl::TextureType target);
182 
183     // EXT_shader_framebuffer_fetch_non_coherent
framebufferFetchBarrier()184     virtual void framebufferFetchBarrier() {}
185 
186     // State sync with dirty bits.
187     virtual angle::Result syncState(const gl::Context *context,
188                                     const gl::State::DirtyBits &dirtyBits,
189                                     const gl::State::DirtyBits &bitMask) = 0;
190 
191     // Disjoint timer queries
192     virtual GLint getGPUDisjoint() = 0;
193     virtual GLint64 getTimestamp() = 0;
194 
195     // Context switching
196     virtual angle::Result onMakeCurrent(const gl::Context *context) = 0;
197     virtual angle::Result onUnMakeCurrent(const gl::Context *context);
198 
199     // Native capabilities, unmodified by gl::Context.
200     virtual gl::Caps getNativeCaps() const                         = 0;
201     virtual const gl::TextureCapsMap &getNativeTextureCaps() const = 0;
202     virtual const gl::Extensions &getNativeExtensions() const      = 0;
203     virtual const gl::Limitations &getNativeLimitations() const    = 0;
204 
205     virtual angle::Result dispatchCompute(const gl::Context *context,
206                                           GLuint numGroupsX,
207                                           GLuint numGroupsY,
208                                           GLuint numGroupsZ)         = 0;
209     virtual angle::Result dispatchComputeIndirect(const gl::Context *context,
210                                                   GLintptr indirect) = 0;
211 
212     virtual angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) = 0;
213     virtual angle::Result memoryBarrierByRegion(const gl::Context *context,
214                                                 GLbitfield barriers)                     = 0;
215 
getState()216     const gl::State &getState() const { return mState; }
getClientMajorVersion()217     int getClientMajorVersion() const { return mState.getClientMajorVersion(); }
getClientMinorVersion()218     int getClientMinorVersion() const { return mState.getClientMinorVersion(); }
getCaps()219     const gl::Caps &getCaps() const { return mState.getCaps(); }
getTextureCaps()220     const gl::TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
getExtensions()221     const gl::Extensions &getExtensions() const { return mState.getExtensions(); }
getLimitations()222     const gl::Limitations &getLimitations() const { return mState.getLimitations(); }
223 
224     // A common GL driver behaviour is to trigger dynamic shader recompilation on a draw call,
225     // based on the current render states. We store a mutable pointer to the program cache so
226     // on draw calls we can store the refreshed shaders in the cache.
227     void setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache);
228 
229     void handleError(GLenum errorCode,
230                      const char *message,
231                      const char *file,
232                      const char *function,
233                      unsigned int line);
234 
235     virtual egl::ContextPriority getContextPriority() const;
236 
237     // EGL_ANGLE_power_preference implementation.
238     virtual egl::Error releaseHighPowerGPU(gl::Context *context);
239     virtual egl::Error reacquireHighPowerGPU(gl::Context *context);
240 
241   protected:
242     const gl::State &mState;
243     gl::MemoryProgramCache *mMemoryProgramCache;
244     gl::ErrorSet *mErrors;
245 };
246 
247 }  // namespace rx
248 
249 #endif  // LIBANGLE_RENDERER_CONTEXTIMPL_H_
250