diff --git a/3rdparty/meshoptimizer/Makefile b/3rdparty/meshoptimizer/Makefile index 3e43811b0..82843a962 100644 --- a/3rdparty/meshoptimizer/Makefile +++ b/3rdparty/meshoptimizer/Makefile @@ -24,6 +24,10 @@ CFLAGS=-g -Wall -Wextra -Werror -std=c89 CXXFLAGS=-g -Wall -Wextra -Wshadow -Wno-missing-field-initializers -Werror -std=c++98 LDFLAGS= +WASM_SOURCES=src/vertexcodec.cpp src/indexcodec.cpp +WASM_EXPORTS=["_meshopt_decodeVertexBuffer","_meshopt_decodeIndexBuffer","_sbrk","__start"] +WASM_FLAGS=-O3 -DNDEBUG -s EXPORTED_FUNCTIONS='$(WASM_EXPORTS)' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=24576 -s TOTAL_MEMORY=65536 + ifeq ($(config),iphone) IPHONESDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk CFLAGS+=-arch armv7 -arch arm64 -isysroot $(IPHONESDK) @@ -70,10 +74,17 @@ format: gltfpack: $(GLTFPACK_OBJECTS) $(LIBRARY) $(CXX) $^ $(LDFLAGS) -o $@ -js/meshopt_decoder.js: src/vertexcodec.cpp src/indexcodec.cpp +build/decoder_base.wasm: $(WASM_SOURCES) @mkdir -p build - emcc $(filter %.cpp,$^) -O3 -DNDEBUG -s EXPORTED_FUNCTIONS='["_meshopt_decodeVertexBuffer", "_meshopt_decodeIndexBuffer", "_sbrk"]' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=24576 -s TOTAL_MEMORY=65536 -o build/meshopt_decoder.wasm - sed -i "s#\(var wasm = \)\".*\";#\\1\"$$(cat build/meshopt_decoder.wasm | base64 -w 0)\";#" $@ + emcc $^ $(WASM_FLAGS) -o $@ + +build/decoder_simd.wasm: $(WASM_SOURCES) + @mkdir -p build + emcc $^ $(WASM_FLAGS) -o $@ -munimplemented-simd128 -mbulk-memory + +js/meshopt_decoder.js: build/decoder_base.wasm build/decoder_simd.wasm + sed -i "s#\(var wasm_base = \)\".*\";#\\1\"$$(cat build/decoder_base.wasm | hexdump -v -e '1/1 "%02X"')\";#" $@ + sed -i "s#\(var wasm_simd = \)\".*\";#\\1\"$$(cat build/decoder_simd.wasm | hexdump -v -e '1/1 "%02X"')\";#" $@ $(EXECUTABLE): $(DEMO_OBJECTS) $(LIBRARY) $(CXX) $^ $(LDFLAGS) -o $@ diff --git a/3rdparty/meshoptimizer/js/meshopt_decoder.js b/3rdparty/meshoptimizer/js/meshopt_decoder.js index aab8b4318..8070dec8d 100644 --- a/3rdparty/meshoptimizer/js/meshopt_decoder.js +++ b/3rdparty/meshoptimizer/js/meshopt_decoder.js @@ -2,7 +2,16 @@ // Copyright (C) 2016-2019, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) var MeshoptDecoder = (function() { "use strict"; - var wasm = "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"; + var wasm_base = "0061736D0100000001230660017F0060000060057F7F7F7F7F017F60037F7F7F017F60017F017F60037F7F7F0002270103656E761F656D736372697074656E5F6E6F746966795F6D656D6F72795F67726F7774680000030908030104040500020205030100010608017F014190CC010B075305066D656D6F727902001A6D6573686F70745F6465636F64655665727465784275666665720008196D6573686F70745F6465636F6465496E6465784275666665720007065F73746172740002047362726B00030AC22408820401037F20024180C0004F0440200020012002100520000F0B200020026A210302402000200173410371450440024020024101480440200021020C010B2000410371450440200021020C010B200021020340200220012D00003A0000200141016A2101200241016A220220034F0D0120024103710D000B0B02402003417C71220441C000490D002002200441406A22054B0D0003402002200128020036020020022001280204360204200220012802083602082002200128020C36020C2002200128021036021020022001280214360214200220012802183602182002200128021C36021C2002200128022036022020022001280224360224200220012802283602282002200128022C36022C2002200128023036023020022001280234360234200220012802383602382002200128023C36023C200141406B2101200241406B220220054D0D000B0B200220044F0D01034020022001280200360200200141046A2101200241046A22022004490D000B0C010B20034104490440200021020C010B2003417C6A22042000490440200021020C010B200021020340200220012D00003A0000200220012D00013A0001200220012D00023A0002200220012D00033A0003200141046A2101200241046A220220044D0D000B0B200220034904400340200220012D00003A0000200141016A2101200241016A22022003470D000B0B20000B0300010B3B01027F3F002101024041900C280200220220006A220020014110744D0D00200010040D004188084130360200417F0F0B41900C200036020020020B230020003F004110746B41FFFF036A4110764000417F46044041000F0B4100100041010B3B01017F2002044003402000200120024180202002418020491B22031001210020014180206A210120004180206A2100200220036B22020D000B0B0BC60201027F20004180016A2201417F6A41FF013A0000200041FF013A00002001417E6A41FF013A0000200041FF013A00012001417D6A41FF013A0000200041FF013A00022001417C6A41FF013A0000200041FF013A00032000410020006B41037122016A2200417F360200200041800120016B417C7122026A2201417C6A417F360200024020024109490D002000417F3602082000417F360204200141786A417F360200200141746A417F36020020024119490D002000417F3602182000417F3602142000417F3602102000417F36020C200141706A417F3602002001416C6A417F360200200141686A417F360200200141646A417F3602002002200041047141187222026B22014120490D00200020026A210003402000427F3703182000427F3703102000427F3703082000427F370300200041206A2100200141606A2201411F4B0D000B0B0B8610010E7F230041C0016B22092400027F417E200141036E220641116A20044B0D001A417F20032D000041E001470D001A200941406B10062009427F3703382009427F3703302009427F3703282009427F3703202009427F3703182009427F3703102009427F3703082009427F370300200320046A41706A2111200341016A221220066A210B200104402002410247210F4100210341002102410021040340417E200B20114B0D021A027F20122D0000220A41EF014D0440200941406B200A410476417F73200C6A410F714103746A220628020421052006280200210D200A410F712206410F4704402009200A417F7320046A410F714102746A280200200320061B2108200645210A0240200F450440200020024101746A2206200D3B0100200620053B0102200620083B01040C010B200020024102746A2206200D36020020062008360208200620053602040B2003200A6A2103200941406B200C4103746A2206200536020420062008360200200920044102746A2008360200200941406B200C41016A410F7122054103746A2206200D360200200620083602042004200A6A2104200541016A0C020B200B2C0000220641FF01712107027F200B41016A2006417F4A0D001A200741FF0071200B2C0001220641FF0071410774722107200B41026A2006417F4A0D001A200B2C0002220641FF0071410E742007722107200B41036A2006417F4A0D001A200B2C0003220641FF00714115742007722107200B41046A2006417F4A0D001A200B2D0004411C742007722107200B41056A0B210B410020074101716B200741017673200E6A210E0240200F450440200020024101746A2206200D3B0100200620053B01022006200E3B01040C010B200020024102746A2206200D3602002006200E360208200620053602040B200941406B200C4103746A220620053602042006200E360200200920044102746A200E360200200941406B200C41016A410F7122054103746A2206200D3602002006200E360204200441016A2104200541016A0C010B200A41FD014D0440200920042011200A410F716A2D0000220841047622056B410F714102746A280200200341016A220620051B210D2009200420086B410F714102746A280200200620054522056A220A2008410F7122061B210720064521080240200F450440200020024101746A220620033B01002006200D3B0102200620073B01040C010B200020024102746A22062003360200200620073602082006200D3602040B200920044102746A2003360200200941406B200C4103746A220620033602042006200D3602002009200441016A2206410F714102746A200D360200200941406B200C41016A410F714103746A220420073602002004200D3602042009200520066A410F7122054102746A2007360200200941406B200C41026A410F7122064103746A2204200336020020042007360204200520086A21042008200A6A2103200641016A0C010B2003200A41FE014622056A2107200B2D00002208410F71211002402008410476220D450440200741016A210A0C010B2007210A20092004200D6B410F714102746A28020021070B02402010450440200A41016A21060C010B200A21062009200420086B410F714102746A280200210A0B024020050440200B41016A21080C010B200B2C0001220541FF01712103027F200B41026A2005417F4A0D001A200341FF0071200B2C0002220541FF0071410774722103200B41036A2005417F4A0D001A200B2C0003220541FF0071410E742003722103200B41046A2005417F4A0D001A200B2C0004220541FF00714115742003722103200B41056A2005417F4A0D001A200B2D0005411C742003722103200B41066A0B2108410020034101716B200341017673200E6A220E21030B0240200D410F470440200821050C010B20082C0000220541FF01712107027F200841016A2005417F4A0D001A200741FF007120082C0001220541FF0071410774722107200841026A2005417F4A0D001A20082C0002220541FF0071410E742007722107200841036A2005417F4A0D001A20082C0003220541FF00714115742007722107200841046A2005417F4A0D001A20082D0004411C742007722107200841056A0B2105410020074101716B200741017673200E6A220E21070B02402010410F4704402005210B0C010B20052C0000220841FF0171210A027F200541016A2008417F4A0D001A200A41FF007120052C0001220841FF007141077472210A200541026A2008417F4A0D001A20052C0002220841FF0071410E74200A72210A200541036A2008417F4A0D001A20052C0003220841FF0071411574200A72210A200541046A2008417F4A0D001A20052D0004411C74200A72210A200541056A0B210B4100200A4101716B200A41017673200E6A220E210A0B0240200F450440200020024101746A220520033B0100200520073B01022005200A3B01040C010B200020024102746A220520033602002005200A360208200520073602040B200941406B200C4103746A2205200336020420052007360200200920044102746A2003360200200941406B200C41016A410F714103746A2205200A360200200520073602042009200441016A2205410F714102746A2007360200200941406B200C41026A410F714103746A220420033602002004200A36020420092005200D45200D410F46726A2203410F714102746A200A36020020032010452010410F46726A210420062103200C41036A0B210C201241016A2112200C410F71210C2004410F712104200241036A22022001490D000B0B4100417D200B2011461B0B210C200941C0016A2400200C0BCB0C010F7F23004180C4006B22102400027F417E200241016A20044B0D001A417F20032D000041A001470D001A2010200320046A220F20026B20021001210B4180C00020026E41F0FF007122044180022004418002491B2111200341016A210902400340200C20014F0D0120112001200C6B200C20116A2001491B210D024002402002450440200921040C010B200D410F6A22034170712112200341047641036A41027621134100210E2009210A0340200F200A6B2013490440410021090C030B200A20136A21044100210941002103201204400340200F20046B4120490D04200B4180C2006A20036A210802400240024002400240200A20034106766A2D000020034103764106717641037141016B0E03010203000B20084200370300200842003703080C030B200820042D000420042D000022064106762205200541034622051B3A00002008200441046A20056A22052D000020064104764103712207200741034622071B3A00012008200520076A22052D000020064102764103712207200741034622071B3A00022008200520076A22052D000020064103712206200641034622061B3A00032008200520066A22052D000020042D000122064106762207200741034622071B3A00042008200520076A22052D000020064104764103712207200741034622071B3A00052008200520076A22052D000020064102764103712207200741034622071B3A00062008200520076A22052D000020064103712206200641034622061B3A00072008200520066A22052D000020042D000222064106762207200741034622071B3A00082008200520076A22052D000020064104764103712207200741034622071B3A00092008200520076A22052D000020064102764103712207200741034622071B3A000A2008200520076A22052D000020064103712206200641034622061B3A000B2008200520066A22062D000020042D000322044106762205200541034622051B3A000C2008200520066A22062D000020044104764103712205200541034622051B3A000D2008200520066A22062D000020044102764103712205200541034622051B3A000E2008200520066A22082D000020044103712204200441034622041B3A000F200420086A21040C020B200820042D000820042D0000220641047622052005410F4622051B3A00002008200441086A20056A22052D00002006410F7122062006410F4622061B3A00012008200520066A22062D000020042D0001220541047622072007410F4622071B3A00022008200620076A22062D00002005410F7122052005410F4622051B3A00032008200520066A22062D000020042D0002220541047622072007410F4622071B3A00042008200620076A22062D00002005410F7122052005410F4622051B3A00052008200520066A22062D000020042D0003220541047622072007410F4622071B3A00062008200620076A22062D00002005410F7122052005410F4622051B3A00072008200520066A22062D000020042D0004220541047622072007410F4622071B3A00082008200620076A22062D00002005410F7122052005410F4622051B3A00092008200520066A22062D000020042D0005220541047622072007410F4622071B3A000A2008200620076A22062D00002005410F7122052005410F4622051B3A000B2008200520066A22062D000020042D0006220541047622072007410F4622071B3A000C2008200620076A22062D00002005410F7122052005410F4622051B3A000D2008200520066A22062D000020042D0007220441047622052005410F4622051B3A000E2008200520066A22082D00002004410F7122042004410F4622041B3A000F200420086A21040C010B2008200429000037000020082004290008370008200441106A21040B200341106A22032012490D000B0B2004450D02200D0440200B200E6A2D0000210A200E21030340200B4180026A20036A200A200B4180C2006A20096A2D0000220A4101764100200A4101716B736A220A3A0000200220036A2103200941016A2209200D470D000B0B2004210A200E41016A220E2002470D000B0B20002002200C6C6A200B4180026A2002200D6C10011A200B200B4180026A200D417F6A20026C6A200210011A200421090B200D410020091B200C6A210C20090D000B417E0C010B4100417D200F20096B20024120200241204B1B461B0B210920104180C4006A240020090B0B09010041900C0B02B066"; + var wasm_simd = "0061736D0100000001160460017F0060000060057F7F7F7F7F017F60017F017F02270103656E761F656D736372697074656E5F6E6F746966795F6D656D6F72795F67726F777468000003070603030102020105030100010608017F014190DE010B075305066D656D6F727902001A6D6573686F70745F6465636F64655665727465784275666665720005196D6573686F70745F6465636F6465496E6465784275666665720004065F73746172740003047362726B00010C01010AF835063B01027F3F002101024041901E280200220220006A220020014110744D0D00200010020D0041881A4130360200417F0F0B41901E200036020020020B230020003F004110746B41FFFF036A4110764000417F46044041000F0B4100100041010B0E01017F230021001006200024000B8D10010E7F230041C0016B22092400027F417E200141036E220641116A20044B0D001A417F20032D000041E001470D001A200941406B41FF01418001FC0B002009427F3703382009427F3703302009427F3703282009427F3703202009427F3703182009427F3703102009427F3703082009427F370300200320046A41706A2111200341016A221220066A210B200104402002410247210F4100210341002102410021040340417E200B20114B0D021A027F20122D0000220A41EF014D0440200941406B200A410476417F73200C6A410F714103746A220628020421052006280200210D200A410F712206410F4704402009200A417F7320046A410F714102746A280200200320061B2108200645210A0240200F450440200020024101746A2206200D3B0100200620053B0102200620083B01040C010B200020024102746A2206200D36020020062008360208200620053602040B2003200A6A2103200941406B200C4103746A2206200536020420062008360200200920044102746A2008360200200941406B200C41016A410F7122054103746A2206200D360200200620083602042004200A6A2104200541016A0C020B200B2C0000220641FF01712107027F200B41016A2006417F4A0D001A200741FF0071200B2C0001220641FF0071410774722107200B41026A2006417F4A0D001A200B2C0002220641FF0071410E742007722107200B41036A2006417F4A0D001A200B2C0003220641FF00714115742007722107200B41046A2006417F4A0D001A200B2D0004411C742007722107200B41056A0B210B410020074101716B200741017673200E6A210E0240200F450440200020024101746A2206200D3B0100200620053B01022006200E3B01040C010B200020024102746A2206200D3602002006200E360208200620053602040B200941406B200C4103746A220620053602042006200E360200200920044102746A200E360200200941406B200C41016A410F7122054103746A2206200D3602002006200E360204200441016A2104200541016A0C010B200A41FD014D0440200920042011200A410F716A2D0000220841047622056B410F714102746A280200200341016A220620051B210D2009200420086B410F714102746A280200200620054522056A220A2008410F7122061B210720064521080240200F450440200020024101746A220620033B01002006200D3B0102200620073B01040C010B200020024102746A22062003360200200620073602082006200D3602040B200920044102746A2003360200200941406B200C4103746A220620033602042006200D3602002009200441016A2206410F714102746A200D360200200941406B200C41016A410F714103746A220420073602002004200D3602042009200520066A410F7122054102746A2007360200200941406B200C41026A410F7122064103746A2204200336020020042007360204200520086A21042008200A6A2103200641016A0C010B2003200A41FE014622056A2107200B2D00002208410F71211002402008410476220D450440200741016A210A0C010B2007210A20092004200D6B410F714102746A28020021070B02402010450440200A41016A21060C010B200A21062009200420086B410F714102746A280200210A0B024020050440200B41016A21080C010B200B2C0001220541FF01712103027F200B41026A2005417F4A0D001A200341FF0071200B2C0002220541FF0071410774722103200B41036A2005417F4A0D001A200B2C0003220541FF0071410E742003722103200B41046A2005417F4A0D001A200B2C0004220541FF00714115742003722103200B41056A2005417F4A0D001A200B2D0005411C742003722103200B41066A0B2108410020034101716B200341017673200E6A220E21030B0240200D410F470440200821050C010B20082C0000220541FF01712107027F200841016A2005417F4A0D001A200741FF007120082C0001220541FF0071410774722107200841026A2005417F4A0D001A20082C0002220541FF0071410E742007722107200841036A2005417F4A0D001A20082C0003220541FF00714115742007722107200841046A2005417F4A0D001A20082D0004411C742007722107200841056A0B2105410020074101716B200741017673200E6A220E21070B02402010410F4704402005210B0C010B20052C0000220841FF0171210A027F200541016A2008417F4A0D001A200A41FF007120052C0001220841FF007141077472210A200541026A2008417F4A0D001A20052C0002220841FF0071410E74200A72210A200541036A2008417F4A0D001A20052C0003220841FF0071411574200A72210A200541046A2008417F4A0D001A20052D0004411C74200A72210A200541056A0B210B4100200A4101716B200A41017673200E6A220E210A0B0240200F450440200020024101746A220520033B0100200520073B01022005200A3B01040C010B200020024102746A220520033602002005200A360208200520073602040B200941406B200C4103746A2205200336020420052007360200200920044102746A2003360200200941406B200C41016A410F714103746A2205200A360200200520073602042009200441016A2205410F714102746A2007360200200941406B200C41026A410F714103746A220420033602002004200A36020420092005200D45200D410F46726A2203410F714102746A200A36020020032010452010410F46726A210420062103200C41036A0B210C201241016A2112200C410F71210C2004410F712104200241036A22022001490D000B0B4100417D200B2011461B0B210C200941C0016A2400200C0B862403107F017E097B23004180CA006B22082400027F417E200241016A20044B0D001A417F20032D000041A001470D001A2008200320046A220B20026B2002FC0A00004180C00020026E41F0FF007122044180022004418002491B2110200341016A210502400340200A20014F0D0120102001200A6B200A20106A2001491B210D024020020440200D410F6A2203417071220941036C211320094101742114200341047641036A41027621114100210E03402005210C4100210F02400340200B200C6B2011490440410021050C050B20084180C2006A2009200F6C6A2112200C20116A210541C0002103410021040240200941C000490D0041002107200B20056B41FF004D0D00034020032104200720126A210602400240024002400240200C20074106766A2D0000220741037141016B0E03010203000B20064100FD0CFD0104000C030B20062005FD0000042005FD00000022164104FD662016FD030010011102120313041405150616071722164102FD672016FD03001001110212031304140515061607174183868C18FD0CFD4D22174103FD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01040020034180186A2D0000200541046A2016FD06006A6A21050C020B20062005FD0000082005FD00000022164104FD672016FD0300100111021203130414051506160717418F9EBCF800FD0CFD4D2217410FFD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01040020034180186A2D0000200541086A2016FD06006A6A21050C010B20062005FD000000FD010400200541106A21050B02400240024002400240200741027641037141016B0E03010203000B20064100FD0CFD0104100C030B20062005FD0000042005FD00000022164104FD662016FD030010011102120313041405150616071722164102FD672016FD03001001110212031304140515061607174183868C18FD0CFD4D22174103FD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01041020034180186A2D0000200541046A2016FD06006A6A21050C020B20062005FD0000082005FD00000022164104FD672016FD0300100111021203130414051506160717418F9EBCF800FD0CFD4D2217410FFD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01041020034180186A2D0000200541086A2016FD06006A6A21050C010B20062005FD000000FD010410200541106A21050B024002400240024002400240024002400240200741047641037141016B0E03010203000B20064100FD0CFD010420200741067641016B0E03040506030B20062005FD0000042005FD00000022164104FD662016FD030010011102120313041405150616071722164102FD672016FD03001001110212031304140515061607174183868C18FD0CFD4D22174103FD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01042020034180186A2D0000200541046A2016FD06006A6A2105200741067641016B0E03030405020B20062005FD0000082005FD00000022164104FD672016FD0300100111021203130414051506160717418F9EBCF800FD0CFD4D2217410FFD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01042020034180186A2D0000200541086A2016FD06006A6A2105200741067641016B0E03020304010B20062005FD000000FD010420200541106A2105200741067641016B0E03010203000B20064100FD0CFD0104300C030B20062005FD0000042005FD00000022164104FD662016FD030010011102120313041405150616071722164102FD672016FD03001001110212031304140515061607174183868C18FD0CFD4D22174103FD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01043020034180186A2D0000200541046A2016FD06006A6A21050C020B20062005FD0000082005FD00000022164104FD672016FD0300100111021203130414051506160717418F9EBCF800FD0CFD4D2217410FFD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01043020034180186A2D0000200541086A2016FD06006A6A21050C010B20062005FD000000FD010430200541106A21050B200441406B220320094B0D0120042107200B20056B41FF004B0D000B0B200420094904400340200B20056B4120490440410021050C070B200420126A210302400240024002400240200C20044106766A2D000020044103764106717641037141016B0E03010203000B20034100FD0CFD0104000C030B20032005FD0000042005FD00000022164104FD662016FD030010011102120313041405150616071722164102FD672016FD03001001110212031304140515061607174183868C18FD0CFD4D22174103FD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01040020034180186A2D0000200541046A2016FD06006A6A21050C020B20032005FD0000082005FD00000022164104FD672016FD0300100111021203130414051506160717418F9EBCF800FD0CFD4D2217410FFD04FD1822182017FD030001020308090A0B040506070C0D0E0F2216FD100042818490C090C0808208832016FD10014290C08082888288A0807F8384221542108820158422154208882015842215A741FF017122034103744180086AFD00030020034180186AFD00000022162017FD03000000000000000000000000000000002015422088A741FF017122034103744180086AFD000300FD57FD0300010203040506071011121314151617FDC00120172018FD50FD01040020034180186A2D0000200541086A2016FD06006A6A21050C010B20032005FD000000FD010400200541106A21050B200441106A22042009490D000B0B200504402005210C200F41016A220F4104460D020C010B0B410021050C030B2009044020084180026A200E6A21032008200E6AFD000200211B410021070340200320084180C2006A20076A2204FD00040022164101FD5620164101FD042218FD4DFD51FD4F221C200420096AFD00040022164101FD5620162018FD4DFD51FD4F221DFD03001001110212031304140515061607172217200420146AFD00040022164101FD5620162018FD4DFD51FD4F221E200420136AFD00040022164101FD5620162018FD4DFD51FD4F2219FD03001001110212031304140515061607172218FD0300011011020312130405141506071617221A201AFD0300010203000102030001020300010203201BFD572216FD0D00360200200220036A22032016201A201AFD0304050607040506070405060704050607FD572216FD0D00360200200220036A22032016201A201AFD0308090A0B08090A0B08090A0B08090A0BFD572216FD0D00360200200220036A22032016201A201AFD030C0D0E0F0C0D0E0F0C0D0E0F0C0D0E0FFD572216FD0D00360200200220036A2203201620172018FD03080918190A0B1A1B0C0D1C1D0E0F1E1F22182018FD0300010203000102030001020300010203FD572216FD0D00360200200220036A2203201620182018FD0304050607040506070405060704050607FD572216FD0D00360200200220036A2203201620182018FD0308090A0B08090A0B08090A0B08090A0BFD572216FD0D00360200200220036A2203201620182018FD030C0D0E0F0C0D0E0F0C0D0E0F0C0D0E0FFD572216FD0D00360200200220036A22032016201C201DFD03081809190A1A0B1B0C1C0D1D0E1E0F1F2217201E2019FD03081809190A1A0B1B0C1C0D1D0E1E0F1F2218FD030001101102031213040514150607161722192019FD0300010203000102030001020300010203FD572216FD0D00360200200220036A2203201620192019FD0304050607040506070405060704050607FD572216FD0D00360200200220036A2203201620192019FD0308090A0B08090A0B08090A0B08090A0BFD572216FD0D00360200200220036A2203201620192019FD030C0D0E0F0C0D0E0F0C0D0E0F0C0D0E0FFD572216FD0D00360200200220036A2203201620172018FD03080918190A0B1A1B0C0D1C1D0E0F1E1F22182018FD0300010203000102030001020300010203FD572216FD0D00360200200220036A2203201620182018FD0304050607040506070405060704050607FD572216FD0D00360200200220036A2203201620182018FD0308090A0B08090A0B08090A0B08090A0BFD572216FD0D00360200200220036A2203201620182018FD030C0D0E0F0C0D0E0F0C0D0E0F0C0D0E0FFD57221BFD0D00360200200220036A2103200741106A22072009490D000B0B200E41046A220E2002490D000B0B20002002200A6C6A20084180026A2002200D6CFC0A0000200820084180026A200D417F6A20026C6A2002FC0A00000B200D410020051B200A6A210A20050D000B417E0C010B4100417D200B20056B20024120200241204B1B461B0B210520084180CA006A240020050B7001057F230041106B2103034041002101410021020340200341086A20016A200241807F200020017641017122041B3A0000200220046A2102200141016A22014108470D000B20004103744180086A200329030837030020004180186A20023A0000200041016A2200418002470D000B0B0B09010041901E0B02B06F"; + var detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,4,26,11]); + + var wasm = wasm_base; + + if (WebAssembly.validate(detector)) { + wasm = wasm_simd; + console.log("Warning: meshopt_decoder is using experimental SIMD support"); + } var instance, heap; @@ -13,19 +22,21 @@ var MeshoptDecoder = (function() { }; var promise = - (typeof fetch === 'function' ? - fetch('data:application/octet-stream;base64,' + wasm) - .then(response => response.arrayBuffer()) : - Promise.resolve(Buffer.from(wasm, 'base64').buffer)) - .then(bytes => WebAssembly.instantiate(bytes, { env })) + WebAssembly.instantiate(unhex(wasm), { env }) .then(function(result) { instance = result.instance; - if (instance.exports.__wasm_call_ctors) { - instance.exports.__wasm_call_ctors(); - } + instance.exports._start(); env.emscripten_notify_memory_growth(0); }); + function unhex(data) { + var bytes = new Uint8Array(data.length / 2); + for (var i = 0; i < data.length; i += 2) { + bytes[i / 2] = parseInt(data.substr(i, 2), 16); + } + return bytes.buffer; + } + function decode(fun, target, count, size, source) { var sbrk = instance.exports.sbrk; var tp = sbrk(count * size); diff --git a/3rdparty/meshoptimizer/src/vertexcodec.cpp b/3rdparty/meshoptimizer/src/vertexcodec.cpp index 44c0c8787..ed9e41fc9 100644 --- a/3rdparty/meshoptimizer/src/vertexcodec.cpp +++ b/3rdparty/meshoptimizer/src/vertexcodec.cpp @@ -61,11 +61,14 @@ #endif #ifdef SIMD_WASM -#define wasm_v32x4_splat(v, i) wasm_v8x16_shuffle(v, v, 4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3, 4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3, 4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3, 4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3) -#define wasm_unpacklo_v8x16(a, b) wasm_v8x16_shuffle(a, b, 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23) -#define wasm_unpackhi_v8x16(a, b) wasm_v8x16_shuffle(a, b, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31) -#define wasm_unpacklo_v16x8(a, b) wasm_v8x16_shuffle(a, b, 0, 1, 16, 17, 2, 3, 18, 19, 4, 5, 20, 21, 6, 7, 22, 23) -#define wasm_unpackhi_v16x8(a, b) wasm_v8x16_shuffle(a, b, 8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31) +#define wasmx_shuffle_v32x4(v, i, j, k, l) wasm_v8x16_shuffle(v, v, 4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3, 4 * j, 4 * j + 1, 4 * j + 2, 4 * j + 3, 4 * k, 4 * k + 1, 4 * k + 2, 4 * k + 3, 4 * l, 4 * l + 1, 4 * l + 2, 4 * l + 3) +#define wasmx_splat_v32x4(v, i) wasmx_shuffle_v32x4(v, i, i, i, i) +#define wasmx_unpacklo_v8x16(a, b) wasm_v8x16_shuffle(a, b, 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23) +#define wasmx_unpackhi_v8x16(a, b) wasm_v8x16_shuffle(a, b, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31) +#define wasmx_unpacklo_v16x8(a, b) wasm_v8x16_shuffle(a, b, 0, 1, 16, 17, 2, 3, 18, 19, 4, 5, 20, 21, 6, 7, 22, 23) +#define wasmx_unpackhi_v16x8(a, b) wasm_v8x16_shuffle(a, b, 8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31) +#define wasmx_unpacklo_v64x2(a, b) wasm_v8x16_shuffle(a, b, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23) +#define wasmx_unpackhi_v64x2(a, b) wasm_v8x16_shuffle(a, b, 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31) #endif namespace meshopt @@ -414,6 +417,9 @@ static const unsigned char* decodeVertexBlock(const unsigned char* data, const u static unsigned char kDecodeBytesGroupShuffle[256][8]; static unsigned char kDecodeBytesGroupCount[256]; +#ifdef EMSCRIPTEN +__attribute__((cold)) // this saves 500 bytes in the output binary - we don't need to vectorize this loop! +#endif static bool decodeBytesGroupBuildTables() { for (int mask = 0; mask < 256; ++mask) @@ -706,24 +712,23 @@ static v128_t decodeShuffleMask(unsigned char mask0, unsigned char mask1) v128_t sm1r = wasm_i8x16_add(sm1, sm1off); - return wasm_v8x16_shuffle(sm0, sm1r, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23); + return wasmx_unpacklo_v64x2(sm0, sm1r); } static void wasmMoveMask(v128_t mask, unsigned char& mask0, unsigned char& mask1) { - uint64_t mbits = 0x8040201008040201ull; + v128_t mask_0 = wasmx_shuffle_v32x4(mask, 0, 2, 1, 3); - uint64_t m0_8 = wasm_i64x2_extract_lane(mask, 0) & mbits; - uint64_t m1_8 = wasm_i64x2_extract_lane(mask, 1) & mbits; + // TODO: when Chrome supports v128.const we can try doing vectorized and? + uint64_t mask_1a = wasm_i64x2_extract_lane(mask_0, 0) & 0x0804020108040201ull; + uint64_t mask_1b = wasm_i64x2_extract_lane(mask_0, 1) & 0x8040201080402010ull; - uint32_t m0_4 = m0_8 | (m0_8 >> 32); - uint32_t m1_4 = m1_8 | (m1_8 >> 32); + uint64_t mask_2 = mask_1a | mask_1b; + uint64_t mask_4 = mask_2 | (mask_2 >> 16); + uint64_t mask_8 = mask_4 | (mask_4 >> 8); - uint16_t m0_2 = m0_4 | (m0_4 >> 16); - uint16_t m1_2 = m1_4 | (m1_4 >> 16); - - mask0 = m0_2 | (m0_2 >> 8); - mask1 = m1_2 | (m1_2 >> 8); + mask0 = uint8_t(mask_8); + mask1 = uint8_t(mask_8 >> 32); } static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsigned char* buffer, int bitslog2) @@ -748,19 +753,12 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi v128_t sel2 = wasm_v128_load(data); v128_t rest = wasm_v128_load(data + 4); - v128_t sel22 = wasm_unpacklo_v8x16(wasm_i16x8_shr(sel2, 4), sel2); - v128_t sel2222 = wasm_unpacklo_v8x16(wasm_i16x8_shr(sel22, 2), sel22); + v128_t sel22 = wasmx_unpacklo_v8x16(wasm_i16x8_shr(sel2, 4), sel2); + v128_t sel2222 = wasmx_unpacklo_v8x16(wasm_i16x8_shr(sel22, 2), sel22); v128_t sel = wasm_v128_and(sel2222, wasm_i8x16_splat(3)); v128_t mask = wasm_i8x16_eq(sel, wasm_i8x16_splat(3)); - if (!wasm_i8x16_any_true(mask)) - { - wasm_v128_store(buffer, sel); - - return data + 4; - } - unsigned char mask0, mask1; wasmMoveMask(mask, mask0, mask1); @@ -780,18 +778,11 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi v128_t sel4 = wasm_v128_load(data); v128_t rest = wasm_v128_load(data + 8); - v128_t sel44 = wasm_unpacklo_v8x16(wasm_i16x8_shr(sel4, 4), sel4); + v128_t sel44 = wasmx_unpacklo_v8x16(wasm_i16x8_shr(sel4, 4), sel4); v128_t sel = wasm_v128_and(sel44, wasm_i8x16_splat(15)); v128_t mask = wasm_i8x16_eq(sel, wasm_i8x16_splat(15)); - if (!wasm_i8x16_any_true(mask)) - { - wasm_v128_store(buffer, sel); - - return data + 8; - } - unsigned char mask0, mask1; wasmMoveMask(mask, mask0, mask1); @@ -871,15 +862,15 @@ static uint8x16_t unzigzag8(uint8x16_t v) #ifdef SIMD_WASM static void transpose8(v128_t& x0, v128_t& x1, v128_t& x2, v128_t& x3) { - v128_t t0 = wasm_unpacklo_v8x16(x0, x1); - v128_t t1 = wasm_unpackhi_v8x16(x0, x1); - v128_t t2 = wasm_unpacklo_v8x16(x2, x3); - v128_t t3 = wasm_unpackhi_v8x16(x2, x3); + v128_t t0 = wasmx_unpacklo_v8x16(x0, x1); + v128_t t1 = wasmx_unpackhi_v8x16(x0, x1); + v128_t t2 = wasmx_unpacklo_v8x16(x2, x3); + v128_t t3 = wasmx_unpackhi_v8x16(x2, x3); - x0 = wasm_unpacklo_v16x8(t0, t2); - x1 = wasm_unpackhi_v16x8(t0, t2); - x2 = wasm_unpacklo_v16x8(t1, t3); - x3 = wasm_unpackhi_v16x8(t1, t3); + x0 = wasmx_unpacklo_v16x8(t0, t2); + x1 = wasmx_unpackhi_v16x8(t0, t2); + x2 = wasmx_unpacklo_v16x8(t1, t3); + x3 = wasmx_unpackhi_v16x8(t1, t3); } static v128_t unzigzag8(v128_t v) @@ -977,7 +968,7 @@ static const unsigned char* decodeVertexBlockSimd(const unsigned char* data, con #define TEMP v128_t #define PREP() v128_t pi = wasm_v128_load(last_vertex + k) // TODO: use wasm_v32x4_load_splat to avoid buffer overrun #define LOAD(i) v128_t r##i = wasm_v128_load(buffer + j + i * vertex_count_aligned) -#define GRP4(i) t0 = wasm_v32x4_splat(r##i, 0), t1 = wasm_v32x4_splat(r##i, 1), t2 = wasm_v32x4_splat(r##i, 2), t3 = wasm_v32x4_splat(r##i, 3) +#define GRP4(i) t0 = wasmx_splat_v32x4(r##i, 0), t1 = wasmx_splat_v32x4(r##i, 1), t2 = wasmx_splat_v32x4(r##i, 2), t3 = wasmx_splat_v32x4(r##i, 3) #define FIXD(i) t##i = pi = wasm_i8x16_add(pi, t##i) #define SAVE(i) *reinterpret_cast(savep) = wasm_i32x4_extract_lane(t##i, 0), savep += vertex_size #endif @@ -1157,12 +1148,6 @@ int meshopt_decodeVertexBuffer(void* destination, size_t vertex_count, size_t ve decode = decodeVertexBlock; #endif -#if defined(SIMD_WASM) - // TODO: workaround for https://github.com/emscripten-core/emscripten/issues/9767 - if (!gDecodeBytesGroupInitialized) - gDecodeBytesGroupInitialized = decodeBytesGroupBuildTables(); -#endif - #if defined(SIMD_SSE) || defined(SIMD_NEON) || defined(SIMD_WASM) assert(gDecodeBytesGroupInitialized); (void)gDecodeBytesGroupInitialized;