• 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 class ContextGL : public ContextImpl
35 {
36   public:
37     ContextGL(const gl::State &state,
38               gl::ErrorSet *errorSet,
39               const std::shared_ptr<RendererGL> &renderer);
40     ~ContextGL() override;
41 
42     angle::Result initialize() override;
43 
44     // Shader creation
45     CompilerImpl *createCompiler() override;
46     ShaderImpl *createShader(const gl::ShaderState &data) override;
47     ProgramImpl *createProgram(const gl::ProgramState &data) override;
48 
49     // Framebuffer creation
50     FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
51 
52     // Texture creation
53     TextureImpl *createTexture(const gl::TextureState &state) override;
54 
55     // Renderbuffer creation
56     RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override;
57 
58     // Buffer creation
59     BufferImpl *createBuffer(const gl::BufferState &state) override;
60 
61     // Vertex Array creation
62     VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
63 
64     // Query and Fence creation
65     QueryImpl *createQuery(gl::QueryType type) override;
66     FenceNVImpl *createFenceNV() override;
67     SyncImpl *createSync() override;
68 
69     // Transform Feedback creation
70     TransformFeedbackImpl *createTransformFeedback(
71         const gl::TransformFeedbackState &state) override;
72 
73     // Sampler object creation
74     SamplerImpl *createSampler(const gl::SamplerState &state) override;
75 
76     // Program Pipeline object creation
77     ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
78 
79     // Path object creation
80     std::vector<PathImpl *> createPaths(GLsizei range) override;
81 
82     // Memory object creation.
83     MemoryObjectImpl *createMemoryObject() override;
84 
85     // Semaphore creation.
86     SemaphoreImpl *createSemaphore() override;
87 
88     // Flush and finish.
89     angle::Result flush(const gl::Context *context) override;
90     angle::Result finish(const gl::Context *context) override;
91 
92     // Drawing methods.
93     angle::Result drawArrays(const gl::Context *context,
94                              gl::PrimitiveMode mode,
95                              GLint first,
96                              GLsizei count) override;
97     angle::Result drawArraysInstanced(const gl::Context *context,
98                                       gl::PrimitiveMode mode,
99                                       GLint first,
100                                       GLsizei count,
101                                       GLsizei instanceCount) override;
102     angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
103                                                   gl::PrimitiveMode mode,
104                                                   GLint first,
105                                                   GLsizei count,
106                                                   GLsizei instanceCount,
107                                                   GLuint baseInstance) override;
108 
109     angle::Result drawElements(const gl::Context *context,
110                                gl::PrimitiveMode mode,
111                                GLsizei count,
112                                gl::DrawElementsType type,
113                                const void *indices) override;
114     angle::Result drawElementsInstanced(const gl::Context *context,
115                                         gl::PrimitiveMode mode,
116                                         GLsizei count,
117                                         gl::DrawElementsType type,
118                                         const void *indices,
119                                         GLsizei instances) override;
120     angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
121                                                               gl::PrimitiveMode mode,
122                                                               GLsizei count,
123                                                               gl::DrawElementsType type,
124                                                               const void *indices,
125                                                               GLsizei instances,
126                                                               GLint baseVertex,
127                                                               GLuint baseInstance) override;
128     angle::Result drawRangeElements(const gl::Context *context,
129                                     gl::PrimitiveMode mode,
130                                     GLuint start,
131                                     GLuint end,
132                                     GLsizei count,
133                                     gl::DrawElementsType type,
134                                     const void *indices) override;
135     angle::Result drawArraysIndirect(const gl::Context *context,
136                                      gl::PrimitiveMode mode,
137                                      const void *indirect) override;
138     angle::Result drawElementsIndirect(const gl::Context *context,
139                                        gl::PrimitiveMode mode,
140                                        gl::DrawElementsType type,
141                                        const void *indirect) override;
142 
143     // CHROMIUM_path_rendering implementation
144     void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
145     void stencilStrokePath(const gl::Path *path, GLint reference, GLuint mask) override;
146     void coverFillPath(const gl::Path *path, GLenum coverMode) override;
147     void coverStrokePath(const gl::Path *path, GLenum coverMode) override;
148     void stencilThenCoverFillPath(const gl::Path *path,
149                                   GLenum fillMode,
150                                   GLuint mask,
151                                   GLenum coverMode) override;
152     void stencilThenCoverStrokePath(const gl::Path *path,
153                                     GLint reference,
154                                     GLuint mask,
155                                     GLenum coverMode) override;
156     void coverFillPathInstanced(const std::vector<gl::Path *> &paths,
157                                 GLenum coverMode,
158                                 GLenum transformType,
159                                 const GLfloat *transformValues) override;
160     void coverStrokePathInstanced(const std::vector<gl::Path *> &paths,
161                                   GLenum coverMode,
162                                   GLenum transformType,
163                                   const GLfloat *transformValues) override;
164     void stencilFillPathInstanced(const std::vector<gl::Path *> &paths,
165                                   GLenum fillMode,
166                                   GLuint mask,
167                                   GLenum transformType,
168                                   const GLfloat *transformValues) override;
169     void stencilStrokePathInstanced(const std::vector<gl::Path *> &paths,
170                                     GLint reference,
171                                     GLuint mask,
172                                     GLenum transformType,
173                                     const GLfloat *transformValues) override;
174     void stencilThenCoverFillPathInstanced(const std::vector<gl::Path *> &paths,
175                                            GLenum coverMode,
176                                            GLenum fillMode,
177                                            GLuint mask,
178                                            GLenum transformType,
179                                            const GLfloat *transformValues) override;
180     void stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *> &paths,
181                                              GLenum coverMode,
182                                              GLint reference,
183                                              GLuint mask,
184                                              GLenum transformType,
185                                              const GLfloat *transformValues) override;
186 
187     // Device loss
188     gl::GraphicsResetStatus getResetStatus() override;
189 
190     // Vendor and description strings.
191     std::string getVendorString() const override;
192     std::string getRendererDescription() const override;
193 
194     // EXT_debug_marker
195     void insertEventMarker(GLsizei length, const char *marker) override;
196     void pushGroupMarker(GLsizei length, const char *marker) override;
197     void popGroupMarker() override;
198 
199     // KHR_debug
200     void pushDebugGroup(GLenum source, GLuint id, const std::string &message) override;
201     void popDebugGroup() override;
202 
203     // State sync with dirty bits.
204     angle::Result syncState(const gl::Context *context,
205                             const gl::State::DirtyBits &dirtyBits,
206                             const gl::State::DirtyBits &bitMask) override;
207 
208     // Disjoint timer queries
209     GLint getGPUDisjoint() override;
210     GLint64 getTimestamp() override;
211 
212     // Context switching
213     angle::Result onMakeCurrent(const gl::Context *context) override;
214 
215     // Caps queries
216     gl::Caps getNativeCaps() const override;
217     const gl::TextureCapsMap &getNativeTextureCaps() const override;
218     const gl::Extensions &getNativeExtensions() const override;
219     const gl::Limitations &getNativeLimitations() const override;
220 
221     // Handle helpers
getFunctions()222     ANGLE_INLINE const FunctionsGL *getFunctions() const { return mRenderer->getFunctions(); }
223 
224     StateManagerGL *getStateManager();
225     const angle::FeaturesGL &getFeaturesGL() const;
226     BlitGL *getBlitter() const;
227     ClearMultiviewGL *getMultiviewClearer() const;
228 
229     angle::Result dispatchCompute(const gl::Context *context,
230                                   GLuint numGroupsX,
231                                   GLuint numGroupsY,
232                                   GLuint numGroupsZ) override;
233     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override;
234 
235     angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
236     angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
237 
238     void setMaxShaderCompilerThreads(GLuint count) override;
239 
240     void invalidateTexture(gl::TextureType target) override;
241 
242   private:
243     angle::Result setDrawArraysState(const gl::Context *context,
244                                      GLint first,
245                                      GLsizei count,
246                                      GLsizei instanceCount);
247 
248     angle::Result setDrawElementsState(const gl::Context *context,
249                                        GLsizei count,
250                                        gl::DrawElementsType type,
251                                        const void *indices,
252                                        GLsizei instanceCount,
253                                        const void **outIndices);
254 
255   protected:
256     std::shared_ptr<RendererGL> mRenderer;
257 };
258 
259 }  // namespace rx
260 
261 #endif  // LIBANGLE_RENDERER_GL_CONTEXTGL_H_
262