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