diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/skia/skia/include/gpu/GrSurfaceInfo.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/gfx/skia/skia/include/gpu/GrSurfaceInfo.h b/gfx/skia/skia/include/gpu/GrSurfaceInfo.h new file mode 100644 index 0000000000..e037fb4957 --- /dev/null +++ b/gfx/skia/skia/include/gpu/GrSurfaceInfo.h @@ -0,0 +1,166 @@ +/* + * Copyright 2021 Google LLC + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrSurfaceInfo_DEFINED +#define GrSurfaceInfo_DEFINED + +#include "include/gpu/GrTypes.h" + +#ifdef SK_GL +#include "include/private/gpu/ganesh/GrGLTypesPriv.h" +#endif +#ifdef SK_VULKAN +#include "include/private/gpu/ganesh/GrVkTypesPriv.h" +#endif +#ifdef SK_DIRECT3D +#include "include/private/gpu/ganesh/GrD3DTypesMinimal.h" +struct GrD3DSurfaceInfo; +#endif +#ifdef SK_METAL +#include "include/private/gpu/ganesh/GrMtlTypesPriv.h" +#endif +#ifdef SK_DAWN +#include "include/private/gpu/ganesh/GrDawnTypesPriv.h" +#endif +#include "include/private/gpu/ganesh/GrMockTypesPriv.h" + +class GrSurfaceInfo { +public: + GrSurfaceInfo() {} +#ifdef SK_GL + GrSurfaceInfo(const GrGLSurfaceInfo& glInfo) + : fBackend(GrBackendApi::kOpenGL) + , fValid(true) + , fSampleCount(glInfo.fSampleCount) + , fLevelCount(glInfo.fLevelCount) + , fProtected(glInfo.fProtected) + , fGLSpec(glInfo) {} +#endif +#ifdef SK_VULKAN + GrSurfaceInfo(const GrVkSurfaceInfo& vkInfo) + : fBackend(GrBackendApi::kVulkan) + , fValid(true) + , fSampleCount(vkInfo.fSampleCount) + , fLevelCount(vkInfo.fLevelCount) + , fProtected(vkInfo.fProtected) + , fVkSpec(vkInfo) {} +#endif +#ifdef SK_DIRECT3D + GrSurfaceInfo(const GrD3DSurfaceInfo& d3dInfo); +#endif +#ifdef SK_METAL + GrSurfaceInfo(const GrMtlSurfaceInfo& mtlInfo) + : fBackend(GrBackendApi::kMetal) + , fValid(true) + , fSampleCount(mtlInfo.fSampleCount) + , fLevelCount(mtlInfo.fLevelCount) + , fProtected(mtlInfo.fProtected) + , fMtlSpec(mtlInfo) {} +#endif +#ifdef SK_DAWN + GrSurfaceInfo(const GrDawnSurfaceInfo& dawnInfo) + : fBackend(GrBackendApi::kDawn) + , fValid(true) + , fSampleCount(dawnInfo.fSampleCount) + , fLevelCount(dawnInfo.fLevelCount) + , fProtected(dawnInfo.fProtected) + , fDawnSpec(dawnInfo) {} +#endif + GrSurfaceInfo(const GrMockSurfaceInfo& mockInfo) + : fBackend(GrBackendApi::kMock) + , fValid(true) + , fSampleCount(mockInfo.fSampleCount) + , fLevelCount(mockInfo.fLevelCount) + , fProtected(mockInfo.fProtected) + , fMockSpec(mockInfo) {} + + ~GrSurfaceInfo(); + GrSurfaceInfo(const GrSurfaceInfo&) = default; + + bool isValid() const { return fValid; } + GrBackendApi backend() const { return fBackend; } + + uint32_t numSamples() const { return fSampleCount; } + uint32_t numMipLevels() const { return fLevelCount; } + GrProtected isProtected() const { return fProtected; } + +#ifdef SK_GL + bool getGLSurfaceInfo(GrGLSurfaceInfo* info) const { + if (!this->isValid() || fBackend != GrBackendApi::kOpenGL) { + return false; + } + *info = GrGLTextureSpecToSurfaceInfo(fGLSpec, fSampleCount, fLevelCount, fProtected); + return true; + } +#endif +#ifdef SK_VULKAN + bool getVkSurfaceInfo(GrVkSurfaceInfo* info) const { + if (!this->isValid() || fBackend != GrBackendApi::kVulkan) { + return false; + } + *info = GrVkImageSpecToSurfaceInfo(fVkSpec, fSampleCount, fLevelCount, fProtected); + return true; + } +#endif +#ifdef SK_DIRECT3D + bool getD3DSurfaceInfo(GrD3DSurfaceInfo*) const; +#endif +#ifdef SK_METAL + bool getMtlSurfaceInfo(GrMtlSurfaceInfo* info) const { + if (!this->isValid() || fBackend != GrBackendApi::kMetal) { + return false; + } + *info = GrMtlTextureSpecToSurfaceInfo(fMtlSpec, fSampleCount, fLevelCount, fProtected); + return true; + } +#endif +#ifdef SK_DAWN + bool getDawnSurfaceInfo(GrDawnSurfaceInfo* info) const { + if (!this->isValid() || fBackend != GrBackendApi::kDawn) { + return false; + } + *info = GrDawnTextureSpecToSurfaceInfo(fDawnSpec, fSampleCount, fLevelCount, fProtected); + return true; + } +#endif + bool getMockSurfaceInfo(GrMockSurfaceInfo* info) const { + if (!this->isValid() || fBackend != GrBackendApi::kMock) { + return false; + } + *info = GrMockTextureSpecToSurfaceInfo(fMockSpec, fSampleCount, fLevelCount, fProtected); + return true; + } + +private: + GrBackendApi fBackend = GrBackendApi::kMock; + bool fValid = false; + + uint32_t fSampleCount = 1; + uint32_t fLevelCount = 0; + GrProtected fProtected = GrProtected::kNo; + + union { +#ifdef SK_GL + GrGLTextureSpec fGLSpec; +#endif +#ifdef SK_VULKAN + GrVkImageSpec fVkSpec; +#endif +#ifdef SK_DIRECT3D + GrD3DTextureResourceSpecHolder fD3DSpec; +#endif +#ifdef SK_METAL + GrMtlTextureSpec fMtlSpec; +#endif +#ifdef SK_DAWN + GrDawnTextureSpec fDawnSpec; +#endif + GrMockTextureSpec fMockSpec; + }; +}; + +#endif |