return EGL_TRUE;
}
-EGLBoolean
-dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
- _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean enable_out_fence)
-{
- struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
- struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
-
- dri2_surf->out_fence_fd = -1;
- dri2_surf->enable_out_fence = false;
- if (dri2_dpy->fence && dri2_dpy->fence->base.version >= 2 &&
- dri2_dpy->fence->get_capabilities &&
- (dri2_dpy->fence->get_capabilities(dri2_dpy->dri_screen) &
- __DRI_FENCE_CAP_NATIVE_FD)) {
- dri2_surf->enable_out_fence = enable_out_fence;
- }
-
- return _eglInitSurface(surf, dpy, type, conf, attrib_list);
-}
-
-static void
-dri2_surface_set_out_fence_fd( _EGLSurface *surf, int fence_fd)
-{
- struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-
- if (dri2_surf->out_fence_fd >=0)
- close(dri2_surf->out_fence_fd);
-
- dri2_surf->out_fence_fd = fence_fd;
-}
-
-void
-dri2_fini_surface(_EGLSurface *surf)
-{
- struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
-
- dri2_surface_set_out_fence_fd(surf, -1);
- dri2_surf->enable_out_fence = false;
-}
-
static EGLBoolean
dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
{
return dri2_dpy->vtbl->destroy_surface(drv, dpy, surf);
}
-static void
-dri2_surf_update_fence_fd(_EGLContext *ctx,
- _EGLDisplay *dpy, _EGLSurface *surf)
-{
- __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context;
- struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
- struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
- int fence_fd = -1;
- void *fence;
-
- if (!dri2_surf->enable_out_fence)
- return;
-
- fence = dri2_dpy->fence->create_fence_fd(dri_ctx, -1);
- if (fence) {
- fence_fd = dri2_dpy->fence->get_fence_fd(dri2_dpy->dri_screen,
- fence);
- dri2_dpy->fence->destroy_fence(dri2_dpy->dri_screen, fence);
- }
- dri2_surface_set_out_fence_fd(surf, fence_fd);
-}
-
/**
* Called via eglMakeCurrent(), drv->API.MakeCurrent().
*/
if (old_ctx) {
__DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;
- if (old_dsurf)
- dri2_surf_update_fence_fd(old_ctx, disp, old_dsurf);
dri2_dpy->core->unbindContext(old_cctx);
}
dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
- _EGLContext *ctx = _eglGetCurrentContext();
-
- if (ctx && surf)
- dri2_surf_update_fence_fd(ctx, dpy, surf);
return dri2_dpy->vtbl->swap_buffers(drv, dpy, surf);
}
const EGLint *rects, EGLint n_rects)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
- _EGLContext *ctx = _eglGetCurrentContext();
-
- if (ctx && surf)
- dri2_surf_update_fence_fd(ctx, dpy, surf);
return dri2_dpy->vtbl->swap_buffers_with_damage(drv, dpy, surf,
rects, n_rects);
}
__DRIimage *front;
unsigned int visual;
#endif
- int out_fence_fd;
- EGLBoolean enable_out_fence;
};
struct dri2_egl_config
void
dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf);
-EGLBoolean
-dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
- _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean enable_out_fence);
-
-void
-dri2_fini_surface(_EGLSurface *surf);
-
#endif /* EGL_DRI2_INCLUDED */
*/
mtx_unlock(&disp->Mutex);
- /* Queue the buffer with stored out fence fd. The ANativeWindow or buffer
- * consumer may choose to wait for the fence to signal before accessing
- * it. If fence fd value is -1, buffer can be accessed by consumer
- * immediately. Consumer or application shouldn't rely on timestamp
- * associated with fence if the fence fd is -1.
+ /* Queue the buffer without a sync fence. This informs the ANativeWindow
+ * that it may access the buffer immediately.
*
- * Ownership of fd is transferred to consumer after queueBuffer and the
- * consumer is responsible for closing it. Caller must not use the fd
- * after passing it to queueBuffer.
+ * From ANativeWindow::dequeueBuffer:
+ *
+ * The fenceFd argument specifies a libsync fence file descriptor for
+ * a fence that must signal before the buffer can be accessed. If
+ * the buffer can be accessed immediately then a value of -1 should
+ * be used. The caller must not use the file descriptor after it
+ * is passed to queueBuffer, and the ANativeWindow implementation
+ * is responsible for closing it.
*/
- int fence_fd = dri2_surf->out_fence_fd;
- dri2_surf->out_fence_fd = -1;
+ int fence_fd = -1;
dri2_surf->window->queueBuffer(dri2_surf->window, dri2_surf->buffer,
fence_fd);
droid_window_cancel_buffer(struct dri2_egl_surface *dri2_surf)
{
int ret;
- int fence_fd = dri2_surf->out_fence_fd;
- dri2_surf->out_fence_fd = -1;
- ret = dri2_surf->window->cancelBuffer(dri2_surf->window,
- dri2_surf->buffer, fence_fd);
+ ret = dri2_surf->window->cancelBuffer(dri2_surf->window, dri2_surf->buffer, -1);
if (ret < 0) {
_eglLog(_EGL_WARNING, "ANativeWindow::cancelBuffer failed");
dri2_surf->base.Lost = EGL_TRUE;
return NULL;
}
- if (!dri2_init_surface(&dri2_surf->base, disp, type, conf, attrib_list, true))
+ if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
goto cleanup_surface;
if (type == EGL_WINDOW_BIT) {
dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
- dri2_fini_surface(surf);
free(dri2_surf);
return EGL_TRUE;
return NULL;
}
- if (!dri2_init_surface(&dri2_surf->base, disp, EGL_WINDOW_BIT, conf, attrib_list, false))
+ if (!_eglInitSurface(&dri2_surf->base, disp, EGL_WINDOW_BIT, conf, attrib_list))
goto cleanup_surf;
surf = gbm_dri_surface(surface);
dri2_egl_surface_free_local_buffers(dri2_surf);
- dri2_fini_surface(surf);
free(surf);
return EGL_TRUE;
return NULL;
}
- if (!dri2_init_surface(&dri2_surf->base, disp, type, conf, attrib_list, false))
+ if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
goto cleanup_surface;
config = dri2_get_dri_config(dri2_conf, type,
dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
- dri2_fini_surface(surf);
free(dri2_surf);
return EGL_TRUE;
}
return NULL;
}
- if (!dri2_init_surface(&dri2_surf->base, disp, EGL_WINDOW_BIT, conf, attrib_list, false))
+ if (!_eglInitSurface(&dri2_surf->base, disp, EGL_WINDOW_BIT, conf, attrib_list))
goto cleanup_surf;
if (dri2_dpy->wl_dmabuf || dri2_dpy->wl_drm) {
wl_proxy_wrapper_destroy(dri2_surf->wl_drm_wrapper);
wl_event_queue_destroy(dri2_surf->wl_queue);
- dri2_fini_surface(surf);
free(surf);
return EGL_TRUE;
return NULL;
}
- if (!dri2_init_surface(&dri2_surf->base, disp, type, conf, attrib_list, false))
+ if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
goto cleanup_surf;
dri2_surf->region = XCB_NONE;
if (surf->Type == EGL_PBUFFER_BIT)
xcb_free_pixmap (dri2_dpy->conn, dri2_surf->drawable);
- dri2_fini_surface(surf);
free(surf);
return EGL_TRUE;
loader_dri3_drawable_fini(&dri3_surf->loader_drawable);
- dri2_fini_surface(surf);
free(surf);
return EGL_TRUE;
return NULL;
}
- if (!dri2_init_surface(&dri3_surf->base, disp, type, conf, attrib_list, false))
+ if (!_eglInitSurface(&dri3_surf->base, disp, type, conf, attrib_list))
goto cleanup_surf;
if (type == EGL_PBUFFER_BIT) {