| 1 | /* |
| 2 | Copyright (c) 2012, Broadcom Europe Ltd |
| 3 | All rights reserved. |
| 4 | |
| 5 | Redistribution and use in source and binary forms, with or without |
| 6 | modification, are permitted provided that the following conditions are met: |
| 7 | * Redistributions of source code must retain the above copyright |
| 8 | notice, this list of conditions and the following disclaimer. |
| 9 | * Redistributions in binary form must reproduce the above copyright |
| 10 | notice, this list of conditions and the following disclaimer in the |
| 11 | documentation and/or other materials provided with the distribution. |
| 12 | * Neither the name of the copyright holder nor the |
| 13 | names of its contributors may be used to endorse or promote products |
| 14 | derived from this software without specific prior written permission. |
| 15 | |
| 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
| 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | */ |
| 27 | |
| 28 | #if !defined(WFC_SERVER_API_H) |
| 29 | #define WFC_SERVER_API_H |
| 30 | |
| 31 | #include "interface/vcos/vcos.h" |
| 32 | #include "interface/vcos/vcos_stdbool.h" |
| 33 | #include "interface/khronos/include/WF/wfc.h" |
| 34 | #include "interface/khronos/wf/wfc_int.h" |
| 35 | #include "interface/khronos/include/EGL/eglext.h" |
| 36 | |
| 37 | /** Defining WFC_FULL_LOGGING will enable trace level logging across all WFC |
| 38 | * components. |
| 39 | #define WFC_FULL_LOGGING |
| 40 | */ |
| 41 | |
| 42 | /** General purpose callback function. |
| 43 | * Note: callbacks are often made on a thread other than the original function's. |
| 44 | * |
| 45 | * @param cb_data Callback additional data. |
| 46 | */ |
| 47 | typedef void (*WFC_CALLBACK_T)(void *cb_data); |
| 48 | |
| 49 | /** Extensible stream information block, supplied during creation and |
| 50 | * retrievable using wfc_server_stream_get_info. */ |
| 51 | typedef struct WFC_STREAM_INFO_T |
| 52 | { |
| 53 | uint32_t size; /**< Size of the strucuture, for versioning. */ |
| 54 | uint32_t flags; /**< Stream flags. */ |
| 55 | } WFC_STREAM_INFO_T; |
| 56 | |
| 57 | /** Create a connection to the server, as necessary. If this fails, no other |
| 58 | * server functions should be called. If it succeeds, there must be one call to |
| 59 | * wfc_server_disconnect() when use of the server has ended. |
| 60 | * |
| 61 | * @return VCOS_SUCCESS or a failure code. |
| 62 | */ |
| 63 | VCOS_STATUS_T wfc_server_connect(void); |
| 64 | |
| 65 | /** Destroy a connection to the server. This must be called once and only once |
| 66 | * for each successful call to wfc_server_connect(). |
| 67 | */ |
| 68 | void wfc_server_disconnect(void); |
| 69 | |
| 70 | /** Increase the keep alive count by one. If it rises from zero, the VideoCore |
| 71 | * will be prevented from being suspended. |
| 72 | */ |
| 73 | void wfc_server_use_keep_alive(void); |
| 74 | |
| 75 | /** Drop the keep alive count by one. If it reaches zero, the VideoCore may be |
| 76 | * suspended. |
| 77 | */ |
| 78 | void wfc_server_release_keep_alive(void); |
| 79 | |
| 80 | /** Create a new on- or off-screen context for composition. The type of the context |
| 81 | * is either WFC_CONTEXT_TYPE_ON_SCREEN or WFC_CONTEXT_TYPE_OFF_SCREEN. |
| 82 | * |
| 83 | * @param context The client context identifier. |
| 84 | * @param context_type The type of the context. |
| 85 | * @param screen_or_stream_num The screen number for and on-screen context, or the |
| 86 | * target client stream identifier for an off-screen context. |
| 87 | * @param pid_lo The low 32-bits of the owning client process identifier. |
| 88 | * @param pid_hi The high 32-bits of the owning client process identifier. |
| 89 | * @return Zero on failure, or the width and height of the context in pixels, |
| 90 | * packed in the top and bottom 16 bits, respectively. |
| 91 | */ |
| 92 | uint32_t wfc_server_create_context(WFCContext context, uint32_t context_type, |
| 93 | uint32_t screen_or_stream_num, uint32_t pid_lo, uint32_t pid_hi); |
| 94 | |
| 95 | /** Destroy a context. |
| 96 | * |
| 97 | * @param context The client context identifier. |
| 98 | */ |
| 99 | void wfc_server_destroy_context(WFCContext ctx); |
| 100 | |
| 101 | /** Flags to be passed to wfc_server_commit_scene. A bitwise combination of |
| 102 | * flags may be passed in to control behaviour. |
| 103 | */ |
| 104 | typedef enum |
| 105 | { |
| 106 | WFC_SERVER_COMMIT_WAIT = 1, /**< Wait for scene to be committed. */ |
| 107 | WFC_SERVER_COMMIT_COMPOSE = 2, /**< Trigger composition */ |
| 108 | } WFC_SERVER_COMMIT_FLAGS_T; |
| 109 | |
| 110 | /** Commit a scene in the context. If the WAIT flag is set, a callback |
| 111 | * must be given and shall be called once a new scene can be given. If the |
| 112 | * COMPOSE flag is set, the newly committed scene shall be composed |
| 113 | * as soon as possible (subject to presence of a deferral stream). |
| 114 | * |
| 115 | * @param context The client context identifier. |
| 116 | * @param scene The scene to be composed. |
| 117 | * @param flags Combination of WFC_SERVER_COMMIT_FLAGS_T values, or 0. |
| 118 | * @param scene_taken_cb Called when scene has been taken, generally on a |
| 119 | * different thread, or zero for no callback. |
| 120 | * @param scene_taken_data Passed to scene_taken_cb. |
| 121 | * @return VCOS_SUCCESS if successful, VCOS_EAGAIN if the scene cannot be |
| 122 | * taken immediately and the wait flag is false. |
| 123 | */ |
| 124 | uint32_t wfc_server_commit_scene(WFCContext ctx, const WFC_SCENE_T *scene, |
| 125 | uint32_t flags, WFC_CALLBACK_T scene_taken_cb, void *scene_taken_data); |
| 126 | |
| 127 | /** Activate a context. While a context is active, it will be automatically |
| 128 | * composed when any of the streams in its current scene are updated. |
| 129 | * |
| 130 | * @param context The client context identifier. |
| 131 | */ |
| 132 | void wfc_server_activate(WFCContext ctx); |
| 133 | |
| 134 | /** Deactivate a context. |
| 135 | * |
| 136 | * @param context The client context identifier. |
| 137 | */ |
| 138 | void wfc_server_deactivate(WFCContext ctx); |
| 139 | |
| 140 | /** Set the deferral stream for a context. When a deferral stream is set on a |
| 141 | * context and a new scene is given for that context, composition is deferred |
| 142 | * until the stream is updated. |
| 143 | * |
| 144 | * @param context The client context identifier. |
| 145 | * @param stream The deferral stream, or WFC_INVALID_HANDLE for none. |
| 146 | */ |
| 147 | void wfc_server_set_deferral_stream(WFCContext ctx, WFCNativeStreamType stream); |
| 148 | |
| 149 | /** Create a stream and its buffers, for supplying pixel data to one or more |
| 150 | * elements, and optionally for storing the output of off-screen composition. |
| 151 | * |
| 152 | * @param stream The client stream identifier. |
| 153 | * @param flags Stream flags. |
| 154 | * @param pid_lo The low 32-bits of the owning client process identifier. |
| 155 | * @param pid_hi The high 32-bits of the owning client process identifier. |
| 156 | * @return The client stream identifier on success, or WFC_INVALID_HANDLE on error. |
| 157 | */ |
| 158 | WFCNativeStreamType wfc_server_stream_create( |
| 159 | WFCNativeStreamType stream, uint32_t flags, uint32_t pid_lo, uint32_t pid_hi); |
| 160 | |
| 161 | /** Create a stream and its buffers, for supplying pixel data to one or more |
| 162 | * elements, and optionally for storing the output of off-screen composition. |
| 163 | * |
| 164 | * @param stream The client stream identifier. |
| 165 | * @param info Stream configuration. |
| 166 | * @param pid_lo The low 32-bits of the owning client process identifier. |
| 167 | * @param pid_hi The high 32-bits of the owning client process identifier. |
| 168 | * @return The client stream identifier on success, or WFC_INVALID_HANDLE on error. |
| 169 | */ |
| 170 | WFCNativeStreamType wfc_server_stream_create_info( |
| 171 | WFCNativeStreamType stream, const WFC_STREAM_INFO_T *info, uint32_t pid_lo, uint32_t pid_hi); |
| 172 | |
| 173 | /** Destroy a stream. |
| 174 | * |
| 175 | * @param stream The client stream identifier. |
| 176 | * @param pid_lo The low 32-bits of the owning client process identifier. |
| 177 | * @param pid_hi The high 32-bits of the owning client process identifier. |
| 178 | */ |
| 179 | void wfc_server_stream_destroy(WFCNativeStreamType stream, uint32_t pid_lo, uint32_t pid_hi); |
| 180 | |
| 181 | /** Set callback for when src/dest rectangles are updated. |
| 182 | * |
| 183 | * @param stream The client stream identifier. |
| 184 | * @param rects_change_cb Called when either src or dest rectangles have been |
| 185 | * updated. |
| 186 | * @param rects_change_data Passed to the callback. |
| 187 | * @return VCOS_SUCCESS if successful, or an error code if not. |
| 188 | */ |
| 189 | void wfc_server_stream_on_rects_change(WFCNativeStreamType stream, |
| 190 | WFC_CALLBACK_T rects_change_cb, void *rects_change_data); |
| 191 | |
| 192 | /** Get destination and source rectangles, following request from server |
| 193 | * |
| 194 | * @param stream The client stream identifier. |
| 195 | * @param rects The rectangle data is written here. |
| 196 | * @return VCOS_SUCCESS if successful, or an error code if not. |
| 197 | */ |
| 198 | #define WFC_SERVER_STREAM_RECTS_SIZE 8 |
| 199 | uint32_t wfc_server_stream_get_rects(WFCNativeStreamType stream, int32_t rects[WFC_SERVER_STREAM_RECTS_SIZE]); |
| 200 | |
| 201 | /** Returns true if given stream number is currently in use. |
| 202 | * |
| 203 | * @param stream The client stream identifier. |
| 204 | * @return True if the client stream identifier is already in use, false if not. |
| 205 | */ |
| 206 | bool wfc_server_stream_is_in_use(WFCNativeStreamType stream); |
| 207 | |
| 208 | /** Allocate images in the stream into which an off-screen context can write |
| 209 | * composited output. |
| 210 | * |
| 211 | * @param stream The client stream identifier. |
| 212 | * @param width The width of the images, in pixels. |
| 213 | * @param height The height of the images, in pixels. |
| 214 | * @param nbufs The number of images to allocate in the stream. |
| 215 | * @return True on success, false on failure. |
| 216 | */ |
| 217 | bool wfc_server_stream_allocate_images(WFCNativeStreamType stream, uint32_t width, uint32_t height, uint32_t nbufs); |
| 218 | |
| 219 | /** Signal that the given EGLImageKHR is the new front image for the stream. |
| 220 | * @param stream The client stream identifier. |
| 221 | * @param ustorage The innards of KHRN_IMAGE_T |
| 222 | * @param width etc.. |
| 223 | * @param height etc... |
| 224 | * @param stride |
| 225 | * @param offset |
| 226 | * @param format |
| 227 | * @param flags |
| 228 | * @param flip |
| 229 | */ |
| 230 | void wfc_server_stream_signal_eglimage_data(WFCNativeStreamType stream, |
| 231 | uint32_t ustorage, uint32_t width, uint32_t height, uint32_t stride, |
| 232 | uint32_t offset, uint32_t format, uint32_t flags, bool flip); |
| 233 | |
| 234 | /** Signal that the given multimedia image handle is the new front image for |
| 235 | * the stream. |
| 236 | * |
| 237 | * @param stream The client stream identifier. |
| 238 | * @param image_handle The new front image for the stream. |
| 239 | */ |
| 240 | void wfc_server_stream_signal_mm_image_data(WFCNativeStreamType stream, uint32_t image_handle); |
| 241 | |
| 242 | /** Signal that a raw image memhandle is the new front image for the stream. |
| 243 | * |
| 244 | * @param stream The client stream identifier. |
| 245 | * @param handle The new front image memhandle for the stream. |
| 246 | * @param format The image format. See WFC_PIXEL_FORMAT_T for supported formats. |
| 247 | * @param width The image width, in pixels. |
| 248 | * @param height The image height, in pixels. |
| 249 | * @param pitch The image pitch, in bytes. |
| 250 | * @param vpitch The image vertical pitch, in pixels. |
| 251 | */ |
| 252 | void wfc_server_stream_signal_raw_pixels(WFCNativeStreamType stream, |
| 253 | uint32_t handle, uint32_t format, uint32_t width, uint32_t height, |
| 254 | uint32_t pitch, uint32_t vpitch); |
| 255 | |
| 256 | /** Signal that the given image is the new front image for the stream. |
| 257 | * |
| 258 | * The type of each image the stream must be the same e.g. it is not permitted |
| 259 | * to mix opaque and raw pixel multimedia images within the same stream. |
| 260 | * |
| 261 | * @param stream The client stream identifier. |
| 262 | * @param image Structure describing the image. |
| 263 | */ |
| 264 | void wfc_server_stream_signal_image(WFCNativeStreamType stream, |
| 265 | const WFC_STREAM_IMAGE_T *image); |
| 266 | |
| 267 | /** Register a stream as in use by a given process. |
| 268 | * |
| 269 | * @param stream The client stream identifier. |
| 270 | * @param pid_lo The low 32-bits of the process ID. |
| 271 | * @param pid_hi The high 32-bits of the process ID. |
| 272 | */ |
| 273 | void wfc_server_stream_register(WFCNativeStreamType stream, uint32_t pid_lo, uint32_t pid_hi); |
| 274 | |
| 275 | /** Unregister a stream as in use by a given process. |
| 276 | * |
| 277 | * @param stream The client stream identifier. |
| 278 | * @param pid_lo The low 32-bits of the process ID. |
| 279 | * @param pid_hi The high 32-bits of the process ID. |
| 280 | */ |
| 281 | void wfc_server_stream_unregister(WFCNativeStreamType stream, uint32_t pid_lo, uint32_t pid_hi); |
| 282 | |
| 283 | /** Retrieve the stream configuration information, if available. |
| 284 | * |
| 285 | * @param stream The client stream identifier. |
| 286 | * @param info Address of block to receive the information on success. |
| 287 | * @return VCOS_SUCCESS if successful, or an error code if not. |
| 288 | */ |
| 289 | uint32_t wfc_server_stream_get_info(WFCNativeStreamType stream, WFC_STREAM_INFO_T *info); |
| 290 | |
| 291 | /** Set callback for when there is an image available. The stream must have |
| 292 | * been created with either the WFC_STREAM_FLAGS_EGL or WFC_STREAM_FLAGS_BUF_AVAIL |
| 293 | * flags set. |
| 294 | * |
| 295 | * @param stream The client stream identifier. |
| 296 | * @param image_available_cb Called when there is an image available. |
| 297 | * @param image_available_data Passed to the callback. |
| 298 | */ |
| 299 | void wfc_server_stream_on_image_available(WFCNativeStreamType stream, |
| 300 | WFC_CALLBACK_T image_available_cb, void *image_available_data); |
| 301 | |
| 302 | #endif /* WFC_SERVER_API_H */ |
| 303 | |