@@ -16,95 +16,107 @@ namespace flutter {
16
16
17
17
typedef struct {
18
18
Eina_Thread_Queue_Msg head;
19
- int value;
19
+ int event;
20
+ intptr_t baton;
20
21
} Msg;
21
22
22
- static Eina_Thread_Queue* vblank_thread_queue{nullptr };
23
-
24
23
TizenVsyncWaiter::TizenVsyncWaiter (FlutterTizenEngine* engine)
25
24
: engine_(engine) {
26
- if (!CreateTDMVblank ()) {
27
- FT_LOGE (" Failed to create TDM vblank" );
28
- DestroyTDMVblank ();
29
- } else {
30
- vblank_thread_queue = eina_thread_queue_new ();
31
- vblank_thread_ =
32
- ecore_thread_feedback_run (RequestVblankLoop, NULL , VblankLoopFinish,
33
- VblankLoopFinish, this , EINA_TRUE);
34
- }
25
+ vblank_thread_ = ecore_thread_feedback_run (RequestVblankLoop, nullptr ,
26
+ nullptr , nullptr , this , EINA_TRUE);
35
27
}
36
28
37
29
TizenVsyncWaiter::~TizenVsyncWaiter () {
38
- SendMessage (kMessageQuit );
30
+ Send (kMessageQuit , 0 );
39
31
if (vblank_thread_) {
40
32
ecore_thread_cancel (vblank_thread_);
41
33
vblank_thread_ = nullptr ;
42
34
}
43
- DestroyTDMVblank ();
44
35
}
45
36
46
37
void TizenVsyncWaiter::AsyncWaitForVsync (intptr_t baton) {
47
- baton_ = baton;
48
- if (TDMValid ()) {
49
- SendMessage (kMessageRequestVblank );
50
- }
38
+ Send (kMessageRequestVblank , baton);
51
39
}
52
40
53
- void TizenVsyncWaiter::SendMessage (int val ) {
54
- if (!vblank_thread_queue || ! vblank_thread_) {
55
- FT_LOGE (" vblank thread or vblank thread queue not valid" );
41
+ void TizenVsyncWaiter::Send (int event, intptr_t baton ) {
42
+ if (!vblank_thread_ || ecore_thread_check ( vblank_thread_) ) {
43
+ FT_LOGE (" vblank thread not valid" );
56
44
return ;
57
45
}
46
+
47
+ if (!vblank_thread_queue_) {
48
+ FT_LOGE (" vblank thread queue not valid" );
49
+ return ;
50
+ }
51
+
58
52
Msg* msg;
59
53
void * ref;
60
54
msg = static_cast <Msg*>(
61
- eina_thread_queue_send (vblank_thread_queue, sizeof (Msg), &ref));
62
- msg->value = val;
63
- eina_thread_queue_send_done (vblank_thread_queue, ref);
55
+ eina_thread_queue_send (vblank_thread_queue_, sizeof (Msg), &ref));
56
+ msg->event = event;
57
+ msg->baton = baton;
58
+ eina_thread_queue_send_done (vblank_thread_queue_, ref);
64
59
}
65
60
66
61
void TizenVsyncWaiter::RequestVblankLoop (void * data, Ecore_Thread* thread) {
67
62
TizenVsyncWaiter* tizen_vsync_waiter =
68
63
reinterpret_cast <TizenVsyncWaiter*>(data);
69
- void * ref;
70
- Msg* msg;
64
+ TdmClient tdm_client (tizen_vsync_waiter->engine_ );
65
+ if (!tdm_client.IsValid ()) {
66
+ FT_LOGE (" Tdm client not valid" );
67
+ ecore_thread_cancel (thread);
68
+ return ;
69
+ }
70
+ Eina_Thread_Queue* vblank_thread_queue = eina_thread_queue_new ();
71
+ if (!vblank_thread_queue) {
72
+ FT_LOGE (" Vblank thread queue is not valid" );
73
+ ecore_thread_cancel (thread);
74
+ return ;
75
+ }
76
+
77
+ tizen_vsync_waiter->vblank_thread_queue_ = vblank_thread_queue;
71
78
while (!ecore_thread_check (thread)) {
72
- if (!vblank_thread_queue) {
73
- FT_LOGE (" Vblank thread queue is not valid" );
74
- return ;
75
- }
79
+ void * ref;
80
+ Msg* msg;
76
81
msg = static_cast <Msg*>(eina_thread_queue_wait (vblank_thread_queue, &ref));
77
82
if (msg) {
78
83
eina_thread_queue_wait_done (vblank_thread_queue, ref);
79
84
} else {
80
85
FT_LOGE (" Message is null" );
81
86
continue ;
82
87
}
83
- if (msg->value == kMessageQuit ) {
84
- return ;
88
+ if (msg->event == kMessageQuit ) {
89
+ break ;
85
90
}
86
- if (!tizen_vsync_waiter->TDMValid ()) {
87
- FT_LOGE (" TDM not valid" );
88
- return ;
89
- }
90
- tdm_error error = tdm_client_vblank_wait (tizen_vsync_waiter->vblank_ , 1 ,
91
- TdmClientVblankCallback, data);
92
- if (error != TDM_ERROR_NONE) {
93
- FT_LOGE (" tdm_client_vblank_wait error %d" , error);
94
- continue ;
95
- }
96
- tdm_client_handle_events (tizen_vsync_waiter->client_ );
91
+ tdm_client.WaitVblank (msg->baton );
97
92
}
98
- }
99
-
100
- void TizenVsyncWaiter::VblankLoopFinish (void * data, Ecore_Thread* thread) {
101
93
if (vblank_thread_queue) {
102
94
eina_thread_queue_free (vblank_thread_queue);
103
- vblank_thread_queue = nullptr ;
104
95
}
105
96
}
106
97
107
- bool TizenVsyncWaiter::CreateTDMVblank () {
98
+ TdmClient::TdmClient (FlutterTizenEngine* engine) {
99
+ if (!CreateTdm ()) {
100
+ FT_LOGE (" Create tdm client failed" );
101
+ }
102
+ engine_ = engine;
103
+ }
104
+
105
+ TdmClient::~TdmClient () {
106
+ DestroyTdm ();
107
+ }
108
+
109
+ void TdmClient::WaitVblank (intptr_t baton) {
110
+ baton_ = baton;
111
+ tdm_error error = tdm_client_vblank_wait (vblank_, 1 , VblankCallback, this );
112
+ if (error != TDM_ERROR_NONE) {
113
+ FT_LOGE (" tdm client wait vblank error %d" , error);
114
+ return ;
115
+ }
116
+ tdm_client_handle_events (client_);
117
+ }
118
+
119
+ bool TdmClient::CreateTdm () {
108
120
tdm_error ret;
109
121
client_ = tdm_client_create (&ret);
110
122
if (ret != TDM_ERROR_NONE && client_ != NULL ) {
@@ -128,7 +140,7 @@ bool TizenVsyncWaiter::CreateTDMVblank() {
128
140
return true ;
129
141
}
130
142
131
- void TizenVsyncWaiter::DestroyTDMVblank () {
143
+ void TdmClient::DestroyTdm () {
132
144
if (vblank_) {
133
145
tdm_client_vblank_destroy (vblank_);
134
146
vblank_ = nullptr ;
@@ -140,26 +152,24 @@ void TizenVsyncWaiter::DestroyTDMVblank() {
140
152
}
141
153
}
142
154
143
- bool TizenVsyncWaiter::TDMValid () {
155
+ bool TdmClient::IsValid () {
144
156
return vblank_ && client_;
145
157
}
146
158
147
- void TizenVsyncWaiter::TdmClientVblankCallback (tdm_client_vblank* vblank,
148
- tdm_error error,
149
- unsigned int sequence,
150
- unsigned int tv_sec,
151
- unsigned int tv_usec,
152
- void * user_data) {
153
- TizenVsyncWaiter* tizen_vsync_waiter =
154
- reinterpret_cast <TizenVsyncWaiter*>(user_data);
155
- FT_ASSERT (tizen_vsync_waiter != nullptr );
156
- FT_ASSERT (tizen_vsync_waiter->engine_ != nullptr );
159
+ void TdmClient::VblankCallback (tdm_client_vblank* vblank,
160
+ tdm_error error,
161
+ unsigned int sequence,
162
+ unsigned int tv_sec,
163
+ unsigned int tv_usec,
164
+ void * user_data) {
165
+ TdmClient* client = reinterpret_cast <TdmClient*>(user_data);
166
+ FT_ASSERT (client != nullptr );
167
+ FT_ASSERT (client->engine_ != nullptr );
157
168
158
169
uint64_t frame_start_time_nanos = tv_sec * 1e9 + tv_usec * 1e3 ;
159
170
uint64_t frame_target_time_nanos = 16.6 * 1e6 + frame_start_time_nanos;
160
- tizen_vsync_waiter->engine_ ->OnVsync (tizen_vsync_waiter->baton_ ,
161
- frame_start_time_nanos,
162
- frame_target_time_nanos);
171
+ client->engine_ ->OnVsync (client->baton_ , frame_start_time_nanos,
172
+ frame_target_time_nanos);
163
173
}
164
174
165
175
} // namespace flutter
0 commit comments