• 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 PixelLocalStoragePlane;
25 class Semaphore;
26 struct Workarounds;
27 }  // namespace gl
28 
29 namespace rx
30 {
31 class ContextImpl : public GLImplFactory
32 {
33   public:
34     ContextImpl(const gl::State &state, gl::ErrorSet *errorSet);
35     ~ContextImpl() override;
36 
onDestroy(const gl::Context * context)37     virtual void onDestroy(const gl::Context *context) {}
38 
39     virtual angle::Result initialize() = 0;
40 
41     // Flush and finish.
42     virtual angle::Result flush(const gl::Context *context)  = 0;
43     virtual angle::Result finish(const gl::Context *context) = 0;
44 
45     // Drawing methods.
46     virtual angle::Result drawArrays(const gl::Context *context,
47                                      gl::PrimitiveMode mode,
48                                      GLint first,
49                                      GLsizei count)                  = 0;
50     virtual angle::Result drawArraysInstanced(const gl::Context *context,
51                                               gl::PrimitiveMode mode,
52                                               GLint first,
53                                               GLsizei count,
54                                               GLsizei instanceCount) = 0;
55     // Necessary for Vulkan since gl_InstanceIndex includes baseInstance
56     virtual angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
57                                                           gl::PrimitiveMode mode,
58                                                           GLint first,
59                                                           GLsizei count,
60                                                           GLsizei instanceCount,
61                                                           GLuint baseInstance) = 0;
62 
63     virtual angle::Result drawElements(const gl::Context *context,
64                                        gl::PrimitiveMode mode,
65                                        GLsizei count,
66                                        gl::DrawElementsType type,
67                                        const void *indices)                                = 0;
68     virtual angle::Result drawElementsBaseVertex(const gl::Context *context,
69                                                  gl::PrimitiveMode mode,
70                                                  GLsizei count,
71                                                  gl::DrawElementsType type,
72                                                  const void *indices,
73                                                  GLint baseVertex)                         = 0;
74     virtual angle::Result drawElementsInstanced(const gl::Context *context,
75                                                 gl::PrimitiveMode mode,
76                                                 GLsizei count,
77                                                 gl::DrawElementsType type,
78                                                 const void *indices,
79                                                 GLsizei instances)                         = 0;
80     virtual angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
81                                                           gl::PrimitiveMode mode,
82                                                           GLsizei count,
83                                                           gl::DrawElementsType type,
84                                                           const void *indices,
85                                                           GLsizei instances,
86                                                           GLint baseVertex)                = 0;
87     virtual angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
88                                                                       gl::PrimitiveMode mode,
89                                                                       GLsizei count,
90                                                                       gl::DrawElementsType type,
91                                                                       const void *indices,
92                                                                       GLsizei instances,
93                                                                       GLint baseVertex,
94                                                                       GLuint baseInstance) = 0;
95     virtual angle::Result drawRangeElements(const gl::Context *context,
96                                             gl::PrimitiveMode mode,
97                                             GLuint start,
98                                             GLuint end,
99                                             GLsizei count,
100                                             gl::DrawElementsType type,
101                                             const void *indices)                           = 0;
102     virtual angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
103                                                       gl::PrimitiveMode mode,
104                                                       GLuint start,
105                                                       GLuint end,
106                                                       GLsizei count,
107                                                       gl::DrawElementsType type,
108                                                       const void *indices,
109                                                       GLint baseVertex)                    = 0;
110 
111     virtual angle::Result drawArraysIndirect(const gl::Context *context,
112                                              gl::PrimitiveMode mode,
113                                              const void *indirect)   = 0;
114     virtual angle::Result drawElementsIndirect(const gl::Context *context,
115                                                gl::PrimitiveMode mode,
116                                                gl::DrawElementsType type,
117                                                const void *indirect) = 0;
118 
119     // MultiDraw* impl added as we need workaround for promoting dynamic attributes in D3D backend
120     virtual angle::Result multiDrawArrays(const gl::Context *context,
121                                           gl::PrimitiveMode mode,
122                                           const GLint *firsts,
123                                           const GLsizei *counts,
124                                           GLsizei drawcount)                      = 0;
125     virtual angle::Result multiDrawArraysIndirect(const gl::Context *context,
126                                                   gl::PrimitiveMode mode,
127                                                   const void *indirect,
128                                                   GLsizei drawcount,
129                                                   GLsizei stride)                 = 0;
130     virtual angle::Result multiDrawArraysInstanced(const gl::Context *context,
131                                                    gl::PrimitiveMode mode,
132                                                    const GLint *firsts,
133                                                    const GLsizei *counts,
134                                                    const GLsizei *instanceCounts,
135                                                    GLsizei drawcount)             = 0;
136     virtual angle::Result multiDrawElements(const gl::Context *context,
137                                             gl::PrimitiveMode mode,
138                                             const GLsizei *counts,
139                                             gl::DrawElementsType type,
140                                             const GLvoid *const *indices,
141                                             GLsizei drawcount)                    = 0;
142     virtual angle::Result multiDrawElementsInstanced(const gl::Context *context,
143                                                      gl::PrimitiveMode mode,
144                                                      const GLsizei *counts,
145                                                      gl::DrawElementsType type,
146                                                      const GLvoid *const *indices,
147                                                      const GLsizei *instanceCounts,
148                                                      GLsizei drawcount)           = 0;
149     virtual angle::Result multiDrawElementsIndirect(const gl::Context *context,
150                                                     gl::PrimitiveMode mode,
151                                                     gl::DrawElementsType type,
152                                                     const void *indirect,
153                                                     GLsizei drawcount,
154                                                     GLsizei stride)               = 0;
155     virtual angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
156                                                                gl::PrimitiveMode mode,
157                                                                const GLint *firsts,
158                                                                const GLsizei *counts,
159                                                                const GLsizei *instanceCounts,
160                                                                const GLuint *baseInstances,
161                                                                GLsizei drawcount) = 0;
162     virtual angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(
163         const gl::Context *context,
164         gl::PrimitiveMode mode,
165         const GLsizei *counts,
166         gl::DrawElementsType type,
167         const GLvoid *const *indices,
168         const GLsizei *instanceCounts,
169         const GLint *baseVertices,
170         const GLuint *baseInstances,
171         GLsizei drawcount) = 0;
172 
173     // Device loss
174     virtual gl::GraphicsResetStatus getResetStatus() = 0;
175 
176     // EXT_debug_marker
177     virtual angle::Result insertEventMarker(GLsizei length, const char *marker) = 0;
178     virtual angle::Result pushGroupMarker(GLsizei length, const char *marker)   = 0;
179     virtual angle::Result popGroupMarker()                                      = 0;
180 
181     // KHR_debug
182     virtual angle::Result pushDebugGroup(const gl::Context *context,
183                                          GLenum source,
184                                          GLuint id,
185                                          const std::string &message) = 0;
186     virtual angle::Result popDebugGroup(const gl::Context *context)  = 0;
187     virtual angle::Result handleNoopDrawEvent();
188 
189     // KHR_parallel_shader_compile
setMaxShaderCompilerThreads(GLuint count)190     virtual void setMaxShaderCompilerThreads(GLuint count) {}
191 
192     // GL_ANGLE_texture_storage_external
193     virtual void invalidateTexture(gl::TextureType target);
194 
195     // EXT_shader_framebuffer_fetch_non_coherent
framebufferFetchBarrier()196     virtual void framebufferFetchBarrier() {}
197 
198     // KHR_blend_equation_advanced
blendBarrier()199     virtual void blendBarrier() {}
200 
201     // State sync with dirty bits.
202     virtual angle::Result syncState(const gl::Context *context,
203                                     const gl::state::DirtyBits dirtyBits,
204                                     const gl::state::DirtyBits bitMask,
205                                     const gl::state::ExtendedDirtyBits extendedDirtyBits,
206                                     const gl::state::ExtendedDirtyBits extendedBitMask,
207                                     gl::Command command) = 0;
208 
209     // Disjoint timer queries
210     virtual GLint getGPUDisjoint() = 0;
211     virtual GLint64 getTimestamp() = 0;
212 
213     // Context switching
214     virtual angle::Result onMakeCurrent(const gl::Context *context) = 0;
215     virtual angle::Result onUnMakeCurrent(const gl::Context *context);
216 
217     // Native capabilities, unmodified by gl::Context.
218     virtual gl::Caps getNativeCaps() const                                              = 0;
219     virtual const gl::TextureCapsMap &getNativeTextureCaps() const                      = 0;
220     virtual const gl::Extensions &getNativeExtensions() const                           = 0;
221     virtual const gl::Limitations &getNativeLimitations() const                         = 0;
222     virtual const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const = 0;
223 
224     virtual angle::Result dispatchCompute(const gl::Context *context,
225                                           GLuint numGroupsX,
226                                           GLuint numGroupsY,
227                                           GLuint numGroupsZ)         = 0;
228     virtual angle::Result dispatchComputeIndirect(const gl::Context *context,
229                                                   GLintptr indirect) = 0;
230 
231     virtual angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) = 0;
232     virtual angle::Result memoryBarrierByRegion(const gl::Context *context,
233                                                 GLbitfield barriers)                     = 0;
234 
getState()235     const gl::State &getState() const { return mState; }
getClientMajorVersion()236     int getClientMajorVersion() const { return mState.getClientMajorVersion(); }
getClientMinorVersion()237     int getClientMinorVersion() const { return mState.getClientMinorVersion(); }
getCaps()238     const gl::Caps &getCaps() const { return mState.getCaps(); }
getTextureCaps()239     const gl::TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
getExtensions()240     const gl::Extensions &getExtensions() const { return mState.getExtensions(); }
getLimitations()241     const gl::Limitations &getLimitations() const { return mState.getLimitations(); }
242 
243     // A common GL driver behaviour is to trigger dynamic shader recompilation on a draw call,
244     // based on the current render states. We store a mutable pointer to the program cache so
245     // on draw calls we can store the refreshed shaders in the cache.
246     void setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache);
247 
248     void handleError(GLenum errorCode,
249                      const char *message,
250                      const char *file,
251                      const char *function,
252                      unsigned int line);
253 
254     virtual egl::ContextPriority getContextPriority() const;
255 
256     // EGL_ANGLE_power_preference implementation.
257     virtual egl::Error releaseHighPowerGPU(gl::Context *context);
258     virtual egl::Error reacquireHighPowerGPU(gl::Context *context);
259 
260     // EGL_ANGLE_external_context_and_surface
261     virtual void acquireExternalContext(const gl::Context *context);
262     virtual void releaseExternalContext(const gl::Context *context);
263 
264     // GL_ANGLE_vulkan_image
265     virtual angle::Result acquireTextures(const gl::Context *context,
266                                           const gl::TextureBarrierVector &textureBarriers);
267     virtual angle::Result releaseTextures(const gl::Context *context,
268                                           gl::TextureBarrierVector *textureBarriers);
269 
270     // AMD_performance_monitor
271     virtual const angle::PerfMonitorCounterGroups &getPerfMonitorCounters();
272 
273     // Enables GL_SHADER_PIXEL_LOCAL_STORAGE_EXT and polyfills load operations for
274     // ANGLE_shader_pixel_local_storage using a fullscreen draw.
275     //
276     // The implementation's ShPixelLocalStorageType must be "PixelLocalStorageEXT".
277     virtual angle::Result drawPixelLocalStorageEXTEnable(gl::Context *,
278                                                          GLsizei n,
279                                                          const gl::PixelLocalStoragePlane[],
280                                                          const GLenum loadops[]);
281 
282     // Stores texture-backed PLS planes via fullscreen draw and disables
283     // GL_SHADER_PIXEL_LOCAL_STORAGE_EXT.
284     //
285     // The implementation's ShPixelLocalStorageType must be "PixelLocalStorageEXT".
286     virtual angle::Result drawPixelLocalStorageEXTDisable(gl::Context *,
287                                                           const gl::PixelLocalStoragePlane[],
288                                                           const GLenum storeops[]);
289 
290   protected:
291     const gl::State &mState;
292     gl::MemoryProgramCache *mMemoryProgramCache;
293     gl::ErrorSet *mErrors;
294 };
295 
296 }  // namespace rx
297 
298 #endif  // LIBANGLE_RENDERER_CONTEXTIMPL_H_
299