• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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