blob: 70c0b6cb2bcdd81bdad359034d3ec753efdeaf1e [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.
*/
#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