Skip to content

Commit

Permalink
WebGL2 wait sync fixes (emscripten-core#8460)
Browse files Browse the repository at this point in the history
Handle the i64 constant in those function signatures.

Fixes emscripten-core#8458
  • Loading branch information
coopersimon authored and belraquib committed Dec 23, 2020
1 parent ef71836 commit 6256ecf
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 6 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -399,4 +399,5 @@ a license to everyone to use it as detailed in LICENSE.)
* Timothy Trindle <[email protected]> (copyright owned by Microsoft, Inc.)
* Matthew Andres Moreno <[email protected]>
* Eric Mandel <[email protected]>
* Simon Cooper <[email protected]>
* Amir Rasouli <[email protected]>
4 changes: 2 additions & 2 deletions src/library_webgl2.js
Original file line number Diff line number Diff line change
Expand Up @@ -748,7 +748,7 @@ var LibraryWebGL2 = {
GL.syncs[id] = null;
},

glClientWaitSync__sig: 'iiii',
glClientWaitSync__sig: 'iiiii',
glClientWaitSync: function(sync, flags, timeoutLo, timeoutHi) {
// WebGL2 vs GLES3 differences: in GLES3, the timeout parameter is a uint64, where 0xFFFFFFFFFFFFFFFFULL means GL_TIMEOUT_IGNORED.
// In JS, there's no 64-bit value types, so instead timeout is taken to be signed, and GL_TIMEOUT_IGNORED is given value -1.
Expand All @@ -760,7 +760,7 @@ var LibraryWebGL2 = {
return GLctx.clientWaitSync(GL.syncs[sync], flags, timeout);
},

glWaitSync__sig: 'viii',
glWaitSync__sig: 'viiii',
glWaitSync: function(sync, flags, timeoutLo, timeoutHi) {
// See WebGL2 vs GLES3 difference on GL_TIMEOUT_IGNORED above (https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.15)
timeoutLo = timeoutLo >>> 0;
Expand Down
16 changes: 14 additions & 2 deletions system/lib/gl/webgl2.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,20 @@ ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glDrawElementsInstanced, GLenum, G
RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_III, GLsync, glFenceSync, GLenum, GLbitfield);
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsSync, GLsync);
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDeleteSync, GLsync);
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_IIII, GLenum, glClientWaitSync, GLsync, GLbitfield, GLuint64); // XXX TODO: 64-bit integer proxying, this is not right, proxying as 32-bit
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glWaitSync, GLsync, GLbitfield, GLuint64); // XXX TODO: 64-bit integer proxying, this is not right, proxying as 32-bit
GLenum glClientWaitSync(GLsync p0, GLbitfield p1, GLuint64 p2) {
GL_FUNCTION_TRACE(glClientWaitSync);
if (pthread_getspecific(currentThreadOwnsItsWebGLContext))
return emscripten_glClientWaitSync(p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
else
return (GLenum)emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_IIIII, &emscripten_glClientWaitSync, p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
}
void glWaitSync(GLsync p0, GLbitfield p1, GLuint64 p2) {
GL_FUNCTION_TRACE(glWaitSync);
if (pthread_getspecific(currentThreadOwnsItsWebGLContext))
emscripten_glWaitSync(p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
else
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIII, &emscripten_glWaitSync, p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
}
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGetInteger64v, GLenum, GLint64 *);
VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetSynciv, GLsync, GLenum, GLsizei, GLsizei *, GLint *);
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetInteger64i_v, GLenum, GLuint, GLint64 *);
Expand Down
4 changes: 2 additions & 2 deletions system/lib/gl/webgl2.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ GL_APICALL void GL_APIENTRY emscripten_glDrawElementsInstanced (GLenum mode, GLs
GL_APICALL GLsync GL_APIENTRY emscripten_glFenceSync (GLenum condition, GLbitfield flags);
GL_APICALL GLboolean GL_APIENTRY emscripten_glIsSync (GLsync sync);
GL_APICALL void GL_APIENTRY emscripten_glDeleteSync (GLsync sync);
GL_APICALL GLenum GL_APIENTRY emscripten_glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
GL_APICALL void GL_APIENTRY emscripten_glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
GL_APICALL GLenum GL_APIENTRY emscripten_glClientWaitSync (GLsync sync, GLbitfield flags, GLuint timeoutLo, GLuint timeoutHi);
GL_APICALL void GL_APIENTRY emscripten_glWaitSync (GLsync sync, GLbitfield flags, GLuint timeoutLo, GLuint timeoutHi);
GL_APICALL void GL_APIENTRY emscripten_glGetInteger64v (GLenum pname, GLint64 *data);
GL_APICALL void GL_APIENTRY emscripten_glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
GL_APICALL void GL_APIENTRY emscripten_glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
Expand Down

0 comments on commit 6256ecf

Please sign in to comment.