• 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 multiDrawArraysIndirect(const gl::Context *context,
125                                                   gl::PrimitiveMode mode,
126                                                   const void *indirect,
127                                                   GLsizei drawcount,
128                                                   GLsizei stride)                 = 0;
129     virtual angle::Result multiDrawArraysInstanced(const gl::Context *context,
130                                                    gl::PrimitiveMode mode,
131                                                    const GLint *firsts,
132                                                    const GLsizei *counts,
133                                                    const GLsizei *instanceCounts,
134                                                    GLsizei drawcount)             = 0;
135     virtual angle::Result multiDrawElements(const gl::Context *context,
136                                             gl::PrimitiveMode mode,
137                                             const GLsizei *counts,
138                                             gl::DrawElementsType type,
139                                             const GLvoid *const *indices,
140                                             GLsizei drawcount)                    = 0;
141     virtual angle::Result multiDrawElementsInstanced(const gl::Context *context,
142                                                      gl::PrimitiveMode mode,
143                                                      const GLsizei *counts,
144                                                      gl::DrawElementsType type,
145                                                      const GLvoid *const *indices,
146                                                      const GLsizei *instanceCounts,
147                                                      GLsizei drawcount)           = 0;
148     virtual angle::Result multiDrawElementsIndirect(const gl::Context *context,
149                                                     gl::PrimitiveMode mode,
150                                                     gl::DrawElementsType type,
151                                                     const void *indirect,
152                                                     GLsizei drawcount,
153                                                     GLsizei stride)               = 0;
154     virtual angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
155                                                                gl::PrimitiveMode mode,
156                                                                const GLint *firsts,
157                                                                const GLsizei *counts,
158                                                                const GLsizei *instanceCounts,
159                                                                const GLuint *baseInstances,
160                                                                GLsizei drawcount) = 0;
161     virtual angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(
162         const gl::Context *context,
163         gl::PrimitiveMode mode,
164         const GLsizei *counts,
165         gl::DrawElementsType type,
166         const GLvoid *const *indices,
167         const GLsizei *instanceCounts,
168         const GLint *baseVertices,
169         const GLuint *baseInstances,
170         GLsizei drawcount) = 0;
171 
172     // Device loss
173     virtual gl::GraphicsResetStatus getResetStatus() = 0;
174 
175     // EXT_debug_marker
176     virtual angle::Result insertEventMarker(GLsizei length, const char *marker) = 0;
177     virtual angle::Result pushGroupMarker(GLsizei length, const char *marker)   = 0;
178     virtual angle::Result popGroupMarker()                                      = 0;
179 
180     // KHR_debug
181     virtual angle::Result pushDebugGroup(const gl::Context *context,
182                                          GLenum source,
183                                          GLuint id,
184                                          const std::string &message) = 0;
185     virtual angle::Result popDebugGroup(const gl::Context *context)  = 0;
186     virtual angle::Result handleNoopDrawEvent();
187 
188     // KHR_parallel_shader_compile
setMaxShaderCompilerThreads(GLuint count)189     virtual void setMaxShaderCompilerThreads(GLuint count) {}
190 
191     // GL_ANGLE_texture_storage_external
192     virtual void invalidateTexture(gl::TextureType target);
193 
194     // EXT_shader_framebuffer_fetch_non_coherent
framebufferFetchBarrier()195     virtual void framebufferFetchBarrier() {}
196 
197     // KHR_blend_equation_advanced
blendBarrier()198     virtual void blendBarrier() {}
199 
200     // State sync with dirty bits.
201     virtual angle::Result syncState(const gl::Context *context,
202                                     const gl::State::DirtyBits &dirtyBits,
203                                     const gl::State::DirtyBits &bitMask,
204                                     gl::Command command) = 0;
205 
206     // Disjoint timer queries
207     virtual GLint getGPUDisjoint() = 0;
208     virtual GLint64 getTimestamp() = 0;
209 
210     // Context switching
211     virtual angle::Result onMakeCurrent(const gl::Context *context) = 0;
212     virtual angle::Result onUnMakeCurrent(const gl::Context *context);
213 
214     // Native capabilities, unmodified by gl::Context.
215     virtual gl::Caps getNativeCaps() const                         = 0;
216     virtual const gl::TextureCapsMap &getNativeTextureCaps() const = 0;
217     virtual const gl::Extensions &getNativeExtensions() const      = 0;
218     virtual const gl::Limitations &getNativeLimitations() const    = 0;
219 
220     virtual angle::Result dispatchCompute(const gl::Context *context,
221                                           GLuint numGroupsX,
222                                           GLuint numGroupsY,
223                                           GLuint numGroupsZ)         = 0;
224     virtual angle::Result dispatchComputeIndirect(const gl::Context *context,
225                                                   GLintptr indirect) = 0;
226 
227     virtual angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) = 0;
228     virtual angle::Result memoryBarrierByRegion(const gl::Context *context,
229                                                 GLbitfield barriers)                     = 0;
230 
getState()231     const gl::State &getState() const { return mState; }
getClientMajorVersion()232     int getClientMajorVersion() const { return mState.getClientMajorVersion(); }
getClientMinorVersion()233     int getClientMinorVersion() const { return mState.getClientMinorVersion(); }
getCaps()234     const gl::Caps &getCaps() const { return mState.getCaps(); }
getTextureCaps()235     const gl::TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
getExtensions()236     const gl::Extensions &getExtensions() const { return mState.getExtensions(); }
getLimitations()237     const gl::Limitations &getLimitations() const { return mState.getLimitations(); }
238 
239     // A common GL driver behaviour is to trigger dynamic shader recompilation on a draw call,
240     // based on the current render states. We store a mutable pointer to the program cache so
241     // on draw calls we can store the refreshed shaders in the cache.
242     void setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache);
243 
244     void handleError(GLenum errorCode,
245                      const char *message,
246                      const char *file,
247                      const char *function,
248                      unsigned int line);
249 
250     virtual egl::ContextPriority getContextPriority() const;
251 
252     // EGL_ANGLE_power_preference implementation.
253     virtual egl::Error releaseHighPowerGPU(gl::Context *context);
254     virtual egl::Error reacquireHighPowerGPU(gl::Context *context);
255 
256     // GL_ANGLE_vulkan_image
257     virtual angle::Result acquireTextures(const gl::Context *context,
258                                           const gl::TextureBarrierVector &textureBarriers);
259     virtual angle::Result releaseTextures(const gl::Context *context,
260                                           gl::TextureBarrierVector *textureBarriers);
261 
262     // AMD_performance_monitor
263     virtual const angle::PerfMonitorCounterGroups &getPerfMonitorCounters();
264 
265   protected:
266     const gl::State &mState;
267     gl::MemoryProgramCache *mMemoryProgramCache;
268     gl::ErrorSet *mErrors;
269 };
270 
271 }  // namespace rx
272 
273 #endif  // LIBANGLE_RENDERER_CONTEXTIMPL_H_
274