mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
egl/android: Use per surface out fence
Use the plumbing introduced with previous patch to interact with the
Android framework.
Namely: currently we use an invalid fd of -1 for our calls to
ANativeWindow::{queue,cancel}Buffer.
At the same time applications (like flatland) may rely on it being
a valid one. Thus as they attempt to query the timestamp of the fence,
they get unexpected results/behaviour.
In the case of flatland - the benchmark hang inside getSignalTime().
Make use of the out fence and pass the correct fd to Android.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101655
Signed-off-by: Zhongmin Wu <zhongmin.wu@intel.com>
Signed-off-by: Yogesh Marathe <yogesh.marathe@intel.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Tomasz Figa <tfiga@chromium.org>
[Emil Velikov: split from larger patch]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
e013ce8d0d
commit
7343d27136
1 changed files with 15 additions and 13 deletions
|
|
@ -229,19 +229,18 @@ droid_window_enqueue_buffer(_EGLDisplay *disp, struct dri2_egl_surface *dri2_sur
|
|||
*/
|
||||
mtx_unlock(&disp->Mutex);
|
||||
|
||||
/* Queue the buffer without a sync fence. This informs the ANativeWindow
|
||||
* that it may access the buffer immediately.
|
||||
/* 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.
|
||||
*
|
||||
* 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.
|
||||
* 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.
|
||||
*/
|
||||
int fence_fd = -1;
|
||||
int fence_fd = dri2_surf->out_fence_fd;
|
||||
dri2_surf->out_fence_fd = -1;
|
||||
dri2_surf->window->queueBuffer(dri2_surf->window, dri2_surf->buffer,
|
||||
fence_fd);
|
||||
|
||||
|
|
@ -263,8 +262,11 @@ static void
|
|||
droid_window_cancel_buffer(struct dri2_egl_surface *dri2_surf)
|
||||
{
|
||||
int ret;
|
||||
int fence_fd = dri2_surf->out_fence_fd;
|
||||
|
||||
ret = dri2_surf->window->cancelBuffer(dri2_surf->window, dri2_surf->buffer, -1);
|
||||
dri2_surf->out_fence_fd = -1;
|
||||
ret = dri2_surf->window->cancelBuffer(dri2_surf->window,
|
||||
dri2_surf->buffer, fence_fd);
|
||||
if (ret < 0) {
|
||||
_eglLog(_EGL_WARNING, "ANativeWindow::cancelBuffer failed");
|
||||
dri2_surf->base.Lost = EGL_TRUE;
|
||||
|
|
@ -289,7 +291,7 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!dri2_init_surface(&dri2_surf->base, disp, type, conf, attrib_list, false))
|
||||
if (!dri2_init_surface(&dri2_surf->base, disp, type, conf, attrib_list, true))
|
||||
goto cleanup_surface;
|
||||
|
||||
if (type == EGL_WINDOW_BIT) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue