1/* 2 * Copyright 2021 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#ifndef GrSurfaceInfo_DEFINED 9#define GrSurfaceInfo_DEFINED 10 11#include "include/gpu/GrTypes.h" 12 13#ifdef SK_GL 14#include "include/private/GrGLTypesPriv.h" 15#endif 16#ifdef SK_VULKAN 17#include "include/private/GrVkTypesPriv.h" 18#endif 19#ifdef SK_DIRECT3D 20#include "include/private/GrD3DTypesMinimal.h" 21struct GrD3DSurfaceInfo; 22#endif 23#ifdef SK_METAL 24#include "include/private/GrMtlTypesPriv.h" 25#endif 26#ifdef SK_DAWN 27#include "include/private/GrDawnTypesPriv.h" 28#endif 29#include "include/private/GrMockTypesPriv.h" 30 31class GrSurfaceInfo { 32public: 33 GrSurfaceInfo() {} 34#ifdef SK_GL 35 GrSurfaceInfo(const GrGLSurfaceInfo& glInfo) 36 : fBackend(GrBackendApi::kOpenGL) 37 , fValid(true) 38 , fSampleCount(glInfo.fSampleCount) 39 , fLevelCount(glInfo.fLevelCount) 40 , fProtected(glInfo.fProtected) 41 , fGLSpec(glInfo) {} 42#endif 43#ifdef SK_VULKAN 44 GrSurfaceInfo(const GrVkSurfaceInfo& vkInfo) 45 : fBackend(GrBackendApi::kVulkan) 46 , fValid(true) 47 , fSampleCount(vkInfo.fSampleCount) 48 , fLevelCount(vkInfo.fLevelCount) 49 , fProtected(vkInfo.fProtected) 50 , fVkSpec(vkInfo) {} 51#endif 52#ifdef SK_DIRECT3D 53 GrSurfaceInfo(const GrD3DSurfaceInfo& d3dInfo); 54#endif 55#ifdef SK_METAL 56 GrSurfaceInfo(const GrMtlSurfaceInfo& mtlInfo) 57 : fBackend(GrBackendApi::kMetal) 58 , fValid(true) 59 , fSampleCount(mtlInfo.fSampleCount) 60 , fLevelCount(mtlInfo.fLevelCount) 61 , fProtected(mtlInfo.fProtected) 62 , fMtlSpec(mtlInfo) {} 63#endif 64#ifdef SK_DAWN 65 GrSurfaceInfo(const GrDawnSurfaceInfo& dawnInfo) 66 : fBackend(GrBackendApi::kDawn) 67 , fValid(true) 68 , fSampleCount(dawnInfo.fSampleCount) 69 , fLevelCount(dawnInfo.fLevelCount) 70 , fProtected(dawnInfo.fProtected) 71 , fDawnSpec(dawnInfo) {} 72#endif 73 GrSurfaceInfo(const GrMockSurfaceInfo& mockInfo) 74 : fBackend(GrBackendApi::kMock) 75 , fValid(true) 76 , fSampleCount(mockInfo.fSampleCount) 77 , fLevelCount(mockInfo.fLevelCount) 78 , fProtected(mockInfo.fProtected) 79 , fMockSpec(mockInfo) {} 80 81 ~GrSurfaceInfo(); 82 GrSurfaceInfo(const GrSurfaceInfo&) = default; 83 84 bool isValid() const { return fValid; } 85 GrBackendApi backend() const { return fBackend; } 86 87 uint32_t numSamples() const { return fSampleCount; } 88 uint32_t numMipLevels() const { return fLevelCount; } 89 GrProtected isProtected() const { return fProtected; } 90 91#ifdef SK_GL 92 bool getGLSurfaceInfo(GrGLSurfaceInfo* info) const { 93 if (!this->isValid() || fBackend != GrBackendApi::kOpenGL) { 94 return false; 95 } 96 *info = GrGLTextureSpecToSurfaceInfo(fGLSpec, fSampleCount, fLevelCount, fProtected); 97 return true; 98 } 99#endif 100#ifdef SK_VULKAN 101 bool getVkSurfaceInfo(GrVkSurfaceInfo* info) const { 102 if (!this->isValid() || fBackend != GrBackendApi::kVulkan) { 103 return false; 104 } 105 *info = GrVkImageSpecToSurfaceInfo(fVkSpec, fSampleCount, fLevelCount, fProtected); 106 return true; 107 } 108#endif 109#ifdef SK_DIRECT3D 110 bool getD3DSurfaceInfo(GrD3DSurfaceInfo*) const; 111#endif 112#ifdef SK_METAL 113 bool getMtlSurfaceInfo(GrMtlSurfaceInfo* info) const { 114 if (!this->isValid() || fBackend != GrBackendApi::kMetal) { 115 return false; 116 } 117 *info = GrMtlTextureSpecToSurfaceInfo(fMtlSpec, fSampleCount, fLevelCount, fProtected); 118 return true; 119 } 120#endif 121#ifdef SK_DAWN 122 bool getDawnSurfaceInfo(GrDawnSurfaceInfo* info) const { 123 if (!this->isValid() || fBackend != GrBackendApi::kDawn) { 124 return false; 125 } 126 *info = GrDawnTextureSpecToSurfaceInfo(fDawnSpec, fSampleCount, fLevelCount, fProtected); 127 return true; 128 } 129#endif 130 bool getMockSurfaceInfo(GrMockSurfaceInfo* info) const { 131 if (!this->isValid() || fBackend != GrBackendApi::kMock) { 132 return false; 133 } 134 *info = GrMockTextureSpecToSurfaceInfo(fMockSpec, fSampleCount, fLevelCount, fProtected); 135 return true; 136 } 137 138private: 139 GrBackendApi fBackend = GrBackendApi::kMock; 140 bool fValid = false; 141 142 uint32_t fSampleCount = 1; 143 uint32_t fLevelCount = 0; 144 GrProtected fProtected = GrProtected::kNo; 145 146 union { 147#ifdef SK_GL 148 GrGLTextureSpec fGLSpec; 149#endif 150#ifdef SK_VULKAN 151 GrVkImageSpec fVkSpec; 152#endif 153#ifdef SK_DIRECT3D 154 GrD3DTextureResourceSpecHolder fD3DSpec; 155#endif 156#ifdef SK_METAL 157 GrMtlTextureSpec fMtlSpec; 158#endif 159#ifdef SK_DAWN 160 GrDawnTextureSpec fDawnSpec; 161#endif 162 GrMockTextureSpec fMockSpec; 163 }; 164}; 165 166#endif 167