DaemonEngine / Daemon

The Dæmon game engine. With some bits of ioq3 and XreaL.
https://unvanquished.net
BSD 3-Clause "New" or "Revised" License
303 stars 60 forks source link

Crash when using macOS OpenGL software rasteriser when loading map #563

Open illwieckz opened 2 years ago

illwieckz commented 2 years ago

I reproduce this on Mojave virtual machine with ./daemon -set r_glAllowSoftware 1 +devmap plat23

As far as I know, on hardware OpenGL implementation the engine does not crash.

The main menu renders properly, but the game crashes when loading map:

Player#5862169 entered the game 
]Process 99047 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00007fff4edf8729 GLEngine`gleResetUniformBufferCachePointers + 79
GLEngine`gleResetUniformBufferCachePointers:
->  0x7fff4edf8729 <+79>: movq   (%rdi,%rsi,8), %rdi
    0x7fff4edf872d <+83>: movq   0x88(%rdi), %rdi
    0x7fff4edf8734 <+90>: shlq   $0x4, %rsi
    0x7fff4edf8738 <+94>: addq   0x51d0(%r13,%rsi), %rdi
Target 0: (daemon) stopped.
thread backtrace

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00007fff4edf8729 GLEngine`gleResetUniformBufferCachePointers + 79
    frame #1: 0x00007fff4ee53f09 GLEngine`gleSetVPTransformFuncAll + 521
    frame #2: 0x0000000131dfc72a
    frame #3: 0x00007fff4ed9267f GLEngine`glMultiDrawElements_IMM_GL3Exec + 1091
    frame #4: 0x0000000100144ced daemon`Tess_DrawElements() at tr_shade.cpp:277:4 [opt]
    frame #5: 0x0000000100149493 daemon`Render_lightMapping(stage=<unavailable>) at tr_shade.cpp:1095:2 [opt]
    frame #6: 0x0000000100145360 daemon`Tess_StageIteratorGeneric() at tr_shade.cpp:0:11 [opt]
    frame #7: 0x000000010014cea7 daemon`Tess_End() at tr_shade.cpp:3065:2 [opt]
    frame #8: 0x00000001000ef435 daemon`RB_RenderDrawSurfaces(fromSort=<unavailable>, toSort=<unavailable>, drawSurfFilter=<unavailable>) at tr_backend.cpp:883:5 [opt]
    frame #9: 0x00000001000ebacd daemon`RB_RenderView(depthPass=false) at tr_backend.cpp:0:3 [opt]
    frame #10: 0x00000001000eb863 daemon`DrawViewCommand::ExecuteSelf(this=0x000000010e0942a4) const at tr_backend.cpp:5531:2 [opt]
    frame #11: 0x00000001000eec29 daemon`RB_ExecuteRenderCommands(data=0x000000010e0942a4) at tr_backend.cpp:5775:14 [opt]
    frame #12: 0x0000000100104367 daemon`R_SyncRenderThread() at tr_cmds.cpp:209:2 [opt]
    frame #13: 0x0000000100118bbc daemon`RE_GenerateTexture(pic=<unavailable>, width=128, height=256) at tr_image.cpp:3018:2 [opt]
    frame #14: 0x000000010005448b daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] CGameVM::QVMSyscall(this=<unavailable>, data=size=0, x=<unavailable>, y=<unavailable>)::$_37::operator()(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int, int&) const at cl_cgame.cpp:1351:14 [opt]
    frame #15: 0x000000010005447b daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>()(std::get<0ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<1ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<2ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<3ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()))) Util::apply_impl<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>, 0ul, 1ul, 2ul, 3ul>(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&, Util::seq<0ul, 1ul, 2ul, 3ul>) at Util.h:125 [opt]
    frame #16: 0x0000000100054451 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>(), std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(), (Util::gen_seq<std::tuple_size<std::__1::decay<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >::type>::value>)())) Util::apply<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&) at Util.h:130 [opt]
    frame #17: 0x0000000100054451 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::detail::HandleMsg<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >(channel=0x0000000100c91028, reader=<unavailable>, func=<unavailable>)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, Util::Reader, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&) at Channel.h:217 [opt]
    frame #18: 0x00000001000543db daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::HandleMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37>(channel=0x0000000100c91028, func=<unavailable>)::$_37&&) at Channel.h:241 [opt]
    frame #19: 0x0000000100054385 daemon`CGameVM::QVMSyscall(this=<unavailable>, index=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1350 [opt]
    frame #20: 0x0000000100053f0d daemon`CGameVM::Syscall(this=<unavailable>, id=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1092:9 [opt]
    frame #21: 0x0000000100067404 daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(IPC::Channel&, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(id=69, reader=Reader @ 0x00007ffeefbfe120)::'lambda'(unsigned int, Util::Reader)::operator()(unsigned int, Util::Reader) at VirtualMachine.h:142:4 [opt]
    frame #22: 0x000000010006736c daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(channel=0x0000000100c91028, messageHandler=0x00007ffeefbfe278, (null)=<unavailable>, args=<unavailable>)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) at Channel.h:174 [opt]
    frame #23: 0x0000000100053e41 daemon`CGameVM::CGameRocketFrame() [inlined] void IPC::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader), cgClientState_t&>(channel=<unavailable>, messageHandler=0x0000000100c90f90, args=0x0000000000000008)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&&, cgClientState_t&) at Channel.h:234:9 [opt]
    frame #24: 0x0000000100053e3c daemon`CGameVM::CGameRocketFrame() [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(this=0x0000000100c90f90, args=0x0000000000000008) at VirtualMachine.h:140 [opt]
    frame #25: 0x0000000100053e0c daemon`CGameVM::CGameRocketFrame(this=0x0000000100c90f90) at cl_cgame.cpp:1079 [opt]
    frame #26: 0x0000000100087a99 daemon`SCR_UpdateScreen() at cl_scrn.cpp:339:3 [opt]
    frame #27: 0x000000010007b8ec daemon`CL_Frame(msec=200) at cl_main.cpp:2549:2 [opt]
    frame #28: 0x000000010000b66b daemon`Com_Frame() at common.cpp:1013:2 [opt]
    frame #29: 0x00000001001d0db5 daemon`main(argc=<unavailable>, argv=0x00007ffeefbff1c8) at System.cpp:686:5 [opt]
    frame #30: 0x00007fff711b43d5 libdyld.dylib`start + 1
    frame #31: 0x00007fff711b43d5 libdyld.dylib`start + 1
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00007fff4edf8729 GLEngine`gleResetUniformBufferCachePointers + 79
    frame #1: 0x00007fff4ee53f09 GLEngine`gleSetVPTransformFuncAll + 521
    frame #2: 0x0000000131dfc72a
    frame #3: 0x00007fff4ed9267f GLEngine`glMultiDrawElements_IMM_GL3Exec + 1091
    frame #4: 0x0000000100144ced daemon`Tess_DrawElements() at tr_shade.cpp:277:4 [opt]
    frame #5: 0x0000000100149493 daemon`Render_lightMapping(stage=<unavailable>) at tr_shade.cpp:1095:2 [opt]
    frame #6: 0x0000000100145360 daemon`Tess_StageIteratorGeneric() at tr_shade.cpp:0:11 [opt]
    frame #7: 0x000000010014cea7 daemon`Tess_End() at tr_shade.cpp:3065:2 [opt]
    frame #8: 0x00000001000ef435 daemon`RB_RenderDrawSurfaces(fromSort=<unavailable>, toSort=<unavailable>, drawSurfFilter=<unavailable>) at tr_backend.cpp:883:5 [opt]
    frame #9: 0x00000001000ebacd daemon`RB_RenderView(depthPass=false) at tr_backend.cpp:0:3 [opt]
    frame #10: 0x00000001000eb863 daemon`DrawViewCommand::ExecuteSelf(this=0x000000010e0942a4) const at tr_backend.cpp:5531:2 [opt]
    frame #11: 0x00000001000eec29 daemon`RB_ExecuteRenderCommands(data=0x000000010e0942a4) at tr_backend.cpp:5775:14 [opt]
    frame #12: 0x0000000100104367 daemon`R_SyncRenderThread() at tr_cmds.cpp:209:2 [opt]
    frame #13: 0x0000000100118bbc daemon`RE_GenerateTexture(pic=<unavailable>, width=128, height=256) at tr_image.cpp:3018:2 [opt]
    frame #14: 0x000000010005448b daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] CGameVM::QVMSyscall(this=<unavailable>, data=size=0, x=<unavailable>, y=<unavailable>)::$_37::operator()(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int, int&) const at cl_cgame.cpp:1351:14 [opt]
    frame #15: 0x000000010005447b daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>()(std::get<0ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<1ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<2ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<3ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()))) Util::apply_impl<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>, 0ul, 1ul, 2ul, 3ul>(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&, Util::seq<0ul, 1ul, 2ul, 3ul>) at Util.h:125 [opt]
    frame #16: 0x0000000100054451 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>(), std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(), (Util::gen_seq<std::tuple_size<std::__1::decay<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >::type>::value>)())) Util::apply<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&) at Util.h:130 [opt]
    frame #17: 0x0000000100054451 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::detail::HandleMsg<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >(channel=0x0000000100c91028, reader=<unavailable>, func=<unavailable>)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, Util::Reader, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&) at Channel.h:217 [opt]
    frame #18: 0x00000001000543db daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::HandleMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37>(channel=0x0000000100c91028, func=<unavailable>)::$_37&&) at Channel.h:241 [opt]
    frame #19: 0x0000000100054385 daemon`CGameVM::QVMSyscall(this=<unavailable>, index=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1350 [opt]
    frame #20: 0x0000000100053f0d daemon`CGameVM::Syscall(this=<unavailable>, id=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1092:9 [opt]
    frame #21: 0x0000000100067404 daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(IPC::Channel&, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(id=69, reader=Reader @ 0x00007ffeefbfe120)::'lambda'(unsigned int, Util::Reader)::operator()(unsigned int, Util::Reader) at VirtualMachine.h:142:4 [opt]
    frame #22: 0x000000010006736c daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(channel=0x0000000100c91028, messageHandler=0x00007ffeefbfe278, (null)=<unavailable>, args=<unavailable>)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) at Channel.h:174 [opt]
    frame #23: 0x0000000100053e41 daemon`CGameVM::CGameRocketFrame() [inlined] void IPC::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader), cgClientState_t&>(channel=<unavailable>, messageHandler=0x0000000100c90f90, args=0x0000000000000008)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&&, cgClientState_t&) at Channel.h:234:9 [opt]
    frame #24: 0x0000000100053e3c daemon`CGameVM::CGameRocketFrame() [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(this=0x0000000100c90f90, args=0x0000000000000008) at VirtualMachine.h:140 [opt]
    frame #25: 0x0000000100053e0c daemon`CGameVM::CGameRocketFrame(this=0x0000000100c90f90) at cl_cgame.cpp:1079 [opt]
    frame #26: 0x0000000100087a99 daemon`SCR_UpdateScreen() at cl_scrn.cpp:339:3 [opt]
    frame #27: 0x000000010007b8ec daemon`CL_Frame(msec=200) at cl_main.cpp:2549:2 [opt]
    frame #28: 0x000000010000b66b daemon`Com_Frame() at common.cpp:1013:2 [opt]
    frame #29: 0x00000001001d0db5 daemon`main(argc=<unavailable>, argv=0x00007ffeefbff1c8) at System.cpp:686:5 [opt]
    frame #30: 0x00007fff711b43d5 libdyld.dylib`start + 1
    frame #31: 0x00007fff711b43d5 libdyld.dylib`start + 1
illwieckz commented 2 years ago

The bug happens in Tess_DrawElements() from src/engine/renderer/tr_shade.cpp when calling glMultiDrawElements which is an OpenGL function. The gleResetUniformBufferCachePointers is likely an internal macOS symbol.

https://github.com/DaemonEngine/Daemon/blob/075128eaaf1f9eb7a177892ac3b186b5f16ff794/src/engine/renderer/tr_shade.cpp#L272-L277

I assume the crashes occurs in Apple OpenGL implementation, but I don't know if that's a bug on Apple side or if we feed bad data.

illwieckz commented 2 years ago

I fail to see something wrong there:

Player#5862169 entered the game 
]Process 1105 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00007fff4edf8729 GLEngine`gleResetUniformBufferCachePointers + 79
GLEngine`gleResetUniformBufferCachePointers:
->  0x7fff4edf8729 <+79>: movq   (%rdi,%rsi,8), %rdi
    0x7fff4edf872d <+83>: movq   0x88(%rdi), %rdi
    0x7fff4edf8734 <+90>: shlq   $0x4, %rsi
    0x7fff4edf8738 <+94>: addq   0x51d0(%r13,%rsi), %rdi
Target 0: (daemon) stopped.
thread backtrace
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00007fff4edf8729 GLEngine`gleResetUniformBufferCachePointers + 79
    frame #1: 0x00007fff4ee53f09 GLEngine`gleSetVPTransformFuncAll + 521
    frame #2: 0x000000013364572a
    frame #3: 0x00007fff4ecfbd18 GLEngine`gleFlushAtomicFunc + 15
    frame #4: 0x00007fff4ed9255b GLEngine`glMultiDrawElements_IMM_GL3Exec + 799
    frame #5: 0x0000000100144e4d daemon`Tess_DrawElements() at tr_shade.cpp:277:4 [opt]
    frame #6: 0x00000001001495f3 daemon`Render_lightMapping(stage=<unavailable>) at tr_shade.cpp:1095:2 [opt]
    frame #7: 0x00000001001454c0 daemon`Tess_StageIteratorGeneric() at tr_shade.cpp:0:11 [opt]
    frame #8: 0x000000010014d007 daemon`Tess_End() at tr_shade.cpp:3065:2 [opt]
    frame #9: 0x00000001000ef595 daemon`RB_RenderDrawSurfaces(fromSort=<unavailable>, toSort=<unavailable>, drawSurfFilter=<unavailable>) at tr_backend.cpp:883:5 [opt]
    frame #10: 0x00000001000ebc2d daemon`RB_RenderView(depthPass=false) at tr_backend.cpp:0:3 [opt]
    frame #11: 0x00000001000eb9c3 daemon`DrawViewCommand::ExecuteSelf(this=0x000000010f0942a4) const at tr_backend.cpp:5531:2 [opt]
    frame #12: 0x00000001000eed89 daemon`RB_ExecuteRenderCommands(data=0x000000010f0942a4) at tr_backend.cpp:5775:14 [opt]
    frame #13: 0x00000001001044c7 daemon`R_SyncRenderThread() at tr_cmds.cpp:209:2 [opt]
    frame #14: 0x0000000100118d1c daemon`RE_GenerateTexture(pic=<unavailable>, width=128, height=256) at tr_image.cpp:3018:2 [opt]
    frame #15: 0x00000001000545eb daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] CGameVM::QVMSyscall(this=<unavailable>, data=size=0, x=<unavailable>, y=<unavailable>)::$_37::operator()(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int, int&) const at cl_cgame.cpp:1351:14 [opt]
    frame #16: 0x00000001000545db daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>()(std::get<0ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<1ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<2ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()), std::get<3ul>(std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >()))) Util::apply_impl<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>, 0ul, 1ul, 2ul, 3ul>(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&, Util::seq<0ul, 1ul, 2ul, 3ul>) at Util.h:125 [opt]
    frame #17: 0x00000001000545b1 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] decltype(func=<unavailable>, tuple=<unavailable>)::$_37>(), std::declval<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(), (Util::gen_seq<std::tuple_size<std::__1::decay<std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >::type>::value>)())) Util::apply<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&> >(CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&, std::__1::tuple<std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&&, int&&, int&&, int&>&&) at Util.h:130 [opt]
    frame #18: 0x00000001000545b1 daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::detail::HandleMsg<CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >(channel=0x0000000100c91028, reader=<unavailable>, func=<unavailable>)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, Util::Reader, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37&&) at Channel.h:217 [opt]
    frame #19: 0x000000010005453b daemon`CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&) [inlined] void IPC::HandleMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)69>, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, int, int>, IPC::Reply<int> >, CGameVM::QVMSyscall(int, Util::Reader&, IPC::Channel&)::$_37>(channel=0x0000000100c91028, func=<unavailable>)::$_37&&) at Channel.h:241 [opt]
    frame #20: 0x00000001000544e5 daemon`CGameVM::QVMSyscall(this=<unavailable>, index=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1350 [opt]
    frame #21: 0x000000010005406d daemon`CGameVM::Syscall(this=<unavailable>, id=<unavailable>, reader=<unavailable>, channel=<unavailable>) at cl_cgame.cpp:1092:9 [opt]
    frame #22: 0x0000000100067564 daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(IPC::Channel&, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(id=69, reader=Reader @ 0x00007ffeefbfe120)::'lambda'(unsigned int, Util::Reader)::operator()(unsigned int, Util::Reader) at VirtualMachine.h:142:4 [opt]
    frame #23: 0x00000001000674cc daemon`void IPC::detail::SendMsg<void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<>, cgClientState_t&>(channel=0x0000000100c91028, messageHandler=0x00007ffeefbfe278, (null)=<unavailable>, args=<unavailable>)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&, IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&) at Channel.h:174 [opt]
    frame #24: 0x0000000100053fa1 daemon`CGameVM::CGameRocketFrame() [inlined] void IPC::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader), cgClientState_t&>(channel=<unavailable>, messageHandler=0x0000000100c90f90, args=0x0000000000000008)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(cgClientState_t&)::'lambda'(unsigned int, Util::Reader)&&, cgClientState_t&) at Channel.h:234:9 [opt]
    frame #25: 0x0000000100053f9c daemon`CGameVM::CGameRocketFrame() [inlined] void VM::VMBase::SendMsg<IPC::SyncMessage<IPC::Message<IPC::Id<(unsigned short)0, (unsigned short)9>, cgClientState_t>, IPC::Reply<> >, cgClientState_t&>(this=0x0000000100c90f90, args=0x0000000000000008) at VirtualMachine.h:140 [opt]
    frame #26: 0x0000000100053f6c daemon`CGameVM::CGameRocketFrame(this=0x0000000100c90f90) at cl_cgame.cpp:1079 [opt]
    frame #27: 0x0000000100087bf9 daemon`SCR_UpdateScreen() at cl_scrn.cpp:339:3 [opt]
    frame #28: 0x000000010007ba4c daemon`CL_Frame(msec=200) at cl_main.cpp:2549:2 [opt]
    frame #29: 0x000000010000b7cb daemon`Com_Frame() at common.cpp:1013:2 [opt]
    frame #30: 0x00000001001d0e05 daemon`main(argc=<unavailable>, argv=0x00007ffeefbff1c8) at System.cpp:686:5 [opt]
    frame #31: 0x00007fff711b43d5 libdyld.dylib`start + 1
    frame #32: 0x00007fff711b43d5 libdyld.dylib`start + 1
frame select 5
daemon was compiled with optimization - stepping may behave oddly; variables may not be available.
frame #5: 0x0000000100144e4d daemon`Tess_DrawElements() at tr_shade.cpp:277:4 [opt]
   274      {
   275          if ( tess.multiDrawPrimitives )
   276          {
-> 277              glMultiDrawElements( GL_TRIANGLES, tess.multiDrawCounts, GL_INDEX_TYPE, ( const GLvoid ** ) tess.multiDrawIndexes, tess.multiDrawPrimitives );
                    ^
   278  
   279              backEnd.pc.c_multiDrawElements++;
   280              backEnd.pc.c_multiDrawPrimitives += tess.multiDrawPrimitives;
frame variable
(int) i = <variable not available>

frame variable tess.multiDrawIndexes
(glIndex_t *[1000]) tess.multiDrawIndexes = {
  [0] = 0x0000000000017850
  [1] = 0x0000000000017568
  [2] = 0x0000000000016e90
  [3] = 0x0000000000017c94
  [4] = 0x00000000000182f4
  [5] = 0x000000000001815c
  [6] = 0x0000000000016458
  [7] = 0x0000000000016e48
  [8] = 0x0000000000016f80
  [9] = 0x00000000000141fc
  [10] = 0x000000000000de00
  [11] = 0x0000000000014f28
  [12] = 0x000000000001899c
  [13] = 0x00000000000317e8
  [14] = 0x0000000000031740
  [15] = 0x0000000000048144
  [16] = 0x0000000000047a30
  [17] = 0x0000000000052050
  [18] = 0x0000000000051108
  [19] = 0x00000000000530dc
  [20] = 0x00000000000534b4
  [21] = 0x00000000000329e8
  [22] = 0x0000000000017850
  [23] = 0x0000000000030810
  [24] = 0x000000000002c268
  [25] = 0x00000000000475c8
  [26] = 0x0000000000047064
  [27] = 0x0000000000046f74
  [28] = 0x00000000000542b8
  [29] = 0x00000000000461c4
  [30] = 0x0000000000046380
  [31] = 0x0000000000045fcc
  [32] = 0x0000000000045bdc
  [33] = 0x0000000000042b70
  [34] = 0x0000000000041c88
  [35] = 0x0000000000041004
  [36] = 0x0000000000047724
  [37] = 0x0000000000017b20
  [38] = 0x0000000000045f30
  [39] = 0x0000000000054084
  [40] = 0x0000000000046290
  [41] = 0x0000000000017b44
  [42] = 0x0000000000045f84
  [43] = 0x000000000005409c
  [44] = 0x0000000000035d54
  [45] = 0x00000000000356ac
  [46] = 0x000000000003549c
  [47] = 0x0000000000032cc4
  [48] = 0x0000000000017b74
  [49] = 0x0000000000053bd4
  [50] = 0x000000000003cd44
  [51] = 0x0000000000017568
  [52] = 0x00000000000362dc
  [53] = 0x0000000000017808
  [54] = 0x0000000000016e90
  [55] = 0x0000000000047598
  [56] = 0x00000000000464ac
  [57] = 0x0000000000044634
  [58] = 0x0000000000044280
  [59] = 0x0000000000017c94
  [60] = 0x00000000000182f4
  [61] = 0x000000000001815c
  [62] = 0x0000000000053c34
  [63] = 0x0000000000047220
  [64] = 0x000000000004467c
  [65] = 0x000000000004f188
  [66] = 0x0000000000045e40
  [67] = 0x000000000003675c
  [68] = 0x0000000000018234
  [69] = 0x0000000000053c04
  [70] = 0x0000000000035238
  [71] = 0x0000000000045978
  [72] = 0x000000000003c618
  [73] = 0x000000000003bebc
  [74] = 0x00000000000307e0
  [75] = 0x000000000002ed10
  [76] = 0x00000000000307b0
  [77] = 0x000000000002dd20
  [78] = 0x0000000000031e60
  [79] = 0x000000000002eb90
  [80] = 0x000000000003cc78
  [81] = 0x000000000003c1b0
  [82] = 0x000000000004c308
  [83] = 0x0000000000048480
  [84] = 0x0000000000051438
  [85] = 0x0000000000052e3c
  [86] = 0x0000000000054228
  [87] = 0x0000000000041f94
  [88] = 0x000000000004c5a8
  [89] = 0x0000000000048ccc
  [90] = 0x0000000000051a50
  [91] = 0x0000000000053034
  [92] = 0x0000000000016d40
  [93] = 0x000000000004260c
  [94] = 0x0000000000016da0
  [95] = 0x0000000000054054
  [96] = 0x0000000000016b60
  [97] = 0x0000000000046428
  [98] = 0x0000000000044598
  [99] = 0x0000000000044238
  [100] = 0x00000000000350ac
  [101] = 0x0000000000016458
  [102] = 0x0000000000053b2c
  [103] = 0x000000000003bc7c
  [104] = 0x00000000000471d8
  [105] = 0x000000000003540c
  [106] = 0x000000000004f170
  [107] = 0x0000000000016e48
  [108] = 0x000000000002cb20
  [109] = 0x000000000003bd54
  [110] = 0x0000000000045e10
  [111] = 0x000000000002c958
  [112] = 0x000000000002c4d8
  [113] = 0x000000000002c028
  [114] = 0x000000000002c6e8
  [115] = 0x000000000002cb8c
  [116] = 0x000000000002c844
  [117] = 0x000000000002c208
  [118] = 0x0000000000047610
  [119] = 0x000000000002c46c
  [120] = 0x0000000000035304
  [121] = 0x000000000003555c
  [122] = 0x000000000002cc64
  [123] = 0x000000000002cec8
  [124] = 0x00000000000459a8
  [125] = 0x000000000002d264
  [126] = 0x000000000002ad68
  [127] = 0x0000000000035c88
  [128] = 0x0000000000032cac
  [129] = 0x000000000002ed70
  [130] = 0x000000000004f494
  [131] = 0x000000000004f3f8
  [132] = 0x000000000002eb24
  [133] = 0x000000000002ddf8
  [134] = 0x000000000002d0fc
  [135] = 0x000000000002d15c
  [136] = 0x000000000002dcfc
  [137] = 0x00000000000359d0
  [138] = 0x00000000000357b4
  [139] = 0x000000000004f434
  [140] = 0x0000000000016f80
  [141] = 0x000000000002ee00
  [142] = 0x0000000000053544
  [143] = 0x0000000000047004
  [144] = 0x000000000003bfd0
  [145] = 0x00000000000466c8
  [146] = 0x0000000000053b8c
  [147] = 0x000000000002dff0
  [148] = 0x000000000002eb60
  [149] = 0x0000000000053514
  [150] = 0x000000000002ea64
  [151] = 0x000000000002e86c
  [152] = 0x0000000000053664
  [153] = 0x000000000002eaac
  [154] = 0x000000000005364c
  [155] = 0x00000000000401dc
  [156] = 0x000000000002a300
  [157] = 0x000000000003a050
  [158] = 0x0000000000038d90
  [159] = 0x000000000004f3b0
  [160] = 0x00000000000476ac
  [161] = 0x00000000000141fc
  [162] = 0x000000000000de00
  [163] = 0x0000000000053db4
  [164] = 0x00000000000474d8
  [165] = 0x0000000000046f08
  [166] = 0x0000000000045f00
  [167] = 0x0000000000043e18
  [168] = 0x00000000000411b4
  [169] = 0x0000000000011784
  [170] = 0x0000000000032988
  [171] = 0x0000000000014f28
  [172] = 0x0000000000046f44
  [173] = 0x00000000000463f8
  [174] = 0x00000000000340a4
  [175] = 0x000000000004ed50
  [176] = 0x00000000000470d0
  [177] = 0x000000000004f380
  [178] = 0x000000000004ed20
  [179] = 0x000000000004be58
  [180] = 0x0000000000047d3c
  [181] = 0x00000000000478f8
  [182] = 0x00000000000508b0
  [183] = 0x0000000000053d84
  [184] = 0x0000000000047448
  [185] = 0x0000000000046d70
  [186] = 0x00000000000540b4
  [187] = 0x0000000000043cd4
  [188] = 0x0000000000044208
  [189] = 0x0000000000041430
  [190] = 0x000000000003d6bc
  [191] = 0x000000000003f3f0
  [192] = 0x00000000000373e0
  [193] = 0x000000000003d500
  [194] = 0x0000000000039990
  [195] = 0x000000000001899c
  [196] = 0x0000000000053c94
  [197] = 0x0000000000000000
  [198] = 0x0000000000000000
  [199] = 0x0000000000000000
  [200] = 0x0000000000000000
  [201] = 0x0000000000000000
  [202] = 0x0000000000000000
  [203] = 0x0000000000000000
  [204] = 0x0000000000000000
  [205] = 0x0000000000000000
  [206] = 0x0000000000000000
  [207] = 0x0000000000000000
  [208] = 0x0000000000000000
  [209] = 0x0000000000000000
  [210] = 0x0000000000000000
  [211] = 0x0000000000000000
  [212] = 0x0000000000000000
  [213] = 0x0000000000000000
  [214] = 0x0000000000000000
  [215] = 0x0000000000000000
  [216] = 0x0000000000000000
  [217] = 0x0000000000000000
  [218] = 0x0000000000000000
  [219] = 0x0000000000000000
  [220] = 0x0000000000000000
  [221] = 0x0000000000000000
  [222] = 0x0000000000000000
  [223] = 0x0000000000000000
  [224] = 0x0000000000000000
  [225] = 0x0000000000000000
  [226] = 0x0000000000000000
  [227] = 0x0000000000000000
  [228] = 0x0000000000000000
  [229] = 0x0000000000000000
  [230] = 0x0000000000000000
  [231] = 0x0000000000000000
  [232] = 0x0000000000000000
  [233] = 0x0000000000000000
  [234] = 0x0000000000000000
  [235] = 0x0000000000000000
  [236] = 0x0000000000000000
  [237] = 0x0000000000000000
  [238] = 0x0000000000000000
  [239] = 0x0000000000000000
  [240] = 0x0000000000000000
  [241] = 0x0000000000000000
  [242] = 0x0000000000000000
  [243] = 0x0000000000000000
  [244] = 0x0000000000000000
  [245] = 0x0000000000000000
  [246] = 0x0000000000000000
  [247] = 0x0000000000000000
  [248] = 0x0000000000000000
  [249] = 0x0000000000000000
  [250] = 0x0000000000000000
  [251] = 0x0000000000000000
  [252] = 0x0000000000000000
  [253] = 0x0000000000000000
  [254] = 0x0000000000000000
  [255] = 0x0000000000000000
  ...
}
*** Some of your variables have more members than the debugger will show by default. To show all of them, you can either use the --show-all-children option to frame variable or raise the limit by changing the target.max-children-count setting.
frame variable tess.multiDrawCounts
(int [1000]) tess.multiDrawCounts = {
  [0] = 273
  [1] = 186
  [2] = 60
  [3] = 306
  [4] = 426
  [5] = 102
  [6] = 630
  [7] = 18
  [8] = 378
  [9] = 843
  [10] = 6399
  [11] = 768
  [12] = 816
  [13] = 6
  [14] = 18
  [15] = 183
  [16] = 57
  [17] = 828
  [18] = 198
  [19] = 78
  [20] = 18
  [21] = 99
  [22] = 180
  [23] = 54
  [24] = 123
  [25] = 12
  [26] = 27
  [27] = 36
  [28] = 15
  [29] = 51
  [30] = 30
  [31] = 15
  [32] = 81
  [33] = 759
  [34] = 195
  [35] = 78
  [36] = 60
  [37] = 9
  [38] = 21
  [39] = 6
  [40] = 30
  [41] = 12
  [42] = 18
  [43] = 6
  [44] = 354
  [45] = 66
  [46] = 48
  [47] = 6
  [48] = 72
  [49] = 12
  [50] = 12
  [51] = 168
  [52] = 30
  [53] = 18
  [54] = 60
  [55] = 12
  [56] = 15
  [57] = 18
  [58] = 15
  [59] = 306
  [60] = 426
  [61] = 54
  [62] = 24
  [63] = 18
  [64] = 12
  [65] = 6
  [66] = 12
  [67] = 90
  [68] = 48
  [69] = 12
  [70] = 51
  [71] = 12
  [72] = 84
  [73] = 69
  [74] = 12
  [75] = 24
  [76] = 12
  [77] = 54
  [78] = 24
  [79] = 96
  [80] = 51
  [81] = 282
  [82] = 168
  [83] = 531
  [84] = 390
  [85] = 126
  [86] = 36
  [87] = 414
  [88] = 108
  [89] = 198
  [90] = 384
  [91] = 33
  [92] = 24
  [93] = 345
  [94] = 36
  [95] = 12
  [96] = 120
  [97] = 15
  [98] = 39
  [99] = 18
  [100] = 99
  [101] = 450
  [102] = 24
  [103] = 54
  [104] = 18
  [105] = 36
  [106] = 6
  [107] = 18
  [108] = 27
  [109] = 90
  [110] = 12
  [111] = 114
  [112] = 132
  [113] = 120
  [114] = 87
  [115] = 54
  [116] = 69
  [117] = 24
  [118] = 6
  [119] = 27
  [120] = 66
  [121] = 84
  [122] = 153
  [123] = 141
  [124] = 24
  [125] = 642
  [126] = 1176
  [127] = 51
  [128] = 6
  [129] = 36
  [130] = 6
  [131] = 15
  [132] = 15
  [133] = 78
  [134] = 24
  [135] = 66
  [136] = 9
  [137] = 174
  [138] = 135
  [139] = 24
  [140] = 378
  [141] = 1644
  [142] = 6
  [143] = 24
  [144] = 120
  [145] = 42
  [146] = 12
  [147] = 543
  [148] = 12
  [149] = 12
  [150] = 18
  [151] = 102
  [152] = 6
  [153] = 24
  [154] = 6
  [155] = 888
  [156] = 348
  [157] = 822
  [158] = 768
  [159] = 18
  [160] = 30
  [161] = 843
  [162] = 3681
  [163] = 12
  [164] = 48
  [165] = 15
  [166] = 12
  [167] = 6
  [168] = 24
  [169] = 2718
  [170] = 24
  [171] = 768
  [172] = 12
  [173] = 6
  [174] = 282
  [175] = 12
  [176] = 18
  [177] = 12
  [178] = 12
  [179] = 84
  [180] = 258
  [181] = 78
  [182] = 534
  [183] = 12
  [184] = 24
  [185] = 102
  [186] = 93
  [187] = 81
  [188] = 12
  [189] = 465
  [190] = 1266
  [191] = 879
  [192] = 1164
  [193] = 111
  [194] = 15
  [195] = 816
  [196] = 48
  [197] = 0
  [198] = 0
  [199] = 0
  [200] = 0
  [201] = 0
  [202] = 0
  [203] = 0
  [204] = 0
  [205] = 0
  [206] = 0
  [207] = 0
  [208] = 0
  [209] = 0
  [210] = 0
  [211] = 0
  [212] = 0
  [213] = 0
  [214] = 0
  [215] = 0
  [216] = 0
  [217] = 0
  [218] = 0
  [219] = 0
  [220] = 0
  [221] = 0
  [222] = 0
  [223] = 0
  [224] = 0
  [225] = 0
  [226] = 0
  [227] = 0
  [228] = 0
  [229] = 0
  [230] = 0
  [231] = 0
  [232] = 0
  [233] = 0
  [234] = 0
  [235] = 0
  [236] = 0
  [237] = 0
  [238] = 0
  [239] = 0
  [240] = 0
  [241] = 0
  [242] = 0
  [243] = 0
  [244] = 0
  [245] = 0
  [246] = 0
  [247] = 0
  [248] = 0
  [249] = 0
  [250] = 0
  [251] = 0
  [252] = 0
  [253] = 0
  [254] = 0
  [255] = 0
  ...
}
frame variable tess.multiDrawPrimitives
(int) tess.multiDrawPrimitives = 13