From 2aac58b5aba8b3fef3ca6c961051d78f6458c902 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Jan 2022 10:39:01 +0100 Subject: [PATCH 1/3] task: Restore previous interrupt handler after `taskMgr.step()` Related to #1180 --- direct/src/task/Task.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index 7be8e077d4..fb1dba7bc6 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -130,6 +130,8 @@ class TaskManager: self.destroyed = False self.fKeyboardInterrupt = False self.interruptCount = 0 + if signal: + self.__prevHandler = signal.default_int_handler self._frameProfileQueue = [] @@ -171,7 +173,7 @@ class TaskManager: print('*** allowing mid-frame keyboard interrupt.') # Restore default interrupt handler if signal: - signal.signal(signal.SIGINT, signal.default_int_handler) + signal.signal(signal.SIGINT, self.__prevHandler) # and invoke it raise KeyboardInterrupt @@ -487,25 +489,30 @@ class TaskManager: chains that are in sub-threads or that have frame budgets might execute their tasks differently. """ + startFrameTime = self.globalClock.getRealTime() + # Replace keyboard interrupt handler during task list processing # so we catch the keyboard interrupt but don't handle it until # after task list processing is complete. self.fKeyboardInterrupt = 0 self.interruptCount = 0 + if signal: - signal.signal(signal.SIGINT, self.keyboardInterruptHandler) + self.__prevHandler = signal.signal(signal.SIGINT, self.keyboardInterruptHandler) - startFrameTime = self.globalClock.getRealTime() + try: + self.mgr.poll() - self.mgr.poll() + # This is the spot for an internal yield function + nextTaskTime = self.mgr.getNextWakeTime() + self.doYield(startFrameTime, nextTaskTime) - # This is the spot for an internal yield function - nextTaskTime = self.mgr.getNextWakeTime() - self.doYield(startFrameTime, nextTaskTime) + finally: + # Restore previous interrupt handler + if signal: + signal.signal(signal.SIGINT, self.__prevHandler) + self.__prevHandler = signal.default_int_handler - # Restore default interrupt handler - if signal: - signal.signal(signal.SIGINT, signal.default_int_handler) if self.fKeyboardInterrupt: raise KeyboardInterrupt From f058bad802aa881a5604209afe5ef5bfd3d8fe35 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Jan 2022 11:45:33 +0100 Subject: [PATCH 2/3] pgraph: Don't dupe shared GeomVertexData when premunging Geom Fixes #1185 --- panda/src/pgraph/geomNode.cxx | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/panda/src/pgraph/geomNode.cxx b/panda/src/pgraph/geomNode.cxx index a485851448..367533dd46 100644 --- a/panda/src/pgraph/geomNode.cxx +++ b/panda/src/pgraph/geomNode.cxx @@ -876,17 +876,36 @@ do_premunge(GraphicsStateGuardianBase *gsg, GeomTransformer &transformer) { Thread *current_thread = Thread::get_current_thread(); + // Cache munged vertex data, so that we don't duplicate vertex data + // unnecessarily. + std::map munged_vdata; + OPEN_ITERATE_CURRENT_AND_UPSTREAM(_cycler, current_thread) { CDStageWriter cdata(_cycler, pipeline_stage, current_thread); - GeomList::iterator gi; PT(GeomList) geoms = cdata->modify_geoms(); - for (gi = geoms->begin(); gi != geoms->end(); ++gi) { - GeomEntry &entry = (*gi); + for (GeomEntry &entry : *geoms) { CPT(RenderState) geom_state = node_state->compose(entry._state); CPT(Geom) geom = entry._geom.get_read_pointer(); PT(GeomMunger) munger = gsg->get_geom_munger(geom_state, current_thread); - entry._geom = transformer.premunge_geom(geom, munger); + + CPT(GeomVertexData) vdata = geom->get_vertex_data(); + + auto it = munged_vdata.find(vdata); + if (it != munged_vdata.end()) { + vdata = it->second; + } else { + CPT(GeomVertexData) old_vdata = std::move(vdata); + vdata = munger->premunge_data(old_vdata); + munged_vdata[std::move(old_vdata)] = vdata; + } + + CPT(Geom) pgeom = geom; + munger->premunge_geom(pgeom, vdata); + + PT(Geom) geom_copy = pgeom->make_copy(); + geom_copy->set_vertex_data(vdata); + entry._geom = std::move(geom_copy); } } CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler); From 11d5a49d6faffddfddc8cd72df240217fa5cab57 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Jan 2022 13:02:04 +0100 Subject: [PATCH 3/3] pgraph: Fix LightAttrib::replace_{on|off}_light() Fixes #1153 --- panda/src/pgraph/lightAttrib.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 9820f1bcfa..6416525bfc 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -469,6 +469,7 @@ replace_on_light(const NodePath &source, const NodePath &dest) const { slobj->attrib_unref(); *it = dest; + attrib->_on_lights.sort(); } return return_new(attrib); } @@ -531,6 +532,7 @@ replace_off_light(const NodePath &source, const NodePath &dest) const { slobj->attrib_unref(); *it = dest; + attrib->_off_lights.sort(); } return return_new(attrib); }