tizen 2.4 release
[sdk/emulator-yagl.git] / EGL / yagl_onscreen_image_tizen_sfc.c
1 /*
2  * YaGL
3  *
4  * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact :
7  * Vasily Ulyanov <v.ulyanov@samsung.com>
8  * Jinhyung Jo <jinhyung.jo@samsung.com>
9  * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a copy
12  * of this software and associated documentation files (the "Software"), to deal
13  * in the Software without restriction, including without limitation the rights
14  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15  * copies of the Software, and to permit persons to whom the Software is
16  * furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included in
19  * all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27  * THE SOFTWARE.
28  *
29  * Contributors:
30  * - S-Core Co., Ltd
31  *
32  */
33
34 #include "yagl_onscreen_image_tizen_sfc.h"
35 #include "yagl_display.h"
36 #include "yagl_log.h"
37 #include "yagl_malloc.h"
38 #include "yagl_host_egl_calls.h"
39 #include "yagl_egl_state.h"
40 #include "yagl_state.h"
41 #include "yagl_client_interface.h"
42 #include "yagl_client_image.h"
43 #include "vigs.h"
44 #include <tbm_bufmgr.h>
45 #include <tbm_bufmgr_backend.h>
46 #include <tbm_surface.h>
47 #include <tbm_surface_internal.h>
48
49 static void yagl_onscreen_image_tizen_sfc_update(struct yagl_image *image)
50 {
51 }
52
53 static void yagl_onscreen_image_tizen_sfc_destroy(struct yagl_ref *ref)
54 {
55     struct yagl_onscreen_image_tizen_sfc *image = (struct yagl_onscreen_image_tizen_sfc *)ref;
56
57     vigs_drm_gem_unref(&image->drm_sfc->gem);
58
59     yagl_image_cleanup(&image->base);
60
61     yagl_free(image);
62 }
63
64
65 struct yagl_onscreen_image_tizen_sfc
66     *yagl_onscreen_image_tizen_sfc_create(struct yagl_display *dpy,
67                                           EGLClientBuffer buffer,
68                                           struct yagl_client_interface *iface)
69 {
70     EGLint error = 0;
71     yagl_object_name tex_global_name = yagl_get_global_name();
72     struct yagl_client_image *client_image;
73     struct yagl_onscreen_image_tizen_sfc *image;
74     struct vigs_drm_surface *drm_sfc;
75     tbm_surface_h sfc;
76     tbm_bo bo;
77
78     image = yagl_malloc0(sizeof(*image));
79
80     sfc = (tbm_surface_h)buffer;
81     bo = tbm_surface_internal_get_bo(sfc, 0);
82     drm_sfc = bo ? tbm_backend_get_bo_priv(bo) : NULL;
83
84     if (!drm_sfc || (tbm_surface_internal_get_num_bos(sfc) != 1)) {
85         yagl_set_error(EGL_BAD_PARAMETER);
86         goto fail;
87     }
88
89     vigs_drm_gem_ref(&drm_sfc->gem);
90
91     if (!yagl_host_eglCreateImageYAGL(tex_global_name,
92                                       dpy->host_dpy,
93                                       drm_sfc->id,
94                                       &error)) {
95         yagl_set_error(error);
96         goto fail;
97     }
98
99     client_image = iface->create_image(iface, tex_global_name);
100
101     yagl_image_init(&image->base,
102                     &yagl_onscreen_image_tizen_sfc_destroy,
103                     dpy,
104                     (EGLImageKHR)drm_sfc->gem.name,
105                     client_image);
106
107     yagl_client_image_release(client_image);
108
109     image->base.update = &yagl_onscreen_image_tizen_sfc_update;
110     image->drm_sfc = drm_sfc;
111
112     return image;
113
114 fail:
115     if (drm_sfc) {
116         vigs_drm_gem_unref(&drm_sfc->gem);
117     }
118
119     yagl_free(image);
120
121     return NULL;
122 }