blob: 54d8764ef342a5dca63b83869610326298e6213a [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"
#include "src/gpu/graphite/TextureInfoPriv.h"
namespace skgpu::graphite {
TextureInfo::TextureInfo(){};
TextureInfo::~TextureInfo() = default;
static inline void assert_is_supported_backend(const BackendApi& backend) {
SkASSERT(backend == BackendApi::kDawn ||
backend == BackendApi::kMetal ||
backend == BackendApi::kVulkan);
}
TextureInfo::TextureInfo(const TextureInfo& that)
: fBackend(that.fBackend)
, fValid(that.fValid)
, fSampleCount(that.fSampleCount)
, fMipmapped(that.fMipmapped)
, fProtected(that.fProtected) {
if (!fValid) {
return;
}
assert_is_supported_backend(fBackend);
fTextureInfoData.reset();
that.fTextureInfoData->copyTo(fTextureInfoData);
}
TextureInfo& TextureInfo::operator=(const TextureInfo& that) {
if (this != &that) {
this->~TextureInfo();
new (this) TextureInfo(that);
}
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;
}
assert_is_supported_backend(fBackend);
return fTextureInfoData->equal(that.fTextureInfoData.get());
}
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;
}
assert_is_supported_backend(fBackend);
return fTextureInfoData->isCompatible(that.fTextureInfoData.get());
}
SkString TextureInfo::toString() const {
SkString ret;
switch (fBackend) {
case BackendApi::kDawn:
case BackendApi::kMetal:
case BackendApi::kVulkan:
ret = fTextureInfoData->toString();
break;
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) {
case BackendApi::kDawn:
case BackendApi::kMetal:
case BackendApi::kVulkan:
return fTextureInfoData->toRPAttachmentString(fSampleCount);
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) {
case BackendApi::kDawn:
case BackendApi::kMetal:
case BackendApi::kVulkan:
return fTextureInfoData->bytesPerPixel();
default:
return 0;
}
}
SkTextureCompressionType TextureInfo::compressionType() const {
if (!this->isValid()) {
return SkTextureCompressionType::kNone;
}
switch (fBackend) {
case BackendApi::kDawn:
case BackendApi::kMetal:
case BackendApi::kVulkan:
return fTextureInfoData->compressionType();
default:
return SkTextureCompressionType::kNone;
}
}
bool TextureInfo::isMemoryless() const {
if (!this->isValid()) {
return false;
}
switch (fBackend) {
case BackendApi::kDawn:
case BackendApi::kMetal:
case BackendApi::kVulkan:
return fTextureInfoData->isMemoryless();
default:
return false;
}
}
TextureInfoData::~TextureInfoData(){};
} // namespace skgpu::graphite