diff --git a/doc/devel/draw/Play.Dispatch.svg b/doc/devel/draw/Play.Dispatch.svg new file mode 100644 index 000000000..07cd3f511 --- /dev/null +++ b/doc/devel/draw/Play.Dispatch.svg @@ -0,0 +1,1798 @@ + + + + + Frame-Dispatch and Job Planning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + Frame-Dispatch and Job Planning + + + Ichthyostega + + + Lumiera: how RenderDrive and Dispatcher work together with the JobTicket provided by the Fixture + 2023 + + + + + + + + + + + + + + + + Fixture + + + + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + x + + + + + + + + Segmentation.. + + + + + + + Timings + + + + Timings + + Frame-Grid + + RenderEnvironment(Closure) + + + + + Scheduler + ModelPortChannelQoS + + + Proc + + + + + Proc + + + + + Source + + JobPlanning + + + + Dispatcher + + + + + + + RenderDrive + + + JobTicket + + + + 3 + + + + + + 1 + + + + 2 + + + diff --git a/src/doxygen.dox b/src/doxygen.dox index fe06eac9b..e794bd331 100644 --- a/src/doxygen.dox +++ b/src/doxygen.dox @@ -53,10 +53,10 @@ with the *ASCIIDOC* tool and published at the [Lumiera website](http://Lumiera.o /* ==== Layers ==== */ -/** @defgroup backend Backend-Layer +/** @defgroup vault Vault-Layer */ -/** @defgroup proc Proc-Layer +/** @defgroup steam Steam-Layer */ /** @defgroup gui Graphical User Interface @@ -65,23 +65,23 @@ with the *ASCIIDOC* tool and published at the [Lumiera website](http://Lumiera.o /* ==== Subsystems ==== */ /** @defgroup asset Asset Management - @ingroup proc + @ingroup steam */ /** @defgroup session Session - @ingroup proc + @ingroup steam */ /** @defgroup player Playback and Render Control - @ingroup proc + @ingroup steam */ /** @defgroup engine Render Engine - @ingroup proc + @ingroup vault */ /** @defgroup scheduler Scheduler - @ingroup backend + @ingroup vault */ diff --git a/src/steam/engine/calc-plan-continuation.cpp b/src/steam/engine/calc-plan-continuation.cpp index dfaca80cb..30efc7af5 100644 --- a/src/steam/engine/calc-plan-continuation.cpp +++ b/src/steam/engine/calc-plan-continuation.cpp @@ -23,7 +23,7 @@ /** @file calc-plan-continuation.cpp ** Implementation elements of render process planning. - ** @todo a draft created in 2013 and then stalled. This is not obsolete. + ** @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive /////////////////////////TICKET #1221 */ diff --git a/src/steam/engine/calc-plan-continuation.hpp b/src/steam/engine/calc-plan-continuation.hpp index 6a67ae90a..457975a81 100644 --- a/src/steam/engine/calc-plan-continuation.hpp +++ b/src/steam/engine/calc-plan-continuation.hpp @@ -29,7 +29,7 @@ ** to the jobs, which perform and update this plan on the go. And in fact, the head of the ** calculation process, the CalcStream, holds onto such a closure to access current planning. ** - ** @todo a draft created in 2013 and then stalled. This is not obsolete. + ** @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive /////////////////////////TICKET #1221 */ @@ -65,7 +65,7 @@ namespace engine { * planning process is determined and controlled by the CalcStream owning * this closure. * - * @todo 5/13 still WIP -- write type comment + * @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive //////////////////////////TICKET #1221 */ class CalcPlanContinuation : public JobClosure diff --git a/src/steam/engine/calc-stream.hpp b/src/steam/engine/calc-stream.hpp index 269371236..75528d13b 100644 --- a/src/steam/engine/calc-stream.hpp +++ b/src/steam/engine/calc-stream.hpp @@ -48,7 +48,7 @@ #include "lib/error.hpp" #include "steam/play/timings.hpp" #include "steam/play/output-slot.hpp" -#include "steam/engine/calc-plan-continuation.hpp" +#include "steam/engine/render-drive.hpp" //#include "include/dummy-player-facade.h" //#include "include/display-facade.h" //#include "common/instancehandle.hpp" @@ -56,9 +56,10 @@ // //#include #include +#include -namespace steam { +namespace steam { namespace engine{ namespace error = lumiera::error; @@ -67,25 +68,11 @@ namespace engine{ // using lumiera::Subsys; // using lumiera::Display; // using lumiera::DummyPlayer; + + class RenderEnvironment; + - /** - * Abstract definition of the environment - * hosting a given render activity (CalcStream). - * Exposes all the operations necessary to adjust the - * runtime behaviour of the render activity, like e.g. - * re-scheduling with modified playback speed. Since the - * CalcStream is an conceptual representation of "the rendering", - * the actual engine implementation is kept opaque this way. - */ - class RenderEnvironmentClosure - { - public: - virtual ~RenderEnvironmentClosure() { } ///< this is an interface - - virtual play::Timings& effectiveTimings() =0; - }; - @@ -108,29 +95,26 @@ namespace engine{ */ class CalcStream { - RenderEnvironmentClosure* eng_; - engine::CalcPlanContinuation* plan_; + std::shared_ptr drive_; protected: - CalcStream (RenderEnvironmentClosure& abstractEngine) - : eng_(&abstractEngine) + CalcStream (RenderEnvironment& abstractEngine) + : drive_{}/////////////////////////////////////////////////TODO { } friend class EngineService; - CalcStream + void sendToOutput (play::DataSink) { UNIMPLEMENTED ("set up dispatcher to start calculating and feeding to the given output sink"); - return *this; } public: CalcStream() - : eng_(0) - , plan_(0) + : drive_{} { } ~CalcStream() { } @@ -138,15 +122,6 @@ namespace engine{ // using standard copy operations - play::Timings const& - getTimings() - { - if (!eng_) - throw error::State ("attempt to get the playback timings " - "of an unconfigured, disabled or halted calculation stream" - ,error::LUMIERA_ERROR_LIFECYCLE); - return eng_->effectiveTimings(); - } }; diff --git a/src/steam/engine/engine-service-mock.cpp b/src/steam/engine/engine-service-mock.cpp index 5010f8528..376182373 100644 --- a/src/steam/engine/engine-service-mock.cpp +++ b/src/steam/engine/engine-service-mock.cpp @@ -66,11 +66,11 @@ namespace engine{ /** special engine configuration for mock/testing operation. */ - RenderEnvironmentClosure& + RenderEnvironment& EngineServiceMock::configureCalculation (ModelPort,Timings,Quality) { - UNIMPLEMENTED ("represent *this as RenderEnvironmentClosure)"); - RenderEnvironmentClosure* todo_fake(0); ////KABOOOM + UNIMPLEMENTED ("represent *this as RenderEnvironment Closure)"); + RenderEnvironment* todo_fake(0); ////KABOOOM return *todo_fake; } diff --git a/src/steam/engine/engine-service-mock.hpp b/src/steam/engine/engine-service-mock.hpp index b5f48fe45..31c4d74ee 100644 --- a/src/steam/engine/engine-service-mock.hpp +++ b/src/steam/engine/engine-service-mock.hpp @@ -91,7 +91,7 @@ namespace engine{ protected: - virtual RenderEnvironmentClosure& configureCalculation (ModelPort,Timings,Quality); + virtual RenderEnvironment& configureCalculation (ModelPort,Timings,Quality); }; diff --git a/src/steam/engine/engine-service.cpp b/src/steam/engine/engine-service.cpp index a2e87e3e2..3927a4f52 100644 --- a/src/steam/engine/engine-service.cpp +++ b/src/steam/engine/engine-service.cpp @@ -23,6 +23,7 @@ /** @file engine-service.cpp ** Implementation parts related to the engine service abstraction + ** @warning as of 4/2023 Render-Engine integration work is underway ////////////////////////////////////////TICKET #1233 */ @@ -81,7 +82,7 @@ namespace engine{ OutputConnection& output, Quality serviceQuality) { - RenderEnvironmentClosure& renderConfig = configureCalculation (mPort,nominalTimings,serviceQuality); + RenderEnvironment& renderConfig = configureCalculation (mPort,nominalTimings,serviceQuality); function triggerRenderStart = bind (activateCalculation, _1, ref(renderConfig)); CalcStreams runningCalculations; @@ -111,11 +112,11 @@ namespace engine{ /** @internal build a representation of a single, ongoing calculation effort. * This "CalcStream" is tied to the actual engine implementation, but only * through an opaque link, representing this concrete engine as an - * RenderEnvironmentClosure. This enables the created CalcStream to be - * re-configured and adjusted while running. + * engine::RenderEnvironment closure. This enables the created CalcStream + * to be re-configured and adjusted while running. */ CalcStream - EngineService::activateCalculation (play::DataSink sink, RenderEnvironmentClosure& engineCallback) + EngineService::activateCalculation (play::DataSink sink, RenderEnvironment& engineCallback) { CalcStream calcStream(engineCallback); calcStream.sendToOutput (sink); @@ -132,18 +133,18 @@ namespace engine{ * the individual channel streams linked together for playback or rendering; * they all share the same media type and quality settings. * @return an abstracted representation of the specific setup for this render; - * from this point on, this RenderEnvironmentClosure will be the only way + * from this point on, this RenderEnvironment closure will be the only way * for client code to talk to "the engine". The actual instance of this * closure is just a handle and can be copied; any CalcStream created * off this closure will be linked to the same "environment" and be * tracked and managed for resource usage automatically. * @note variations and especially mock implementations of the render engine * might choose to configure internals differently. As long as the - * CalcStream and the embedded RenderEnvironmentClosure are consistent, - * such a specific configuration remains opaque for the user of the - * created render activity + * CalcStream and the embedded RenderEnvironment are consistent, + * such a specific configuration remains opaque for the user of + * the created render activity */ - RenderEnvironmentClosure& + RenderEnvironment& EngineService::configureCalculation (ModelPort mPort, Timings nominalTimings, Quality serviceQuality) @@ -151,7 +152,7 @@ namespace engine{ UNIMPLEMENTED ("Access and wire to the Scheduler-frontend. " "Then access the Segmentation and invoke a builder function for a suitable dispatcher table. " "Package all of this into a suitable RenderEnvironementClosure subclass."); - RenderEnvironmentClosure* todo_fake(0); ////KABOOOM + RenderEnvironment* todo_fake(0); ////KABOOOM return *todo_fake; } diff --git a/src/steam/engine/engine-service.hpp b/src/steam/engine/engine-service.hpp index 10dbdfd56..ab214c331 100644 --- a/src/steam/engine/engine-service.hpp +++ b/src/steam/engine/engine-service.hpp @@ -40,6 +40,8 @@ ** ** @ingroup engine ** @todo draft from 2013, stalled, but still relevant and to be continued eventually + ** @warning as of 4/2023 Render-Engine integration work is underway ////////////////////////////////////////TICKET #1233 + ** ** @see EngineInterface_test ** @see CalcStream_test ** @see steam::play::PlayerService @@ -69,7 +71,7 @@ //#include -namespace steam { +namespace steam { namespace engine{ // using std::string; @@ -158,7 +160,7 @@ namespace engine{ protected: - virtual RenderEnvironmentClosure& configureCalculation (ModelPort,Timings,Quality); + virtual RenderEnvironment& configureCalculation (ModelPort,Timings,Quality); void activateTracing(); void disableTracing(); ///< EX_FREE @@ -166,7 +168,7 @@ namespace engine{ friend class EngineDiagnostics; private: - static CalcStream activateCalculation (play::DataSink, RenderEnvironmentClosure&); + static CalcStream activateCalculation (play::DataSink, RenderEnvironment&); }; diff --git a/src/steam/engine/frame-coord.hpp b/src/steam/engine/frame-coord.hpp index 5e8307bbc..424c48810 100644 --- a/src/steam/engine/frame-coord.hpp +++ b/src/steam/engine/frame-coord.hpp @@ -61,6 +61,7 @@ namespace engine { * There is no reference to any kind of time grid (or similar session internals). * * @todo 1/12 WIP-WIP-WIP defining the invocation sequence and render jobs + * @todo 4/23 WIP-WIP-WIP recast the dispatch- and job invocation sequence */ struct FrameCoord { diff --git a/src/steam/engine/job-planning.hpp b/src/steam/engine/job-planning.hpp index 57850ab0c..6d0af0822 100644 --- a/src/steam/engine/job-planning.hpp +++ b/src/steam/engine/job-planning.hpp @@ -157,6 +157,8 @@ namespace engine { ,this->point_to_calculate_); } +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... +#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... /** integrate another chain of prerequisites into the current evaluation line. * Further evaluation will start to visit prerequisites from the new starting point, * and return to the current evaluation chain later on exhaustion of the side chain. @@ -200,6 +202,8 @@ namespace engine { +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... +#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... /** * iterator, exposing a sequence of JobPlanning elements */ @@ -314,6 +318,8 @@ namespace engine { +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... +#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored... /** * Generate a sequence of starting points for Job planning, * based on the underlying frame grid. This sequence will be diff --git a/src/steam/engine/render-drive.cpp b/src/steam/engine/render-drive.cpp new file mode 100644 index 000000000..146c9b7c5 --- /dev/null +++ b/src/steam/engine/render-drive.cpp @@ -0,0 +1,113 @@ +/* + RenderDrive - repetitively advancing a render calculation stream + + Copyright (C) Lumiera.org + 2023, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +/** @file render-drive.cpp + ** Implementation elements of render process planning. + ** @todo 4/2023 »Playback Vertical Slice« -- effort towards first integration of render process ////////////TICKET #1221 + */ + + +#include "steam/engine/render-drive.hpp" +#include "steam/engine/frame-coord.hpp" +#include "steam/engine/job-ticket.hpp" +#include "lib/time/timevalue.hpp" +//#include "lib/frameid.hpp" +//#include "steam/state.hpp" + +#include + + + +namespace steam { +namespace engine { + + + /** entry point (interface JobClosure): invoke the concrete job operation. + * In this case, the job operation is responsible for planning a chunk of actual render jobs. + */ + void + RenderDrive::invokeJobOperation (JobParameter parameter) + { + ASSERT (parameter.nominalTime == getTimings().getFrameStartAt (parameter.invoKey.frameNumber)); + + this->performJobPlanningChunk (parameter.invoKey.frameNumber); + } + + + void + RenderDrive::signalFailure (JobParameter parameter, JobFailureReason reason) + { + UNIMPLEMENTED ("what needs to be done when a planning continuation cant be invoked?"); + } + + + bool + RenderDrive::verify (Time nominalTime, InvocationInstanceID invoKey) const + { + UNIMPLEMENTED ("the actual meat: advance the render process"); + return getTimings().isValid() + && Time::MIN < nominalTime && nominalTime < Time::MAX + && nominalTime == getTimings().getFrameStartAt (invoKey.frameNumber); + } + + + size_t + RenderDrive::hashOfInstance (InvocationInstanceID invoKey) const + { + UNIMPLEMENTED ("the actual meat: advance the render process"); + return boost::hash_value (invoKey.frameNumber); + } + + + + + + Job + RenderDrive::prepareRenderPlanningFrom (FrameCnt startFrame) + { + InvocationInstanceID invoKey; + invoKey.frameNumber = startFrame; + Time nominalPlanningStartTime = getTimings().getFrameStartAt (startFrame); + + return Job(*this, invoKey, nominalPlanningStartTime); + } + + + void + RenderDrive::performJobPlanningChunk(FrameCnt nextStartFrame) + { + UNIMPLEMENTED ("the actual meat: advance the render process"); + } + + + Job + RenderDrive::buildFollowUpJobFrom (TimeAnchor const& refPoint) + { + return this->prepareRenderPlanningFrom( + refPoint.getNextAnchorPoint()); + } + + + + +}} // namespace engine diff --git a/src/steam/engine/render-drive.hpp b/src/steam/engine/render-drive.hpp new file mode 100644 index 000000000..284617ed5 --- /dev/null +++ b/src/steam/engine/render-drive.hpp @@ -0,0 +1,155 @@ +/* + RENDER-DRIVE.hpp - repetitively advancing a render calculation stream + + Copyright (C) Lumiera.org + 2023, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +/** @file render-drive.hpp + ** The active core within a CalcStream, causing the render mechanism to re-trigger repeatedly. + ** Rendering is seen as an open-ended, ongoing process, and thus the management and planning + ** of the render process itself is performed chunk wise and embedded into the other rendering + ** calculations. The _"rendering-as-it-is-planned-right-now"_ can be represented as a closure + ** to the jobs, which perform and update this plan on the go. And in fact, the head of the + ** calculation process, the CalcStream, maintains this closure instance, as parametrised + ** with the appropriate configuration for the specific playback/render process underway. + ** Enclosed into this instance lives the actual job planning pipeline, connected at the + ** rear to the dispatcher and thus to the fixture and the low-level model + ** + ** @todo 4/2023 »Playback Vertical Slice« -- effort towards first integration of render process ////////////TICKET #1221 + */ + + +#ifndef STEAM_ENGINE_RENDER_DRIVE_H +#define STEAM_ENGINE_RENDER_DRIVE_H + +#include "steam/common.hpp" +#include "steam/mobject/model-port.hpp" +#include "steam/engine/time-anchor.hpp" +#include "steam/engine/dispatcher.hpp" +#include "steam/play/timings.hpp" +#include "vault/engine/job.h" +#include "lib/nocopy.hpp" + + +namespace steam { +namespace engine { + +// using std::function; + using vault::engine::JobParameter; + using vault::engine::JobClosure; + using mobject::ModelPort; +// using lib::time::TimeSpan; +// using lib::time::FSecs; +// using lib::time::Time; + using lib::time::FrameCnt; + + + /** + * Abstract definition of the environment + * hosting a given render activity (CalcStream). + * Exposes all the operations necessary to adjust the + * runtime behaviour of the render activity, like e.g. + * re-scheduling with modified playback speed. Since the + * CalcStream is an conceptual representation of "the rendering", + * the actual engine implementation is kept opaque this way. + */ + class RenderEnvironment + { + public: + virtual ~RenderEnvironment() { } ///< this is an interface + + virtual play::Timings& effectiveTimings() =0; + virtual Dispatcher& getDispatcher() =0; + }; + + + /** + * The active drive to keep the render process going -- implemented as a + * job planning job, that repeatedly triggers itself again for the next + * planning chunk. The RenderDrive is created and owned by the corresponding + * CalcStream, and operates the job planning pipeline, backed by the dispatcher. + * + * @todo 4/23 early DRAFT -- find out what this does and write type comment + */ + class RenderDrive + : public JobClosure + , util::NonCopyable + { + + RenderEnvironment& engine_; + +// const ModelPort modelPort_; +// const uint channel_; + + + /* === JobClosure Interface === */ + + JobKind + getJobKind() const + { + return META_JOB; + } + + bool verify (Time, InvocationInstanceID) const; + size_t hashOfInstance (InvocationInstanceID) const; + + void invokeJobOperation (JobParameter); + void signalFailure (JobParameter, JobFailureReason); + + + + + public: + /** + * @todo + */ + RenderDrive (RenderEnvironment& renderEnvironment + ,ModelPort port, uint chan) + : engine_{renderEnvironment} + { } + + + play::Timings const& + getTimings() const + { + return engine_.effectiveTimings(); + } + + /** create the "start trigger job" + * Scheduling this job will effectively get a calculation stream + * into active processing, since it causes the first chunk of job planning + * plus the automated scheduling of follow-up planning jobs. The relation + * to real (wall clock) time will be established when the returned job + * is actually invoked + * @param startFrame where to begin rendering, relative to the nominal + * time grid implicitly given by the ModelPort to be pulled + */ + Job prepareRenderPlanningFrom (FrameCnt startFrame); + + + private: + void performJobPlanningChunk(FrameCnt nextStartFrame); + Job buildFollowUpJobFrom (TimeAnchor const& refPoint); + }; + + + +}} // namespace steam::engine +#endif /*STEAM_ENGINE_RENDER_DRIVE_H*/ diff --git a/src/steam/mobject/model-port.hpp b/src/steam/mobject/model-port.hpp index 0235a2570..3bbfc2711 100644 --- a/src/steam/mobject/model-port.hpp +++ b/src/steam/mobject/model-port.hpp @@ -80,7 +80,7 @@ namespace mobject { /** - * Handle denoting a point within the model, + * Handle designating a point within the model, * where actually output data can be pulled. * ModelPort is a frontend to be used by clients. * These ModelPort handle objects may be copied and stored diff --git a/src/steam/play/timings.hpp b/src/steam/play/timings.hpp index 729316519..0b7b3c176 100644 --- a/src/steam/play/timings.hpp +++ b/src/steam/play/timings.hpp @@ -99,7 +99,7 @@ namespace play { public: PlaybackUrgency playbackUrgency; boost::rational playbackSpeed; /////////////TICKET #902 we need a more generic representation for variable speed playback - Time scheduledDelivery; + Time scheduledDelivery; ///< a wall clock time corresponding to the Grid's origin. Can be Time::Never (=not time bound) Duration outputLatency; explicit diff --git a/wiki/draw/Play.Dispatch.png b/wiki/draw/Play.Dispatch.png new file mode 100644 index 000000000..428dc7264 Binary files /dev/null and b/wiki/draw/Play.Dispatch.png differ diff --git a/wiki/renderengine.html b/wiki/renderengine.html index ecb133321..a0913389e 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -2525,14 +2525,14 @@ Additionally, they may be used for resource management purposes by embedding a r #* one OpenGL Dataframe could contain raw texture data (but I am lacking expertise for this topic) -
+
An entity within the RenderEngine, responsible for translating a logical [[calculation stream|CalcStream]] (corresponding to a PlayProcess) into a sequence of individual RenderJob entries, which can then be handed over to the [[Scheduler]]. Performing this operation involves a special application of [[time quantisation|TimeQuant]]: after establishing a suitable starting point, a typically contiguous series of frame numbers need to be generated, together with the time coordinates for each of those frames.
 
 The dispatcher works together with the job ticket(s) and the scheduler; actually these are the //core abstractions//&nbsp; the process of ''job planning'' relies on. While the actual scheduler implementation lives within the Vault, the job tickets and the dispatcher are located within the [[Segmentation]], which is the backbone of the [[low-level model|LowLevelModel]]. More specifically, the dispatcher interface is //implemented//&nbsp; by a set of &rarr; [[dispatcher tables|DispatcherTables]] within the segmentation.
 
 {{red{stalled since 2014}}} -- development on this (important) topic has been postponed. Moreover, some rough edges remain within the Design &rarr; see [[some notes...|AboutMonads]]
 
-!defining the dispatcher interface
+!Collaborations
 The purpose of this interface is to support the planning of new jobs, for a given CalcStream. From time to time, a chunk of new RenderJob entries will be prepared for the [[Scheduler]]. Each job knows his frame number and the actual ProcNode to operate. So, to start planning jobs, we need to translate time &rarr; frame number &rarr; segment &rarr; real exit node.
 
 !!!Invocation situation
@@ -2555,7 +2555,7 @@ The frame dispatch step joins and combines multiple time axes. Through the proce
 These complex relationships are reflected in the invocation structure leading to an individual frame job. The [[calculation stream|CalcStream]] provides the [[render/playback timings|Timings]], while the actual implementation of the dispatcher, backed by the [[Fixture]] and thus linked to the session models, gets to relate the effective nominal time, the frame number, the exit node and the //processing function.//
 
 !!!controlling the planning process
-New render jobs are planned as an ongoing process, proceeding in chunks of evaluation. Typically, to calculate a single frame, several jobs are necessary -- to find out which and how, we'll have to investigate the model structures corresponding to this frame, resulting in a tree of prerequisites. Basically, the planning for each frame is seeded by establishing the nominal time position, in accordance to the current [[mode of playback|NonLinearPlayback]]. Conducted by the [[play controller|PlayController]], there is a strategy to define the precise way of spacing and sequence of frames to be calculated -- yet for the actual process of evaluating the prerequisites and planning the jobs, those details are irrelevant and hidden behind the dispatcher interface, as is most of the model and context information. The planning operation just produces a sequence of job definitions, which can then be associated with real time (wall clock) deadlines for delivery. The relation between the spacing and progression of the nominal frame time (as controlled by the playback mode) and the actual sequence of deadlines (which is more or less dictated by the output device) is rather loose and established anew for each planning chunk, relying on the ''time anchor''. The latter in turn uses the [[timings record|Timings]] of the [[calculation stream|CalcStream]] currently being planned, and these timings act as a strategy to represent the underlying timing grid and playback modalities.
+[>img[Structure of the Fixture|draw/Play.Dispatch.png]]New render jobs are planned as an ongoing process, proceeding in chunks of evaluation. Typically, to calculate a single frame, several jobs are necessary -- to find out which and how, we'll have to investigate the model structures corresponding to this frame, resulting in a tree of prerequisites. Basically, the planning for each frame is seeded by establishing the nominal time position, in accordance to the current [[mode of playback|NonLinearPlayback]]. Conducted by the [[play controller|PlayController]], there is a strategy to define the precise way of spacing and sequence of frames to be calculated -- yet for the actual process of evaluating the prerequisites and planning the jobs, those details are irrelevant and hidden behind the dispatcher interface, as is most of the model and context information. The planning operation just produces a sequence of job definitions, which can then be associated with real time (wall clock) deadlines for delivery. The relation between the spacing and progression of the nominal frame time (as controlled by the playback mode) and the actual sequence of deadlines (which is more or less dictated by the output device) is rather loose and established anew for each planning chunk, relying on the ''time anchor''. The latter in turn uses the [[timings record|Timings]] of the [[calculation stream|CalcStream]] currently being planned, and these timings act as a strategy to represent the underlying timing grid and playback modalities.
 
 While the sequence of frame jobs to be planned is possibly infinite, the actual evaluation is confined to the current planning chunk. When done with planning such a chunk of jobs, an additional ''continuation job'' is included to prepare a re-invocation of the planning function for preparation of the next chunk. Terminating playback is equivalent to not including or not invoking this continuation job. Please note that planning proceeds independently for each [[Feed]] -- in Lumiera the //current playback position//&nbsp; is just a conceptual projection of wall clock time to nominal time, yet there is no such thing like a synchronously proceeding "Playhead" 
 
@@ -7095,7 +7095,7 @@ We need to detect attaching and detaching of
 * root &harr; [[Fork]]
 
-
+
//Segmentation of timeline// denotes a data structure and a step in the BuildProcess.
 When [[building the fixture|BuildFixture]], ~MObjects -- as handled by their Placements -- are grouped below each timeline using them; Placements are then to be resolved into [[explicit Placements|ExplicitPlacement]], resulting in a single well defined time interval for each object. This allows to cut this effective timeline into slices of constant wiring structure, which are represented through the ''Segmentation Datastructure'', a time axis with segments holding object placements and [[exit nodes|ExitNode]]. &nbsp;&rarr; see [[structure of the Fixture|Fixture]]
 * for each Timeline we get a Segmentation
@@ -7112,7 +7112,7 @@ When [[building the fixture|BuildFixture]], ~MObjects -- as handled by their Pla
 ;(2) commit stage
 : -- after the build process(es) are completed, the new fixture gets ''committed'', thus becoming the officially valid state to be rendered. As render processes might be going on in parallel, some kind of locking or barrier is required. It seems advisable to make the change into a single atomic hot-swap. Meaning we'd get a single access point to be protected. But there is another twist: We need to find out which render processes to cancel and restart, to pick up the changes introduced by this build process -- which might include adding and deleting of timelines as a whole, and any conceivable change to the segmentation grid. Because of the highly dynamic nature of the placements, on the other hand it isn't viable to expect the high-level model to provide this information. Thus we need to find out about a ''change coverage'' at this point. We might expand on that idea to //prune any new segments which aren't changed.// This way, only a write barrier would be necessary on switching the actually changed segments, and any render processes touching these would be //tainted.// Old allocations could be released after all tainted processes are known to be terminated.
 ;(3) rendering use
-:Each play/render process employs a ''frame dispatch step'' to get the right exit node for pulling a given frame (&rarr; [[Dispatcher|FrameDispatcher]]). From there on, the process proceeds into the [[processing nodes|ProcNode]], interleaved with Vault/scheduler actions due to splitting into individually scheduled jobs. The storage of these processing nodes and accompanying wiring descriptors is hooked up behind the individual segments, by sharing a common {{{AllocationCluster}}}. Yet the calculation of individual frames also depends on ''parameters'' and especially ''automation'' linked with objects in the high-level model. It is likely that there might be some sharing or some kind of additional communication interface, as the intention was to allow ''live changes'' to automated values. <br/>{{red{WIP 12/2010}}} details need to be worked out. &rarr; [[parameter wiring concept|Wiring]]
+:Each play/render process employs a ''frame dispatch step'' to get the right exit node for pulling a given frame (&rarr; [[Dispatcher|FrameDispatcher]]). Planning appropriate [[render jobs|RenderJob]] involves support by the JobTicket for each Segment and port, which provides //a blueprint for rendering and connectivity.// From there on, the calculation process -- transmitted through [[Scheduler activity|RenderActivity]]  -- proceeds into the [[processing nodes|ProcNode]]. The storage of these processing nodes and accompanying wiring descriptors is hooked up behind the individual segments, by sharing a common {{{AllocationCluster}}}. Yet the calculation of individual frames also depends on ''parameters'' and especially ''automation'' linked with objects in the high-level model. It is likely that there might be some sharing or some kind of additional communication interface, as the intention was to allow ''live changes'' to automated values. <br/>{{red{WIP 4/2023}}} details about to be elaborated &rarr; PlaybackVerticalSlice
 !!!observations
 * Storage and initialisation for explicit placements is an issue. We should strive at making that inline as much as possible.
 * the overall segmentation emerges from a sorting of time points, which are start points of explicit placements
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index f1f06d2ef..63fa3a540 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -68383,8 +68383,39 @@
 
 
 
-
-
+
+
+
+
+
+  
+    
+  
+  
+    

+ Zeitmaß für diesen Wiedergabevorgang +

+ +
+
+ + + + +
+ + + + + + + + + + + + + @@ -68457,7 +68488,7 @@ - + @@ -68513,7 +68544,7 @@ - + @@ -68540,8 +68571,8 @@ - - + + @@ -68645,7 +68676,7 @@ - + @@ -68844,28 +68875,31 @@ - + - + - - + + + - + + - + + - + @@ -68972,6 +69006,7 @@ + @@ -69013,7 +69048,7 @@ - + @@ -69126,8 +69161,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -69247,9 +69357,183 @@ - + + + + + + + + +

+ ...erschlossen aus den bestehenden Strukturen + der neuen Intention +

+ +
+ + + + + + + + + + + + + + + + + +
    +
  • + repräsentieren eine parameter-basierte Instanz-Identität +
  • +
  • + sind jeweils voll kopierbare Wertobjekte +
  • +
  • + benötigen zudem eine Dependency-Injection +
  • +
  • + gespeichert im Play-Process und damit in der »Prozess-Tafel« +
  • +
+ +
+
+ + + + + + +
    +
  • + Der CalcStream ist eben das, also ein Organisationsmerkmal bzw. die Identität eines Teilprozesses +
  • +
  • + Der RenderDrive soll ein zyklischer Mechanismus sein, und als JobFunctor genutzt werden +
  • +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ ein Play/Renderprozeß wird mit einer definiten Quality-of-Service-Strategie aufgebaut; daraus ergibt sich implizit, was benötigt wird — und das ist ein sehr erweiterungsfähiges Konzept: beispielsweise könnte man das auf die Verfügbarkeit gewisser Klassen von Mediendaten erweitern, und es müßten somit nicht alle Daten immer direkt greifbar sein +

+ +
+
+ + + + + + +

+ mit der Erstellung eines CalcStream geht die Zusage einher, alle benötigten Resourcen tatsächlich im geforderten Maß verfügbar zu haben; diese Zusage mündet in die Übersetzung in eine abstrahierte RenderEnvironmentClosure; dahinter können sehr weitreichende Dispositionen verborgen sein, z.B. verteilte Resourcen in einem Render-Cluster/Netwerk-Setup, oder spezielle Hardware +

+ +
+
+ + + + + + +

+ die Zusage ist verbindlich und ohne zeitliche Parametrisierung; sollte eine Resource wegbrechen, so läßt man sofort den btr. Renderprozeß zusammenbrechen und markiert ihn als schadhaft +

+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +

+ dieser wird nun mehr und mehr entkernt.... +

+ +
+
+ + + + + + +

+ ...und das kommt nicht von ungefähr; schon im Entwurf von 2012 sollte ja Dispatcher  ein Interface sein, und die aktuelle Implementierung wäre eine  DispatchTable, die direkt in der Fixture angesiedelt und gemanaged würde +

+ +
+
+ +
@@ -69429,10 +69713,25 @@
+ + + + + + +
+ + + + + + + +