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