static EGLBoolean dri2_drm_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); unsigned i; if (dri2_dpy->swrast) { (*dri2_dpy->core->swapBuffers)(dri2_surf->dri_drawable); } else { if (dri2_surf->base.Type == EGL_WINDOW_BIT) { if (dri2_surf->current) _eglError(EGL_BAD_SURFACE, "dri2_swap_buffers"); for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) if (dri2_surf->color_buffers[i].age > 0) dri2_surf->color_buffers[i].age++; /* Make sure we have a back buffer in case we're swapping without * ever rendering. */ if (get_back_bo(dri2_surf) < 0) { _eglError(EGL_BAD_ALLOC, "dri2_swap_buffers"); return EGL_FALSE; } dri2_surf->current = dri2_surf->back; dri2_surf->current->age = 1; dri2_surf->back = NULL; } dri2_flush_drawable_for_swapbuffers(disp, draw); (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); } return EGL_TRUE; }
static int droid_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format, uint32_t *stamp, void *loaderPrivate, uint32_t buffer_mask, struct __DRIimageList *images) { struct dri2_egl_surface *dri2_surf = loaderPrivate; images->image_mask = 0; if (update_buffers(dri2_surf) < 0) return 0; if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) { /* * We don't support front buffers and GLES doesn't require them for * window surfaces, but some DRI drivers will request them anyway. * We just ignore such request as other platforms backends do. */ } if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) { if (get_back_bo(dri2_surf) < 0) return 0; images->back = dri2_surf->dri_image; images->image_mask |= __DRI_IMAGE_BUFFER_BACK; } return 1; }
static EGLint dri2_drm_query_buffer_age(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface) { struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface); if (get_back_bo(dri2_surf) < 0) { _eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age"); return 0; } return dri2_surf->back->age; }
static int dri2_drm_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format, uint32_t *stamp, void *loaderPrivate, uint32_t buffer_mask, struct __DRIimageList *buffers) { struct dri2_egl_surface *dri2_surf = loaderPrivate; struct gbm_dri_bo *bo; if (get_back_bo(dri2_surf) < 0) return 0; bo = (struct gbm_dri_bo *) dri2_surf->back->bo; buffers->image_mask = __DRI_IMAGE_BUFFER_BACK; buffers->back = bo->image; return 1; }
static __DRIbuffer * dri2_drm_get_buffers_with_format(__DRIdrawable *driDrawable, int *width, int *height, unsigned int *attachments, int count, int *out_count, void *loaderPrivate) { struct dri2_egl_surface *dri2_surf = loaderPrivate; int i, j; dri2_surf->buffer_count = 0; for (i = 0, j = 0; i < 2 * count; i += 2, j++) { assert(attachments[i] < __DRI_BUFFER_COUNT); assert(dri2_surf->buffer_count < 5); switch (attachments[i]) { case __DRI_BUFFER_BACK_LEFT: if (get_back_bo(dri2_surf) < 0) { _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer"); return NULL; } back_bo_to_dri_buffer(dri2_surf, &dri2_surf->buffers[j]); break; default: if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1], &dri2_surf->buffers[j]) < 0) { _eglError(EGL_BAD_ALLOC, "failed to allocate aux buffer"); return NULL; } break; } } *out_count = j; if (j == 0) return NULL; *width = dri2_surf->base.Width; *height = dri2_surf->base.Height; return dri2_surf->buffers; }
static int droid_image_get_buffers(__DRIdrawable *driDrawable, unsigned int format, uint32_t *stamp, void *loaderPrivate, uint32_t buffer_mask, struct __DRIimageList *images) { struct dri2_egl_surface *dri2_surf = loaderPrivate; if (update_buffers(dri2_surf) < 0) return 0; if (get_back_bo(dri2_surf) < 0) { _eglError(EGL_BAD_PARAMETER, "get_back_bo"); return 0; } images->image_mask = __DRI_IMAGE_BUFFER_BACK; images->back = dri2_surf->dri_image; return 1; }