From 25c8579695ddb07161e4ea298c3016883dc6d56d Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Mon, 17 Apr 2023 04:51:38 +0200 Subject: [PATCH] Job-Planning: new draft - organise the overall planning process - introduce a new entity: RenderDrive - it supersedes the CalcPlanCalculation, but is managed by CalcStream - moreover, the RenderDrive will house a IterTreeExplorer-Pipeline - define the concerns and relationships more clearly (see Drawing) - prerequisite to disentangle the Job-planning "mechanics" --- doc/devel/draw/Play.Dispatch.svg | 1798 +++++++++++++++++++ src/doxygen.dox | 14 +- src/steam/engine/calc-plan-continuation.cpp | 2 +- src/steam/engine/calc-plan-continuation.hpp | 4 +- src/steam/engine/calc-stream.hpp | 47 +- src/steam/engine/engine-service-mock.cpp | 6 +- src/steam/engine/engine-service-mock.hpp | 2 +- src/steam/engine/engine-service.cpp | 21 +- src/steam/engine/engine-service.hpp | 8 +- src/steam/engine/frame-coord.hpp | 1 + src/steam/engine/job-planning.hpp | 6 + src/steam/engine/render-drive.cpp | 113 ++ src/steam/engine/render-drive.hpp | 155 ++ src/steam/mobject/model-port.hpp | 2 +- src/steam/play/timings.hpp | 2 +- wiki/draw/Play.Dispatch.png | Bin 0 -> 87494 bytes wiki/renderengine.html | 10 +- wiki/thinkPad.ichthyo.mm | 331 +++- 18 files changed, 2436 insertions(+), 86 deletions(-) create mode 100644 doc/devel/draw/Play.Dispatch.svg create mode 100644 src/steam/engine/render-drive.cpp create mode 100644 src/steam/engine/render-drive.hpp create mode 100644 wiki/draw/Play.Dispatch.png 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 0000000000000000000000000000000000000000..428dc7264bda5b3af3bf4f6caf061ee77c948753 GIT binary patch literal 87494 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 literal 0 HcmV?d00001 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 @@
+ + + + + + +
+ + + + + + + +