diff --git a/src/steam/engine/dispatcher.hpp b/src/steam/engine/dispatcher.hpp index b16d1c2d5..47dfe5420 100644 --- a/src/steam/engine/dispatcher.hpp +++ b/src/steam/engine/dispatcher.hpp @@ -324,7 +324,7 @@ namespace engine { * @return Iterator to pull a sequence of render jobs, ready for processing */ auto - feedTo (play::DataSink sink) + feedTo (play::DataSink& sink) { return terminatePipeline ( SRC::transform( diff --git a/src/steam/engine/job-planning.hpp b/src/steam/engine/job-planning.hpp index f7ff4ecf0..a7d04c0d3 100644 --- a/src/steam/engine/job-planning.hpp +++ b/src/steam/engine/job-planning.hpp @@ -49,6 +49,7 @@ #include "vault/engine/job.h" #include "steam/engine/job-ticket.hpp" #include "steam/engine/frame-coord.hpp" +#include "steam/play/output-slot.hpp" #include "lib/time/timevalue.hpp" //#include "lib/iter-explorer.hpp" //#include "lib/iter-adapter.hpp" @@ -60,7 +61,8 @@ namespace steam { namespace engine { namespace error = lumiera::error; - + + using play::DataSink; using lib::time::TimeValue; using util::unConst; using util::isnil; @@ -84,15 +86,15 @@ namespace engine { */ class JobPlanning { -// JobTicket::ExplorationState plannedOperations_; - FrameCoord point_to_calculate_; + FrameCoord frameCoord_; + JobTicket& jobTicket_; + DataSink& outputSink_; public: - /** by default create the bottom element of job planning, - * which happens to to plan no job at all. It is represented - * using an inactive state core (default constructed) - */ - JobPlanning() + JobPlanning(FrameCoord frame, JobTicket& ticket, DataSink& sink) + : frameCoord_{frame} + , jobTicket_{ticket} + , outputSink_{sink} { } #if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... @@ -109,19 +111,16 @@ namespace engine { // using the standard copy operations - /** cast and explicate this job planning information - * to create a frame job descriptor, ready to be scheduled + /** + * Connect and complete the planning information assembled thus far + * to create a frame job descriptor, ready to be scheduled. */ - operator Job() + Job + buildJob() { -#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... - if (isnil (plannedOperations_)) - throw error::Logic("Attempt to plan a frame-Job based on a missing, " - "unspecified, exhausted or superseded job description" - ,error::LUMIERA_ERROR_BOTTOM_VALUE); - - return plannedOperations_->createJobFor (point_to_calculate_); -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... + Job job = jobTicket_.createJobFor (frameCoord_); + //////////////////////////////////////////////////////TICKET #1295 : somehow package and communicate the DataSink info + return job; } diff --git a/tests/core/steam/engine/job-planning-test.cpp b/tests/core/steam/engine/job-planning-test.cpp index a735f26bd..3452c9cfe 100644 --- a/tests/core/steam/engine/job-planning-test.cpp +++ b/tests/core/steam/engine/job-planning-test.cpp @@ -33,7 +33,7 @@ //#include "steam/engine/procnode.hpp" //#include "steam/play/dummy-play-connection.hpp" //#include "steam/mobject/model-port.hpp" -//#include "steam/engine/dispatcher.hpp" +#include "steam/engine/mock-dispatcher.hpp" #include "steam/play/timings.hpp" #include "lib/time/timevalue.hpp" //#include "lib/time/timequant.hpp" @@ -58,7 +58,7 @@ namespace steam { namespace engine{ namespace test { -// using lib::time::FrameRate; + using lib::time::FrameRate; // using lib::time::Duration; // using lib::time::Offset; // using lib::time::TimeVar; @@ -108,6 +108,19 @@ namespace test { void simpleUsage() { + MockDispatcher dispatcher; + play::Timings timings (FrameRate::PAL); + auto [port,sink] = dispatcher.getDummyConnection(1); + + Time nominalTime{200,0}; + size_t portIDX = dispatcher.resolveModelPort (port); + FrameCoord frame{nominalTime, portIDX}; + JobTicket& ticket = dispatcher.getJobTicketFor(frame); + + JobPlanning plan{frame,ticket,sink}; + Job job = plan.buildJob(); + + CHECK (dispatcher.verify (job, port, sink)); } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 2aab05cbf..6f9aee021 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -70012,6 +70012,19 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + +

+ eigentlich werden nur zwei Felder genutzt, und davon der ModelPort-IDX nur an einer einzigen Stelle (beim Zugriff auf das JobTicket). Die absolute Frame-Nr geht bisher nirgends ein — sie ist redundant, wenn man die Timings kennt, und jenseits der Job-Erstellung komplett irrelevant (soll auch irrelevant sein) +

+ +
+ +
@@ -75685,10 +75698,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + + + + + + + + + + + + + + + @@ -76721,6 +76748,50 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + + + + + + + + + + + + +

+ wir können nicht die Daten für jeden Job einzeln nachverfolgen (dann würden wir etwa den Level von Arbeit leisten, wie ein Garbage-Collector) — vielmehr muß es sowas wie »epochs« geben +

+ +
+ +
+ + + + + + +

+ In extremen Situationen kann es vorkommen, daß das Checkpoint-System eine Rest-Menge identifiziert, die aus anderen Gründen  zuverlässig beobachtet werden muß. Als Beispiel denke ich über obsolete Reste einer aufwendigen Berechnungskette, die unterwegs geändert wurde: hier müssen diejenigen (wenigen) Activities gefunden werden, die bereits „unterwegs“ sind; erst wenn diese alle wieder zurückgekommen sind, kann ein Clean-up-Trigger feuern +

+ +
+ +
+
+