/*
 * 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 "include/core/SkFourByteTag.h"
#include "include/core/SkStream.h"
#include "src/gpu/GpuTypesPriv.h"
#include "src/gpu/graphite/Caps.h"
#include "src/gpu/graphite/TextureFormat.h"
#include "src/gpu/graphite/TextureInfoPriv.h"

namespace skgpu::graphite {

TextureInfo::TextureInfo(const TextureInfo& that)
        : fBackend(that.fBackend)
        , fViewFormat(that.fViewFormat)
        , fProtected(that.fProtected) {
    if (!that.fData.has_value()) {
        SkASSERT(!fData.has_value());
        return;
    }

    that.fData->copyTo(fData);
}

TextureInfo& TextureInfo::operator=(const TextureInfo& that) {
    if (this != &that) {
        this->~TextureInfo();
        new (this) TextureInfo(that);
    }
    return *this;
}

bool TextureInfo::isCompatible(const TextureInfo& that, bool requireExact) const {
    if (fBackend != that.fBackend) {
        return false;
    } else if (fBackend == skgpu::BackendApi::kUnsupported) {
        SkASSERT(!fData.has_value() && !that.fData.has_value());
        return true;
    } else {
        SkASSERT(fData.has_value() && that.fData.has_value());
        return fData->fSampleCount == that.fData->fSampleCount &&
               fData->fMipmapped == that.fData->fMipmapped &&
               fData->isCompatible(that, requireExact);
    }
}

SkString TextureInfo::toString() const {
    if (!this->isValid()) {
        return SkString("{}");
    }

    // Strip the leading "k" from the enum name when creating the TextureInfo string.
    SkASSERT(BackendApiToStr(fBackend)[0] == 'k');
    const char* backendName = BackendApiToStr(fBackend) + 1;

    return SkStringPrintf("%s(viewFormat=%s,%s,bpp=%zu,sampleCount=%u,mipmapped=%d,protected=%d)",
                          backendName,
                          TextureFormatName(fViewFormat),
                          fData->toBackendString().c_str(),
                          TextureFormatBytesPerBlock(fViewFormat),
                          (unsigned) fData->fSampleCount,
                          static_cast<int>(fData->fMipmapped),
                          static_cast<int>(fProtected));
}

} // namespace skgpu::graphite
