1 /*
2 * Copyright 2024 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 #include "include/core/SkStream.h"
8 #include "include/core/SkString.h"
9 #include "include/gpu/graphite/vk/VulkanGraphiteTypes.h"
10 #include "include/gpu/vk/VulkanMutableTextureState.h"
11 #include "src/gpu/graphite/TextureInfoPriv.h"
12 #include "src/gpu/graphite/vk/VulkanGraphiteUtils.h"
13 #include "src/gpu/vk/VulkanUtilsPriv.h"
14
15 #include <cstdint>
16
17 namespace skgpu::graphite {
18
toBackendString() const19 SkString VulkanTextureInfo::toBackendString() const {
20 return SkStringPrintf(
21 "flags=0x%08X,imageTiling=%d,imageUsageFlags=0x%08X,sharingMode=%d,"
22 "aspectMask=%u",
23 fFlags,
24 fImageTiling,
25 fImageUsageFlags,
26 fSharingMode,
27 fAspectMask);
28 }
29
viewFormat() const30 TextureFormat VulkanTextureInfo::viewFormat() const {
31 if (fYcbcrConversionInfo.isValid()) {
32 if (fYcbcrConversionInfo.fFormat == VK_FORMAT_UNDEFINED) {
33 return TextureFormat::kExternal;
34 } else {
35 return VkFormatToTextureFormat(fYcbcrConversionInfo.fFormat);
36 }
37 } else {
38 return VkFormatToTextureFormat(fFormat);
39 }
40 }
41
isCompatible(const TextureInfo & that,bool requireExact) const42 bool VulkanTextureInfo::isCompatible(const TextureInfo& that, bool requireExact) const {
43 const auto& vt = TextureInfoPriv::Get<VulkanTextureInfo>(that);
44
45 // The usages may match or the usage passed in may be a superset of the usage stored within.
46 const auto usageMask = requireExact ? vt.fImageUsageFlags : fImageUsageFlags;
47 return fFlags == vt.fFlags &&
48 fFormat == vt.fFormat &&
49 fImageTiling == vt.fImageTiling &&
50 fSharingMode == vt.fSharingMode &&
51 fAspectMask == vt.fAspectMask &&
52 (usageMask & vt.fImageUsageFlags) == fImageUsageFlags &&
53 fYcbcrConversionInfo == vt.fYcbcrConversionInfo;
54 }
55
serialize(SkWStream * stream) const56 bool VulkanTextureInfo::serialize(SkWStream* stream) const {
57 SkASSERT(SkTFitsIn<uint64_t>(fFlags));
58 SkASSERT(SkTFitsIn<uint64_t>(fFormat));
59 SkASSERT(SkTFitsIn<uint64_t>(fImageUsageFlags));
60 SkASSERT(SkTFitsIn<uint8_t>(fImageTiling));
61 SkASSERT(SkTFitsIn<uint8_t>(fSharingMode));
62 SkASSERT(SkTFitsIn<uint32_t>(fAspectMask));
63
64 if (!stream->write64(static_cast<uint64_t>(fFlags))) { return false; }
65 if (!stream->write64(static_cast<uint64_t>(fFormat))) { return false; }
66 if (!stream->write64(static_cast<uint64_t>(fImageUsageFlags))) { return false; }
67 if (!stream->write8(static_cast<uint8_t>(fImageTiling))) { return false; }
68 if (!stream->write8(static_cast<uint8_t>(fSharingMode))) { return false; }
69 if (!stream->write32(static_cast<uint32_t>(fAspectMask))) { return false; }
70
71 return SerializeVkYCbCrInfo(stream, fYcbcrConversionInfo);
72 }
73
74 // TODO(robertphillips): add validity checks to deserialized values
deserialize(SkStream * stream)75 bool VulkanTextureInfo::deserialize(SkStream* stream) {
76 uint64_t tmp64;
77
78 if (!stream->readU64(&tmp64)) { return false; }
79 fFlags = static_cast<VkImageCreateFlags>(tmp64);
80
81 if (!stream->readU64(&tmp64)) { return false; }
82 fFormat = static_cast<VkFormat>(tmp64);
83
84 if (!stream->readU64(&tmp64)) { return false; }
85 fImageUsageFlags = static_cast<VkImageUsageFlags>(tmp64);
86
87 uint32_t tmp32;
88 uint8_t tmp8;
89
90 if (!stream->readU8(&tmp8)) { return false; }
91 fImageTiling = static_cast<VkImageTiling>(tmp8);
92
93 if (!stream->readU8(&tmp8)) { return false; }
94 fSharingMode = static_cast<VkSharingMode>(tmp8);
95
96 if (!stream->readU32(&tmp32)) { return false; }
97 fAspectMask = static_cast<VkImageAspectFlags>(tmp32);
98
99 return DeserializeVkYCbCrInfo(stream, &fYcbcrConversionInfo);
100 }
101
102 namespace TextureInfos {
103
MakeVulkan(const VulkanTextureInfo & vkInfo)104 TextureInfo MakeVulkan(const VulkanTextureInfo& vkInfo) {
105 return TextureInfoPriv::Make(vkInfo);
106 }
107
GetVulkanTextureInfo(const TextureInfo & info,VulkanTextureInfo * out)108 bool GetVulkanTextureInfo(const TextureInfo& info, VulkanTextureInfo* out) {
109 return TextureInfoPriv::Copy(info, out);
110 }
111
112 } // namespace TextureInfos
113
114 } // namespace skgpu::graphite
115