Skip to content

Commit 59e68b5

Browse files
authored
[wasm64] Run all browser64 webgl tests (#20613)
Split out from #20516
1 parent 8ecbdb3 commit 59e68b5

File tree

4 files changed

+75
-28
lines changed

4 files changed

+75
-28
lines changed

.circleci/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,13 +786,15 @@ jobs:
786786
browser64.test_emscripten_async_wget_*
787787
browser64.test_wasm_worker_*
788788
browser64.test_sdl_*
789+
browser64.test_sdl1_*
789790
browser64.test_egl*
790791
browser64.test_gl_*
791792
browser64.test_glgears*
792793
browser64.test_glfw*
793794
browser64.test_glew
794795
browser64.test_idbstore*
795796
browser64.test_fs_idbfs*
797+
browser64.test_webgl*
796798
"
797799
test-browser-firefox:
798800
executor: bionic

src/library_strings.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ addToLibrary({
116116
#endif
117117
$UTF8ToString: (ptr, maxBytesToRead) => {
118118
#if ASSERTIONS
119-
assert(typeof ptr == 'number');
119+
assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`);
120120
#endif
121121
#if CAN_ADDRESS_2GB
122122
ptr >>>= 0;
@@ -158,7 +158,7 @@ addToLibrary({
158158
outIdx >>>= 0;
159159
#endif
160160
#if ASSERTIONS
161-
assert(typeof str === 'string');
161+
assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`);
162162
#endif
163163
// Parameter maxBytesToWrite is not optional. Negative values, 0, null,
164164
// undefined and false each don't write out any bytes.

src/library_webgl.js

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ var LibraryGL = {
11681168
#endif
11691169
}
11701170
#endif
1171-
ret = s && stringToNewUTF8(s);
1171+
ret = s ? stringToNewUTF8(s) : 0;
11721172
break;
11731173

11741174
#if GL_EMULATE_GLES_VERSION_STRING_FORMAT
@@ -1783,7 +1783,7 @@ var LibraryGL = {
17831783
},
17841784

17851785
// Queries EXT
1786-
glGenQueriesEXT__sig: 'vii',
1786+
glGenQueriesEXT__sig: 'vip',
17871787
glGenQueriesEXT: (n, ids) => {
17881788
for (var i = 0; i < n; i++) {
17891789
var query = GLctx.disjointTimerQueryExt['createQueryEXT']();
@@ -1802,7 +1802,7 @@ var LibraryGL = {
18021802
}
18031803
},
18041804

1805-
glDeleteQueriesEXT__sig: 'vii',
1805+
glDeleteQueriesEXT__sig: 'vip',
18061806
glDeleteQueriesEXT: (n, ids) => {
18071807
for (var i = 0; i < n; i++) {
18081808
var id = {{{ makeGetValue('ids', 'i*4', 'i32') }}};
@@ -1844,7 +1844,7 @@ var LibraryGL = {
18441844
GLctx.disjointTimerQueryExt['queryCounterEXT'](GL.queries[id], target);
18451845
},
18461846

1847-
glGetQueryivEXT__sig: 'viii',
1847+
glGetQueryivEXT__sig: 'viip',
18481848
glGetQueryivEXT: (target, pname, params) => {
18491849
if (!params) {
18501850
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
@@ -1858,7 +1858,7 @@ var LibraryGL = {
18581858
{{{ makeSetValue('params', '0', 'GLctx.disjointTimerQueryExt[\'getQueryEXT\'](target, pname)', 'i32') }}};
18591859
},
18601860

1861-
glGetQueryObjectivEXT__sig: 'viii',
1861+
glGetQueryObjectivEXT__sig: 'viip',
18621862
glGetQueryObjectivEXT: (id, pname, params) => {
18631863
if (!params) {
18641864
// GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense
@@ -1884,7 +1884,7 @@ var LibraryGL = {
18841884
},
18851885
glGetQueryObjectuivEXT: 'glGetQueryObjectivEXT',
18861886

1887-
glGetQueryObjecti64vEXT__sig: 'viii',
1887+
glGetQueryObjecti64vEXT__sig: 'viip',
18881888
glGetQueryObjecti64vEXT__deps: ['$writeI53ToI64'],
18891889
glGetQueryObjecti64vEXT: (id, pname, params) => {
18901890
if (!params) {
@@ -3840,7 +3840,7 @@ var LibraryGL = {
38403840
drawcount);
38413841
},
38423842

3843-
glMultiDrawArraysInstancedWEBGL__sig: 'viiiii',
3843+
glMultiDrawArraysInstancedWEBGL__sig: 'vipppi',
38443844
glMultiDrawArraysInstancedANGLE: 'glMultiDrawArraysInstancedWEBGL',
38453845
glMultiDrawArraysInstancedWEBGL: (mode, firsts, counts, instanceCounts, drawcount) => {
38463846
GLctx.multiDrawWebgl['multiDrawArraysInstancedWEBGL'](
@@ -3854,10 +3854,34 @@ var LibraryGL = {
38543854
drawcount);
38553855
},
38563856

3857+
#if MEMORY64
3858+
// Convert an array of i64 offsets to an array of i32 offsets returning a
3859+
// pointer to the new (stack allocated) array.
3860+
$convertOffsets__internal: true,
3861+
$convertOffsets: (offsets, count) => {
3862+
var offsets32 = stackAlloc(count * 4);
3863+
var i64ptr = offsets >> 3;
3864+
var i32ptr = offsets32 >> 2;
3865+
for (var i = 0; i < count; i++, i32ptr++, i64ptr++) {
3866+
var i64val = HEAPU64[i64ptr];
3867+
assert(i64val >= 0 && i32ptr <= 0xffffffff);
3868+
HEAPU32[i32ptr] = Number(i64val);
3869+
}
3870+
return offsets32;
3871+
},
3872+
#endif
3873+
38573874
glMultiDrawElementsWEBGL__sig: 'vipipi',
38583875
glMultiDrawElements: 'glMultiDrawElementsWEBGL',
38593876
glMultiDrawElementsANGLE: 'glMultiDrawElementsWEBGL',
3877+
#if MEMORY64
3878+
glMultiDrawElementsWEBGL__deps: ['$convertOffsets'],
3879+
#endif
38603880
glMultiDrawElementsWEBGL: (mode, counts, type, offsets, drawcount) => {
3881+
#if MEMORY64
3882+
var stack = stackSave();
3883+
offsets = convertOffsets(offsets, drawcount);
3884+
#endif
38613885
GLctx.multiDrawWebgl['multiDrawElementsWEBGL'](
38623886
mode,
38633887
HEAP32,
@@ -3866,11 +3890,21 @@ var LibraryGL = {
38663890
HEAP32,
38673891
offsets >> 2,
38683892
drawcount);
3893+
#if MEMORY64
3894+
stackRestore(stack);
3895+
#endif
38693896
},
38703897

3871-
glMultiDrawElementsInstancedWEBGL__sig: 'viiiiii',
3898+
glMultiDrawElementsInstancedWEBGL__sig: 'vipippi',
38723899
glMultiDrawElementsInstancedANGLE: 'glMultiDrawElementsInstancedWEBGL',
3900+
#if MEMORY64
3901+
glMultiDrawElementsInstancedWEBGL__deps: ['$convertOffsets'],
3902+
#endif
38733903
glMultiDrawElementsInstancedWEBGL: (mode, counts, type, offsets, instanceCounts, drawcount) => {
3904+
#if MEMORY64
3905+
var stack = stackSave();
3906+
offsets = convertOffsets(offsets, drawcount);
3907+
#endif
38743908
GLctx.multiDrawWebgl['multiDrawElementsInstancedWEBGL'](
38753909
mode,
38763910
HEAP32,
@@ -3881,6 +3915,9 @@ var LibraryGL = {
38813915
HEAP32,
38823916
instanceCounts >> 2,
38833917
drawcount);
3918+
#if MEMORY64
3919+
stackRestore(stack);
3920+
#endif
38843921
},
38853922

38863923
// As a small peculiarity, we currently allow building with -sFULL_ES3 to emulate client side arrays,

test/test_browser.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,7 +1330,8 @@ def test_webgl_context_attributes(self):
13301330
# perform tests with attributes activated
13311331
self.btest_exit('test_webgl_context_attributes_glut.c', args=['--js-library', 'check_webgl_attributes_support.js', '-DAA_ACTIVATED', '-DDEPTH_ACTIVATED', '-DSTENCIL_ACTIVATED', '-DALPHA_ACTIVATED', '-lGL', '-lglut', '-lGLEW'])
13321332
self.btest_exit('test_webgl_context_attributes_sdl.c', args=['--js-library', 'check_webgl_attributes_support.js', '-DAA_ACTIVATED', '-DDEPTH_ACTIVATED', '-DSTENCIL_ACTIVATED', '-DALPHA_ACTIVATED', '-lGL', '-lSDL', '-lGLEW'])
1333-
self.btest_exit('test_webgl_context_attributes_sdl2.c', args=['--js-library', 'check_webgl_attributes_support.js', '-DAA_ACTIVATED', '-DDEPTH_ACTIVATED', '-DSTENCIL_ACTIVATED', '-DALPHA_ACTIVATED', '-lGL', '-sUSE_SDL=2', '-lGLEW'])
1333+
if not self.is_wasm64():
1334+
self.btest_exit('test_webgl_context_attributes_sdl2.c', args=['--js-library', 'check_webgl_attributes_support.js', '-DAA_ACTIVATED', '-DDEPTH_ACTIVATED', '-DSTENCIL_ACTIVATED', '-DALPHA_ACTIVATED', '-lGL', '-sUSE_SDL=2', '-lGLEW'])
13341335
self.btest_exit('test_webgl_context_attributes_glfw.c', args=['--js-library', 'check_webgl_attributes_support.js', '-DAA_ACTIVATED', '-DDEPTH_ACTIVATED', '-DSTENCIL_ACTIVATED', '-DALPHA_ACTIVATED', '-lGL', '-lglfw', '-lGLEW'])
13351336

13361337
# perform tests with attributes desactivated
@@ -2749,14 +2750,15 @@ def test_webgl_unmasked_vendor_webgl(self):
27492750
self.btest_exit('webgl_unmasked_vendor_webgl.c', args=['-lGL'])
27502751

27512752
@requires_graphics_hardware
2752-
def test_webgl2(self):
2753-
for opts in [
2754-
['-sMIN_CHROME_VERSION=0', '-Wno-transpile'],
2755-
['-O2', '-g1', '--closure=1', '-sWORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG'],
2756-
['-sFULL_ES2'],
2757-
]:
2758-
print(opts)
2759-
self.btest_exit('webgl2.cpp', args=['-sMAX_WEBGL_VERSION=2', '-lGL'] + opts)
2753+
@parameterized({
2754+
'legacy_browser': (['-sMIN_CHROME_VERSION=0', '-Wno-transpile'],),
2755+
'closure': (['-O2', '-g1', '--closure=1', '-sWORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG'],),
2756+
'full_es2': (['-sFULL_ES2'],),
2757+
})
2758+
def test_webgl2(self, args):
2759+
if '-sMIN_CHROME_VERSION=0' in args and self.is_wasm64():
2760+
self.skipTest('wasm64 not supported by legacy browsers')
2761+
self.btest_exit('webgl2.cpp', args=['-sMAX_WEBGL_VERSION=2', '-lGL'] + args)
27602762

27612763
# Tests the WebGL 2 glGetBufferSubData() functionality.
27622764
@requires_graphics_hardware
@@ -4502,6 +4504,7 @@ def test_small_js_flags(self):
45024504
@requires_threads
45034505
@requires_offscreen_canvas
45044506
@requires_graphics_hardware
4507+
@no_wasm64('TODO: wasm64 + OFFSCREENCANVAS')
45054508
def test_webgl_offscreen_canvas_in_pthread(self, args):
45064509
self.btest('gl_in_pthread.cpp', expected='1', args=args + ['-pthread', '-sPTHREAD_POOL_SIZE=2', '-sOFFSCREENCANVAS_SUPPORT', '-lGL'])
45074510

@@ -4521,6 +4524,7 @@ def test_webgl_offscreen_canvas_in_mainthread_after_pthread(self, args):
45214524
@requires_threads
45224525
@requires_offscreen_canvas
45234526
@requires_graphics_hardware
4527+
@no_wasm64('TODO: wasm64 + OFFSCREENCANVAS')
45244528
def test_webgl_offscreen_canvas_only_in_pthread(self):
45254529
self.btest_exit('gl_only_in_pthread.cpp', args=['-pthread', '-sPTHREAD_POOL_SIZE', '-sOFFSCREENCANVAS_SUPPORT', '-lGL', '-sOFFSCREEN_FRAMEBUFFER'])
45264530

@@ -4533,15 +4537,16 @@ def test_webgl_from_client_side_memory_without_default_enabled_extensions(self):
45334537
# For testing WebGL draft extensions like this, if using chrome as the browser,
45344538
# We might want to append the --enable-webgl-draft-extensions to the EMTEST_BROWSER env arg.
45354539
@requires_graphics_hardware
4536-
def test_webgl_multi_draw(self):
4537-
self.btest('webgl_multi_draw_test.c', reference='browser/webgl_multi_draw.png',
4538-
args=['-lGL', '-sOFFSCREEN_FRAMEBUFFER', '-DMULTI_DRAW_ARRAYS=1', '-DEXPLICIT_SWAP=1'])
4539-
self.btest('webgl_multi_draw_test.c', reference='browser/webgl_multi_draw.png',
4540-
args=['-lGL', '-sOFFSCREEN_FRAMEBUFFER', '-DMULTI_DRAW_ARRAYS_INSTANCED=1', '-DEXPLICIT_SWAP=1'])
4541-
self.btest('webgl_multi_draw_test.c', reference='browser/webgl_multi_draw.png',
4542-
args=['-lGL', '-sOFFSCREEN_FRAMEBUFFER', '-DMULTI_DRAW_ELEMENTS=1', '-DEXPLICIT_SWAP=1'])
4543-
self.btest('webgl_multi_draw_test.c', reference='browser/webgl_multi_draw.png',
4544-
args=['-lGL', '-sOFFSCREEN_FRAMEBUFFER', '-DMULTI_DRAW_ELEMENTS_INSTANCED=1', '-DEXPLICIT_SWAP=1'])
4540+
@parameterized({
4541+
'arrays': (['-DMULTI_DRAW_ARRAYS'],),
4542+
'arrays_instanced': (['-DMULTI_DRAW_ARRAYS_INSTANCED'],),
4543+
'elements': (['-DMULTI_DRAW_ELEMENTS'],),
4544+
'elements_instanced': (['-DMULTI_DRAW_ELEMENTS_INSTANCED'],),
4545+
})
4546+
def test_webgl_multi_draw(self, args):
4547+
self.btest('webgl_multi_draw_test.c',
4548+
reference='browser/webgl_multi_draw.png',
4549+
args=['-lGL', '-sOFFSCREEN_FRAMEBUFFER', '-DEXPLICIT_SWAP'] + args)
45454550

45464551
# Tests for base_vertex/base_instance extension
45474552
# For testing WebGL draft extensions like this, if using chrome as the browser,
@@ -4580,6 +4585,7 @@ def test_webgl_timer_query(self, args):
45804585

45814586
# Tests that -sOFFSCREEN_FRAMEBUFFER rendering works.
45824587
@requires_graphics_hardware
4588+
@no_wasm64('TODO: wasm64 + OFB')
45834589
def test_webgl_offscreen_framebuffer(self):
45844590
# Tests all the different possible versions of libgl
45854591
for threads in [[], ['-pthread', '-sPROXY_TO_PTHREAD']]:
@@ -4632,6 +4638,7 @@ def test_webgl_array_of_structs_uniform(self):
46324638
@requires_threads
46334639
@requires_offscreen_canvas
46344640
@requires_graphics_hardware
4641+
@no_wasm64('TODO: wasm64 + OFFSCREENCANVAS')
46354642
def test_webgl_offscreen_canvas_in_proxied_pthread(self, asyncify):
46364643
cmd = ['-pthread', '-sOFFSCREENCANVAS_SUPPORT', '-lGL', '-sGL_DEBUG', '-sPROXY_TO_PTHREAD']
46374644
if asyncify:
@@ -4648,6 +4655,7 @@ def test_webgl_offscreen_canvas_in_proxied_pthread(self, asyncify):
46484655
@requires_threads
46494656
@requires_graphics_hardware
46504657
@requires_offscreen_canvas
4658+
@no_wasm64('TODO: wasm64 + OFFSCREENCANVAS')
46514659
def test_webgl_resize_offscreencanvas_from_main_thread(self, args):
46524660
for args2 in [[], ['-DTEST_SYNC_BLOCKING_LOOP=1']]:
46534661
for args3 in [[], ['-sOFFSCREENCANVAS_SUPPORT', '-sOFFSCREEN_FRAMEBUFFER']]:

0 commit comments

Comments
 (0)