Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOpenGLSync.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "KisOpenGLSync.h"
8
9namespace Sync {
10 //For checking sync status
15
16#ifndef GL_SYNC_GPU_COMMANDS_COMPLETE
17 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
18#endif
19#ifndef GL_UNSIGNALED
20 #define GL_UNSIGNALED 0x9118
21#endif
22#ifndef GL_SIGNALED
23 #define GL_SIGNALED 0x9119
24#endif
25#ifndef GL_SYNC_STATUS
26 #define GL_SYNC_STATUS 0x9114
27#endif
28
29 //Function pointers for glFenceSync and glGetSynciv
30 typedef GLsync (*kis_glFenceSync)(GLenum, GLbitfield);
32 typedef void (*kis_glGetSynciv)(GLsync, GLenum, GLsizei, GLsizei*, GLint*);
34 typedef void (*kis_glDeleteSync)(GLsync);
36 typedef GLenum (*kis_glClientWaitSync)(GLsync,GLbitfield,GLuint64);
38
39 //Initialise the function pointers for glFenceSync and glGetSynciv
40 //Note: Assumes a current OpenGL context.
41 void init(QOpenGLContext* ctx) {
42#if defined Q_OS_WIN
44#ifdef ENV64BIT
45 k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync");
46 k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv");
47 k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync");
48#else
49 k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSyncARB");
50 k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSyncivARB");
51 k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSyncARB");
52#endif
53 k_glClientWaitSync = (kis_glClientWaitSync)ctx->getProcAddress("glClientWaitSync");
54 }
55#elif defined Q_OS_LINUX || defined Q_OS_MACOS
57 k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync");
58 k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv");
59 k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync");
60 k_glClientWaitSync = (kis_glClientWaitSync)ctx->getProcAddress("glClientWaitSync");
61 }
62#endif
63 if (k_glFenceSync == 0 || k_glGetSynciv == 0 ||
65 warnUI << "Could not find sync functions, disabling sync notification.";
66 }
67 }
68
69 //Get a fence sync object from OpenGL
70 GLsync getSync() {
71 if(k_glFenceSync) {
74 k_glClientWaitSync(sync, 0, 1);
75 }
76 return sync;
77 }
78 return 0;
79 }
80
81 //Check the status of a sync object
82 SyncStatus syncStatus(GLsync syncObject) {
83 if(syncObject && k_glGetSynciv) {
84 GLint status = -1;
85 k_glGetSynciv(syncObject, GL_SYNC_STATUS, 1, 0, &status);
86 return status == GL_SIGNALED ? Sync::Signaled : Sync::Unsignaled;
87 }
88 return Sync::Signaled;
89 }
90
91 void deleteSync(GLsync syncObject) {
92 if(syncObject && k_glDeleteSync) {
93 k_glDeleteSync(syncObject);
94 }
95 }
96}
97
102
107
112
113void KisOpenGLSync::init(QOpenGLContext *ctx)
114{
115 Sync::init(ctx);
116}
#define GL_SIGNALED
#define GL_SYNC_STATUS
#define GL_SYNC_GPU_COMMANDS_COMPLETE
static void init(QOpenGLContext *ctx)
GLsync m_syncObject
static bool needsFenceWorkaround()
static bool supportsFenceSync()
supportsFilter
#define warnUI
Definition kis_debug.h:94
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
static kis_glGetSynciv k_glGetSynciv
static kis_glDeleteSync k_glDeleteSync
void init(QOpenGLContext *ctx)
SyncStatus syncStatus(GLsync syncObject)
void(* kis_glGetSynciv)(GLsync, GLenum, GLsizei, GLsizei *, GLint *)
void deleteSync(GLsync syncObject)
GLsync(* kis_glFenceSync)(GLenum, GLbitfield)
static kis_glClientWaitSync k_glClientWaitSync
static kis_glFenceSync k_glFenceSync
void(* kis_glDeleteSync)(GLsync)
GLenum(* kis_glClientWaitSync)(GLsync, GLbitfield, GLuint64)
GLsync getSync()