-
Notifications
You must be signed in to change notification settings - Fork 511
Expand file tree
/
Copy pathGPUDrawable.cpp
More file actions
83 lines (72 loc) · 2.62 KB
/
GPUDrawable.cpp
File metadata and controls
83 lines (72 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Tencent is pleased to support the open source community by making libpag available.
//
// Copyright (C) 2024 Tencent. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// unless required by applicable law or agreed to in writing, software distributed under the
// license is distributed on an "as is" basis, without warranties or conditions of any kind,
// either express or implied. see the license for the specific language governing permissions
// and limitations under the license.
//
/////////////////////////////////////////////////////////////////////////////////////////////////
#include "GPUDrawable.h"
#include <native_window/external_window.h>
#include "base/utils/Log.h"
#include "tgfx/core/Surface.h"
namespace pag {
std::shared_ptr<GPUDrawable> GPUDrawable::FromWindow(NativeWindow* nativeWindow,
EGLContext sharedContext) {
if (!nativeWindow) {
LOGE("GPUDrawable.FromWindow() The nativeWindow is invalid.");
return nullptr;
}
return std::shared_ptr<GPUDrawable>(new GPUDrawable(nativeWindow, sharedContext));
}
GPUDrawable::GPUDrawable(NativeWindow* nativeWindow, EGLContext eglContext)
: nativeWindow(nativeWindow), sharedContext(eglContext) {
updateSize();
}
GPUDrawable::~GPUDrawable() {
OH_NativeWindow_DestroyNativeWindow(nativeWindow);
}
void GPUDrawable::updateSize() {
OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &_height, &_width);
if (window) {
window->invalidSize();
}
}
std::shared_ptr<tgfx::Device> GPUDrawable::getDevice() {
if (_width <= 0 || _height <= 0) {
return nullptr;
}
if (!window) {
window = tgfx::EGLWindow::MakeFrom(reinterpret_cast<EGLNativeWindowType>(nativeWindow),
sharedContext);
}
return window ? window->getDevice() : nullptr;
}
std::shared_ptr<tgfx::Surface> GPUDrawable::onCreateSurface(tgfx::Context* context) {
return window ? window->getSurface(context) : nullptr;
}
void GPUDrawable::onFreeSurface() {
if (window) {
window->freeSurface();
}
}
void GPUDrawable::present(tgfx::Context* context) {
if (window == nullptr) {
return;
}
window->setPresentationTime(currentTimeStamp);
window->present(context);
}
void GPUDrawable::setTimeStamp(int64_t timeStamp) {
currentTimeStamp = timeStamp;
}
} // namespace pag