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