File indexing completed on 2024-11-10 04:56:53
0001 /* 0002 SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "eglnativefence.h" 0008 #include "egldisplay.h" 0009 0010 #include <unistd.h> 0011 0012 namespace KWin 0013 { 0014 0015 #ifndef EGL_ANDROID_native_fence_sync 0016 #define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 0017 #define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 0018 #endif // EGL_ANDROID_native_fence_sync 0019 0020 EGLNativeFence::EGLNativeFence(EglDisplay *display) 0021 : EGLNativeFence(display, eglCreateSyncKHR(display->handle(), EGL_SYNC_NATIVE_FENCE_ANDROID, nullptr)) 0022 { 0023 if (m_sync != EGL_NO_SYNC_KHR) { 0024 // The native fence will get a valid sync file fd only after a flush. 0025 glFlush(); 0026 m_fileDescriptor = FileDescriptor(eglDupNativeFenceFDANDROID(m_display->handle(), m_sync)); 0027 } 0028 } 0029 0030 EGLNativeFence::EGLNativeFence(EglDisplay *display, EGLSyncKHR sync) 0031 : m_sync(sync) 0032 , m_display(display) 0033 { 0034 } 0035 0036 EGLNativeFence::~EGLNativeFence() 0037 { 0038 m_fileDescriptor.reset(); 0039 if (m_sync != EGL_NO_SYNC_KHR) { 0040 eglDestroySyncKHR(m_display->handle(), m_sync); 0041 } 0042 } 0043 0044 bool EGLNativeFence::isValid() const 0045 { 0046 return m_sync != EGL_NO_SYNC_KHR && m_fileDescriptor.isValid(); 0047 } 0048 0049 const FileDescriptor &EGLNativeFence::fileDescriptor() const 0050 { 0051 return m_fileDescriptor; 0052 } 0053 0054 bool EGLNativeFence::waitSync() const 0055 { 0056 return eglWaitSync(m_display->handle(), m_sync, 0) == EGL_TRUE; 0057 } 0058 0059 EGLNativeFence EGLNativeFence::importFence(EglDisplay *display, FileDescriptor &&fd) 0060 { 0061 EGLint attributes[] = { 0062 EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fd.take(), 0063 EGL_NONE}; 0064 return EGLNativeFence(display, eglCreateSyncKHR(display->handle(), EGL_SYNC_NATIVE_FENCE_ANDROID, attributes)); 0065 } 0066 0067 } // namespace KWin