1/**
2 * Copyright (c) 2006-2023 LOVE Development Team
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute it
10 * freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 * 3. This notice may not be removed or altered from any source distribution.
19 **/
20
21
22#include "FenceSync.h"
23
24namespace love
25{
26namespace graphics
27{
28namespace opengl
29{
30
31FenceSync::~FenceSync()
32{
33 cleanup();
34}
35
36bool FenceSync::fence()
37{
38 bool wasActive = sync != 0;
39
40 if (wasActive)
41 cleanup();
42
43 sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
44
45 return !wasActive;
46}
47
48bool FenceSync::cpuWait()
49{
50 if (sync == 0)
51 return false;
52
53 GLbitfield flags = 0;
54 GLuint64 duration = 0;
55
56 while (true)
57 {
58 GLenum status = glClientWaitSync(sync, flags, duration);
59
60 if (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED)
61 break;
62
63 if (status == GL_WAIT_FAILED)
64 break;
65
66 flags = GL_SYNC_FLUSH_COMMANDS_BIT;
67 duration = 1000000000; // 1 second in nanoseconds.
68 }
69
70 cleanup();
71
72 return true;
73}
74
75void FenceSync::cleanup()
76{
77 if (sync != 0)
78 {
79 glDeleteSync(sync);
80 sync = 0;
81 }
82}
83
84} // opengl
85} // graphics
86} // love
87