Changeset View
Changeset View
Standalone View
Standalone View
krita/ui/opengl/kis_opengl_canvas2_p.h
Show First 20 Lines • Show All 180 Lines • ▼ Show 20 Line(s) | 180 | #endif | |||
---|---|---|---|---|---|
181 | 181 | | |||
182 | //Function pointers for glFenceSync and glGetSynciv | 182 | //Function pointers for glFenceSync and glGetSynciv | ||
183 | typedef GLsync (*kis_glFenceSync)(GLenum, GLbitfield); | 183 | typedef GLsync (*kis_glFenceSync)(GLenum, GLbitfield); | ||
184 | static kis_glFenceSync k_glFenceSync = 0; | 184 | static kis_glFenceSync k_glFenceSync = 0; | ||
185 | typedef void (*kis_glGetSynciv)(GLsync, GLenum, GLsizei, GLsizei*, GLint*); | 185 | typedef void (*kis_glGetSynciv)(GLsync, GLenum, GLsizei, GLsizei*, GLint*); | ||
186 | static kis_glGetSynciv k_glGetSynciv = 0; | 186 | static kis_glGetSynciv k_glGetSynciv = 0; | ||
187 | typedef void (*kis_glDeleteSync)(GLsync); | 187 | typedef void (*kis_glDeleteSync)(GLsync); | ||
188 | static kis_glDeleteSync k_glDeleteSync = 0; | 188 | static kis_glDeleteSync k_glDeleteSync = 0; | ||
189 | typedef GLenum (*kis_glClientWaitSync)(GLsync,GLbitfield,GLuint64); | ||||
190 | static kis_glClientWaitSync k_glClientWaitSync = 0; | ||||
189 | 191 | | |||
190 | //Initialise the function pointers for glFenceSync and glGetSynciv | 192 | //Initialise the function pointers for glFenceSync and glGetSynciv | ||
191 | //Note: Assumes a current OpenGL context. | 193 | //Note: Assumes a current OpenGL context. | ||
192 | void init() { | 194 | void init() { | ||
193 | QOpenGLContext* ctx = QOpenGLContext::currentContext(); | 195 | QOpenGLContext* ctx = QOpenGLContext::currentContext(); | ||
194 | #if defined Q_OS_WIN | 196 | #if defined Q_OS_WIN | ||
195 | if (KisOpenGL::supportsFenceSync()) { | 197 | if (KisOpenGL::supportsFenceSync()) { | ||
196 | #ifdef ENV64BIT | 198 | #ifdef ENV64BIT | ||
197 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync"); | 199 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync"); | ||
198 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv"); | 200 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv"); | ||
199 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync"); | 201 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync"); | ||
200 | #else | 202 | #else | ||
201 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSyncARB"); | 203 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSyncARB"); | ||
202 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSyncivARB"); | 204 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSyncivARB"); | ||
203 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSyncARB"); | 205 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSyncARB"); | ||
204 | #endif | 206 | #endif | ||
207 | k_glClientWaitSync = (kis_glClientWaitSync)ctx->getProcAddress("glClientWaitSync"); | ||||
205 | } | 208 | } | ||
206 | #elif defined Q_OS_LINUX | 209 | #elif defined Q_OS_LINUX | ||
207 | if (KisOpenGL::supportsFenceSync()) { | 210 | if (KisOpenGL::supportsFenceSync()) { | ||
208 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync"); | 211 | k_glFenceSync = (kis_glFenceSync)ctx->getProcAddress("glFenceSync"); | ||
209 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv"); | 212 | k_glGetSynciv = (kis_glGetSynciv)ctx->getProcAddress("glGetSynciv"); | ||
210 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync"); | 213 | k_glDeleteSync = (kis_glDeleteSync)ctx->getProcAddress("glDeleteSync"); | ||
214 | k_glClientWaitSync = (kis_glClientWaitSync)ctx->getProcAddress("glClientWaitSync"); | ||||
211 | } | 215 | } | ||
212 | #endif | 216 | #endif | ||
213 | if (k_glFenceSync == 0 || k_glGetSynciv == 0 || k_glDeleteSync == 0) { | 217 | if (k_glFenceSync == 0 || k_glGetSynciv == 0 || | ||
218 | k_glDeleteSync == 0 || k_glClientWaitSync == 0) { | ||||
214 | qWarning("Could not find sync functions, disabling sync notification."); | 219 | qWarning("Could not find sync functions, disabling sync notification."); | ||
215 | } | 220 | } | ||
216 | } | 221 | } | ||
217 | 222 | | |||
218 | //Get a fence sync object from OpenGL | 223 | //Get a fence sync object from OpenGL | ||
219 | GLsync getSync() { | 224 | GLsync getSync() { | ||
220 | if(k_glFenceSync) { | 225 | if(k_glFenceSync) { | ||
221 | GLsync sync = k_glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); | 226 | GLsync sync = k_glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); | ||
222 | if (KisOpenGL::needsFenceWorkaround()) { | 227 | if (KisOpenGL::needsFenceWorkaround()) { | ||
223 | glClientWaitSync(sync, 0, 1); | 228 | k_glClientWaitSync(sync, 0, 1); | ||
224 | } | 229 | } | ||
225 | return sync; | 230 | return sync; | ||
226 | } | 231 | } | ||
227 | return 0; | 232 | return 0; | ||
228 | } | 233 | } | ||
229 | 234 | | |||
230 | //Check the status of a sync object | 235 | //Check the status of a sync object | ||
231 | SyncStatus syncStatus(GLsync syncObject) { | 236 | SyncStatus syncStatus(GLsync syncObject) { | ||
Show All 17 Lines |