diff options
Diffstat (limited to 'recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch')
-rw-r--r-- | recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch b/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch new file mode 100644 index 0000000..933f279 --- /dev/null +++ b/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch | |||
@@ -0,0 +1,208 @@ | |||
1 | From 0a64dc61d3d7db69389157ae757203b4b3afdbfa Mon Sep 17 00:00:00 2001 | ||
2 | From: Dom Cobley <dc4@broadcom.com> | ||
3 | Date: Tue, 9 Jul 2013 09:26:26 -0400 | ||
4 | Subject: [PATCH 01/16] Allow applications to set next resource handle | ||
5 | |||
6 | This patch adds provisions in userland to | ||
7 | let apps callers set the next rendereing dispmanx resource. | ||
8 | It's useful for implementing, say, a buffer carousel. | ||
9 | --- | ||
10 | interface/khronos/common/khrn_client_rpc.h | 2 ++ | ||
11 | interface/khronos/common/khrn_int_ids.h | 2 ++ | ||
12 | interface/khronos/egl/egl_client.c | 30 +++++++++++++++++++++++++++--- | ||
13 | interface/khronos/egl/egl_client_surface.c | 24 +++++++++++++++++++++++- | ||
14 | interface/khronos/egl/egl_client_surface.h | 3 ++- | ||
15 | interface/khronos/egl/egl_int_impl.h | 5 +++-- | ||
16 | 6 files changed, 59 insertions(+), 7 deletions(-) | ||
17 | |||
18 | diff --git a/interface/khronos/common/khrn_client_rpc.h b/interface/khronos/common/khrn_client_rpc.h | ||
19 | index dc4351d..10ea060 100644 | ||
20 | --- a/interface/khronos/common/khrn_client_rpc.h | ||
21 | +++ b/interface/khronos/common/khrn_client_rpc.h | ||
22 | @@ -685,6 +685,7 @@ static INLINE void rpc_call12_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id | ||
23 | static INLINE void rpc_call13_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } | ||
24 | static INLINE void rpc_call14_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } | ||
25 | static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } | ||
26 | +static INLINE void rpc_call16_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, uint32_t p14, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } | ||
27 | #endif | ||
28 | |||
29 | #define RPC_CALL1_OUT_CTRL(fn, thread, id, out) rpc_call1_out_ctrl(thread, id, out) | ||
30 | @@ -702,6 +703,7 @@ static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id | ||
31 | #define RPC_CALL13_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) rpc_call13_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) | ||
32 | #define RPC_CALL14_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) rpc_call14_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) | ||
33 | #define RPC_CALL15_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) rpc_call15_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) | ||
34 | +#define RPC_CALL16_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) rpc_call16_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) | ||
35 | |||
36 | # if !defined(__SYMBIAN32__) //use functions defined in khrpc.cpp | ||
37 | static INLINE uint32_t rpc_call1_out_ctrl_res(CLIENT_THREAD_STATE_T *thread,uint32_t id, void *out) { uint32_t res; rpc_begin(thread); RPC_CALL(thread, id); res = rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_RES | RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); return res; } | ||
38 | diff --git a/interface/khronos/common/khrn_int_ids.h b/interface/khronos/common/khrn_int_ids.h | ||
39 | index 8378f4a..ec961e0 100644 | ||
40 | --- a/interface/khronos/common/khrn_int_ids.h | ||
41 | +++ b/interface/khronos/common/khrn_int_ids.h | ||
42 | @@ -367,6 +367,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
43 | */ | ||
44 | |||
45 | #define EGLINTCREATESURFACE_ID 0x4000 | ||
46 | +#define EGLINTCREATESURFACE_ID_V2 0x4100 | ||
47 | #define EGLINTCREATEGLES11_ID 0x4001 | ||
48 | #define EGLINTCREATEGLES20_ID 0x4002 | ||
49 | #define EGLINTCREATEVG_ID 0x4003 | ||
50 | @@ -377,6 +378,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
51 | #define EGLINTMAKECURRENT_ID 0x4008 | ||
52 | #define EGLINTFLUSHANDWAIT_ID 0x4009 | ||
53 | #define EGLINTSWAPBUFFERS_ID 0x400a | ||
54 | +#define EGLINTSWAPBUFFERS_ID_V2 0x410a | ||
55 | #define EGLINTSELECTMIPMAP_ID 0x400b | ||
56 | #define EGLINTFLUSH_ID 0x400c | ||
57 | #define EGLINTGETCOLORDATA_ID 0x400d | ||
58 | diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c | ||
59 | index 9d617c8..b8bb374 100644 | ||
60 | --- a/interface/khronos/egl/egl_client.c | ||
61 | +++ b/interface/khronos/egl/egl_client.c | ||
62 | @@ -162,6 +162,17 @@ static void egl_current_release(CLIENT_PROCESS_STATE_T *process, EGL_CURRENT_T * | ||
63 | void egl_gl_flush_callback(bool wait); | ||
64 | void egl_vg_flush_callback(bool wait); | ||
65 | |||
66 | +#include "interface/vmcs_host/vc_dispmanx_types.h" | ||
67 | +/**HACKHACK - give us the ability to inject a DispmanX | ||
68 | + * resource handle into the CreateWindowSurface and | ||
69 | + * SwapBuffers calls */ | ||
70 | +static DISPMANX_RESOURCE_HANDLE_T next_resource_handle; | ||
71 | + | ||
72 | +EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle) | ||
73 | +{ | ||
74 | + next_resource_handle = handle; | ||
75 | +} | ||
76 | + | ||
77 | /* | ||
78 | TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate) | ||
79 | Also affects global image (and possibly others?) | ||
80 | @@ -644,7 +655,8 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c | ||
81 | false, | ||
82 | EGL_NO_TEXTURE, | ||
83 | EGL_NO_TEXTURE, | ||
84 | - 0, 0); | ||
85 | + 0, 0, | ||
86 | + next_resource_handle); | ||
87 | |||
88 | if (surface) { | ||
89 | if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { | ||
90 | @@ -889,7 +901,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig | ||
91 | mipmap_texture, | ||
92 | texture_format, | ||
93 | texture_target, | ||
94 | - 0, 0); | ||
95 | + 0, 0, 0); | ||
96 | |||
97 | if (surface) { | ||
98 | if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { | ||
99 | @@ -1031,7 +1043,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c | ||
100 | false, | ||
101 | EGL_NO_TEXTURE, | ||
102 | EGL_NO_TEXTURE, | ||
103 | - pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle); | ||
104 | + pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0); | ||
105 | |||
106 | if (surface) { | ||
107 | if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { | ||
108 | @@ -2303,6 +2315,18 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) | ||
109 | |||
110 | vcos_log_trace("eglSwapBuffers server call"); | ||
111 | |||
112 | + if (next_resource_handle) | ||
113 | + RPC_CALL7(eglIntSwapBuffers_impl, | ||
114 | + thread, | ||
115 | + EGLINTSWAPBUFFERS_ID_V2, | ||
116 | + RPC_UINT(surface->serverbuffer), | ||
117 | + RPC_UINT(surface->width), | ||
118 | + RPC_UINT(surface->height), | ||
119 | + RPC_UINT(surface->internal_handle), | ||
120 | + RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), | ||
121 | + RPC_UINT(khrn_platform_get_window_position(surface->win)), | ||
122 | + RPC_INT(next_resource_handle)); | ||
123 | + else | ||
124 | RPC_CALL6(eglIntSwapBuffers_impl, | ||
125 | thread, | ||
126 | EGLINTSWAPBUFFERS_ID, | ||
127 | diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c | ||
128 | index 6846dfa..128325e 100644 | ||
129 | --- a/interface/khronos/egl/egl_client_surface.c | ||
130 | +++ b/interface/khronos/egl/egl_client_surface.c | ||
131 | @@ -314,7 +314,8 @@ EGL_SURFACE_T *egl_surface_create( | ||
132 | EGLenum texture_format, | ||
133 | EGLenum texture_target, | ||
134 | EGLNativePixmapType pixmap, | ||
135 | - const uint32_t *pixmap_server_handle) | ||
136 | + const uint32_t *pixmap_server_handle, | ||
137 | + DISPMANX_RESOURCE_HANDLE_T next_resource_handle) | ||
138 | { | ||
139 | KHRN_IMAGE_FORMAT_T color; | ||
140 | KHRN_IMAGE_FORMAT_T depth; | ||
141 | @@ -473,6 +474,27 @@ EGL_SURFACE_T *egl_surface_create( | ||
142 | #endif | ||
143 | uint32_t results[3]; | ||
144 | |||
145 | + if (next_resource_handle) | ||
146 | + RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl, | ||
147 | + thread, | ||
148 | + EGLINTCREATESURFACE_ID_V2, | ||
149 | + RPC_UINT(serverwin), | ||
150 | + RPC_UINT(buffers), | ||
151 | + RPC_UINT(width), | ||
152 | + RPC_UINT(height), | ||
153 | + RPC_UINT(color), | ||
154 | + RPC_UINT(depth), | ||
155 | + RPC_UINT(mask), | ||
156 | + RPC_UINT(multi), | ||
157 | + RPC_UINT(largest_pbuffer), | ||
158 | + RPC_UINT(mipmap_texture), | ||
159 | + RPC_UINT(config_depth_bits), | ||
160 | + RPC_UINT(config_stencil_bits), | ||
161 | + RPC_UINT(sem_name), | ||
162 | + RPC_UINT(type), | ||
163 | + RPC_INT(next_resource_handle), | ||
164 | + results); | ||
165 | + else | ||
166 | RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl, | ||
167 | thread, | ||
168 | EGLINTCREATESURFACE_ID, | ||
169 | diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h | ||
170 | index c99d44c..b5bf70a 100644 | ||
171 | --- a/interface/khronos/egl/egl_client_surface.h | ||
172 | +++ b/interface/khronos/egl/egl_client_surface.h | ||
173 | @@ -322,7 +322,8 @@ extern EGL_SURFACE_T *egl_surface_create( | ||
174 | EGLenum texture_format, | ||
175 | EGLenum texture_target, | ||
176 | EGLNativePixmapType pixmap, | ||
177 | - const uint32_t *pixmap_server_handle); | ||
178 | + const uint32_t *pixmap_server_handle, | ||
179 | + DISPMANX_RESOURCE_HANDLE_T next_resource_handle); | ||
180 | extern EGL_SURFACE_T *egl_surface_from_vg_image( | ||
181 | VGImage vg_handle, | ||
182 | EGLSurface name, | ||
183 | diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h | ||
184 | index 8a5734c..51b3580 100644 | ||
185 | --- a/interface/khronos/egl/egl_int_impl.h | ||
186 | +++ b/interface/khronos/egl/egl_int_impl.h | ||
187 | @@ -56,7 +56,8 @@ FN(int, eglIntCreateSurface_impl, ( | ||
188 | uint32_t config_stencil_bits, | ||
189 | uint32_t sem, | ||
190 | uint32_t type, | ||
191 | - uint32_t *results)) | ||
192 | + uint32_t *results, | ||
193 | + DISPMANX_RESOURCE_HANDLE_T next_resource_handle)) | ||
194 | |||
195 | FN(int, eglIntCreatePbufferFromVGImage_impl, ( | ||
196 | VGImage vg_handle, | ||
197 | @@ -110,7 +111,7 @@ FN(void, eglIntMakeCurrent_impl, (uint32_t pid_0, uint32_t pid_1, uint32_t glver | ||
198 | FN(int, eglIntFlushAndWait_impl, (uint32_t flushgl, uint32_t flushvg)) | ||
199 | FN(void, eglIntFlush_impl, (uint32_t flushgl, uint32_t flushvg)) | ||
200 | |||
201 | -FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position)) | ||
202 | +FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position, DISPMANX_RESOURCE_HANDLE_T new_back_buffer)) | ||
203 | FN(void, eglIntSelectMipmap_impl, (EGL_SURFACE_ID_T s, int level)) | ||
204 | |||
205 | FN(void, eglIntGetColorData_impl, (EGL_SURFACE_ID_T s, KHRN_IMAGE_FORMAT_T format, uint32_t width, uint32_t height, int32_t stride, uint32_t y_offset, void *data)) | ||
206 | -- | ||
207 | 2.16.1 | ||
208 | |||