25692b3dba14326e763e9e453777fe4b1d59858f
[platform/core/uifw/libtdm.git] / src / tdm_hwc_window.c
1 /**************************************************************************
2  *
3  * libtdm
4  *
5  * Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
6  *
7  * Contact: Eunchul Kim <chulspro.kim@samsung.com>,
8  *          JinYoung Jeon <jy0.jeon@samsung.com>,
9  *          Taeheon Kim <th908.kim@samsung.com>,
10  *          YoungJun Cho <yj44.cho@samsung.com>,
11  *          SooChan Lim <sc1.lim@samsung.com>,
12  *          Boram Park <boram1288.park@samsung.com>
13  *
14  * Permission is hereby granted, free of charge, to any person obtaining a
15  * copy of this software and associated documentation files (the
16  * "Software"), to deal in the Software without restriction, including
17  * without limitation the rights to use, copy, modify, merge, publish,
18  * distribute, sub license, and/or sell copies of the Software, and to
19  * permit persons to whom the Software is furnished to do so, subject to
20  * the following conditions:
21  *
22  * The above copyright notice and this permission notice (including the
23  * next paragraph) shall be included in all copies or substantial portions
24  * of the Software.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
29  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
30  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33  *
34 **************************************************************************/
35
36 #ifdef HAVE_CONFIG_H
37 #include "config.h"
38 #endif
39
40 #include "tdm_private.h"
41
42 /* LCOV_EXCL_START */
43
44 #define COUNT_MAX   10
45
46 #define HWC_WINDOW_FUNC_ENTRY() \
47         tdm_private_display *private_display; \
48         tdm_private_output *private_output; \
49         tdm_private_hwc_window *private_hwc_window; \
50         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
51         TDM_RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER); \
52         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
53         private_output = private_hwc_window->private_output; \
54         private_display = private_output->private_display
55
56 #define HWC_WINDOW_FUNC_ENTRY_ERROR() \
57         tdm_private_display *private_display; \
58         tdm_private_output *private_output; \
59         tdm_private_hwc_window *private_hwc_window; \
60         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
61         TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
62         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
63         private_output = private_hwc_window->private_output; \
64         private_display = private_output->private_display
65
66 #define HWC_WINDOW_FUNC_ENTRY_VOID_RETURN() \
67         tdm_private_display *private_display; \
68         tdm_private_output *private_output; \
69         tdm_private_hwc_window *private_hwc_window; \
70         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
71         TDM_RETURN_IF_FAIL(hwc_window != NULL); \
72         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
73         private_output = private_hwc_window->private_output; \
74         private_display = private_output->private_display
75
76 tbm_surface_queue_h
77 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
78 {
79         tdm_private_module *private_module;
80         tdm_func_hwc_window *func_hwc_window = NULL;
81         tbm_surface_queue_h queue = NULL;
82
83         HWC_WINDOW_FUNC_ENTRY_ERROR();
84
85         _pthread_mutex_lock(&private_display->lock);
86
87         private_module = private_output->private_module;
88         func_hwc_window = &private_module->func_hwc_window;
89
90         if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
91                 _pthread_mutex_unlock(&private_display->lock);
92                 TDM_WRN("not implemented!!");
93                 if (error)
94                         *error = TDM_ERROR_NOT_IMPLEMENTED;
95                 return NULL;
96         }
97
98         queue = func_hwc_window->hwc_window_get_tbm_buffer_queue(private_hwc_window->hwc_window_backend, error);
99
100         _pthread_mutex_unlock(&private_display->lock);
101
102         return queue;
103 }
104
105 EXTERN tdm_error
106 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
107                                                                         tdm_hwc_window_composition composition_type)
108 {
109         tdm_private_module *private_module;
110         tdm_func_hwc_window *func_hwc_window = NULL;
111
112         HWC_WINDOW_FUNC_ENTRY();
113         TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER);
114         TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
115
116         _pthread_mutex_lock(&private_display->lock);
117
118         private_module = private_output->private_module;
119         func_hwc_window = &private_module->func_hwc_window;
120
121         if (!func_hwc_window->hwc_window_set_composition_type) {
122                 _pthread_mutex_unlock(&private_display->lock);
123                 TDM_WRN("not implemented!!");
124                 return TDM_ERROR_NOT_IMPLEMENTED;
125         }
126
127         ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
128
129         _pthread_mutex_unlock(&private_display->lock);
130
131         return ret;
132 }
133
134 EXTERN tdm_error
135 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
136 {
137         tdm_private_module *private_module;
138         tdm_func_hwc_window *func_hwc_window = NULL;
139
140         HWC_WINDOW_FUNC_ENTRY();
141         if (damage.num_rects > 0)
142                 TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, TDM_ERROR_INVALID_PARAMETER);
143
144         _pthread_mutex_lock(&private_display->lock);
145
146         private_module = private_output->private_module;
147         func_hwc_window = &private_module->func_hwc_window;
148
149         if (!func_hwc_window->hwc_window_set_buffer_damage) {
150                 _pthread_mutex_unlock(&private_display->lock);
151                 TDM_WRN("not implemented!!");
152                 return TDM_ERROR_NOT_IMPLEMENTED;
153         }
154
155         ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
156
157         _pthread_mutex_unlock(&private_display->lock);
158
159         return ret;
160 }
161
162
163 EXTERN tdm_error
164 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
165 {
166         tdm_private_module *private_module;
167         tdm_func_hwc_window *func_hwc_window = NULL;
168         char fmtstr[128];
169
170         HWC_WINDOW_FUNC_ENTRY();
171
172         TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
173
174         _pthread_mutex_lock(&private_display->lock);
175
176         private_module = private_output->private_module;
177         func_hwc_window = &private_module->func_hwc_window;
178
179         if (!func_hwc_window->hwc_window_set_info) {
180                 _pthread_mutex_unlock(&private_display->lock);
181                 TDM_WRN("not implemented!!");
182                 return TDM_ERROR_NOT_IMPLEMENTED;
183         }
184
185         if (info->src_config.format)
186                 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
187         else
188                 snprintf(fmtstr, 128, "NONE");
189
190         TDM_INFO("hwc_window(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)",
191                          private_hwc_window, info->src_config.size.h, info->src_config.size.v,
192                          info->src_config.pos.x, info->src_config.pos.y,
193                          info->src_config.pos.w, info->src_config.pos.h,
194                          fmtstr,
195                          info->dst_pos.x, info->dst_pos.y,
196                          info->dst_pos.w, info->dst_pos.h,
197                          info->transform);
198
199         ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
200
201         _pthread_mutex_unlock(&private_display->lock);
202
203         return ret;
204 }
205
206 EXTERN tdm_error
207 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
208 {
209         tdm_private_module *private_module;
210         tdm_func_hwc_window *func_hwc_window;
211
212         HWC_WINDOW_FUNC_ENTRY();
213
214         _pthread_mutex_lock(&private_display->lock);
215
216         if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
217                 char str[TDM_PATH_LEN];
218                 static int i;
219                 snprintf(str, TDM_PATH_LEN, "window_%d_%03d", private_output->index, i++);
220                 tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str);
221         }
222
223         private_module = private_output->private_module;
224         func_hwc_window = &private_module->func_hwc_window;
225
226         if (!func_hwc_window->hwc_window_set_buffer) {
227                 _pthread_mutex_unlock(&private_display->lock);
228                 TDM_WRN("not implemented!!");
229                 return TDM_ERROR_NOT_IMPLEMENTED;
230         }
231
232         ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
233
234         _pthread_mutex_unlock(&private_display->lock);
235
236         return ret;
237 }
238
239 EXTERN tdm_error
240 tdm_hwc_window_unset_buffer(tdm_hwc_window *hwc_window)
241 {
242         tdm_private_module *private_module;
243         tdm_func_hwc_window *func_hwc_window;
244
245         HWC_WINDOW_FUNC_ENTRY();
246
247         _pthread_mutex_lock(&private_display->lock);
248
249         private_module = private_output->private_module;
250         func_hwc_window = &private_module->func_hwc_window;
251
252         if (!func_hwc_window->hwc_window_unset_buffer) {
253                 _pthread_mutex_unlock(&private_display->lock);
254                 TDM_ERR("not implemented!!");
255                 return TDM_ERROR_NOT_IMPLEMENTED;
256         }
257
258         ret = func_hwc_window->hwc_window_unset_buffer(private_hwc_window->hwc_window_backend);
259
260         _pthread_mutex_unlock(&private_display->lock);
261
262         return ret;
263 }
264
265 INTERN tdm_hwc_window *
266 tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
267                                                                    tdm_error *error)
268 {
269         tdm_private_display *private_display = private_output->private_display;
270         tdm_private_module *private_module = private_output->private_module;
271         tdm_func_output *func_output = &private_module->func_output;
272         tdm_private_hwc_window *private_hwc_window = NULL;
273         tdm_hwc_window *hwc_window_backend = NULL;
274         tdm_error ret = TDM_ERROR_NONE;
275
276         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
277
278         if (!is_video) {
279                 if (!func_output->output_hwc_create_window) {
280                         if (error)
281                                 *error = TDM_ERROR_BAD_MODULE;
282                         return NULL;
283                 }
284
285                 hwc_window_backend = func_output->output_hwc_create_window(
286                                                  private_output->output_backend, &ret);
287                 if (ret != TDM_ERROR_NONE) {
288                         if (error)
289                                 *error = ret;
290                         return NULL;
291                 }
292         } else {
293                 if (!func_output->output_hwc_create_video_window) {
294                         if (error)
295                                 *error = TDM_ERROR_NOT_IMPLEMENTED;
296                         return NULL;
297                 }
298
299                 hwc_window_backend = func_output->output_hwc_create_video_window(
300                                                  private_output->output_backend, &ret);
301                 if (ret != TDM_ERROR_NONE) {
302                         if (error)
303                                 *error = ret;
304                         return NULL;
305                 }
306         }
307
308         private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window));
309         if (!private_hwc_window) {
310                 TDM_ERR("failed: alloc memory");
311                 func_output->output_hwc_destroy_window(private_output->output_backend, hwc_window_backend);
312                 if (error)
313                         *error = TDM_ERROR_OUT_OF_MEMORY;
314                 return NULL;
315         }
316
317         LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
318
319         private_hwc_window->private_display = private_display;
320         private_hwc_window->private_output = private_output;
321         private_hwc_window->hwc_window_backend = hwc_window_backend;
322
323         TDM_DBG("hwc_window(%p) create", private_hwc_window);
324
325         if (error)
326                 *error = TDM_ERROR_NONE;
327
328         return private_hwc_window;
329 }
330
331 INTERN tdm_error
332 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
333 {
334         tdm_private_output *private_output;
335         tdm_private_module *private_module;
336         tdm_func_output *func_output;
337
338         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
339
340         if (!private_hwc_window)
341                 return TDM_ERROR_OPERATION_FAILED;
342
343         private_output = private_hwc_window->private_output;
344         private_module = private_output->private_module;
345
346         LIST_DEL(&private_hwc_window->link);
347
348         func_output = &private_module->func_output;
349         func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
350
351         free(private_hwc_window);
352         return TDM_ERROR_NONE;
353 }
354
355 EXTERN tdm_error
356 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
357 {
358         tdm_private_module *private_module;
359         tdm_func_hwc_window *func_hwc_window = NULL;
360
361         HWC_WINDOW_FUNC_ENTRY();
362
363         _pthread_mutex_lock(&private_display->lock);
364
365         private_module = private_output->private_module;
366         func_hwc_window = &private_module->func_hwc_window;
367
368         if (!func_hwc_window->hwc_window_set_flags) {
369                 _pthread_mutex_unlock(&private_display->lock);
370                 TDM_WRN("not implemented!!");
371                 return TDM_ERROR_NOT_IMPLEMENTED;
372         }
373
374         ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
375
376         _pthread_mutex_unlock(&private_display->lock);
377
378         return ret;
379 }
380
381 EXTERN tdm_error
382 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
383 {
384         tdm_private_module *private_module;
385         tdm_func_hwc_window *func_hwc_window = NULL;
386
387         HWC_WINDOW_FUNC_ENTRY();
388
389         _pthread_mutex_lock(&private_display->lock);
390
391         private_module = private_output->private_module;
392         func_hwc_window = &private_module->func_hwc_window;
393
394         if (!func_hwc_window->hwc_window_unset_flags) {
395                 _pthread_mutex_unlock(&private_display->lock);
396                 TDM_WRN("not implemented!!");
397                 return TDM_ERROR_NOT_IMPLEMENTED;
398         }
399
400         ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
401
402         _pthread_mutex_unlock(&private_display->lock);
403
404         return ret;
405 }
406
407 static void
408 _tdm_hwc_window_layer_commit_handler(tdm_layer *layer, unsigned int sequence,
409                                                                                  unsigned int tv_sec, unsigned int tv_usec,
410                                                                                  void *user_data)
411 {
412         tdm_private_hwc_window_commit_handler *hwc_window_commit_handler = (tdm_private_hwc_window_commit_handler *)user_data;
413         tdm_hwc_window_commit_handler func = hwc_window_commit_handler->func;
414         tdm_hwc_window *hwc_window = (tdm_hwc_window *)hwc_window_commit_handler->private_hwc_window;
415         void *data = hwc_window_commit_handler->user_data;
416
417         func(hwc_window, sequence, tv_sec, tv_usec, data);
418
419         free(hwc_window_commit_handler);
420 }
421
422 tdm_error
423 tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler func, void *user_data)
424 {
425         tdm_private_module *private_module;
426         tdm_func_hwc_window *func_hwc_window = NULL;
427         tdm_private_hwc_window_commit_handler *hwc_window_commit_handler;
428         tdm_layer *layer = NULL;
429         tdm_private_layer *private_layer;
430         tdm_info_layer *info_layer;
431         tdm_hwc_window_info window_info;
432         tbm_surface_h buffer;
433
434         HWC_WINDOW_FUNC_ENTRY();
435
436         _pthread_mutex_lock(&private_display->lock);
437
438         private_module = private_output->private_module;
439         func_hwc_window = &private_module->func_hwc_window;
440
441         if (!func_hwc_window->hwc_window_get_layer) {
442                 _pthread_mutex_unlock(&private_display->lock);
443                 TDM_ERR("not implemented!!");
444                 return TDM_ERROR_NOT_IMPLEMENTED;
445         }
446
447         layer = func_hwc_window->hwc_window_get_layer(private_hwc_window->hwc_window_backend,
448                                                                                                                    &ret);
449         if (!layer) {
450                 _pthread_mutex_unlock(&private_display->lock);
451                 TDM_ERR("no assigned layer!!");
452                 return TDM_ERROR_INVALID_PARAMETER;
453         }
454
455         private_layer = (tdm_private_layer*)layer;
456
457         buffer = func_hwc_window->hwc_window_get_buffer(private_hwc_window->hwc_window_backend,
458                                                                                                                    &ret);
459         if (buffer)
460                 ret = tdm_layer_set_buffer_internal(private_layer, buffer);
461         else
462                 ret = tdm_layer_unset_buffer_internal(private_layer);
463         if (ret != TDM_ERROR_NONE) {
464                 TDM_ERR("failed: layer set buffer(window)");
465                 _pthread_mutex_unlock(&private_display->lock);
466                 return ret;
467         }
468
469         ret = func_hwc_window->hwc_window_get_info(private_hwc_window->hwc_window_backend,
470                                                                                                                    &window_info);
471         if (ret != TDM_ERROR_NONE) {
472                 TDM_ERR("failed: commit layer(window)");
473                 _pthread_mutex_unlock(&private_display->lock);
474                 return ret;
475         }
476
477         info_layer = (tdm_info_layer *)&window_info;
478         ret = tdm_layer_set_info_internal(private_layer, info_layer);
479         if (ret != TDM_ERROR_NONE) {
480                 TDM_ERR("failed: layer set info(window)");
481                 _pthread_mutex_unlock(&private_display->lock);
482                 return ret;
483         }
484
485         hwc_window_commit_handler = calloc(1, sizeof(tdm_private_hwc_window_commit_handler));
486         if (!hwc_window_commit_handler) {
487                 TDM_ERR("failed: alloc memory");
488                 _pthread_mutex_unlock(&private_display->lock);
489                 return TDM_ERROR_OUT_OF_MEMORY;
490         }
491
492         hwc_window_commit_handler->private_hwc_window = private_hwc_window;
493         hwc_window_commit_handler->func = func;
494         hwc_window_commit_handler->user_data = user_data;
495
496         ret = tdm_layer_commit_internal(private_layer, _tdm_hwc_window_layer_commit_handler, hwc_window_commit_handler);
497         if (ret != TDM_ERROR_NONE) {
498                 TDM_ERR("failed: commit layer(window)");
499                 free(hwc_window_commit_handler);
500                 _pthread_mutex_unlock(&private_display->lock);
501                 return ret;
502         }
503
504         _pthread_mutex_unlock(&private_display->lock);
505
506         return ret;
507 }
508
509 EXTERN tdm_error
510 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
511                                                                         tdm_hwc_window_video_capability *video_capability)
512 {
513         tdm_private_module *private_module;
514         tdm_func_hwc_window *func_hwc_window = NULL;
515
516         HWC_WINDOW_FUNC_ENTRY();
517
518         TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
519
520         _pthread_mutex_lock(&private_display->lock);
521
522         private_module = private_output->private_module;
523         func_hwc_window = &private_module->func_hwc_window;
524
525         if (!func_hwc_window->hwc_window_video_get_capability) {
526                 _pthread_mutex_unlock(&private_display->lock);
527                 TDM_WRN("not implemented!!");
528                 return TDM_ERROR_NOT_IMPLEMENTED;
529         }
530
531         ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
532                                                                                                                    video_capability);
533
534         _pthread_mutex_unlock(&private_display->lock);
535
536         return ret;
537 }
538
539 EXTERN tdm_error
540 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
541                                                                                           const tdm_prop **props, int *count)
542 {
543         tdm_private_module *private_module;
544         tdm_func_hwc_window *func_hwc_window = NULL;
545
546         HWC_WINDOW_FUNC_ENTRY();
547
548         TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
549         TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
550
551         _pthread_mutex_lock(&private_display->lock);
552
553         private_module = private_output->private_module;
554         func_hwc_window = &private_module->func_hwc_window;
555
556         if (!func_hwc_window->hwc_window_video_get_available_properties) {
557                 _pthread_mutex_unlock(&private_display->lock);
558                 TDM_WRN("not implemented!!");
559                 return TDM_ERROR_NOT_IMPLEMENTED;
560         }
561
562         ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
563                                                                                                                                          props, count);
564
565         _pthread_mutex_unlock(&private_display->lock);
566
567         return ret;
568 }
569
570 EXTERN tdm_error
571 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
572                                                                         unsigned int id, tdm_value *value)
573 {
574         tdm_private_module *private_module;
575         tdm_func_hwc_window *func_hwc_window = NULL;
576
577         HWC_WINDOW_FUNC_ENTRY();
578
579         TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
580
581         _pthread_mutex_lock(&private_display->lock);
582
583         private_module = private_output->private_module;
584         func_hwc_window = &private_module->func_hwc_window;
585
586         if (!func_hwc_window->hwc_window_video_get_property) {
587                 _pthread_mutex_unlock(&private_display->lock);
588                 TDM_WRN("not implemented!!");
589                 return TDM_ERROR_NOT_IMPLEMENTED;
590         }
591
592         ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
593                                                                                                                  id, value);
594
595         _pthread_mutex_unlock(&private_display->lock);
596
597         return ret;
598 }
599
600 EXTERN tdm_error
601 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
602                                                                         unsigned int id, tdm_value value)
603 {
604         tdm_private_module *private_module;
605         tdm_func_hwc_window *func_hwc_window = NULL;
606
607         HWC_WINDOW_FUNC_ENTRY();
608
609         _pthread_mutex_lock(&private_display->lock);
610
611         private_module = private_output->private_module;
612         func_hwc_window = &private_module->func_hwc_window;
613
614         if (!func_hwc_window->hwc_window_video_set_property) {
615                 _pthread_mutex_unlock(&private_display->lock);
616                 TDM_WRN("not implemented!!");
617                 return TDM_ERROR_NOT_IMPLEMENTED;
618         }
619
620         ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
621                                                                                                                  id, value);
622
623         _pthread_mutex_unlock(&private_display->lock);
624
625         return ret;
626 }
627 /* LCOV_EXCL_STOP */