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