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