blob: 44bbd753da28a10fd10b7f084282aaba59deb834 [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/TextureInfo.h"
#ifdef SK_DAWN
#include "src/gpu/graphite/dawn/DawnUtilsPriv.h"
#endif
#ifdef SK_METAL
namespace skgpu::graphite {
// Including Metal types/headers here is tricky. This is defined in MtlGraphiteUtils.mm
size_t MtlFormatBytesPerBlock(MtlPixelFormat);
SkTextureCompressionType MtlFormatToCompressionType(MtlPixelFormat);
}
#endif
#ifdef SK_VULKAN
#include "src/gpu/vk/VulkanUtilsPriv.h"
#endif
namespace skgpu::graphite {
TextureInfo& TextureInfo::operator=(const TextureInfo& that) {
if (!that.isValid()) {
fValid = false;
return *this;
}
fBackend = that.fBackend;
fSampleCount = that.fSampleCount;
fMipmapped = that.fMipmapped;
fProtected = that.fProtected;
switch (that.backend()) {
#ifdef SK_DAWN
case BackendApi::kDawn:
fDawnSpec = that.fDawnSpec;
break;
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
fMtlSpec = that.fMtlSpec;
break;
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
fVkSpec = that.fVkSpec;
break;
#endif
default:
SK_ABORT("Unsupport Backend");
}
fValid = true;
return *this;
}
bool TextureInfo::operator==(const TextureInfo& that) const {
if (!this->isValid() && !that.isValid()) {
return true;
}
if (!this->isValid() || !that.isValid()) {
return false;
}
if (fBackend != that.fBackend) {
return false;
}
if (fSampleCount != that.fSampleCount ||
fMipmapped != that.fMipmapped ||
fProtected != that.fProtected) {
return false;
}
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
return fDawnSpec == that.fDawnSpec;
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
return fMtlSpec == that.fMtlSpec;
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
return fVkSpec == that.fVkSpec;
#endif
default:
return false;
}
}
bool TextureInfo::isCompatible(const TextureInfo& that) const {
if (!this->isValid() || !that.isValid()) {
return false;
}
if (fSampleCount != that.fSampleCount ||
fMipmapped != that.fMipmapped ||
fProtected != that.fProtected) {
return false;
}
if (fBackend != that.fBackend) {
return false;
}
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
return fDawnSpec.isCompatible(that.fDawnSpec);
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
return fMtlSpec.isCompatible(that.fMtlSpec);
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
return fVkSpec.isCompatible(that.fVkSpec);
#endif
default:
return false;
}
}
#ifdef SK_DAWN
bool TextureInfo::getDawnTextureInfo(DawnTextureInfo* info) const {
if (!this->isValid() || fBackend != BackendApi::kDawn) {
return false;
}
*info = DawnTextureSpecToTextureInfo(fDawnSpec, fSampleCount, fMipmapped);
return true;
}
#endif
SkString TextureInfo::toString() const {
SkString ret;
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
ret.appendf("Dawn(%s,", fDawnSpec.toString().c_str());
break;
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
ret.appendf("Metal(%s,", fMtlSpec.toString().c_str());
break;
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
ret.appendf("Vulkan(%s,", fVkSpec.toString().c_str());
break;
#endif
case BackendApi::kMock:
ret += "Mock(";
break;
default:
ret += "Invalid(";
break;
}
ret.appendf("bytesPerPixel=%zu,sampleCount=%u,mipmapped=%d,protected=%d)",
this->bytesPerPixel(),
fSampleCount,
static_cast<int>(fMipmapped),
static_cast<int>(fProtected));
return ret;
}
SkString TextureInfo::toRPAttachmentString() const {
// For renderpass attachments, the string will contain the view format and sample count only
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
return SkStringPrintf("Dawn(f=%u,s=%u)",
static_cast<unsigned int>(fDawnSpec.fViewFormat), fSampleCount);
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
return SkStringPrintf("Metal(f=%u,s=%u)",
static_cast<unsigned int>(fMtlSpec.fFormat), fSampleCount);
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
return SkStringPrintf("Vulkan(f%u,s=%u)",
static_cast<unsigned int>(fVkSpec.fFormat), fSampleCount);
#endif
case BackendApi::kMock:
return SkStringPrintf("Mock(s=%u)", fSampleCount);
default:
return SkString("Invalid");
}
}
size_t TextureInfo::bytesPerPixel() const {
if (!this->isValid()) {
return 0;
}
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
return DawnFormatBytesPerBlock(this->dawnTextureSpec().getViewFormat());
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
return MtlFormatBytesPerBlock(this->mtlTextureSpec().fFormat);
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
return VkFormatBytesPerBlock(this->vulkanTextureSpec().fFormat);
#endif
default:
return 0;
}
}
SkTextureCompressionType TextureInfo::compressionType() const {
if (!this->isValid()) {
return SkTextureCompressionType::kNone;
}
switch (fBackend) {
#ifdef SK_DAWN
case BackendApi::kDawn:
return DawnFormatToCompressionType(this->dawnTextureSpec().getViewFormat());
#endif
#ifdef SK_METAL
case BackendApi::kMetal:
return MtlFormatToCompressionType(this->mtlTextureSpec().fFormat);
#endif
#ifdef SK_VULKAN
case BackendApi::kVulkan:
return VkFormatToCompressionType(this->vulkanTextureSpec().fFormat);
#endif
default:
return SkTextureCompressionType::kNone;
}
}
} // namespace skgpu::graphite