| /* |
| * Copyright 2021 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/gpu/graphite/BackendTexture.h" |
| |
| #include "src/gpu/MutableTextureStateRef.h" |
| |
| namespace skgpu::graphite { |
| |
| BackendTexture::BackendTexture() {} |
| |
| BackendTexture::~BackendTexture() { |
| if (!this->isValid()) { |
| return; |
| } |
| #ifdef SK_DAWN |
| if (this->backend() == BackendApi::kDawn) { |
| // Only one of fDawnTexture and fDawnTextureView can be non null. |
| SkASSERT(!(fDawn.fTexture && fDawn.fTextureView)); |
| // Release reference. |
| fDawn.fTexture = nullptr; |
| fDawn.fTextureView = nullptr; |
| } |
| #endif |
| } |
| |
| BackendTexture::BackendTexture(const BackendTexture& that) { |
| *this = that; |
| } |
| |
| BackendTexture& BackendTexture::operator=(const BackendTexture& that) { |
| bool valid = this->isValid(); |
| if (!that.isValid()) { |
| fInfo = {}; |
| return *this; |
| } else if (valid && this->backend() != that.backend()) { |
| valid = false; |
| } |
| fDimensions = that.fDimensions; |
| fInfo = that.fInfo; |
| |
| switch (that.backend()) { |
| #ifdef SK_DAWN |
| case BackendApi::kDawn: |
| fDawn = that.fDawn; |
| break; |
| #endif |
| #ifdef SK_METAL |
| case BackendApi::kMetal: |
| fMtlTexture = that.fMtlTexture; |
| break; |
| #endif |
| #ifdef SK_VULKAN |
| case BackendApi::kVulkan: |
| // TODO: Actually fill this out |
| break; |
| #endif |
| default: |
| SK_ABORT("Unsupport Backend"); |
| } |
| return *this; |
| } |
| |
| bool BackendTexture::operator==(const BackendTexture& that) const { |
| if (!this->isValid() || !that.isValid()) { |
| return false; |
| } |
| |
| if (fDimensions != that.fDimensions || fInfo != that.fInfo) { |
| return false; |
| } |
| |
| switch (that.backend()) { |
| #ifdef SK_DAWN |
| case BackendApi::kDawn: |
| if (fDawn != that.fDawn) { |
| return false; |
| } |
| break; |
| #endif |
| #ifdef SK_METAL |
| case BackendApi::kMetal: |
| if (fMtlTexture != that.fMtlTexture) { |
| return false; |
| } |
| break; |
| #endif |
| #ifdef SK_VULKAN |
| case BackendApi::kVulkan: |
| // TODO: Actually fill this out |
| return false; |
| #endif |
| default: |
| SK_ABORT("Unsupport Backend"); |
| } |
| return true; |
| } |
| |
| void BackendTexture::setMutableState(const skgpu::MutableTextureState& newState) { |
| fMutableState->set(newState); |
| } |
| |
| #ifdef SK_DAWN |
| BackendTexture::BackendTexture(wgpu::Texture texture) |
| : fDimensions{static_cast<int32_t>(texture.GetWidth()), |
| static_cast<int32_t>(texture.GetHeight())} |
| , fInfo(DawnTextureInfo(texture)) |
| , fDawn(std::move(texture)) {} |
| |
| BackendTexture::BackendTexture(SkISize dimensions, |
| const DawnTextureInfo& info, |
| wgpu::TextureView textureView) |
| : fDimensions(dimensions) |
| , fInfo(info) |
| , fDawn(std::move(textureView)) {} |
| |
| wgpu::Texture BackendTexture::getDawnTexture() const { |
| if (this->isValid() && this->backend() == BackendApi::kDawn) { |
| return fDawn.fTexture; |
| } |
| return {}; |
| } |
| |
| wgpu::TextureView BackendTexture::getDawnTextureView() const { |
| if (this->isValid() && this->backend() == BackendApi::kDawn) { |
| return fDawn.fTextureView; |
| } |
| return {}; |
| } |
| #endif |
| |
| #ifdef SK_METAL |
| BackendTexture::BackendTexture(SkISize dimensions, MtlHandle mtlTexture) |
| : fDimensions(dimensions) |
| , fInfo(MtlTextureInfo(mtlTexture)) |
| , fMtlTexture(mtlTexture) {} |
| |
| MtlHandle BackendTexture::getMtlTexture() const { |
| if (this->isValid() && this->backend() == BackendApi::kMetal) { |
| return fMtlTexture; |
| } |
| return nullptr; |
| } |
| #endif // SK_METAL |
| |
| #ifdef SK_VULKAN |
| BackendTexture::BackendTexture(SkISize dimensions, |
| const VulkanTextureInfo& info, |
| VkImageLayout layout, |
| uint32_t queueFamilyIndex, |
| VkImage image) |
| : fDimensions(dimensions) |
| , fInfo(info) |
| , fMutableState(new MutableTextureStateRef(layout, queueFamilyIndex)) |
| , fVkImage(image) {} |
| |
| VkImage BackendTexture::getVkImage() const { |
| if (this->isValid() && this->backend() == BackendApi::kVulkan) { |
| return fVkImage; |
| } |
| return VK_NULL_HANDLE; |
| } |
| |
| VkImageLayout BackendTexture::getVkImageLayout() const { |
| if (this->isValid() && this->backend() == BackendApi::kVulkan) { |
| SkASSERT(fMutableState); |
| return fMutableState->getImageLayout(); |
| } |
| return VK_IMAGE_LAYOUT_UNDEFINED; |
| } |
| |
| uint32_t BackendTexture::getVkQueueFamilyIndex() const { |
| if (this->isValid() && this->backend() == BackendApi::kVulkan) { |
| SkASSERT(fMutableState); |
| return fMutableState->getQueueFamilyIndex(); |
| } |
| return 0; |
| } |
| #endif // SK_VULKAN |
| |
| } // namespace skgpu::graphite |
| |