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