diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h b/gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h new file mode 100644 index 0000000000..3b167fe8b6 --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/renderer/ContextImpl.h @@ -0,0 +1,274 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ContextImpl: +// Implementation-specific functionality associated with a GL Context. +// + +#ifndef LIBANGLE_RENDERER_CONTEXTIMPL_H_ +#define LIBANGLE_RENDERER_CONTEXTIMPL_H_ + +#include <vector> + +#include "common/angleutils.h" +#include "libANGLE/State.h" +#include "libANGLE/renderer/GLImplFactory.h" + +namespace gl +{ +class ErrorSet; +class MemoryProgramCache; +class Path; +class Semaphore; +struct Workarounds; +} // namespace gl + +namespace rx +{ +class ContextImpl : public GLImplFactory +{ + public: + ContextImpl(const gl::State &state, gl::ErrorSet *errorSet); + ~ContextImpl() override; + + virtual void onDestroy(const gl::Context *context) {} + + virtual angle::Result initialize() = 0; + + // Flush and finish. + virtual angle::Result flush(const gl::Context *context) = 0; + virtual angle::Result finish(const gl::Context *context) = 0; + + // Drawing methods. + virtual angle::Result drawArrays(const gl::Context *context, + gl::PrimitiveMode mode, + GLint first, + GLsizei count) = 0; + virtual angle::Result drawArraysInstanced(const gl::Context *context, + gl::PrimitiveMode mode, + GLint first, + GLsizei count, + GLsizei instanceCount) = 0; + // Necessary for Vulkan since gl_InstanceIndex includes baseInstance + virtual angle::Result drawArraysInstancedBaseInstance(const gl::Context *context, + gl::PrimitiveMode mode, + GLint first, + GLsizei count, + GLsizei instanceCount, + GLuint baseInstance) = 0; + + virtual angle::Result drawElements(const gl::Context *context, + gl::PrimitiveMode mode, + GLsizei count, + gl::DrawElementsType type, + const void *indices) = 0; + virtual angle::Result drawElementsBaseVertex(const gl::Context *context, + gl::PrimitiveMode mode, + GLsizei count, + gl::DrawElementsType type, + const void *indices, + GLint baseVertex) = 0; + virtual angle::Result drawElementsInstanced(const gl::Context *context, + gl::PrimitiveMode mode, + GLsizei count, + gl::DrawElementsType type, + const void *indices, + GLsizei instances) = 0; + virtual angle::Result drawElementsInstancedBaseVertex(const gl::Context *context, + gl::PrimitiveMode mode, + GLsizei count, + gl::DrawElementsType type, + const void *indices, + GLsizei instances, + GLint baseVertex) = 0; + virtual angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context, + gl::PrimitiveMode mode, + GLsizei count, + gl::DrawElementsType type, + const void *indices, + GLsizei instances, + GLint baseVertex, + GLuint baseInstance) = 0; + virtual angle::Result drawRangeElements(const gl::Context *context, + gl::PrimitiveMode mode, + GLuint start, + GLuint end, + GLsizei count, + gl::DrawElementsType type, + const void *indices) = 0; + virtual angle::Result drawRangeElementsBaseVertex(const gl::Context *context, + gl::PrimitiveMode mode, + GLuint start, + GLuint end, + GLsizei count, + gl::DrawElementsType type, + const void *indices, + GLint baseVertex) = 0; + + virtual angle::Result drawArraysIndirect(const gl::Context *context, + gl::PrimitiveMode mode, + const void *indirect) = 0; + virtual angle::Result drawElementsIndirect(const gl::Context *context, + gl::PrimitiveMode mode, + gl::DrawElementsType type, + const void *indirect) = 0; + + // MultiDraw* impl added as we need workaround for promoting dynamic attributes in D3D backend + virtual angle::Result multiDrawArrays(const gl::Context *context, + gl::PrimitiveMode mode, + const GLint *firsts, + const GLsizei *counts, + GLsizei drawcount) = 0; + virtual angle::Result multiDrawArraysIndirect(const gl::Context *context, + gl::PrimitiveMode mode, + const void *indirect, + GLsizei drawcount, + GLsizei stride) = 0; + virtual angle::Result multiDrawArraysInstanced(const gl::Context *context, + gl::PrimitiveMode mode, + const GLint *firsts, + const GLsizei *counts, + const GLsizei *instanceCounts, + GLsizei drawcount) = 0; + virtual angle::Result multiDrawElements(const gl::Context *context, + gl::PrimitiveMode mode, + const GLsizei *counts, + gl::DrawElementsType type, + const GLvoid *const *indices, + GLsizei drawcount) = 0; + virtual angle::Result multiDrawElementsInstanced(const gl::Context *context, + gl::PrimitiveMode mode, + const GLsizei *counts, + gl::DrawElementsType type, + const GLvoid *const *indices, + const GLsizei *instanceCounts, + GLsizei drawcount) = 0; + virtual angle::Result multiDrawElementsIndirect(const gl::Context *context, + gl::PrimitiveMode mode, + gl::DrawElementsType type, + const void *indirect, + GLsizei drawcount, + GLsizei stride) = 0; + virtual angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context, + gl::PrimitiveMode mode, + const GLint *firsts, + const GLsizei *counts, + const GLsizei *instanceCounts, + const GLuint *baseInstances, + GLsizei drawcount) = 0; + virtual angle::Result multiDrawElementsInstancedBaseVertexBaseInstance( + const gl::Context *context, + gl::PrimitiveMode mode, + const GLsizei *counts, + gl::DrawElementsType type, + const GLvoid *const *indices, + const GLsizei *instanceCounts, + const GLint *baseVertices, + const GLuint *baseInstances, + GLsizei drawcount) = 0; + + // Device loss + virtual gl::GraphicsResetStatus getResetStatus() = 0; + + // EXT_debug_marker + virtual angle::Result insertEventMarker(GLsizei length, const char *marker) = 0; + virtual angle::Result pushGroupMarker(GLsizei length, const char *marker) = 0; + virtual angle::Result popGroupMarker() = 0; + + // KHR_debug + virtual angle::Result pushDebugGroup(const gl::Context *context, + GLenum source, + GLuint id, + const std::string &message) = 0; + virtual angle::Result popDebugGroup(const gl::Context *context) = 0; + virtual angle::Result handleNoopDrawEvent(); + + // KHR_parallel_shader_compile + virtual void setMaxShaderCompilerThreads(GLuint count) {} + + // GL_ANGLE_texture_storage_external + virtual void invalidateTexture(gl::TextureType target); + + // EXT_shader_framebuffer_fetch_non_coherent + virtual void framebufferFetchBarrier() {} + + // KHR_blend_equation_advanced + virtual void blendBarrier() {} + + // State sync with dirty bits. + virtual angle::Result syncState(const gl::Context *context, + const gl::State::DirtyBits &dirtyBits, + const gl::State::DirtyBits &bitMask, + gl::Command command) = 0; + + // Disjoint timer queries + virtual GLint getGPUDisjoint() = 0; + virtual GLint64 getTimestamp() = 0; + + // Context switching + virtual angle::Result onMakeCurrent(const gl::Context *context) = 0; + virtual angle::Result onUnMakeCurrent(const gl::Context *context); + + // Native capabilities, unmodified by gl::Context. + virtual gl::Caps getNativeCaps() const = 0; + virtual const gl::TextureCapsMap &getNativeTextureCaps() const = 0; + virtual const gl::Extensions &getNativeExtensions() const = 0; + virtual const gl::Limitations &getNativeLimitations() const = 0; + virtual ShPixelLocalStorageType getNativePixelLocalStorageType() const = 0; + + virtual angle::Result dispatchCompute(const gl::Context *context, + GLuint numGroupsX, + GLuint numGroupsY, + GLuint numGroupsZ) = 0; + virtual angle::Result dispatchComputeIndirect(const gl::Context *context, + GLintptr indirect) = 0; + + virtual angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) = 0; + virtual angle::Result memoryBarrierByRegion(const gl::Context *context, + GLbitfield barriers) = 0; + + const gl::State &getState() const { return mState; } + int getClientMajorVersion() const { return mState.getClientMajorVersion(); } + int getClientMinorVersion() const { return mState.getClientMinorVersion(); } + const gl::Caps &getCaps() const { return mState.getCaps(); } + const gl::TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); } + const gl::Extensions &getExtensions() const { return mState.getExtensions(); } + const gl::Limitations &getLimitations() const { return mState.getLimitations(); } + + // A common GL driver behaviour is to trigger dynamic shader recompilation on a draw call, + // based on the current render states. We store a mutable pointer to the program cache so + // on draw calls we can store the refreshed shaders in the cache. + void setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache); + + void handleError(GLenum errorCode, + const char *message, + const char *file, + const char *function, + unsigned int line); + + virtual egl::ContextPriority getContextPriority() const; + + // EGL_ANGLE_power_preference implementation. + virtual egl::Error releaseHighPowerGPU(gl::Context *context); + virtual egl::Error reacquireHighPowerGPU(gl::Context *context); + + // GL_ANGLE_vulkan_image + virtual angle::Result acquireTextures(const gl::Context *context, + const gl::TextureBarrierVector &textureBarriers); + virtual angle::Result releaseTextures(const gl::Context *context, + gl::TextureBarrierVector *textureBarriers); + + // AMD_performance_monitor + virtual const angle::PerfMonitorCounterGroups &getPerfMonitorCounters(); + + protected: + const gl::State &mState; + gl::MemoryProgramCache *mMemoryProgramCache; + gl::ErrorSet *mErrors; +}; + +} // namespace rx + +#endif // LIBANGLE_RENDERER_CONTEXTIMPL_H_ |