• 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 // ContextGL:
7 //   OpenGL-specific functionality associated with a GL Context.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_GL_CONTEXTGL_H_
11 #define LIBANGLE_RENDERER_GL_CONTEXTGL_H_
12 
13 #include "libANGLE/renderer/ContextImpl.h"
14 #include "libANGLE/renderer/gl/RendererGL.h"
15 
16 namespace angle
17 {
18 struct FeaturesGL;
19 }  // namespace angle
20 
21 namespace sh
22 {
23 struct BlockMemberInfo;
24 }  // namespace sh
25 
26 namespace rx
27 {
28 class BlitGL;
29 class ClearMultiviewGL;
30 class FunctionsGL;
31 class RendererGL;
32 class StateManagerGL;
33 
34 enum class RobustnessVideoMemoryPurgeStatus
35 {
36     NOT_REQUESTED = 0,
37     REQUESTED     = 1,
38 };
39 
40 class ContextGL : public ContextImpl
41 {
42   public:
43     ContextGL(const gl::State &state,
44               gl::ErrorSet *errorSet,
45               const std::shared_ptr<RendererGL> &renderer,
46               RobustnessVideoMemoryPurgeStatus robustnessVideoMemoryPurgeStatus);
47     ~ContextGL() override;
48 
49     angle::Result initialize() override;
50 
51     // Shader creation
52     CompilerImpl *createCompiler() override;
53     ShaderImpl *createShader(const gl::ShaderState &data) override;
54     ProgramImpl *createProgram(const gl::ProgramState &data) override;
55 
56     // Framebuffer creation
57     FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
58 
59     // Texture creation
60     TextureImpl *createTexture(const gl::TextureState &state) override;
61 
62     // Renderbuffer creation
63     RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override;
64 
65     // Buffer creation
66     BufferImpl *createBuffer(const gl::BufferState &state) override;
67 
68     // Vertex Array creation
69     VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
70 
71     // Query and Fence creation
72     QueryImpl *createQuery(gl::QueryType type) override;
73     FenceNVImpl *createFenceNV() override;
74     SyncImpl *createSync() override;
75 
76     // Transform Feedback creation
77     TransformFeedbackImpl *createTransformFeedback(
78         const gl::TransformFeedbackState &state) override;
79 
80     // Sampler object creation
81     SamplerImpl *createSampler(const gl::SamplerState &state) override;
82 
83     // Program Pipeline object creation
84     ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
85 
86     // Memory object creation.
87     MemoryObjectImpl *createMemoryObject() override;
88 
89     // Semaphore creation.
90     SemaphoreImpl *createSemaphore() override;
91 
92     // Overlay creation.
93     OverlayImpl *createOverlay(const gl::OverlayState &state) override;
94 
95     // Flush and finish.
96     angle::Result flush(const gl::Context *context) override;
97     angle::Result finish(const gl::Context *context) override;
98 
99     // Drawing methods.
100     angle::Result drawArrays(const gl::Context *context,
101                              gl::PrimitiveMode mode,
102                              GLint first,
103                              GLsizei count) override;
104     angle::Result drawArraysInstanced(const gl::Context *context,
105                                       gl::PrimitiveMode mode,
106                                       GLint first,
107                                       GLsizei count,
108                                       GLsizei instanceCount) override;
109     angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
110                                                   gl::PrimitiveMode mode,
111                                                   GLint first,
112                                                   GLsizei count,
113                                                   GLsizei instanceCount,
114                                                   GLuint baseInstance) override;
115 
116     angle::Result drawElements(const gl::Context *context,
117                                gl::PrimitiveMode mode,
118                                GLsizei count,
119                                gl::DrawElementsType type,
120                                const void *indices) override;
121     angle::Result drawElementsBaseVertex(const gl::Context *context,
122                                          gl::PrimitiveMode mode,
123                                          GLsizei count,
124                                          gl::DrawElementsType type,
125                                          const void *indices,
126                                          GLint baseVertex) override;
127     angle::Result drawElementsInstanced(const gl::Context *context,
128                                         gl::PrimitiveMode mode,
129                                         GLsizei count,
130                                         gl::DrawElementsType type,
131                                         const void *indices,
132                                         GLsizei instances) override;
133     angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
134                                                   gl::PrimitiveMode mode,
135                                                   GLsizei count,
136                                                   gl::DrawElementsType type,
137                                                   const void *indices,
138                                                   GLsizei instanceCount,
139                                                   GLint baseVertex) override;
140     angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
141                                                               gl::PrimitiveMode mode,
142                                                               GLsizei count,
143                                                               gl::DrawElementsType type,
144                                                               const void *indices,
145                                                               GLsizei instances,
146                                                               GLint baseVertex,
147                                                               GLuint baseInstance) override;
148     angle::Result drawRangeElements(const gl::Context *context,
149                                     gl::PrimitiveMode mode,
150                                     GLuint start,
151                                     GLuint end,
152                                     GLsizei count,
153                                     gl::DrawElementsType type,
154                                     const void *indices) override;
155     angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
156                                               gl::PrimitiveMode mode,
157                                               GLuint start,
158                                               GLuint end,
159                                               GLsizei count,
160                                               gl::DrawElementsType type,
161                                               const void *indices,
162                                               GLint baseVertex) override;
163     angle::Result drawArraysIndirect(const gl::Context *context,
164                                      gl::PrimitiveMode mode,
165                                      const void *indirect) override;
166     angle::Result drawElementsIndirect(const gl::Context *context,
167                                        gl::PrimitiveMode mode,
168                                        gl::DrawElementsType type,
169                                        const void *indirect) override;
170 
171     angle::Result multiDrawArrays(const gl::Context *context,
172                                   gl::PrimitiveMode mode,
173                                   const GLint *firsts,
174                                   const GLsizei *counts,
175                                   GLsizei drawcount) override;
176     angle::Result multiDrawArraysInstanced(const gl::Context *context,
177                                            gl::PrimitiveMode mode,
178                                            const GLint *firsts,
179                                            const GLsizei *counts,
180                                            const GLsizei *instanceCounts,
181                                            GLsizei drawcount) override;
182     angle::Result multiDrawArraysIndirect(const gl::Context *context,
183                                           gl::PrimitiveMode mode,
184                                           const void *indirect,
185                                           GLsizei drawcount,
186                                           GLsizei stride) override;
187     angle::Result multiDrawElements(const gl::Context *context,
188                                     gl::PrimitiveMode mode,
189                                     const GLsizei *counts,
190                                     gl::DrawElementsType type,
191                                     const GLvoid *const *indices,
192                                     GLsizei drawcount) override;
193     angle::Result multiDrawElementsInstanced(const gl::Context *context,
194                                              gl::PrimitiveMode mode,
195                                              const GLsizei *counts,
196                                              gl::DrawElementsType type,
197                                              const GLvoid *const *indices,
198                                              const GLsizei *instanceCounts,
199                                              GLsizei drawcount) override;
200     angle::Result multiDrawElementsIndirect(const gl::Context *context,
201                                             gl::PrimitiveMode mode,
202                                             gl::DrawElementsType type,
203                                             const void *indirect,
204                                             GLsizei drawcount,
205                                             GLsizei stride) override;
206     angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
207                                                        gl::PrimitiveMode mode,
208                                                        const GLint *firsts,
209                                                        const GLsizei *counts,
210                                                        const GLsizei *instanceCounts,
211                                                        const GLuint *baseInstances,
212                                                        GLsizei drawcount) override;
213     angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
214                                                                    gl::PrimitiveMode mode,
215                                                                    const GLsizei *counts,
216                                                                    gl::DrawElementsType type,
217                                                                    const GLvoid *const *indices,
218                                                                    const GLsizei *instanceCounts,
219                                                                    const GLint *baseVertices,
220                                                                    const GLuint *baseInstances,
221                                                                    GLsizei drawcount) override;
222 
223     // Device loss
224     gl::GraphicsResetStatus getResetStatus() override;
225 
226     // EXT_debug_marker
227     angle::Result insertEventMarker(GLsizei length, const char *marker) override;
228     angle::Result pushGroupMarker(GLsizei length, const char *marker) override;
229     angle::Result popGroupMarker() override;
230 
231     // KHR_debug
232     angle::Result pushDebugGroup(const gl::Context *context,
233                                  GLenum source,
234                                  GLuint id,
235                                  const std::string &message) override;
236     angle::Result popDebugGroup(const gl::Context *context) override;
237 
238     // State sync with dirty bits.
239     angle::Result syncState(const gl::Context *context,
240                             const gl::state::DirtyBits dirtyBits,
241                             const gl::state::DirtyBits bitMask,
242                             const gl::state::ExtendedDirtyBits extendedDirtyBits,
243                             const gl::state::ExtendedDirtyBits extendedBitMask,
244                             gl::Command command) override;
245 
246     // Disjoint timer queries
247     GLint getGPUDisjoint() override;
248     GLint64 getTimestamp() override;
249 
250     // Context switching
251     angle::Result onMakeCurrent(const gl::Context *context) override;
252     angle::Result onUnMakeCurrent(const gl::Context *context) override;
253 
254     // Caps queries
255     gl::Caps getNativeCaps() const override;
256     const gl::TextureCapsMap &getNativeTextureCaps() const override;
257     const gl::Extensions &getNativeExtensions() const override;
258     const gl::Limitations &getNativeLimitations() const override;
259     const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override;
260 
261     // Handle helpers
getFunctions()262     ANGLE_INLINE const FunctionsGL *getFunctions() const { return mRenderer->getFunctions(); }
263 
264     StateManagerGL *getStateManager();
265     const angle::FeaturesGL &getFeaturesGL() const;
266     BlitGL *getBlitter() const;
267     ClearMultiviewGL *getMultiviewClearer() const;
268 
269     angle::Result dispatchCompute(const gl::Context *context,
270                                   GLuint numGroupsX,
271                                   GLuint numGroupsY,
272                                   GLuint numGroupsZ) override;
273     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override;
274 
275     angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
276     angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
277 
278     void framebufferFetchBarrier() override;
279 
280     void setMaxShaderCompilerThreads(GLuint count) override;
281 
282     void invalidateTexture(gl::TextureType target) override;
283 
284     void validateState() const;
285 
286     void setNeedsFlushBeforeDeleteTextures();
287     void flushIfNecessaryBeforeDeleteTextures();
288 
289     void markWorkSubmitted();
290 
getDebug()291     const gl::Debug &getDebug() const { return mState.getDebug(); }
292 
293     angle::Result drawPixelLocalStorageEXTEnable(gl::Context *,
294                                                  GLsizei n,
295                                                  const gl::PixelLocalStoragePlane[],
296                                                  const GLenum loadops[]) override;
297     angle::Result drawPixelLocalStorageEXTDisable(gl::Context *,
298                                                   const gl::PixelLocalStoragePlane[],
299                                                   const GLenum storeops[]) override;
300 
301   private:
302     angle::Result setDrawArraysState(const gl::Context *context,
303                                      GLint first,
304                                      GLsizei count,
305                                      GLsizei instanceCount);
306 
307     angle::Result setDrawElementsState(const gl::Context *context,
308                                        GLsizei count,
309                                        gl::DrawElementsType type,
310                                        const void *indices,
311                                        GLsizei instanceCount,
312                                        const void **outIndices);
313 
314     gl::AttributesMask updateAttributesForBaseInstance(const gl::Program *program,
315                                                        GLuint baseInstance);
316     void resetUpdatedAttributes(gl::AttributesMask attribMask);
317 
318     // Resets draw state prior to drawing load/store operations for EXT_shader_pixel_local_storage,
319     // in order to guarantee every pixel gets updated.
320     void resetDrawStateForPixelLocalStorageEXT(const gl::Context *context);
321 
322   protected:
323     std::shared_ptr<RendererGL> mRenderer;
324 
325     RobustnessVideoMemoryPurgeStatus mRobustnessVideoMemoryPurgeStatus;
326 };
327 
328 }  // namespace rx
329 
330 #endif  // LIBANGLE_RENDERER_GL_CONTEXTGL_H_
331