/* * Copyright 2024 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkStream.h" #include "include/core/SkString.h" #include "include/gpu/graphite/vk/VulkanGraphiteTypes.h" #include "include/gpu/vk/VulkanMutableTextureState.h" #include "src/gpu/graphite/TextureInfoPriv.h" #include "src/gpu/graphite/vk/VulkanGraphiteUtils.h" #include "src/gpu/vk/VulkanUtilsPriv.h" #include namespace skgpu::graphite { SkString VulkanTextureInfo::toBackendString() const { return SkStringPrintf( "flags=0x%08X,imageTiling=%d,imageUsageFlags=0x%08X,sharingMode=%d," "aspectMask=%u", fFlags, fImageTiling, fImageUsageFlags, fSharingMode, fAspectMask); } TextureFormat VulkanTextureInfo::viewFormat() const { if (fYcbcrConversionInfo.isValid()) { if (fYcbcrConversionInfo.fFormat == VK_FORMAT_UNDEFINED) { return TextureFormat::kExternal; } else { return VkFormatToTextureFormat(fYcbcrConversionInfo.fFormat); } } else { return VkFormatToTextureFormat(fFormat); } } bool VulkanTextureInfo::isCompatible(const TextureInfo& that, bool requireExact) const { const auto& vt = TextureInfoPriv::Get(that); // The usages may match or the usage passed in may be a superset of the usage stored within. const auto usageMask = requireExact ? vt.fImageUsageFlags : fImageUsageFlags; return fFlags == vt.fFlags && fFormat == vt.fFormat && fImageTiling == vt.fImageTiling && fSharingMode == vt.fSharingMode && fAspectMask == vt.fAspectMask && (usageMask & vt.fImageUsageFlags) == fImageUsageFlags && fYcbcrConversionInfo == vt.fYcbcrConversionInfo; } bool VulkanTextureInfo::serialize(SkWStream* stream) const { SkASSERT(SkTFitsIn(fFlags)); SkASSERT(SkTFitsIn(fFormat)); SkASSERT(SkTFitsIn(fImageUsageFlags)); SkASSERT(SkTFitsIn(fImageTiling)); SkASSERT(SkTFitsIn(fSharingMode)); SkASSERT(SkTFitsIn(fAspectMask)); if (!stream->write64(static_cast(fFlags))) { return false; } if (!stream->write64(static_cast(fFormat))) { return false; } if (!stream->write64(static_cast(fImageUsageFlags))) { return false; } if (!stream->write8(static_cast(fImageTiling))) { return false; } if (!stream->write8(static_cast(fSharingMode))) { return false; } if (!stream->write32(static_cast(fAspectMask))) { return false; } return SerializeVkYCbCrInfo(stream, fYcbcrConversionInfo); } // TODO(robertphillips): add validity checks to deserialized values bool VulkanTextureInfo::deserialize(SkStream* stream) { uint64_t tmp64; if (!stream->readU64(&tmp64)) { return false; } fFlags = static_cast(tmp64); if (!stream->readU64(&tmp64)) { return false; } fFormat = static_cast(tmp64); if (!stream->readU64(&tmp64)) { return false; } fImageUsageFlags = static_cast(tmp64); uint32_t tmp32; uint8_t tmp8; if (!stream->readU8(&tmp8)) { return false; } fImageTiling = static_cast(tmp8); if (!stream->readU8(&tmp8)) { return false; } fSharingMode = static_cast(tmp8); if (!stream->readU32(&tmp32)) { return false; } fAspectMask = static_cast(tmp32); return DeserializeVkYCbCrInfo(stream, &fYcbcrConversionInfo); } namespace TextureInfos { TextureInfo MakeVulkan(const VulkanTextureInfo& vkInfo) { return TextureInfoPriv::Make(vkInfo); } bool GetVulkanTextureInfo(const TextureInfo& info, VulkanTextureInfo* out) { return TextureInfoPriv::Copy(info, out); } } // namespace TextureInfos } // namespace skgpu::graphite