1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "skia_texture_info.h"
17 #include "utils/system_properties.h"
18
19 namespace OHOS {
20 namespace Rosen {
21 namespace Drawing {
22
23 #ifdef RS_ENABLE_VK
ConvertToGrBackendVKTexture(const TextureInfo & info)24 GrBackendTexture SkiaTextureInfo::ConvertToGrBackendVKTexture(const TextureInfo& info)
25 {
26 GrVkImageInfo imageInfo;
27 if (SystemProperties::GetGpuApiType() != GpuApiType::VULKAN &&
28 SystemProperties::GetGpuApiType() != GpuApiType::DDGR) {
29 GrBackendTexture backendTexture(0, 0, imageInfo);
30 return backendTexture;
31 }
32
33 auto vkInfo = info.GetVKTextureInfo();
34 if (!vkInfo) {
35 GrBackendTexture backendTexture(info.GetWidth(), info.GetHeight(), imageInfo);
36 return backendTexture;
37 }
38 imageInfo.fImage = vkInfo->vkImage;
39 GrVkAlloc alloc;
40 alloc.fMemory = vkInfo->vkAlloc.memory;
41 alloc.fOffset = vkInfo->vkAlloc.offset;
42 alloc.fSize = vkInfo->vkAlloc.size;
43 alloc.fFlags = vkInfo->vkAlloc.flags;
44 imageInfo.fAlloc = alloc;
45
46 imageInfo.fImageTiling = vkInfo->imageTiling;
47 imageInfo.fImageLayout = vkInfo->imageLayout;
48 imageInfo.fFormat = vkInfo->format;
49 imageInfo.fImageUsageFlags = vkInfo->imageUsageFlags;
50 imageInfo.fSampleCount = vkInfo->sampleCount;
51 imageInfo.fLevelCount = vkInfo->levelCount;
52 imageInfo.fCurrentQueueFamily = vkInfo->currentQueueFamily;
53 imageInfo.fProtected = vkInfo->vkProtected ? GrProtected::kYes : GrProtected::kNo;
54
55 GrVkYcbcrConversionInfo ycbcrInfo = {
56 .fFormat = vkInfo->ycbcrConversionInfo.format,
57 .fExternalFormat = vkInfo->ycbcrConversionInfo.externalFormat,
58 .fYcbcrModel = vkInfo->ycbcrConversionInfo.ycbcrModel,
59 .fYcbcrRange = vkInfo->ycbcrConversionInfo.ycbcrRange,
60 .fXChromaOffset = vkInfo->ycbcrConversionInfo.xChromaOffset,
61 .fYChromaOffset = vkInfo->ycbcrConversionInfo.yChromaOffset,
62 .fChromaFilter = vkInfo->ycbcrConversionInfo.chromaFilter,
63 .fForceExplicitReconstruction = vkInfo->ycbcrConversionInfo.forceExplicitReconstruction,
64 .fFormatFeatures = vkInfo->ycbcrConversionInfo.formatFeatures
65 };
66 imageInfo.fYcbcrConversionInfo = ycbcrInfo;
67
68 imageInfo.fSharingMode = vkInfo->sharingMode;
69
70 GrBackendTexture backendTexture(info.GetWidth(), info.GetHeight(), imageInfo);
71 return backendTexture;
72 }
73
ConvertToVKTexture(const GrBackendTexture & backendTexture,TextureInfo & info)74 void SkiaTextureInfo::ConvertToVKTexture(const GrBackendTexture& backendTexture, TextureInfo& info)
75 {
76 if (SystemProperties::GetGpuApiType() != GpuApiType::VULKAN &&
77 SystemProperties::GetGpuApiType() != GpuApiType::DDGR) {
78 return;
79 }
80 std::shared_ptr<VKTextureInfo> vkInfo = std::make_shared<VKTextureInfo>();
81 info.SetWidth(backendTexture.width());
82 info.SetHeight(backendTexture.height());
83
84 GrVkImageInfo vkImageInfo;
85 backendTexture.getVkImageInfo(&vkImageInfo);
86
87 vkInfo->vkImage = vkImageInfo.fImage;
88
89 vkInfo->vkAlloc.memory = vkImageInfo.fAlloc.fMemory;
90 vkInfo->vkAlloc.offset = vkImageInfo.fAlloc.fOffset;
91 vkInfo->vkAlloc.size = vkImageInfo.fAlloc.fSize;
92 vkInfo->vkAlloc.flags = vkImageInfo.fAlloc.fFlags;
93
94 vkInfo->imageTiling = vkImageInfo.fImageTiling;
95 vkInfo->imageLayout = vkImageInfo.fImageLayout;
96 vkInfo->format = vkImageInfo.fFormat;
97 vkInfo->imageUsageFlags = vkImageInfo.fImageUsageFlags;
98 vkInfo->sampleCount = vkImageInfo.fSampleCount;
99 vkInfo->levelCount = vkImageInfo.fLevelCount;
100 vkInfo->currentQueueFamily = vkImageInfo.fCurrentQueueFamily;
101 vkInfo->vkProtected = (vkImageInfo.fProtected == GrProtected::kYes) ? true : false;
102
103 vkInfo->ycbcrConversionInfo.format = vkImageInfo.fYcbcrConversionInfo.fFormat;
104 vkInfo->ycbcrConversionInfo.externalFormat = vkImageInfo.fYcbcrConversionInfo.fExternalFormat;
105 vkInfo->ycbcrConversionInfo.ycbcrModel = vkImageInfo.fYcbcrConversionInfo.fYcbcrModel;
106 vkInfo->ycbcrConversionInfo.ycbcrRange = vkImageInfo.fYcbcrConversionInfo.fYcbcrRange;
107 vkInfo->ycbcrConversionInfo.xChromaOffset = vkImageInfo.fYcbcrConversionInfo.fXChromaOffset;
108 vkInfo->ycbcrConversionInfo.yChromaOffset = vkImageInfo.fYcbcrConversionInfo.fYChromaOffset;
109 vkInfo->ycbcrConversionInfo.chromaFilter = vkImageInfo.fYcbcrConversionInfo.fChromaFilter;
110 vkInfo->ycbcrConversionInfo.forceExplicitReconstruction =
111 vkImageInfo.fYcbcrConversionInfo.fForceExplicitReconstruction;
112 vkInfo->ycbcrConversionInfo.formatFeatures = vkImageInfo.fYcbcrConversionInfo.fFormatFeatures;
113
114 vkInfo->sharingMode = vkImageInfo.fSharingMode;
115
116 info.SetVKTextureInfo(vkInfo);
117 }
118 #endif
119
ConvertToGrBackendTexture(const TextureInfo & info)120 GrBackendTexture SkiaTextureInfo::ConvertToGrBackendTexture(const TextureInfo& info)
121 {
122 #ifdef RS_ENABLE_VK
123 if (GetGpuApiType() == OHOS::Rosen::GpuApiType::VULKAN ||
124 GetGpuApiType() == OHOS::Rosen::GpuApiType::DDGR) {
125 return ConvertToGrBackendVKTexture(info);
126 } else {
127 GrGLTextureInfo grGLTextureInfo = { info.GetTarget(), info.GetID(), info.GetFormat() };
128 GrBackendTexture backendTexture(info.GetWidth(), info.GetHeight(),
129 static_cast<GrMipMapped>(info.GetIsMipMapped()), grGLTextureInfo);
130 return backendTexture;
131 }
132 #else
133 GrGLTextureInfo grGLTextureInfo = { info.GetTarget(), info.GetID(), info.GetFormat() };
134 GrBackendTexture backendTexture(info.GetWidth(), info.GetHeight(),
135 static_cast<GrMipMapped>(info.GetIsMipMapped()), grGLTextureInfo);
136 return backendTexture;
137 #endif
138 }
139
ConvertToTextureInfo(const GrBackendTexture & grBackendTexture)140 TextureInfo SkiaTextureInfo::ConvertToTextureInfo(const GrBackendTexture& grBackendTexture)
141 {
142 GrGLTextureInfo* grGLTextureInfo = new GrGLTextureInfo();
143 grBackendTexture.getGLTextureInfo(grGLTextureInfo);
144 TextureInfo textureInfo;
145 textureInfo.SetWidth(grBackendTexture.width());
146 textureInfo.SetHeight(grBackendTexture.height());
147 textureInfo.SetIsMipMapped(static_cast<bool>(grBackendTexture.mipmapped()));
148 textureInfo.SetTarget(grGLTextureInfo->fTarget);
149 textureInfo.SetID(grGLTextureInfo->fID);
150 textureInfo.SetFormat(grGLTextureInfo->fFormat);
151 delete grGLTextureInfo;
152 return textureInfo;
153 }
154
155 } // namespace Drawing
156 } // namespace Rosen
157 } // namespace OHOS
158