extern "C" EGLBoolean eglplatformcommon_eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_buffer *buffer, EGLint attribute, EGLint *value) { server_wlegl_buffer *buf = server_wlegl_buffer_from(buffer); ANativeWindowBuffer* anwb = (ANativeWindowBuffer *) buf->buf; if (attribute == EGL_TEXTURE_FORMAT) { switch(anwb->format) { case HAL_PIXEL_FORMAT_RGB_565: *value = EGL_TEXTURE_RGB; break; case HAL_PIXEL_FORMAT_RGBA_8888: *value = EGL_TEXTURE_RGBA; break; case 0x3231564E: // HAL_PIXEL_FORMAT_NV12 *value = EGL_TEXTURE_Y_UV_WL; break; default: *value = anwb->format; } return EGL_TRUE; } if (attribute == EGL_WIDTH) { *value = anwb->width; return EGL_TRUE; } if (attribute == EGL_HEIGHT) { *value = anwb->height; return EGL_TRUE; } return EGL_FALSE ; }
extern "C" void eglplatformcommon_passthroughImageKHR(EGLContext *ctx, EGLenum *target, EGLClientBuffer *buffer, const EGLint **attrib_list) { #ifdef WANT_WAYLAND static int debugenvchecked = 0; if (*target == EGL_WAYLAND_BUFFER_WL) { server_wlegl_buffer *buf = server_wlegl_buffer_from((struct wl_buffer *)*buffer); HYBRIS_TRACE_BEGIN("eglplatformcommon", "Wayland_eglImageKHR", "-resource@%i", ((struct wl_buffer *)*buffer)->resource.object.id); HYBRIS_TRACE_END("eglplatformcommon", "Wayland_eglImageKHR", "-resource@%i", ((struct wl_buffer *)*buffer)->resource.object.id); if (debugenvchecked == 0) { if (getenv("HYBRIS_WAYLAND_KHR_DUMP_BUFFERS") != NULL) debugenvchecked = 2; else debugenvchecked = 1; } else if (debugenvchecked == 2) { hybris_dump_buffer_to_file((ANativeWindowBuffer *) buf->buf); } *buffer = (EGLClientBuffer) (ANativeWindowBuffer *) buf->buf; *target = EGL_NATIVE_BUFFER_ANDROID; *ctx = EGL_NO_CONTEXT; *attrib_list = NULL; } #endif }
static void server_wlegl_buffer_dtor(struct wl_resource *resource) { struct wl_buffer *base = reinterpret_cast<struct wl_buffer*>(resource->data); server_wlegl_buffer *buffer = server_wlegl_buffer_from(base); buffer->buf->common.decRef(&buffer->buf->common); delete buffer; }
extern "C" wl_buffer *waylandws_createWlBuffer(EGLDisplay dpy, EGLImageKHR image) { egl_image *img = reinterpret_cast<egl_image *>(image); if (!img || !egl_image_sanitycheck(img)) { // The spec says we should send a EGL_BAD_PARAMETER error here, but we don't have the // means, as of now. return NULL; } if (img->target == EGL_WAYLAND_BUFFER_WL) { WaylandDisplay *wdpy = (WaylandDisplay *)hybris_egl_display_get_mapping(dpy); server_wlegl_buffer *buf = server_wlegl_buffer_from((wl_resource *)img->egl_buffer); WaylandNativeWindowBuffer wnb(buf->buf); // The buffer will be managed by the app, so pass NULL as the queue so that // it will be assigned to the default queue wnb.wlbuffer_from_native_handle(wdpy->wlegl, wdpy->wl_dpy, NULL); return wnb.wlbuffer; } // EGL_BAD_MATCH return NULL; }
extern "C" void eglplatformcommon_passthroughImageKHR(EGLenum *target, EGLClientBuffer *buffer) { #ifdef WANT_WAYLAND static int debugenvchecked = 0; if (*target == EGL_WAYLAND_BUFFER_WL) { server_wlegl_buffer *buf = server_wlegl_buffer_from((struct wl_buffer *)*buffer); if (debugenvchecked == 0) { if (getenv("HYBRIS_WAYLAND_KHR_DUMP_BUFFERS") != NULL) debugenvchecked = 2; else debugenvchecked = 1; } else if (debugenvchecked == 2) { hybris_dump_buffer_to_file((ANativeWindowBuffer *) buf->buf); } *buffer = (EGLClientBuffer) (ANativeWindowBuffer *) buf->buf; *target = EGL_NATIVE_BUFFER_ANDROID; } #endif }