• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.. All rights reserved.
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_surface.h"
17 
18 #include "include/gpu/GrBackendSemaphore.h"
19 
20 #include "draw/surface.h"
21 #include "include/gpu/GrBackendSemaphore.h"
22 #include "utils/log.h"
23 
24 #include "skia_bitmap.h"
25 #include "skia_canvas.h"
26 #include "skia_image_info.h"
27 #ifdef ACE_ENABLE_GPU
28 #include "skia_gpu_context.h"
29 #endif
30 #include "skia_image.h"
31 #include "skia_image_info.h"
32 #include "skia_texture_info.h"
33 #include "utils/system_properties.h"
34 
35 namespace OHOS {
36 namespace Rosen {
37 namespace Drawing {
38 #ifdef ACE_ENABLE_GPU
39 static constexpr int TEXTURE_SAMPLE_COUNT = 0;
40 static constexpr int FB_SAMPLE_COUNT = 0;
41 static constexpr int STENCIL_BITS = 8;
42 static constexpr uint32_t SURFACE_PROPS_FLAGS = 0;
43 #endif
44 
45 namespace {
ConvertToSkiaBackendAccess(BackendAccess access)46 SkSurface::BackendHandleAccess ConvertToSkiaBackendAccess(BackendAccess access)
47 {
48     switch (access) {
49         case BackendAccess::FLUSH_READ:
50             return SkSurface::BackendHandleAccess::kFlushRead_BackendHandleAccess;
51         case BackendAccess::FLUSH_WRITE:
52             return SkSurface::BackendHandleAccess::kFlushWrite_BackendHandleAccess;
53         case BackendAccess::DISCARD_WRITE:
54             return SkSurface::BackendHandleAccess::kDiscardWrite_BackendHandleAccess;
55         default:
56             return SkSurface::BackendHandleAccess::kFlushRead_BackendHandleAccess;
57     }
58     return SkSurface::BackendHandleAccess::kFlushRead_BackendHandleAccess;
59 }
60 }
61 
SkiaSurface()62 SkiaSurface::SkiaSurface() {}
63 
PostSkSurfaceToTargetThread()64 void SkiaSurface::PostSkSurfaceToTargetThread()
65 {
66     auto canvas = GetCanvas();
67     if (canvas == nullptr) {
68         return;
69     }
70     auto ctx = canvas->GetGPUContext();
71     if (ctx == nullptr) {
72         return;
73     }
74     auto skctx = ctx->GetImpl<SkiaGPUContext>();
75     if (skctx == nullptr) {
76         return;
77     }
78     auto grctx = skctx->GetGrContext();
79     if (grctx == nullptr) {
80         return;
81     }
82     auto func = SkiaGPUContext::GetPostFunc(grctx);
83     if (func) {
84         auto skSurface = skSurface_;
85         auto skImage = skImage_;
86         func([skSurface, skImage]() {});
87     }
88 }
89 
~SkiaSurface()90 SkiaSurface::~SkiaSurface()
91 {
92     PostSkSurfaceToTargetThread();
93 }
94 
Bind(const Bitmap & bitmap)95 bool SkiaSurface::Bind(const Bitmap& bitmap)
96 {
97     const auto &skBitmap = bitmap.GetImpl<SkiaBitmap>()->ExportSkiaBitmap();
98     skSurface_ = SkSurface::MakeRasterDirect(skBitmap.info(), skBitmap.getPixels(), skBitmap.rowBytes());
99     if (skSurface_ == nullptr) {
100         LOGD("SkiaSurface bind Bitmap failed: skSurface is nullptr");
101         return false;
102     }
103     return true;
104 }
105 
106 #ifdef ACE_ENABLE_GPU
Bind(const Image & image)107 bool SkiaSurface::Bind(const Image& image)
108 {
109     auto skiaImageImpl = image.GetImpl<SkiaImage>();
110     if (skiaImageImpl == nullptr) {
111         LOGD("SkiaSurface bind Image failed: skiaImageImpl is nullptr");
112         return false;
113     }
114     auto skImage = skiaImageImpl->GetImage();
115     auto grContext = skiaImageImpl->GetGrContext();
116     if (skImage == nullptr || grContext == nullptr) {
117         LOGD("SkiaSurface bind Image failed: image is not GPU image");
118         return false;
119     }
120 
121     if (skImage->isLazyGenerated()) {
122         skImage = skImage->makeTextureImage(grContext.get());
123     }
124 
125     GrSurfaceOrigin grSurfaceOrigin;
126     GrBackendTexture grBackendTexture;
127     SkSurfaceProps surfaceProps(SURFACE_PROPS_FLAGS, kRGB_H_SkPixelGeometry);
128     grBackendTexture = skImage->getBackendTexture(false, &grSurfaceOrigin);
129     if (!grBackendTexture.isValid()) {
130         LOGD("SkiaSurface bind Image failed: BackendTexture is invalid");
131         return false;
132     }
133 
134     skSurface_ = SkSurface::MakeFromBackendTexture(grContext.get(), grBackendTexture, grSurfaceOrigin,
135         TEXTURE_SAMPLE_COUNT, skImage->colorType(), skImage->refColorSpace(), &surfaceProps);
136     if (skSurface_ == nullptr) {
137         LOGD("SkiaSurface bind Image failed: skSurface is nullptr");
138         return false;
139     }
140 
141     skImage_ = skImage;
142     return true;
143 }
144 
Bind(const FrameBuffer & frameBuffer)145 bool SkiaSurface::Bind(const FrameBuffer& frameBuffer)
146 {
147     if (frameBuffer.gpuContext == nullptr) {
148         LOGD("SkiaSurface bind FBO failed: gpuContext is invalid");
149         return false;
150     }
151     auto skiaContext = frameBuffer.gpuContext->GetImpl<SkiaGPUContext>();
152 
153     GrGLFramebufferInfo framebufferInfo;
154     framebufferInfo.fFBOID = frameBuffer.FBOID;
155     framebufferInfo.fFormat = frameBuffer.Format;
156     GrBackendRenderTarget backendRenderTarget(
157         frameBuffer.width, frameBuffer.height, FB_SAMPLE_COUNT, STENCIL_BITS, framebufferInfo);
158 
159     SkColorType colorType = SkiaImageInfo::ConvertToSkColorType(frameBuffer.colorType);
160     sk_sp<SkColorSpace> skColorSpace = nullptr;
161     if (frameBuffer.colorSpace != nullptr) {
162         auto colorSpaceImpl = frameBuffer.colorSpace->GetImpl<SkiaColorSpace>();
163         if (colorSpaceImpl != nullptr) {
164             skColorSpace = colorSpaceImpl->GetColorSpace();
165         }
166     }
167 
168     SkSurfaceProps surfaceProps(SURFACE_PROPS_FLAGS, kRGB_H_SkPixelGeometry);
169 
170     skSurface_ = SkSurface::MakeFromBackendRenderTarget(skiaContext->GetGrContext().get(),
171         backendRenderTarget, kBottomLeft_GrSurfaceOrigin, colorType, skColorSpace, &surfaceProps);
172     if (skSurface_ == nullptr) {
173         LOGD("SkiaSurface bind FBO failed: skSurface is nullptr");
174         return false;
175     }
176     return true;
177 }
178 
179 #ifdef RS_ENABLE_VK
MakeFromBackendRenderTarget(GPUContext * gpuContext,const TextureInfo & info,TextureOrigin origin,ColorType colorType,std::shared_ptr<ColorSpace> colorSpace,void (* deleteVkImage)(void *),void * cleanHelper)180 std::shared_ptr<Surface> SkiaSurface::MakeFromBackendRenderTarget(GPUContext* gpuContext, const TextureInfo& info,
181     TextureOrigin origin, ColorType colorType, std::shared_ptr<ColorSpace> colorSpace,
182     void (*deleteVkImage)(void *), void* cleanHelper)
183 {
184     if (!SystemProperties::IsUseVulkan()) {
185         return nullptr;
186     }
187     sk_sp<GrDirectContext> grContext = nullptr;
188     if (gpuContext) {
189         auto skiaGpuContext = gpuContext->GetImpl<SkiaGPUContext>();
190         if (skiaGpuContext) {
191             grContext = skiaGpuContext->GetGrContext();
192         }
193     }
194     GrVkImageInfo image_info;
195     SkiaTextureInfo::ConvertToGrBackendTexture(info).getVkImageInfo(&image_info);
196     GrBackendRenderTarget backendRenderTarget(info.GetWidth(), info.GetHeight(), 0, image_info);
197     SkSurfaceProps surfaceProps(0, SkPixelGeometry::kUnknown_SkPixelGeometry);
198 
199     sk_sp<SkColorSpace> skColorSpace = nullptr;
200     if (colorSpace != nullptr) {
201         auto colorSpaceImpl = colorSpace->GetImpl<SkiaColorSpace>();
202         skColorSpace = colorSpaceImpl ? colorSpaceImpl->GetColorSpace() : SkColorSpace::MakeSRGB();
203     } else {
204         skColorSpace = SkColorSpace::MakeSRGB();
205     }
206 
207     sk_sp<SkSurface> skSurface =
208         SkSurface::MakeFromBackendRenderTarget(grContext.get(),
209         backendRenderTarget, SkiaTextureInfo::ConvertToGrSurfaceOrigin(origin),
210         SkiaImageInfo::ConvertToSkColorType(colorType),
211         skColorSpace, &surfaceProps, deleteVkImage, cleanHelper);
212     if (skSurface == nullptr) {
213         return nullptr;
214     }
215 
216     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
217     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
218     return surface;
219 }
220 #endif
MakeFromBackendTexture(GPUContext * gpuContext,const TextureInfo & info,TextureOrigin origin,int sampleCnt,ColorType colorType,std::shared_ptr<ColorSpace> colorSpace,void (* deleteVkImage)(void *),void * cleanHelper)221 std::shared_ptr<Surface> SkiaSurface::MakeFromBackendTexture(GPUContext* gpuContext, const TextureInfo& info,
222     TextureOrigin origin, int sampleCnt, ColorType colorType,
223     std::shared_ptr<ColorSpace> colorSpace, void (*deleteVkImage)(void *), void* cleanHelper)
224 {
225     sk_sp<GrDirectContext> grContext = nullptr;
226     if (gpuContext) {
227         auto skiaGpuContext = gpuContext->GetImpl<SkiaGPUContext>();
228         if (skiaGpuContext) {
229             grContext = skiaGpuContext->GetGrContext();
230         }
231     }
232     sk_sp<SkColorSpace> skColorSpace = nullptr;
233     if (colorSpace != nullptr) {
234         auto colorSpaceImpl = colorSpace->GetImpl<SkiaColorSpace>();
235         skColorSpace = colorSpaceImpl ? colorSpaceImpl->GetColorSpace() : SkColorSpace::MakeSRGB();
236     } else {
237         skColorSpace = SkColorSpace::MakeSRGB();
238     }
239 
240     sk_sp<SkSurface> skSurface = nullptr;
241     SkSurfaceProps surfaceProps(0, SkPixelGeometry::kUnknown_SkPixelGeometry);
242 #ifdef RS_ENABLE_VK
243     if (SystemProperties::GetGpuApiType() == GpuApiType::VULKAN) {
244         GrVkImageInfo image_info;
245         SkiaTextureInfo::ConvertToGrBackendTexture(info).getVkImageInfo(&image_info);
246         GrBackendTexture backendRenderTarget(info.GetWidth(), info.GetHeight(), image_info);
247         skSurface = SkSurface::MakeFromBackendTexture(grContext.get(),
248             backendRenderTarget, SkiaTextureInfo::ConvertToGrSurfaceOrigin(origin),
249             sampleCnt, SkiaImageInfo::ConvertToSkColorType(colorType),
250             skColorSpace, &surfaceProps, deleteVkImage, cleanHelper);
251     }
252 #endif
253 #ifdef RS_ENABLE_GL
254     if (SystemProperties::GetGpuApiType() == GpuApiType::OPENGL) {
255         GrBackendTexture glBackendTexture = SkiaTextureInfo::ConvertToGrBackendTexture(info);
256         skSurface = SkSurface::MakeFromBackendTexture(grContext.get(),
257             glBackendTexture, SkiaTextureInfo::ConvertToGrSurfaceOrigin(origin),
258             sampleCnt, SkiaImageInfo::ConvertToSkColorType(colorType),
259             skColorSpace, &surfaceProps, deleteVkImage, cleanHelper);
260     }
261 #endif
262     if (skSurface == nullptr) {
263         return nullptr;
264     }
265 
266     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
267     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
268     return surface;
269 }
270 
MakeRenderTarget(GPUContext * gpuContext,bool budgeted,const ImageInfo & imageInfo)271 std::shared_ptr<Surface> SkiaSurface::MakeRenderTarget(GPUContext* gpuContext,
272     bool budgeted, const ImageInfo& imageInfo)
273 {
274     sk_sp<GrDirectContext> grContext = nullptr;
275     if (gpuContext) {
276         auto skiaGpuContext = gpuContext->GetImpl<SkiaGPUContext>();
277         if (skiaGpuContext) {
278             grContext = skiaGpuContext->GetGrContext();
279         }
280     }
281     SkImageInfo skImageInfo = SkiaImageInfo::ConvertToSkImageInfo(imageInfo);
282     sk_sp<SkSurface> skSurface =
283         SkSurface::MakeRenderTarget(grContext.get(), static_cast<SkBudgeted>(budgeted), skImageInfo);
284     if (skSurface == nullptr) {
285         LOGD("skSurface nullptr, %{public}s, %{public}d [%{public}d %{public}d]", __FUNCTION__, __LINE__,
286             imageInfo.GetWidth(), imageInfo.GetHeight());
287         return nullptr;
288     }
289     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
290     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
291     return surface;
292 }
293 #endif
294 
MakeRaster(const ImageInfo & imageInfo)295 std::shared_ptr<Surface> SkiaSurface::MakeRaster(const ImageInfo& imageInfo)
296 {
297     SkImageInfo skImageInfo = SkiaImageInfo::ConvertToSkImageInfo(imageInfo);
298     sk_sp<SkSurface> skSurface = SkSurface::MakeRaster(skImageInfo);
299     if (skSurface == nullptr) {
300         LOGD("skSurface nullptr, %{public}s, %{public}d", __FUNCTION__, __LINE__);
301         return nullptr;
302     }
303     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
304     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
305     return surface;
306 }
307 
MakeRasterDirect(const ImageInfo & imageInfo,void * pixels,size_t rowBytes)308 std::shared_ptr<Surface> SkiaSurface::MakeRasterDirect(const ImageInfo& imageInfo, void* pixels, size_t rowBytes)
309 {
310     SkImageInfo skImageInfo = SkiaImageInfo::ConvertToSkImageInfo(imageInfo);
311     sk_sp<SkSurface> skSurface = SkSurface::MakeRasterDirect(skImageInfo, pixels, rowBytes);
312     if (skSurface == nullptr) {
313         LOGD("skSurface nullptr, %{public}s, %{public}d", __FUNCTION__, __LINE__);
314         return nullptr;
315     }
316     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
317     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
318     return surface;
319 }
320 
MakeRasterN32Premul(int32_t width,int32_t height)321 std::shared_ptr<Surface> SkiaSurface::MakeRasterN32Premul(int32_t width, int32_t height)
322 {
323     sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(width, height);
324     if (skSurface == nullptr) {
325         LOGD("skSurface nullptr, %{public}s, %{public}d", __FUNCTION__, __LINE__);
326         return nullptr;
327     }
328     std::shared_ptr<Surface> surface = std::make_shared<Surface>();
329     surface->GetImpl<SkiaSurface>()->SetSkSurface(skSurface);
330     return surface;
331 }
332 
GetCanvas() const333 std::shared_ptr<Canvas> SkiaSurface::GetCanvas() const
334 {
335     if (skSurface_ == nullptr || skSurface_->getCanvas() == nullptr) {
336         LOGD("skSurface is invalid");
337         return nullptr;
338     }
339 
340     auto canvas = std::make_shared<Canvas>();
341     canvas->GetImpl<SkiaCanvas>()->ImportSkCanvas(skSurface_->getCanvas());
342     return canvas;
343 }
344 
GetImageSnapshot() const345 std::shared_ptr<Image> SkiaSurface::GetImageSnapshot() const
346 {
347     if (skSurface_ == nullptr) {
348         LOGD("skSurface is nullptr");
349         return nullptr;
350     }
351 
352     auto skImage = skSurface_->makeImageSnapshot();
353     if (skImage == nullptr) {
354         LOGD("skSurface makeImageSnashot failed");
355         return nullptr;
356     }
357 
358     auto image = std::make_shared<Image>();
359     image->GetImpl<SkiaImage>()->SetSkImage(skImage);
360     return image;
361 }
362 
GetImageSnapshot(const RectI & bounds) const363 std::shared_ptr<Image> SkiaSurface::GetImageSnapshot(const RectI& bounds) const
364 {
365     if (skSurface_ == nullptr) {
366         LOGD("skSurface is nullptr");
367         return nullptr;
368     }
369 
370     auto iRect = SkIRect::MakeLTRB(bounds.GetLeft(), bounds.GetTop(), bounds.GetRight(), bounds.GetBottom());
371     auto skImage = skSurface_->makeImageSnapshot(iRect);
372     if (skImage == nullptr) {
373         LOGD("skSurface makeImageSnashot failed");
374         return nullptr;
375     }
376 
377     auto image = std::make_shared<Image>();
378     image->GetImpl<SkiaImage>()->SetSkImage(skImage);
379     return image;
380 }
381 
GetBackendTexture(BackendAccess access) const382 BackendTexture SkiaSurface::GetBackendTexture(BackendAccess access) const
383 {
384     if (skSurface_ == nullptr) {
385         LOGD("skSurface is nullptr");
386         return {};
387     }
388 
389     GrBackendTexture grBackendTexture = skSurface_->getBackendTexture(ConvertToSkiaBackendAccess(access));
390     auto backendTexture = BackendTexture(true);
391 #ifdef RS_ENABLE_VK
392     if (SystemProperties::IsUseVulkan()) {
393         TextureInfo info;
394         SkiaTextureInfo::ConvertToVKTexture(grBackendTexture, info);
395         backendTexture.SetTextureInfo(info);
396     } else {
397         backendTexture.SetTextureInfo(SkiaTextureInfo::ConvertToTextureInfo(grBackendTexture));
398     }
399 #else
400     backendTexture.SetTextureInfo(SkiaTextureInfo::ConvertToTextureInfo(grBackendTexture));
401 #endif
402     return backendTexture;
403 }
404 
MakeSurface(int width,int height) const405 std::shared_ptr<Surface> SkiaSurface::MakeSurface(int width, int height) const
406 {
407     if (skSurface_ == nullptr) {
408         LOGD("skSurface is nullptr");
409         return nullptr;
410     }
411     auto surface = skSurface_->makeSurface(width, height);
412     if (surface == nullptr) {
413         LOGD("SkiaSurface::MakeSurface failed");
414         return nullptr;
415     }
416 
417     auto drawingSurface = std::make_shared<Surface>();
418     drawingSurface->GetImpl<SkiaSurface>()->SetSkSurface(surface);
419     return drawingSurface;
420 }
421 
MakeSurface(const ImageInfo & imageInfo) const422 std::shared_ptr<Surface> SkiaSurface::MakeSurface(const ImageInfo& imageInfo) const
423 {
424     if (skSurface_ == nullptr) {
425         LOGD("skSurface is nullptr");
426         return nullptr;
427     }
428     SkImageInfo skImageInfo = SkiaImageInfo::ConvertToSkImageInfo(imageInfo);
429     auto surface = skSurface_->makeSurface(skImageInfo);
430     if (surface == nullptr) {
431         LOGD("SkiaSurface::MakeSurface failed");
432         return nullptr;
433     }
434 
435     auto drawingSurface = std::make_shared<Surface>();
436     drawingSurface->GetImpl<SkiaSurface>()->SetSkSurface(surface);
437     return drawingSurface;
438 }
439 
SetSkSurface(const sk_sp<SkSurface> & skSurface)440 void SkiaSurface::SetSkSurface(const sk_sp<SkSurface>& skSurface)
441 {
442     skSurface_ = skSurface;
443 }
444 
GetSkSurface() const445 sk_sp<SkSurface> SkiaSurface::GetSkSurface() const
446 {
447     return skSurface_;
448 }
449 
FlushAndSubmit(bool syncCpu)450 void SkiaSurface::FlushAndSubmit(bool syncCpu)
451 {
452     if (skSurface_ == nullptr) {
453         LOGD("skSurface is nullptr");
454         return;
455     }
456 
457     skSurface_->flushAndSubmit(syncCpu);
458 }
459 
Flush(FlushInfo * drawingflushInfo)460 void SkiaSurface::Flush(FlushInfo *drawingflushInfo)
461 {
462     if (skSurface_ == nullptr) {
463         LOGD("skSurface is nullptr");
464         // handle exception such as skia
465         if (!drawingflushInfo) {
466             return;
467         }
468         if (drawingflushInfo->submittedProc) {
469             drawingflushInfo->submittedProc(drawingflushInfo->submittedContext, false);
470         }
471         if (drawingflushInfo->finishedProc) {
472             drawingflushInfo->finishedProc(drawingflushInfo->finishedContext);
473         }
474         return;
475     }
476     if (drawingflushInfo != nullptr) {
477         GrFlushInfo flushInfo;
478         flushInfo.fNumSemaphores = drawingflushInfo->numSemaphores;
479         flushInfo.fSignalSemaphores = static_cast<GrBackendSemaphore*>(drawingflushInfo->backendSemaphore);
480         flushInfo.fFinishedProc = drawingflushInfo->finishedProc;
481         flushInfo.fFinishedContext = static_cast<GrGpuFinishedContext>(drawingflushInfo->finishedContext);
482         flushInfo.fSubmittedProc = drawingflushInfo->submittedProc;
483         flushInfo.fSubmittedContext = static_cast<GrGpuSubmittedContext>(drawingflushInfo->submittedContext);
484         skSurface_->flush(drawingflushInfo->backendSurfaceAccess == false ?
485             SkSurface::BackendSurfaceAccess::kNoAccess : SkSurface::BackendSurfaceAccess::kPresent, flushInfo);
486         return;
487     }
488     skSurface_->flush();
489 }
490 
491 #ifdef RS_ENABLE_GL
Wait(const std::vector<GrGLsync> & syncs)492 void SkiaSurface::Wait(const std::vector<GrGLsync>& syncs)
493 {
494     if (!SystemProperties::IsUseGl()) {
495         return;
496     }
497 
498     if (skSurface_ == nullptr) {
499         LOGD("skSurface is nullptr");
500         return;
501     }
502 
503     uint32_t count = syncs.size();
504     if (count == 0) {
505         LOGD("GrGLsync count is zero");
506         return;
507     } else {
508         std::vector<GrBackendSemaphore> semaphores;
509         semaphores.reserve(count);
510         for (auto& sync : syncs) {
511             GrBackendSemaphore backendSemaphore;
512             backendSemaphore.initGL(sync);
513             semaphores.emplace_back(backendSemaphore);
514         }
515         skSurface_->wait(count, semaphores.data());
516     }
517 }
518 #endif
519 
520 #ifdef RS_ENABLE_VK
Wait(int32_t time,const VkSemaphore & semaphore)521 void SkiaSurface::Wait(int32_t time, const VkSemaphore& semaphore)
522 {
523     if (!SystemProperties::IsUseVulkan()) {
524         return;
525     }
526     if (skSurface_ == nullptr) {
527         LOGD("skSurface is nullptr");
528         return;
529     }
530     GrBackendSemaphore backendSemaphore;
531     backendSemaphore.initVulkan(semaphore);
532     skSurface_->wait(time, &backendSemaphore);
533 }
534 
SetDrawingArea(const std::vector<RectI> & rects)535 void SkiaSurface::SetDrawingArea(const std::vector<RectI>& rects)
536 {
537     if (!SystemProperties::IsUseVulkan()) {
538         return;
539     }
540     if (skSurface_ == nullptr) {
541         LOGD("skSurface is nullptr");
542         return;
543     }
544     std::vector<SkIRect> skIRects;
545     for (auto &rect : rects) {
546         SkIRect skIRect = {rect.GetLeft(), rect.GetTop(), rect.GetRight(), rect.GetBottom()};
547         skIRects.push_back(skIRect);
548     }
549     skSurface_->setDrawingArea(skIRects);
550 }
551 
ClearDrawingArea()552 void SkiaSurface::ClearDrawingArea()
553 {
554     if (SystemProperties::GetGpuApiType() != GpuApiType::VULKAN &&
555         SystemProperties::GetGpuApiType() != GpuApiType::DDGR) {
556         return;
557     }
558     if (skSurface_ == nullptr) {
559         LOGD("skSurface is nullptr");
560         return;
561     }
562     skSurface_->clearDrawingArea();
563 }
564 #endif
565 
Width() const566 int SkiaSurface::Width() const
567 {
568     if (skSurface_ == nullptr) {
569         LOGW("skSurface is nullptr");
570         return 0;
571     }
572     return skSurface_->width();
573 }
574 
Height() const575 int SkiaSurface::Height() const
576 {
577     if (skSurface_ == nullptr) {
578         LOGW("skSurface is nullptr");
579         return 0;
580     }
581     return skSurface_->height();
582 }
583 
584 } // namespace Drawing
585 } // namespace Rosen
586 } // namespace OHOS
587