| /* |
| * 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 skgpu_graphite_TextureInfo_DEFINED |
| #define skgpu_graphite_TextureInfo_DEFINED |
| |
| #include "include/gpu/graphite/GraphiteTypes.h" |
| |
| #ifdef SK_DAWN |
| #include "include/private/gpu/graphite/DawnTypesPriv.h" |
| #endif |
| |
| #ifdef SK_METAL |
| #include "include/private/gpu/graphite/MtlTypesPriv.h" |
| #endif |
| |
| #ifdef SK_VULKAN |
| #include "include/private/gpu/graphite/VulkanGraphiteTypesPriv.h" |
| #endif |
| |
| namespace skgpu::graphite { |
| |
| class TextureInfo { |
| public: |
| TextureInfo() {} |
| #ifdef SK_DAWN |
| TextureInfo(const DawnTextureInfo& dawnInfo) |
| : fBackend(BackendApi::kDawn) |
| , fValid(true) |
| , fSampleCount(dawnInfo.fSampleCount) |
| , fMipmapped(dawnInfo.fMipmapped) |
| , fProtected(Protected::kNo) |
| , fDawnSpec(dawnInfo) {} |
| #endif |
| |
| #ifdef SK_METAL |
| TextureInfo(const MtlTextureInfo& mtlInfo) |
| : fBackend(BackendApi::kMetal) |
| , fValid(true) |
| , fSampleCount(mtlInfo.fSampleCount) |
| , fMipmapped(mtlInfo.fMipmapped) |
| , fProtected(Protected::kNo) |
| , fMtlSpec(mtlInfo) {} |
| #endif |
| |
| #ifdef SK_VULKAN |
| TextureInfo(const VulkanTextureInfo& vkInfo) |
| : fBackend(BackendApi::kVulkan) |
| , fValid(true) |
| , fSampleCount(vkInfo.fSampleCount) |
| , fMipmapped(vkInfo.fMipmapped) |
| , fProtected(Protected::kNo) |
| , fVkSpec(vkInfo) { |
| if (vkInfo.fFlags & VK_IMAGE_CREATE_PROTECTED_BIT) { |
| fProtected = Protected::kYes; |
| } |
| } |
| #endif |
| |
| ~TextureInfo() {} |
| TextureInfo(const TextureInfo&) = default; |
| TextureInfo& operator=(const TextureInfo&); |
| |
| bool operator==(const TextureInfo&) const; |
| bool operator!=(const TextureInfo& that) const { return !(*this == that); } |
| |
| bool isValid() const { return fValid; } |
| BackendApi backend() const { return fBackend; } |
| |
| uint32_t numSamples() const { return fSampleCount; } |
| Mipmapped mipmapped() const { return fMipmapped; } |
| Protected isProtected() const { return fProtected; } |
| |
| #ifdef SK_DAWN |
| bool getDawnTextureInfo(DawnTextureInfo* info) const { |
| if (!this->isValid() || fBackend != BackendApi::kDawn) { |
| return false; |
| } |
| *info = DawnTextureSpecToTextureInfo(fDawnSpec, fSampleCount, fMipmapped); |
| return true; |
| } |
| #endif |
| |
| #ifdef SK_METAL |
| bool getMtlTextureInfo(MtlTextureInfo* info) const { |
| if (!this->isValid() || fBackend != BackendApi::kMetal) { |
| return false; |
| } |
| *info = MtlTextureSpecToTextureInfo(fMtlSpec, fSampleCount, fMipmapped); |
| return true; |
| } |
| #endif |
| |
| #ifdef SK_VULKAN |
| bool getVulkanTextureInfo(VulkanTextureInfo* info) const { |
| if (!this->isValid() || fBackend != BackendApi::kVulkan) { |
| return false; |
| } |
| *info = VulkanTextureSpecToTextureInfo(fVkSpec, fSampleCount, fMipmapped); |
| return true; |
| } |
| #endif |
| |
| private: |
| #ifdef SK_DAWN |
| friend class DawnCaps; |
| friend class DawnCommandBuffer; |
| friend class DawnGraphicsPipeline; |
| friend class DawnResourceProvider; |
| friend class DawnTexture; |
| const DawnTextureSpec& dawnTextureSpec() const { |
| SkASSERT(fValid && fBackend == BackendApi::kDawn); |
| return fDawnSpec; |
| } |
| #endif |
| |
| #ifdef SK_METAL |
| friend class MtlCaps; |
| friend class MtlGraphicsPipeline; |
| friend class MtlTexture; |
| const MtlTextureSpec& mtlTextureSpec() const { |
| SkASSERT(fValid && fBackend == BackendApi::kMetal); |
| return fMtlSpec; |
| } |
| #endif |
| |
| #ifdef SK_VULKAN |
| friend class VulkanCaps; |
| friend class VulkanTexture; |
| const VulkanTextureSpec& vulkanTextureSpec() const { |
| SkASSERT(fValid && fBackend == BackendApi::kVulkan); |
| return fVkSpec; |
| } |
| #endif |
| |
| BackendApi fBackend = BackendApi::kMock; |
| bool fValid = false; |
| |
| uint32_t fSampleCount = 1; |
| Mipmapped fMipmapped = Mipmapped::kNo; |
| Protected fProtected = Protected::kNo; |
| |
| union { |
| #ifdef SK_DAWN |
| DawnTextureSpec fDawnSpec; |
| #endif |
| #ifdef SK_METAL |
| MtlTextureSpec fMtlSpec; |
| #endif |
| #ifdef SK_VULKAN |
| VulkanTextureSpec fVkSpec; |
| #endif |
| }; |
| }; |
| |
| } // namespace skgpu::graphite |
| |
| #endif //skgpu_graphite_TextureInfo_DEFINED |