KWin
Loading...
Searching...
No Matches
eglnativefence.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "eglnativefence.h"
8#include "egldisplay.h"
9
10#include <unistd.h>
11
12namespace KWin
13{
14
15#ifndef EGL_ANDROID_native_fence_sync
16#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
17#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
18#endif // EGL_ANDROID_native_fence_sync
19
21 : EGLNativeFence(display, eglCreateSyncKHR(display->handle(), EGL_SYNC_NATIVE_FENCE_ANDROID, nullptr))
22{
23 if (m_sync != EGL_NO_SYNC_KHR) {
24 // The native fence will get a valid sync file fd only after a flush.
25 glFlush();
26 m_fileDescriptor = FileDescriptor(eglDupNativeFenceFDANDROID(m_display->handle(), m_sync));
27 }
28}
29
31 : m_sync(sync)
32 , m_display(display)
33{
34}
35
37{
38 m_fileDescriptor.reset();
39 if (m_sync != EGL_NO_SYNC_KHR) {
40 eglDestroySyncKHR(m_display->handle(), m_sync);
41 }
42}
43
45{
46 return m_sync != EGL_NO_SYNC_KHR && m_fileDescriptor.isValid();
47}
48
50{
51 return m_fileDescriptor;
52}
53
55{
56 return eglWaitSync(m_display->handle(), m_sync, 0) == EGL_TRUE;
57}
58
60{
61 EGLint attributes[] = {
62 EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fd.take(),
63 EGL_NONE};
64 return EGLNativeFence(display, eglCreateSyncKHR(display->handle(), EGL_SYNC_NATIVE_FENCE_ANDROID, attributes));
65}
66
67} // namespace KWin
static EGLNativeFence importFence(EglDisplay *display, FileDescriptor &&fd)
EGLNativeFence(EglDisplay *display)
const FileDescriptor & fileDescriptor() const
::EGLDisplay handle() const
#define EGL_SYNC_NATIVE_FENCE_ANDROID