bool SurfaceBuffer::isShmBuffer() const { if (!m_is_shm_resolved) { #if (WAYLAND_VERSION_MAJOR >= 1) && (WAYLAND_VERSION_MINOR >= 2) m_shmBuffer = wl_shm_buffer_get(m_buffer); #else if (wl_buffer_is_shm(static_cast<struct ::wl_buffer*>(m_buffer->data))) m_shmBuffer = static_cast<struct ::wl_buffer*>(m_buffer->data); #endif m_is_shm_resolved = true; } return m_shmBuffer != 0; }
CoglTexture2D * cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx, struct wl_buffer *buffer, CoglError **error) { if (wl_buffer_is_shm (buffer)) { int stride = wl_shm_buffer_get_stride (buffer); CoglPixelFormat format; CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY; switch (wl_shm_buffer_get_format (buffer)) { #if G_BYTE_ORDER == G_BIG_ENDIAN case WL_SHM_FORMAT_ARGB8888: format = COGL_PIXEL_FORMAT_ARGB_8888_PRE; break; case WL_SHM_FORMAT_XRGB32: format = COGL_PIXEL_FORMAT_ARGB_8888; internal_format = COGL_PIXEL_FORMAT_RGB_888; break; #elif G_BYTE_ORDER == G_LITTLE_ENDIAN case WL_SHM_FORMAT_ARGB8888: format = COGL_PIXEL_FORMAT_BGRA_8888_PRE; break; case WL_SHM_FORMAT_XRGB8888: format = COGL_PIXEL_FORMAT_BGRA_8888; internal_format = COGL_PIXEL_FORMAT_BGR_888; break; #endif default: g_warn_if_reached (); format = COGL_PIXEL_FORMAT_ARGB_8888; } return cogl_texture_2d_new_from_data (ctx, buffer->width, buffer->height, format, internal_format, stride, wl_shm_buffer_get_data (buffer), error); } else { EGLImageKHR image; CoglTexture2D *tex; _COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints & COGL_RENDERER_CONSTRAINT_USES_EGL, NULL); image = _cogl_egl_create_image (ctx, EGL_WAYLAND_BUFFER_WL, buffer, NULL); tex = _cogl_egl_texture_2d_new_from_image (ctx, buffer->width, buffer->height, COGL_PIXEL_FORMAT_ARGB_8888_PRE, image, error); _cogl_egl_destroy_image (ctx, image); return tex; } }