Job-Planning: Analysis for the next step

...which is build a »Job planning pipeline« step by step
in a test setup, and then factor that out as RenderDrive,
to supersede the existing CalcPlanContinuation and get
rid of the Monads this way...

Challenges
- there is a inconsistency with channel usage
- need to establish a way how to transport the output-Sink into the JobFunctor
- need a way to propagate the current frame number to the next planning chunk
This commit is contained in:
Fischlurch 2023-05-26 04:20:12 +02:00
parent e33689e5d6
commit b4c0ffab25
12 changed files with 731 additions and 21 deletions

View file

@ -96,6 +96,7 @@ namespace engine{
class CalcStream
{
std::shared_ptr<RenderDrive> drive_;
//////////////////////////////////////////////////////////////////////TICKET #1301 : need to pass-on the output sink association (and the ModelPort)
protected:
CalcStream (RenderEnvironment& abstractEngine)
@ -125,7 +126,7 @@ namespace engine{
};
typedef std::vector<CalcStream> CalcStreams;
typedef std::vector<CalcStream> CalcStreams; //////////////////////////////////////////////////////TICKET #1297 : probably unnecessary, since we intend to connect always one Feed per ModelPort (and handle multiple channels internally, in the processing nodes)

View file

@ -119,7 +119,7 @@ namespace engine{
EngineService::activateCalculation (play::DataSink sink, RenderEnvironment& engineCallback)
{
CalcStream calcStream(engineCallback);
calcStream.sendToOutput (sink);
calcStream.sendToOutput (sink); ////////////////////////////////////////////////////TICKET #1297 : need to re-think the association ModelPort ⟷ output sink
return calcStream;
}

View file

@ -72,7 +72,7 @@ namespace engine {
TimeVar absoluteRealDeadline;
ModelPort modelPort;
uint channelNr;
uint channelNr; ///////////////////////////////////////////////////////////////////////////TICKET #1297 : retract differentiation into channels here (instead use ModelPorts in the Segment)
/** build an \em undefined frame location */

View file

@ -92,7 +92,7 @@ namespace engine {
RenderDrive::prepareRenderPlanningFrom (FrameCnt startFrame)
{
InvocationInstanceID invoKey;
invoKey.frameNumber = startFrame;
invoKey.frameNumber = startFrame;/////////////////////////////////////////////////////////TICKET #1301 : Job should be created similar to what JobTicket does
Time nominalPlanningStartTime = getTimings().getFrameStartAt (startFrame);
return Job(*this, invoKey, nominalPlanningStartTime);

View file

@ -27,7 +27,7 @@
** 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
** planning 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

View file

@ -160,9 +160,12 @@ namespace play {
RenderConfigurator::ConnectFunction
buildRenderConfiguration (POutputManager outputPossibilities, Timings playTimings)
{
shared_ptr<RenderConfigurator> specialConfig (how_to_render (outputPossibilities,playTimings));
shared_ptr<RenderConfigurator> specialConfig{how_to_render (outputPossibilities,playTimings)};
return bind (&RenderConfigurator::buildActiveFeed, specialConfig, _1 );
return [specialConfig](ModelPort port)
{
return specialConfig->buildActiveFeed(port);
};
}

View file

@ -82,7 +82,7 @@ namespace play {
Feed buildActiveFeed (ModelPort);
typedef function<Feed(ModelPort)> ConnectFunction;
using ConnectFunction = function<Feed(ModelPort)>;
protected:
/** retrieve a suitable output sink for the data
@ -103,6 +103,7 @@ namespace play {
* with the EngineFacade, one for each channel connection.
* @note when this strategy function returns, the corresponding
* render activities are already up and running.
* @todo get rid of the multiple channel connections /////////////////////////////////////////TICKET #1297 : retract differentiation into channels here (instead use ModelPorts in the Segment)
*/
virtual engine::CalcStreams buildCalculationStreams (ModelPort, OutputSlot&) =0;

View file

@ -77,3 +77,7 @@ END
PLANNED "scheduler interface" SchedulerInterface_test <<END
END
PLANNED "Step timing basics" Timings_test <<END
END

View file

@ -103,7 +103,7 @@ namespace test {
,"after", Time{0,20} // the Segment ends *before* 20sec
,"mark", 123) // marker-ID 123 (can be verified from Job invocation)
.scope(MakeRec() // this JobTicket also defines a prerequisite ticket
.attrib("mark",555) // using a differen marker-ID 555
.attrib("mark",555) // using a different marker-ID 555
.genNode()
)
.genNode()};

View file

@ -0,0 +1,181 @@
/*
Timings(Test) - document and verify basic frame step timings
Copyright (C) Lumiera.org
2012, Hermann Vosseler <Ichthyostega@web.de>
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 dispatcher-interface-test.cpp
** unit test \ref Timings_test
**
** @warning as of 5/2023 planning-chunk generation is reworked ///////////////////////////////////////////TICKET #1301 : factor out RenderDrive
*/
#include "lib/test/run.hpp"
#include "lib/error.hpp"
//#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/play/timings.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/time/timequant.hpp"
//#include "lib/format-cout.hpp"
#include "lib/depend.hpp"
#include "lib/itertools.hpp"
#include "lib/util-coll.hpp"
#include "lib/util.hpp"
#include <functional>
#include <vector>
using test::Test;
using util::isnil;
using util::last;
using std::vector;
using std::function;
//using std::rand;
namespace steam {
namespace engine{
namespace test {
using lib::time::FrameRate;
using lib::time::Duration;
using lib::time::Offset;
using lib::time::TimeVar;
using lib::time::Time;
using mobject::ModelPort;
using play::Timings;
namespace { // Test fixture...
/* == test parameters == */
const uint START_FRAME(10);
const uint DUMMY_CHANNEL(0); /////////////////////////////////////////////////////////////TICKET #1297 : get rid of the channels (use different ModelPort)
ModelPort
getTestPort()
{
using play::test::ModelPorts;
using play::test::PlayTestFrames_Strategy;
using DummyPlaybackSetup = play::test::DummyPlayConnection<PlayTestFrames_Strategy>;
DummyPlaybackSetup dummySetup;
ModelPorts mockModelPorts = dummySetup.provide_testModelPorts();
return *mockModelPorts; // using just the first dummy port
}
} // (End) Test fixture
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
/***************************************************************//**
* @test document and verify the engine::Dispatcher interface, used
* to translate a CalcStream into individual node jobs.
* This test covers the definition of the interface itself,
* together with the supporting types and the default
* implementation of the basic operations.
* It creates and uses a mock Dispatcher implementation.
*/
class Timings_test : public Test
{
virtual void
run (Arg)
{
verify_simpleFrameStep();
verify_next_startPoint();
}
/** @test perform the basic dispatch step
* and verify the generated frame coordinates
*/
void
verify_simpleFrameStep()
{
ModelPort modelPort (getTestPort());
Timings timings (FrameRate::PAL);
ENSURE (START_FRAME == 10);
TimeAnchor refPoint(timings, START_FRAME);
CHECK (refPoint == Time::ZERO + Duration(10, FrameRate::PAL));
FrameCoord frame; /////////////////TODO get / implement offset-by-#-Frames
FrameCnt frameOffset = 15;
frame.absoluteNominalTime = refPoint;
frame.absoluteFrameNumber = refPoint.getStartFrame();
frame.absoluteRealDeadline = refPoint.establishDeadlineFor (frameOffset);
frame.modelPort = modelPort;
frame.channelNr = DUMMY_CHANNEL;
ENSURE (frame.isDefined());
// frame = dispatcher_->locateRelative (frame, frameOffset); /////////////////////////////OOO MAGIC FAIRY DUST HERE
CHECK (frame.absoluteNominalTime == Time(0,1)); ///////////////////////////////////OOO Boooooom
CHECK (frame.absoluteFrameNumber == 25);
CHECK (refPoint.remainingRealTimeFor(frame) < Time(FSecs(25,25)));
CHECK (refPoint.remainingRealTimeFor(frame) >= Time(FSecs(24,25)));
CHECK (frame.modelPort == modelPort);
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
}
/** action used as "continuation" in #check_ContinuationBuilder
* This function expects to be invoked with a time anchor bumped up
* to point exactly behind the end of the previously planned chunk of Jobs
*/
void
verify_next_startPoint()
{
Timings timings (FrameRate::PAL);
TimeAnchor nextRefPoint(timings, START_FRAME); //////////////////////////////////////OOO : how is this actually determined (not yet implemented....)
UNIMPLEMENTED ("How to determine the start point of the next planning chunk");
Duration frameDuration (1, FrameRate::PAL);
Time startAnchor = Time::ZERO + START_FRAME*frameDuration;
Duration time_to_cover = timings.getPlanningChunkDuration();
CHECK (Time(nextRefPoint) >= startAnchor + time_to_cover);
CHECK (Time(nextRefPoint) < startAnchor + time_to_cover + 1*frameDuration);
}
};
/** Register this test class... */
LAUNCHER (Timings_test, "unit engine");
}}} // namespace steam::engine::test

View file

@ -1495,9 +1495,9 @@ at the lowest level within the builder there is the step of building a //connect
* by default, a timeline is outfitted with one video and one sound master bus
</pre>
</div>
<div title="CalcStream" modifier="Ichthyostega" created="201112162053" modified="201202120003" tags="spec Rendering">
<div title="CalcStream" modifier="Ichthyostega" created="201112162053" modified="202305252135" tags="spec Rendering" changecount="2">
<pre>Calculation stream is an organisational unit used at the interface level of the Lumiera engine.
Representing a //stream of calculations,// delivering generated data within //timing constraints,// it is used
Representing a //stream of calculations,// to deliver generated data within //timing constraints,// it is used
*by the [[play process(es)|PlayProcess]] to define and control properties of the output generation
*at the engine backbone to feed the [[Scheduler]] with individual [[render jobs|RenderJob]] to implement this stream of calculations
Calculation stream objects are stateless, constant chunks of definition -- any altering of playback or rendering parameters just causes the respective descriptors to be superseeded. The presence of a CalcStream (being alive within the denoted time span) implies that using any of the associated jobs, dispatcher tables, node and wiring descriptors is safe
@ -1509,7 +1509,7 @@ Any really interesting calculation stream needs to be retrieved from the EngineF
!purpose
When a calculation stream is retrieved from the EngineFaçade it is already registered and attached there and represents an ongoing activity. Under the hood, several further collaborators will hold a copy of that calculation stream descriptor. While, as such, a CalcStream has no explicit state, at any time it //represents a current state.// In case the running time span of that stream is limited, it becomes superseded automatically, just by the passing of time.
Each calculation stream refers a relevant [[frame dispatcher table|FrameDispatcher]]. Thus, for the engine (interface level), the calculation stream allows to produce the individual [[render jobs|RenderJob]] to enqueue with the [[Scheduler]]. This translation step is what links and relates nominal time with running wall clock time, thereby obeying the [[timing constraints|Timings]] given when initially defining the calculation stream.
Each calculation stream refers a relevant [[frame dispatcher table|FrameDispatcher]]. Thus, for the engine (interface level), the calculation stream allows to produce the individual [[render jobs|RenderJob]] to enqueue with the [[Scheduler]]. This translation step is what links and relates nominal time with running wall clock time, thereby obeying the [[timing constraints|Timings]] established initially together with the calculation stream.
Additionally, each calculation stream knows how to access a //render environment closure,// allowing to re-schedule and re-adjust the setup of this stream. Basically, this closure is comprised of several functors (callbacks), which could be invoked to perform management tasks later on. Amongst others, this allows the calculation stream to redefine, supersede or &quot;cancel itself&quot;, without the need to access a central registration table at the engine interface level.
@ -2530,7 +2530,7 @@ 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)
</pre>
</div>
<div title="FrameDispatcher" modifier="Ichthyostega" created="201105222330" modified="202305231941" tags="def Rendering" changecount="21">
<div title="FrameDispatcher" modifier="Ichthyostega" created="201105222330" modified="202305260210" tags="def Player Rendering" changecount="23">
<pre>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)|JobTicket]] and the scheduler; actually these are the //core abstractions//&amp;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//&amp;nbsp; by a set of &amp;rarr; [[dispatcher tables|DispatcherTables]] within the segmentation.
@ -2566,6 +2566,7 @@ While the sequence of frame jobs to be planned is possibly infinite, the actual
!!!producing actual jobs
The JobTicket is created on demand, specialised for a single [[segment|Segmentation]] of the timeline and a single [[feed|Feed]] of data frames to be pulled from a ModelPort. Consequently this means that all frames and all channels within that realm will rely on the same job ticket -- which is a //higher order function,// a function producing another function: when provided with the specific frame coordinates (frame number and time point), the job ticket produces a [[concrete job definition|RenderJob]], which itself is a function to be invoked by the [[scheduler|Scheduler]] to carry out the necessary calculations just in time.
&amp;rarr; JobPlanningPipeline
</pre>
</div>
<div title="GAVL" modifier="Ichthyostega" created="200809220251" tags="def">
@ -4289,6 +4290,9 @@ Thus an invocation trail represents one specific path leading to the invocation
''Note'': {{red{future plans and visions -- no clear and distinct meaning -- as of 4/21}}}
</pre>
</div>
<div title="JobPlanningPipeline" creator="Ichthyostega" modifier="Ichthyostega" created="202305260209" tags="operational Rendering draft" changecount="1">
<pre>//Depth-first evaluation pipeline used in the FrameDispatcher to generate the next chunk of [[render jobs|RenderJob]]//</pre>
</div>
<div title="JobTicket" modifier="Ichthyostega" created="201202120018" modified="202305111241" tags="spec Rendering draft" changecount="4">
<pre>The actual media data is rendered by [[individually scheduled render jobs|RenderJob]]. All these calculations together implement a [[stream of calculations|CalcStream]], as demanded and directed by the PlayProcess. During the preparation of playback, a ''node planning phase'' is performed, to arrange for [[dispatching|FrameDispatcher]] the individual calculations per frame. The goal of these //preparations//&amp;nbsp; is to find out
* which [[model ports|ModelPort]] can be processed independently
@ -6185,7 +6189,7 @@ This is the core service provided by the player subsystem. The purpose is to cre
:any details of this processing remain opaque for the clients; even the player subsystem just accesses the EngineFaçade
</pre>
</div>
<div title="PlaybackVerticalSlice" creator="Ichthyostega" modifier="Ichthyostega" created="202303272236" modified="202305232230" tags="overview impl discuss draft" changecount="26">
<div title="PlaybackVerticalSlice" creator="Ichthyostega" modifier="Ichthyostega" created="202303272236" modified="202305260205" tags="overview impl discuss draft" changecount="27">
<pre>//Integration effort to promote the development of rendering, playback and video display in the GUI//
This IntegrationSlice was started in {{red{2023}}} as [[Ticket #1221|https://issues.lumiera.org/ticket/1221]] to coordinate the completion and integration of various implementation facilities, planned, drafted and built during the last years; this effort marks the return of development focus to the lower layers (after years of focussed UI development) and will implement the asynchronous and time-bound rendering coordinated by the [[Scheduler]] in the [[Vault|Vault-Layer]]
@ -6206,7 +6210,7 @@ __May.23__: taking a //prototyping approach// now, since further development was
* ✔ build a {{{MockSegmentation}}} to hold onto ~JobTickets, which can be created as Mock
* ✔define a simple specification language (based on the existing {{{GenNode}}}-DSL to define segments, tickets and prerequisite jobs
* ✔ implement a »~Split-Splice« algorithm for &amp;rarr; SegmentationChange, rigged accordingly to generate a mocked Segementation for now
* 🗘 create a testbed to assemble a DispatcherPipeline step by step (&amp;rarr; [[#920|https://issues.lumiera.org/ticket/920]] and [[#1275|https://issues.lumiera.org/ticket/1275|]])
* 🗘 create a testbed to assemble a JobPlanningPipeline step by step (&amp;rarr; [[#920|https://issues.lumiera.org/ticket/920]] and [[#1275|https://issues.lumiera.org/ticket/1275|]])
!Decisions
;Scheduler

View file

@ -64540,6 +64540,12 @@
<icon BUILTIN="hourglass"/>
</node>
</node>
<node CREATED="1685057613713" ID="ID_1402118663" MODIFIED="1685057622892" TEXT="&#xf6;ffnen / Belegen einer Output-Verbindung">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685057626464" ID="ID_106757636" MODIFIED="1685057709903" TEXT="Anpassung notwendig: Match auf ModelPort">
<linktarget COLOR="#fb1160" DESTINATION="ID_106757636" ENDARROW="Default" ENDINCLINATION="-78;630;" ID="Arrow_ID_1247503914" SOURCE="ID_1172676625" STARTARROW="None" STARTINCLINATION="1444;-44;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node CREATED="1680567322328" ID="ID_1487342906" MODIFIED="1680567331604" TEXT="externe Schnittstellen"/>
@ -69257,7 +69263,7 @@
<arrowlink COLOR="#f4fec9" DESTINATION="ID_1928295133" ENDARROW="Default" ENDINCLINATION="-1068;-69;" ID="Arrow_ID_362199078" STARTARROW="None" STARTINCLINATION="1381;58;"/>
<icon BUILTIN="full-3"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681424692274" ID="ID_1926192234" MODIFIED="1681425384986" STYLE="bubble" TEXT="Setup f&#xfc;r scheduler::Action anlegen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681424692274" ID="ID_1926192234" MODIFIED="1684972006686" STYLE="bubble" TEXT="Setup f&#xfc;r scheduler::Activity anlegen">
<edge COLOR="#725330"/>
<arrowlink COLOR="#f4fec9" DESTINATION="ID_688439359" ENDARROW="Default" ENDINCLINATION="-522;-149;" ID="Arrow_ID_1352278228" STARTARROW="None" STARTINCLINATION="1598;114;"/>
<icon BUILTIN="full-4"/>
@ -69377,6 +69383,7 @@
<linktarget COLOR="#5e5972" DESTINATION="ID_1709285340" ENDARROW="Default" ENDINCLINATION="-55;-7;" ID="Arrow_ID_1166695691" SOURCE="ID_1732223894" STARTARROW="None" STARTINCLINATION="-42;8;"/>
<node CREATED="1681520869358" ID="ID_248036437" MODIFIED="1681521862197" TEXT="betreibt den RenderDrive"/>
<node CREATED="1681520874613" ID="ID_1197599470" MODIFIED="1681520883624" TEXT="dieser ist intern mit dem Dispatcher verdrahtet"/>
<node CREATED="1685055290119" ID="ID_1913311410" MODIFIED="1685055313743" TEXT="er wird aktiviert und damit mit einem OutputSink verbunden"/>
</node>
<node CREATED="1681513790253" HGAP="30" ID="ID_1418303343" MODIFIED="1681515151463" TEXT="Dispatcher">
<arrowlink COLOR="#5e5972" DESTINATION="ID_786643460" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_876462297" STARTARROW="None" STARTINCLINATION="-29;7;"/>
@ -69399,13 +69406,21 @@
<node CREATED="1681521107332" ID="ID_764418758" MODIFIED="1681521118625" TEXT="konkrete StateCore mit allen aktiven Verdrahtungen"/>
<node CREATED="1681521122833" ID="ID_479512654" MODIFIED="1681521129047" TEXT="wird wie ein Cursor navigiert"/>
<node CREATED="1681521246771" ID="ID_1361044565" MODIFIED="1681521267392" TEXT="bewegt sich auf Basis von JobTicket-Konfigurationen"/>
<node CREATED="1681521294153" ID="ID_718588107" MODIFIED="1681521306565" TEXT="Mittel der Bewegung ist der JobTIcket::ExplorationState"/>
<node COLOR="#5b280f" CREATED="1681521294153" ID="ID_718588107" MODIFIED="1685050996829" TEXT="Mittel der Bewegung ist der JobTicket::ExplorationState">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#ac0e17" CREATED="1685051000827" ID="ID_1306786593" MODIFIED="1685051071238" TEXT="@deprecated">
<linktarget COLOR="#fc295f" DESTINATION="ID_1306786593" ENDARROW="Default" ENDINCLINATION="-46;56;" ID="Arrow_ID_1518460249" SOURCE="ID_633522131" STARTARROW="None" STARTINCLINATION="93;-5;"/>
</node>
</node>
</node>
<node CREATED="1681513818806" HGAP="30" ID="ID_839385817" MODIFIED="1681514365078" TEXT="JobTicket">
<linktarget COLOR="#5e5972" DESTINATION="ID_839385817" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1889540359" SOURCE="ID_947997771" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681521333950" ID="ID_1882410873" MODIFIED="1681521341316" TEXT="ist ein passiver Bauplan"/>
<node CREATED="1681521341799" ID="ID_1831867258" MODIFIED="1681521349882" TEXT="wird on-demand konkretisiert"/>
<node CREATED="1681521357484" ID="ID_633522131" MODIFIED="1681521366470" TEXT="kolaboriert mit einem aktiven ExplorationState"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681521357484" ID="ID_633522131" MODIFIED="1685051080939" TEXT="kolaboriert mit einem aktiven ExplorationState">
<arrowlink COLOR="#fc295f" DESTINATION="ID_1306786593" ENDARROW="Default" ENDINCLINATION="-46;56;" ID="Arrow_ID_1518460249" STARTARROW="None" STARTINCLINATION="93;-5;"/>
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
@ -69782,6 +69797,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742238869" ID="ID_1876795011" MODIFIED="1681742244980" TEXT="Planungs-Pipeline aufbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684967502141" HGAP="43" ID="ID_611062440" LINK="https://issues.lumiera.org/ticket/920" MODIFIED="1684975121952" TEXT="#920 planning-chunk" VSHIFT="3">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
<i><font size="4" color="#500f57">sehr altes Ticket...</font></i>
</p>
<p>
Effektiv ist das der Implementierungs-Kern; seinerzeit hatte ich unter diesem Ticket die Idee der <b><font face="Monospaced">CalcPlanContinuation</font></b>&#160;entwickelt, welche nun zum <b><font face="Monospaced">RenderDrive</font></b>&#160;wird...
</p>
</body>
</html></richcontent>
<linktarget COLOR="#942e62" DESTINATION="ID_611062440" ENDARROW="Default" ENDINCLINATION="-1068;115;" ID="Arrow_ID_590164748" SOURCE="ID_656533593" STARTARROW="None" STARTINCLINATION="-1389;145;"/>
<font NAME="SansSerif" SIZE="13"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681742255171" ID="ID_1531898349" MODIFIED="1681744077783" TEXT="Draft im Test-Setup">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1684889637419" TEXT="scaffolding and mocking used for this test">
@ -72993,6 +73026,45 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836995" ID="ID_456677168" MODIFIED="1684878195489" TEXT="using a frame step as base tick">
<icon BUILTIN="full-2"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685063204038" ID="ID_1320162919" MODIFIED="1685063213261" TEXT="Vorarbeit: Timings_test">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685063216695" ID="ID_918094283" MODIFIED="1685063243124" TEXT="ich bin immer wieder verwirrt...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
also besser dann als separaten Test dokumentieren
</p>
</body>
</html></richcontent>
<icon BUILTIN="smiley-angry"/>
<node CREATED="1685064270982" ID="ID_322776587" MODIFIED="1685064283466" TEXT="Ha! der Kern ist noch gar nicht implementiert">
<icon BUILTIN="idea"/>
<node CREATED="1685064289216" ID="ID_767771504" MODIFIED="1685064289216" TEXT="FrameCoord locateRelative (FrameCoord const&amp;, FrameCnt frameOffset)"/>
<node CREATED="1685064291715" ID="ID_1955955475" MODIFIED="1685064303415" TEXT="hier sollte das FrameGrid ins Spiel kommen">
<icon BUILTIN="info"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685063128431" ID="ID_1958871740" MODIFIED="1685063140918" TEXT="Startpunkt gewinnen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685063142277" ID="ID_1900307953" MODIFIED="1685063194220" TEXT="Problem: mu&#xdf; die Frame-Nummer an diese Stelle bekommen">
<arrowlink COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-27;-313;" ID="Arrow_ID_567963048" STARTARROW="None" STARTINCLINATION="-36;126;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066463050" ID="ID_1613334312" MODIFIED="1685066472930" TEXT="Mock-Setup schaffen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066492396" ID="ID_1906962794" MODIFIED="1685066501049" TEXT="API f&#xfc;r Zugriff kl&#xe4;ren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066474347" ID="ID_122826612" MODIFIED="1685066485373" TEXT="Grid in den Mock-Dispatcher legen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836996" ID="ID_1790705283" MODIFIED="1684878198471" TEXT="invoke the dispatcher to retrieve the top-level JobTicket">
<icon BUILTIN="full-3"/>
@ -73001,11 +73073,166 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="full-4"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836996" ID="ID_1332543018" MODIFIED="1684878204163" TEXT="integration: generate a complete sequence of (dummy)Jobs">
<arrowlink COLOR="#4d3a6e" DESTINATION="ID_92268538" ENDARROW="Default" ENDINCLINATION="184;0;" ID="Arrow_ID_1841184971" STARTARROW="None" STARTINCLINATION="146;7;"/>
<icon BUILTIN="full-5"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742264338" ID="ID_627755845" MODIFIED="1681742273104" TEXT="in RenderDrive &#xfc;berf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1684975260910" ID="ID_675928767" MODIFIED="1684975279714" TEXT="wo genau wird die Pipeline angesiedelt?">
<icon BUILTIN="help"/>
<node CREATED="1685058111671" ID="ID_1591073548" MODIFIED="1685058114306" TEXT="Datenstruktur">
<node CREATED="1685058115678" ID="ID_1234845094" MODIFIED="1685058131762" TEXT="ein Feed ist ein Descriptor (Value-Objekt)"/>
<node CREATED="1685058133308" ID="ID_605529757" MODIFIED="1685058146198" TEXT="ein PlayProcess hat einen vector&lt;Feed&gt;"/>
<node CREATED="1685058150242" ID="ID_1251514808" MODIFIED="1685058160434" TEXT="ein Feed kann mehrere CalcStreams haben (vector)"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685058172991" ID="ID_1595485074" MODIFIED="1685062339730" TEXT="RenderDrive is non-Copyable &#x27f9; mu&#xdf; irgendwo abgefangen werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
non-Copyable-Objekte in einem Vector sind nicht m&#246;glich...
</li>
<li>
die Zahl der Feeds und CalcStreams mu&#223; offen bleiben &#10233; Heap
</li>
<li>
aber sp&#228;testens vom RenderDrive darf es nur noch eine Instanz geben (pro realem CalcStream)
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684984505425" ID="ID_92268538" MODIFIED="1684984529415" TEXT="Job-Erzeugung festlegen">
<linktarget COLOR="#4d3a6e" DESTINATION="ID_92268538" ENDARROW="Default" ENDINCLINATION="184;0;" ID="Arrow_ID_1841184971" SOURCE="ID_1332543018" STARTARROW="None" STARTINCLINATION="146;7;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1684984549427" HGAP="40" ID="ID_206055852" MODIFIED="1684984923938" TEXT="zu repr&#xe4;sentierende Daten" VSHIFT="20">
<icon BUILTIN="info"/>
<node CREATED="1685050891692" ID="ID_726774749" MODIFIED="1685050895237" TEXT="FrameCoord">
<node CREATED="1685052033040" MODIFIED="1685052033040" TEXT="TimeVar absoluteNominalTime;"/>
<node CREATED="1685052033041" MODIFIED="1685052033041" TEXT="FrameCnt absoluteFrameNumber;"/>
<node CREATED="1685052033041" MODIFIED="1685052033041" TEXT="TimeVar absoluteRealDeadline;"/>
<node CREATED="1685052033041" MODIFIED="1685052033041" TEXT="ModelPort modelPort;"/>
</node>
<node CREATED="1685050895873" ID="ID_1305413793" MODIFIED="1685050899356" TEXT="JobTicket"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685050903817" ID="ID_947140645" MODIFIED="1685058047977" TEXT="konkrete Output-Sink">
<linktarget COLOR="#a95a75" DESTINATION="ID_947140645" ENDARROW="Default" ENDINCLINATION="188;21;" ID="Arrow_ID_686370160" SOURCE="ID_1575034395" STARTARROW="None" STARTINCLINATION="747;-40;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685058050639" ID="ID_143173446" MODIFIED="1685058108822" TEXT="Sink ist ein Handle (ref-counting)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
lib::Handle&lt;OutputSlot::Connection&gt;
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685062340977" ID="ID_1162744930" MODIFIED="1685062405034" TEXT="diese Info geh&#xf6;rt in den JobFunktor">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
denn die Inovcation mu&#223; in diese Sink rendern
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684984896696" HGAP="36" ID="ID_727075583" MODIFIED="1685034155777" VSHIFT="3">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Verh&#228;ltnis von JobPlanning
</p>
<p>
und JobTicket::Provision kl&#228;ren
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034217649" ID="ID_838263980" MODIFIED="1685034235192" TEXT="Job kann seine eigene Performance-Charakteristik beobachten">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034865250" ID="ID_321040814" MODIFIED="1685050866587" TEXT="Me&#xdf;punkte per TimingObservable">
<arrowlink COLOR="#8f29b2" DESTINATION="ID_1462535336" ENDARROW="Default" ENDINCLINATION="885;-44;" ID="Arrow_ID_1037995856" STARTARROW="None" STARTINCLINATION="503;38;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034976707" ID="ID_655578250" MODIFIED="1685034992696" TEXT="als strukturierter Term repr&#xe4;sentiert">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034247837" ID="ID_1377875222" MODIFIED="1685034271882" TEXT="die Provision wei&#xdf; im Detail, wie die Ausf&#xfc;hrung strukturiert ist">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034304654" ID="ID_187208942" MODIFIED="1685052153799" TEXT="JobPlanning">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685052155282" ID="ID_1374932582" MODIFIED="1685052157494" TEXT="f&#xfc;gt die FrameCoord hinzu">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685052158905" ID="ID_298268641" MODIFIED="1685052192794" TEXT="ist eine State-Facade f&#xfc;r den aktuellen Planungs-Stand">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685062609797" ID="ID_51155918" MODIFIED="1685062617634" TEXT="(re)-Trigger-Mechanismus">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685062620764" ID="ID_1394015015" MODIFIED="1685062646843" TEXT="Job analog zum JobTicket konstruieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
InvocationInstanceID invoKey{timeHash (nominalTime, provision.invocationSeed)};
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685062686774" ID="ID_548686360" MODIFIED="1685063188122">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
brauche dann aber einen Weg,
</p>
<p>
um die Frame-Nummer zu transportieren
</p>
</body>
</html></richcontent>
<linktarget COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-27;-313;" ID="Arrow_ID_567963048" SOURCE="ID_1900307953" STARTARROW="None" STARTINCLINATION="-36;126;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685062714666" ID="ID_1331730136" MODIFIED="1685062746213" TEXT="bisher habe ich mit der InvocationInstaceID &quot;getrickst&quot;">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685062757986" ID="ID_1983441100" MODIFIED="1685062769556" TEXT="TimeAnchor braucht die Frame-Nr">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684967502141" ID="ID_470129345" LINK="https://issues.lumiera.org/ticket/1301" MODIFIED="1684975281405" TEXT="#1301 Render-Drive extrahieren">
<linktarget COLOR="#942e62" DESTINATION="ID_470129345" ENDARROW="Default" ENDINCLINATION="-1340;103;" ID="Arrow_ID_1563903339" SOURCE="ID_1293956051" STARTARROW="None" STARTINCLINATION="-1408;109;"/>
<font NAME="SansSerif" SIZE="13"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
@ -73184,6 +73411,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742053502" ID="ID_122410804" MODIFIED="1681742065769" TEXT="Idee: auch noch Channel aufl&#xf6;sen">
<linktarget COLOR="#daffc5" DESTINATION="ID_122410804" ENDARROW="Default" ENDINCLINATION="-352;-925;" ID="Arrow_ID_194808318" SOURCE="ID_804638831" STARTARROW="None" STARTINCLINATION="544;39;"/>
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685055490012" ID="ID_583565421" MODIFIED="1685055782306" TEXT="Komplikation">
<arrowlink COLOR="#f82653" DESTINATION="ID_444040470" ENDARROW="Default" ENDINCLINATION="104;-230;" ID="Arrow_ID_298674260" STARTARROW="None" STARTINCLINATION="-271;47;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1685055516660" ID="ID_256799905" MODIFIED="1685055529299" TEXT="es k&#xf6;nnte OutputConnection mit mehreren Feeds geben"/>
<node CREATED="1685055530054" ID="ID_161856895" MODIFIED="1685055709088" TEXT="diese M&#xf6;glichkeit halte ich mir bewu&#xdf;t offen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Und zwar, weil es so am Einfachsten ist f&#252;r die Implementierung der OutputConnection = slot.allocate() ....
</p>
<p>
Denn es kann durchaus so sein, da&#223; sich hinter einer Connection gleich mehrere Sinks auf Hardware / Driver-Ebene befinden. In diesem Fall w&#228;re es andernfalls notwendig, wieder innerhalb der OutputConnection ein de-Multiplexing zu machen. Und das will ich nicht, sowas geh&#246;rt in die Engine. Der OutputSink ist wirklich nur noch ein Buffer, der mit gewissen Timing-Constraints <i>bespielt werden mu&#223;</i>
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681742068918" ID="ID_1859739609" MODIFIED="1681742080663" TEXT="Frage: sinnvoll f&#xfc;r den ModelPort?">
<icon BUILTIN="help"/>
</node>
@ -73301,6 +73548,54 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685055718338" ID="ID_444040470" MODIFIED="1685055775753" TEXT="Aufdr&#xf6;seln der Kan&#xe4;le l&#xf6;sen">
<linktarget COLOR="#f82653" DESTINATION="ID_444040470" ENDARROW="Default" ENDINCLINATION="104;-230;" ID="Arrow_ID_298674260" SOURCE="ID_583565421" STARTARROW="None" STARTINCLINATION="-271;47;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685055799951" ID="ID_1193173193" MODIFIED="1685055809850" TEXT="CalcStream::sendToOutput (play::DataSink)">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685055837068" ID="ID_1575034395" MODIFIED="1685058047977" TEXT="hier mu&#xdf; ggfs. eine Sub-Adressierung eingerichtet werden">
<arrowlink COLOR="#a95a75" DESTINATION="ID_947140645" ENDARROW="Default" ENDINCLINATION="188;21;" ID="Arrow_ID_686370160" STARTARROW="None" STARTINCLINATION="747;-40;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685056049002" HGAP="40" ID="ID_1330403717" LINK="https://issues.lumiera.org/ticket/1297" MODIFIED="1685056111380" TEXT="#1297 uniform handling of channels and output slots" VSHIFT="10">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685056117433" ID="ID_543449333" MODIFIED="1685056202074" TEXT="Wunsch: 1:1 Relation ModelPort &#x27f7; Sink">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1685056152876" ID="ID_287943939" MODIFIED="1685056199158" TEXT="Realit&#xe4;t: eine OutputConnection k&#xf6;nnte mehrere Sinks erfordern">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1685056209644" ID="ID_915182218" MODIFIED="1685056239177" TEXT="ich hatte zun&#xe4;chst gedacht, dann eben Channels innerhalb des ModelPort mitzuschleifen">
<icon BUILTIN="info"/>
</node>
<node CREATED="1685056240542" ID="ID_809031507" MODIFIED="1685056271549" TEXT="aber das f&#xfc;hrt zu unerw&#xfc;nschter Redundanz im JobTicket und Model">
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685057413132" HGAP="58" ID="ID_1258310036" LINK="https://issues.lumiera.org/ticket/1297#comment:1" MODIFIED="1685057450791" TEXT="Widerspruch zum Design f&#xfc;r Output-Connections">
<icon BUILTIN="broken-line"/>
<node CREATED="1685057458886" ID="ID_1801490861" MODIFIED="1685057497316" TEXT="bisher: eine Allocation &#x27f6; viele Sinks">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
und alle m&#252;ssen an dieser Stelle auf einen Schlag angebunden werden
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1685057500160" ID="ID_573982703" MODIFIED="1685057531295" TEXT="aber: eigentlich m&#xfc;&#xdf;ten hier mehrere ModelPorts beigestellt werden">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685057532500" ID="ID_1172676625" MODIFIED="1685057709903" TEXT="&#x27f9; brauche ein Matching auf passende Ports">
<arrowlink COLOR="#fb1160" DESTINATION="ID_106757636" ENDARROW="Default" ENDINCLINATION="-78;630;" ID="Arrow_ID_1247503914" STARTARROW="None" STARTINCLINATION="1444;-44;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742018442" ID="ID_596503548" MODIFIED="1681742022940" TEXT="Addressierung JobTicket">
<icon BUILTIN="flag-yellow"/>
@ -73437,6 +73732,27 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681086255534" ID="ID_1953726127" MODIFIED="1681086266246" TEXT="Umbau: C-Struct - Layer zur&#xfc;ckbauen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685033975249" ID="ID_1266406674" MODIFIED="1685033983018" TEXT="erweiterte F&#xe4;higkeiten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685033984477" ID="ID_1752806906" MODIFIED="1685033993700" TEXT="kann seine Ausf&#xfc;hrungszeiten beobachten">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685033995127" ID="ID_1464401657" MODIFIED="1685034032376" TEXT="kann seine Startzeit dynamisch sch&#xe4;tzen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034033363" ID="ID_1119701449" MODIFIED="1685034041276" TEXT="zu gegebener Deadline">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034042065" ID="ID_1845073256" MODIFIED="1685034074950" TEXT="plus Kontext-Info">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034075926" ID="ID_498185505" MODIFIED="1685034100316" TEXT="nominelle Zeit">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034085899" ID="ID_1109099042" MODIFIED="1685034100318" TEXT="daraus folgend: Cache-Status">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681086215092" ID="ID_688439359" MODIFIED="1681425384986" TEXT="Activity">
<linktarget COLOR="#f4fec9" DESTINATION="ID_688439359" ENDARROW="Default" ENDINCLINATION="-522;-149;" ID="Arrow_ID_1352278228" SOURCE="ID_1926192234" STARTARROW="None" STARTINCLINATION="1598;114;"/>
@ -73453,6 +73769,108 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680565476652" ID="ID_1599285907" MODIFIED="1684973334977" TEXT="#1298 Definition: Render Activity verbs">
<linktarget COLOR="#fde0ca" DESTINATION="ID_1599285907" ENDARROW="Default" ENDINCLINATION="-762;53;" ID="Arrow_ID_744981346" SOURCE="ID_1591114904" STARTARROW="None" STARTINCLINATION="-1043;88;"/>
<linktarget COLOR="#fe6d01" DESTINATION="ID_1599285907" ENDARROW="Default" ENDINCLINATION="-183;0;" ID="Arrow_ID_1756942771" SOURCE="ID_495348423" STARTARROW="None" STARTINCLINATION="-502;-42;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1684980870862" ID="ID_1051551" MODIFIED="1684980899528" TEXT="Arten">
<node CREATED="1684980900575" ID="ID_1853795602" MODIFIED="1684980920474" TEXT="invoke">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
dispatches a JobFunctor into an appropriate worker thread, based on the job definition's execution spec
</p>
<p>
no further dependency checks; Activities attached to the job are re-dispatched after the job function's completion
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900581" ID="ID_1090845009" MODIFIED="1684980927235" TEXT="depend">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
verify a given number of dependencies has been satisfied, otherwise inhibit the indicated target Activity
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900583" ID="ID_896772403" MODIFIED="1684980933730" TEXT="starttime">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
signal start of some processing &#8212;&#160;for the purpose of timing measurement, but also to detect crashed tasks
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900585" ID="ID_1179349638" MODIFIED="1684980938862" TEXT="stoptime">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
correspondingly signal end of some processing
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900586" ID="ID_1961246380" MODIFIED="1684980944549" TEXT="notify">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
push a message to another Activity or process record
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900587" ID="ID_1255388864" MODIFIED="1684980973980" TEXT="check">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
invoke a closure within engine context; inhibit another target Activity, depending on the result.
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900588" ID="ID_1729066993" MODIFIED="1684980976835" TEXT="tick">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
internal engine &#187;heart beat&#171; -- invoke internal maintenance hook(s)
</p>
<p>
&#160;
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1684980982361" ID="ID_1863198468" MODIFIED="1684980987321" TEXT="Themen">
<node CREATED="1684980991406" ID="ID_1812192430" MODIFIED="1684981025601" TEXT="Timings nachf&#xfc;hren">
<arrowlink COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="223;-15;" ID="Arrow_ID_516157232" STARTARROW="None" STARTINCLINATION="312;45;"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1681396805942" ID="ID_1886457526" MODIFIED="1681396815850" TEXT="Architektur festlegen">
@ -73474,17 +73892,96 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1680565469342" ID="ID_250843894" MODIFIED="1680566937368" TEXT="Priority-Scheduling">
<linktarget COLOR="#fec499" DESTINATION="ID_250843894" ENDARROW="Default" ENDINCLINATION="-644;84;" ID="Arrow_ID_1702721830" SOURCE="ID_12567096" STARTARROW="None" STARTINCLINATION="-233;30;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684973294743" ID="ID_495348423" MODIFIED="1684973356775" TEXT="Strukturen und Repr&#xe4;sentation">
<arrowlink COLOR="#fe6d01" DESTINATION="ID_1599285907" ENDARROW="Default" ENDINCLINATION="-183;0;" ID="Arrow_ID_1756942771" STARTARROW="None" STARTINCLINATION="-502;-42;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1680565476652" ID="ID_1218283238" MODIFIED="1680566934008" TEXT="Dependency-Notification">
</node>
<node CREATED="1680565476652" ID="ID_1218283238" MODIFIED="1684973201854" TEXT="Dependency-Notification">
<linktarget COLOR="#fec499" DESTINATION="ID_1218283238" ENDARROW="Default" ENDINCLINATION="-664;74;" ID="Arrow_ID_443600884" SOURCE="ID_695181807" STARTARROW="None" STARTINCLINATION="-240;29;"/>
<node CREATED="1685029743471" ID="ID_662250285" MODIFIED="1685029748808" TEXT="Benachrichtigungen">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1685029752445" ID="ID_1073371022" MODIFIED="1685029779621" TEXT="wohin? andere Threads &#x27f9; lock-free Messaging-Queue">
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1685029812065" ID="ID_930725673" MODIFIED="1685029830507" TEXT="welcher Art Nachrichten treten auf?">
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1685029955186" ID="ID_1190497873" MODIFIED="1685029971434" TEXT="Inhibition">
<linktarget COLOR="#fe3b32" DESTINATION="ID_1190497873" ENDARROW="Default" ENDINCLINATION="111;-9;" ID="Arrow_ID_302966285" SOURCE="ID_845619439" STARTARROW="None" STARTINCLINATION="111;-9;"/>
<icon BUILTIN="help"/>
</node>
<node CREATED="1685030153172" ID="ID_1240235053" MODIFIED="1685030161822" TEXT="Zeit-Messungen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node CREATED="1685029833448" ID="ID_1405359337" MODIFIED="1685029836621" TEXT="Verzweigungen">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1685029839057" ID="ID_1926570028" MODIFIED="1685029854988" TEXT="verzweigte Ausf&#xfc;hrungs-Strukur oder nur Entscheidungs-Struktur?">
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685029859862" ID="ID_60316038" MODIFIED="1685029875094" TEXT="Pr&#xe4;dikat: Auswertung im Engine-Kontext">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1685029878060" ID="ID_526042153" MODIFIED="1685029885075" TEXT="was hei&#xdf;t das?">
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685029907272" ID="ID_1507342460" MODIFIED="1685029927215" TEXT="Folge &#x27f9; inhibit Activity">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685029940611" ID="ID_845619439" MODIFIED="1685029978331" TEXT="m&#xf6;glicherweise Nachricht">
<arrowlink COLOR="#fe3b32" DESTINATION="ID_1190497873" ENDARROW="Default" ENDINCLINATION="111;-9;" ID="Arrow_ID_302966285" STARTARROW="None" STARTINCLINATION="111;-9;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1684980732965" ID="ID_1914429002" MODIFIED="1684980742528" TEXT="Thema: Timing-Updates">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684980744406" ID="ID_1565158605" LINK="https://issues.lumiera.org/ticket/1302" MODIFIED="1684981025601" TEXT="#1302 maintain consistent job timings">
<linktarget COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="223;-15;" ID="Arrow_ID_516157232" SOURCE="ID_1812192430" STARTARROW="None" STARTINCLINATION="312;45;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681347244544" ID="ID_444443795" MODIFIED="1681347486789" TEXT="Basis: Operational Control">
<linktarget COLOR="#9c738a" DESTINATION="ID_444443795" ENDARROW="Default" ENDINCLINATION="-1256;-1009;" ID="Arrow_ID_1047384894" SOURCE="ID_594073373" STARTARROW="None" STARTINCLINATION="-902;35;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684984312239" ID="ID_1397136569" MODIFIED="1684984327473" TEXT="Dependencies repr&#xe4;sentieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681347258814" ID="ID_1046752034" MODIFIED="1681347345729" TEXT="TimingObservable">
<linktarget COLOR="#a54e77" DESTINATION="ID_1046752034" ENDARROW="Default" ENDINCLINATION="-1519;212;" ID="Arrow_ID_1830118942" SOURCE="ID_1139462793" STARTARROW="None" STARTINCLINATION="836;79;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034759152" ID="ID_1462535336" MODIFIED="1685034942586" TEXT="Zeitplanung ist &#xfc;ber die Activity-Struktur verteilt">
<linktarget COLOR="#8f29b2" DESTINATION="ID_1462535336" ENDARROW="Default" ENDINCLINATION="885;-44;" ID="Arrow_ID_1037995856" SOURCE="ID_321040814" STARTARROW="None" STARTINCLINATION="503;38;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034805714" ID="ID_601531168" MODIFIED="1685034823237" TEXT="gewichtete moving-Averages">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034336329" ID="ID_1204987843" MODIFIED="1685034344505" TEXT="langlebige Instanzen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034347304" ID="ID_979587106" MODIFIED="1685034357789" TEXT="keying per Invocation-Hash-System">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685034722333" ID="ID_1196812284" MODIFIED="1685034732152" TEXT="InvocationInstanceID"/>
<node CREATED="1685034732627" ID="ID_195305881" MODIFIED="1685034744467" TEXT="+ ID des Me&#xdf;punkts"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034362678" ID="ID_1900695090" MODIFIED="1685034447971" TEXT="persistent aufbewahren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034463110" ID="ID_1741580708" MODIFIED="1685034485943" TEXT="Plattform-Modell (vgl. Yoshimi-Testsuite)">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034490452" ID="ID_1695057398" MODIFIED="1685034513314" TEXT="Relevanz-Score mitf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685034527488" ID="ID_126462924" MODIFIED="1685034534813" TEXT="Nutzungsh&#xe4;ufigkeit"/>
<node CREATED="1685034536414" ID="ID_1109987049" MODIFIED="1685034545521" TEXT="Erfolg der Sch&#xe4;tzung"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034585984" ID="ID_1264433598" MODIFIED="1685034595551" TEXT="Score hierarchisch aktualisieren">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685034596598" ID="ID_938491535" MODIFIED="1685034602145" TEXT="in der laufenden Instanz"/>
<node CREATED="1685034602640" ID="ID_846888946" MODIFIED="1685034609355" TEXT="im aktuellen Projekt"/>
<node CREATED="1685034611687" ID="ID_8278922" MODIFIED="1685034622667" TEXT="in der lokalen Installation"/>
</node>
</node>
</node>
</node>
</node>
</node>
@ -73544,7 +74041,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1681341905668" ID="ID_432577558" MODIFIED="1681341915150" TEXT="das ist die &#xbb;abstrahierte Render-Engine&#xab;"/>
</node>
<node CREATED="1681594252245" ID="ID_1719102613" MODIFIED="1681594256245" TEXT="InvocationInstanceID">
<linktarget COLOR="#677097" DESTINATION="ID_1719102613" ENDARROW="Default" ENDINCLINATION="20;85;" ID="Arrow_ID_470615287" SOURCE="ID_465090802" STARTARROW="None" STARTINCLINATION="-167;-25;"/>
<linktarget COLOR="#677097" DESTINATION="ID_1719102613" ENDARROW="Default" ENDINCLINATION="20;85;" ID="Arrow_ID_470615287" SOURCE="ID_465090802" STARTARROW="None" STARTINCLINATION="-148;-14;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681594257143" ID="ID_689625560" MODIFIED="1681594270271" TEXT="Bedeutung kl&#xe4;ren">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1682039643804" ID="ID_1788184151" MODIFIED="1682040050470" TEXT="2012&#x2026;2023+ ist das lediglich ein Platzhalter">
@ -73622,7 +74119,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1682040135826" ID="ID_1456180976" MODIFIED="1682040139389" TEXT="Job-Parameter">
<node CREATED="1682040150126" ID="ID_1607794832" MODIFIED="1682040158098" TEXT="nomineller Zeitpunt"/>
<node CREATED="1682040159275" ID="ID_465090802" MODIFIED="1682040208269" TEXT="InvocationInstanceID">
<arrowlink COLOR="#677097" DESTINATION="ID_1719102613" ENDARROW="Default" ENDINCLINATION="20;85;" ID="Arrow_ID_470615287" STARTARROW="None" STARTINCLINATION="-167;-25;"/>
<arrowlink COLOR="#677097" DESTINATION="ID_1719102613" ENDARROW="Default" ENDINCLINATION="20;85;" ID="Arrow_ID_470615287" STARTARROW="None" STARTINCLINATION="-148;-14;"/>
</node>
</node>
<node CREATED="1682040140026" ID="ID_606595034" MODIFIED="1682040142533" TEXT="Job-Funktor">
@ -79703,12 +80200,27 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#5fa6c1" DESTINATION="ID_409993593" ENDARROW="Default" ENDINCLINATION="199;8;" ID="Arrow_ID_222915618" STARTARROW="None" STARTINCLINATION="167;-10;"/>
<arrowlink COLOR="#6a92a9" DESTINATION="ID_1805461369" ENDARROW="Default" ENDINCLINATION="190;-8;" ID="Arrow_ID_1209058185" STARTARROW="None" STARTINCLINATION="61;-2;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684967502141" HGAP="32" ID="ID_656533593" LINK="https://issues.lumiera.org/ticket/920" MODIFIED="1684975125151" TEXT="#920 planning-chunk" VSHIFT="9">
<arrowlink COLOR="#942e62" DESTINATION="ID_611062440" ENDARROW="Default" ENDINCLINATION="-1068;115;" ID="Arrow_ID_590164748" STARTARROW="None" STARTINCLINATION="-1389;145;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1684967561516" ID="ID_758948708" MODIFIED="1684967566943" TEXT="sehr altes Ticket"/>
<node CREATED="1684967567676" ID="ID_1413649871" MODIFIED="1684967580677" TEXT="ist praktisch der Dispatcher-Implementierungs-Kern"/>
<node CREATED="1684967582842" ID="ID_305633266" MODIFIED="1684975176753" TEXT="hier k&#xf6;nnte man den Umbau auf RenderDrive ansetzen">
<arrowlink COLOR="#fa2575" DESTINATION="ID_1293956051" ENDARROW="Default" ENDINCLINATION="47;4;" ID="Arrow_ID_652930263" STARTARROW="None" STARTINCLINATION="-8;28;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680305211903" ID="ID_1805461369" LINK="https://issues.lumiera.org/ticket/1276" MODIFIED="1681165797441" TEXT="#1276 reassess design of render job deadline planning">
<arrowlink COLOR="#f42f34" DESTINATION="ID_896127270" ENDARROW="Default" ENDINCLINATION="-1096;-80;" ID="Arrow_ID_1764912075" STARTARROW="None" STARTINCLINATION="-511;24;"/>
<linktarget COLOR="#963345" DESTINATION="ID_1805461369" ENDARROW="Default" ENDINCLINATION="367;0;" ID="Arrow_ID_271837208" SOURCE="ID_216719314" STARTARROW="None" STARTINCLINATION="175;160;"/>
<linktarget COLOR="#6a92a9" DESTINATION="ID_1805461369" ENDARROW="Default" ENDINCLINATION="190;-8;" ID="Arrow_ID_1209058185" SOURCE="ID_699634936" STARTARROW="None" STARTINCLINATION="61;-2;"/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684967502141" HGAP="32" ID="ID_1293956051" LINK="https://issues.lumiera.org/ticket/920" MODIFIED="1684975150795" TEXT="#1301 Render-Drive refactoring" VSHIFT="9">
<arrowlink COLOR="#942e62" DESTINATION="ID_470129345" ENDARROW="Default" ENDINCLINATION="-1340;103;" ID="Arrow_ID_1563903339" STARTARROW="None" STARTINCLINATION="-1408;109;"/>
<linktarget COLOR="#fa2575" DESTINATION="ID_1293956051" ENDARROW="Default" ENDINCLINATION="47;4;" ID="Arrow_ID_652930263" SOURCE="ID_305633266" STARTARROW="None" STARTINCLINATION="-8;28;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680316647510" ID="ID_1793327086" LINK="https://issues.lumiera.org/ticket/1277" MODIFIED="1680316670021" TEXT="#1277 implement Timings descriptor for simple playback">
<icon BUILTIN="flag-yellow"/>
@ -79745,6 +80257,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680389032371" ID="ID_663979640" LINK="https://issues.lumiera.org/ticket/1285" MODIFIED="1680389054385" TEXT="#1285 draft integration of asynchronous IO with rendering">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1680561901447" ID="ID_1591114904" LINK="https://issues.lumiera.org/ticket/1298" MODIFIED="1684980824431" TEXT="#1298 Render Activity verbs">
<arrowlink COLOR="#fde0ca" DESTINATION="ID_1599285907" ENDARROW="Default" ENDINCLINATION="-762;53;" ID="Arrow_ID_744981346" STARTARROW="None" STARTINCLINATION="-1043;88;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1680388296693" ID="ID_283603911" LINK="https://issues.lumiera.org/ticket/1284" MODIFIED="1680388318115" TEXT="#1284 Render Engine operational control">