blob: e4ef3c18d6c1aafb236ec0fe8e272740b0f3ea9a [file] [log] [blame]
/*
* 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/GrGLTypesPriv.h"
#endif
#ifdef SK_VULKAN
#include "include/private/GrVkTypesPriv.h"
#endif
#ifdef SK_DIRECT3D
#include "include/private/GrD3DTypesMinimal.h"
struct GrD3DSurfaceInfo;
#endif
#ifdef SK_METAL
#include "include/private/GrMtlTypesPriv.h"
#endif
#ifdef SK_DAWN
#include "include/private/GrDawnTypesPriv.h"
#endif
#include "include/private/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