4
4
5
5
#include " tizen_vsync_waiter.h"
6
6
7
+ #include < Ecore.h>
8
+
7
9
#include " flutter/shell/platform/tizen/logger.h"
10
+ #include " flutter/shell/platform/tizen/tizen_embedder_engine.h"
11
+
12
+ static std::atomic<Ecore_Pipe*> g_vblank_ecore_pipe = nullptr ;
8
13
9
- TizenVsyncWaiter::TizenVsyncWaiter ()
10
- : client_(NULL ),
11
- output_(NULL ),
12
- vblank_(NULL ),
13
- flutter_engine_(nullptr ),
14
- baton_(0 ),
15
- vblank_ecore_pipe_(NULL ) {
16
- if (CreateTDMVblank ()) {
17
- std::thread t (CreateVblankEventLoop, this );
18
- t.join ();
19
- } else {
20
- LoggerE (" CreateVsyncVaiter fail" );
14
+ static const int VBLANK_LOOP_REQUEST = 1 ;
15
+ static const int VBLANK_LOOP_DEL_PIPE = 2 ;
16
+
17
+ static void SendVblankLoopRequest (int event_type) {
18
+ if (ecore_pipe_write (g_vblank_ecore_pipe.load (), &event_type,
19
+ sizeof (event_type)) == EINA_FALSE) {
20
+ LoggerE (" Failed to Send Reqeust [%s]" , event_type == VBLANK_LOOP_REQUEST
21
+ ? " VBLANK_LOOP_REQUEST"
22
+ : " VBLANK_LOOP_DEL_PIPE" );
21
23
}
22
24
}
23
25
24
- void TizenVsyncWaiter::CreateVblankEventLoop (void * data) {
25
- TizenVsyncWaiter* tizen_vsync_waiter =
26
- reinterpret_cast <TizenVsyncWaiter*>(data);
27
- if (!ecore_init ()) {
28
- LoggerE (" ERROR: Cannot init Ecore!" );
26
+ TizenVsyncWaiter::TizenVsyncWaiter (TizenEmbedderEngine* engine)
27
+ : engine_(engine) {
28
+ if (!CreateTDMVblank ()) {
29
+ LoggerE (" Failed to create TDM vblank" );
29
30
return ;
30
31
}
31
- tizen_vsync_waiter->vblank_ecore_pipe_ =
32
- ecore_pipe_add (VblankEventLoopCallback, tizen_vsync_waiter);
33
- LoggerD (" ecore_init successful" );
34
- ecore_main_loop_begin ();
35
- ecore_shutdown ();
36
- }
37
32
38
- void TizenVsyncWaiter::VblankEventLoopCallback (void * data, void * buffer,
39
- unsigned int nbyte) {
40
- TizenVsyncWaiter* tizen_vsync_waiter =
41
- reinterpret_cast <TizenVsyncWaiter*>(data);
42
- int * event_type = reinterpret_cast <int *>(buffer);
43
- if ((*event_type) == VBLANK_LOOP_REQUEST) {
44
- tizen_vsync_waiter->AsyncWaitForVsyncCallback ();
45
- } else if ((*event_type) == VBLANK_LOOP_DEL_PIPE) {
46
- tizen_vsync_waiter->DeleteVblankEventPipe ();
33
+ std::thread t (
34
+ [this ](void * data) {
35
+ if (!ecore_init ()) {
36
+ LoggerE (" Failed to init Ecore" );
37
+ return ;
38
+ }
39
+ Ecore_Pipe* vblank_ecore_pipe = ecore_pipe_add (
40
+ [](void * data, void * buffer, unsigned int nbyte) {
41
+ TizenVsyncWaiter* tizen_vsync_waiter =
42
+ reinterpret_cast <TizenVsyncWaiter*>(data);
43
+ int event_type = *(reinterpret_cast <int *>(buffer));
44
+ if (event_type == VBLANK_LOOP_REQUEST) {
45
+ tizen_vsync_waiter->HandleVblankLoopRequest ();
46
+ } else if (event_type == VBLANK_LOOP_DEL_PIPE) {
47
+ if (g_vblank_ecore_pipe.load ()) {
48
+ ecore_pipe_del (g_vblank_ecore_pipe);
49
+ g_vblank_ecore_pipe = NULL ;
50
+ }
51
+ ecore_main_loop_quit ();
52
+ }
53
+ },
54
+ this );
55
+
56
+ g_vblank_ecore_pipe.store (vblank_ecore_pipe);
57
+ ecore_main_loop_begin ();
58
+ ecore_shutdown ();
59
+ },
60
+ nullptr );
61
+ t.join ();
62
+
63
+ if (g_vblank_ecore_pipe.load () == nullptr ) {
64
+ LoggerE (" Failed to create Ecore Pipe" );
47
65
}
48
66
}
49
67
50
- void TizenVsyncWaiter::AsyncWaitForVsyncCallback () {
51
- tdm_error ret;
52
- ret = tdm_client_vblank_wait (vblank_, 1 , TdmClientVblankCallback, this );
53
- if (ret != TDM_ERROR_NONE) {
54
- LoggerE (" ERROR, ret = %d" , ret);
55
- return ;
68
+ TizenVsyncWaiter::~TizenVsyncWaiter () {
69
+ if (g_vblank_ecore_pipe.load ()) {
70
+ SendVblankLoopRequest (VBLANK_LOOP_DEL_PIPE);
71
+ }
72
+ if (vblank_) {
73
+ tdm_client_vblank_destroy (vblank_);
74
+ }
75
+ if (client_) {
76
+ tdm_client_destroy (client_);
56
77
}
57
- tdm_client_handle_events (client_);
58
78
}
59
79
60
- void TizenVsyncWaiter::DeleteVblankEventPipe () {
61
- if (vblank_ecore_pipe_) {
62
- ecore_pipe_del (vblank_ecore_pipe_);
63
- vblank_ecore_pipe_ = NULL ;
64
- }
65
- ecore_main_loop_quit ();
80
+ void TizenVsyncWaiter::AsyncWaitForVsync (intptr_t baton) {
81
+ baton_ = baton;
82
+ SendVblankLoopRequest (VBLANK_LOOP_REQUEST);
83
+ }
84
+
85
+ bool TizenVsyncWaiter::IsValid () {
86
+ return g_vblank_ecore_pipe.load () && client_ && output_ && vblank_ &&
87
+ engine_->flutter_engine ;
66
88
}
67
89
68
90
bool TizenVsyncWaiter::CreateTDMVblank () {
@@ -86,6 +108,7 @@ bool TizenVsyncWaiter::CreateTDMVblank() {
86
108
}
87
109
88
110
tdm_client_vblank_set_enable_fake (vblank_, 1 );
111
+
89
112
return true ;
90
113
}
91
114
@@ -94,57 +117,20 @@ void TizenVsyncWaiter::TdmClientVblankCallback(
94
117
unsigned int tv_sec, unsigned int tv_usec, void * user_data) {
95
118
TizenVsyncWaiter* tizen_vsync_waiter =
96
119
reinterpret_cast <TizenVsyncWaiter*>(user_data);
97
- if (tizen_vsync_waiter == nullptr ) {
98
- LoggerE (" tizen_vsync_waiter is null" );
99
- return ;
100
- }
101
- if (tizen_vsync_waiter->flutter_engine_ == nullptr ) {
102
- LoggerI (" flutter engine creation is not completed" );
103
- return ;
104
- }
120
+
105
121
uint64_t frame_start_time_nanos = tv_sec * 1e9 + tv_usec * 1e3 ;
106
122
uint64_t frame_target_time_nanos = 16.6 * 1e6 + frame_start_time_nanos;
107
- FlutterEngineOnVsync (tizen_vsync_waiter->flutter_engine_ ,
123
+ FlutterEngineOnVsync (tizen_vsync_waiter->engine_ -> flutter_engine ,
108
124
tizen_vsync_waiter->baton_ , frame_start_time_nanos,
109
125
frame_target_time_nanos);
110
126
}
111
127
112
- bool TizenVsyncWaiter::AsyncWaitForVsync () {
113
- if (nullptr == flutter_engine_) {
114
- LoggerD (" flutter_engine_ is null" );
115
- return false ;
116
- }
117
- if (vblank_ecore_pipe_) {
118
- int event_type = VBLANK_LOOP_REQUEST;
119
- ecore_pipe_write (vblank_ecore_pipe_, &event_type, sizeof (event_type));
120
- }
121
- return true ;
122
- }
123
-
124
- TizenVsyncWaiter::~TizenVsyncWaiter () {
125
- if (vblank_ecore_pipe_) {
126
- int event_type = VBLANK_LOOP_DEL_PIPE;
127
- ecore_pipe_write (vblank_ecore_pipe_, &event_type, sizeof (event_type));
128
- }
129
- if (vblank_) {
130
- tdm_client_vblank_destroy (vblank_);
131
- }
132
- if (client_) {
133
- tdm_client_destroy (client_);
134
- }
135
- }
136
-
137
- void TizenVsyncWaiter::AsyncWaitForVsync (intptr_t baton) {
138
- baton_ = baton;
139
- AsyncWaitForVsync ();
140
- }
141
-
142
- void TizenVsyncWaiter::AsyncWaitForRunEngineSuccess (
143
- FLUTTER_API_SYMBOL (FlutterEngine) flutter_engine) {
144
- flutter_engine_ = flutter_engine;
145
- if (baton_ == 0 ) {
146
- LoggerD (" baton_ == 0" );
128
+ void TizenVsyncWaiter::HandleVblankLoopRequest () {
129
+ tdm_error ret;
130
+ ret = tdm_client_vblank_wait (vblank_, 1 , TdmClientVblankCallback, this );
131
+ if (ret != TDM_ERROR_NONE) {
132
+ LoggerE (" ERROR, ret = %d" , ret);
147
133
return ;
148
134
}
149
- AsyncWaitForVsync ( );
135
+ tdm_client_handle_events (client_ );
150
136
}
0 commit comments