From e0d6362baddadd70475a5fe97f887fe7168a0edd Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 14 Mar 2026 20:44:27 +0100 Subject: [PATCH] BufferProvider: document the adapted structure in UML MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There was an old UML diagram created at the time of the first draft. It is integrated into the »OutputSlot« page in TiddlyWiki. This description and the diagram are highly relevant for understanding the design in this case. Unfortunately, Umbrello was "improved" with a lot of features since I used it for the last time, but the **quality** of the software has been **degraded**, it is now buggy and the layout is imprecise and gets messed up easily. --- doc/devel/uml/BoUML-diagrams.txt | 1 - doc/devel/uml/OutputSlot_components.svg | 7277 ++++++++++++++++++++++ doc/devel/uml/fig151685.png | Bin 26030 -> 0 bytes src/steam/play/render-configurator.cpp | 2 +- src/vault/out/output-slot-connection.hpp | 2 +- src/vault/out/output-slot.hpp | 6 +- uml/Lumiera.xmi | 283 +- uml/README_UML.txt | 9 + wiki/renderengine.html | 10 +- wiki/thinkPad.ichthyo.mm | 106 + 10 files changed, 7673 insertions(+), 23 deletions(-) create mode 100644 doc/devel/uml/OutputSlot_components.svg delete mode 100644 doc/devel/uml/fig151685.png diff --git a/doc/devel/uml/BoUML-diagrams.txt b/doc/devel/uml/BoUML-diagrams.txt index 72ea556da..384c8f0d7 100644 --- a/doc/devel/uml/BoUML-diagrams.txt +++ b/doc/devel/uml/BoUML-diagrams.txt @@ -50,5 +50,4 @@ On occasion, we'll replace them by drawings from our current UML model. 133637: classdiagram 143877 "Player Entities" 133637: objectdiagram 144005 "Play Process Structure" 133637: sequencediagram 145157 "output data exchange" -133637: classdiagram 151685 "Player Output" 128773: classdiagram 158213 "UIBus" diff --git a/doc/devel/uml/OutputSlot_components.svg b/doc/devel/uml/OutputSlot_components.svg new file mode 100644 index 000000000..6f663e34f --- /dev/null +++ b/doc/devel/uml/OutputSlot_components.svg @@ -0,0 +1,7277 @@ + + + OutputSlot components + Generated with Qt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + «for each channel» + + + + + + + + + + + + + + + + + + «smart handle» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + «active» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BufferProxyAdaptor + + + + + + + + + + + + + + + buildDescriptor() + + + + + + + + lockBuffer() + + + + + + + + + + + + + + + + BufferProvider + + + + + + + + + + + + + + + getDescriptor() + + + + + + + + lockBuffer() + + + + + + + + + + + + + + + + SpecificOutputSlot + + + + + + + + + + + + + + + buildState() + + + + + + + + + + + + + + + + SpecificConnection + + + + + + + + + + + + + + + + + + + + + + + BuffHandle + + + + + + + + + + + + + + + emit() + + + + + + + + release() + + + + + + + + + + + + + + + + Connection + + + + + + + + + + + + + + + claimBufferFor() + + + + + + + + transfer() + + + + + + + + shutDown() + + + + + + + + + + + + + + + + OutputSlot + + + + + + + + + + + + state_ + + + + + + + + + + + + + + isFree() + + + + + + + + allocate() + + + + + + + + + + + + + + + + DataSink + + + + + + + + + + + + + + + lockBufferFor() + + + + + + + + + + + + + + + + Allocation + + + + + + + + + + + + + + + getOpenedSinks() + + + + + + + + timingConstraints() + + + + + + + + isActive() + + + + + + + + + + + + + + + + + + + CON + + + + + + + + AllocState + + + + + + + + + + + + connections_ + + + + + + + + + + + + + + AllocState() «constructor» + + + + + + + + connectOutputSink() + + + + + + + + shutdownConnection() + + + + + + + + + + + + Actual Output Driver + + + + + + Output Management + + + + + + + + + + + + Knowledge specific + + + + + + + for this kind of + + + + + + + output driver + + + + + + + + + + + + + + + Client + + + + + + + front-end + + + + + + + + + + + OutputSlot components + + + + Ichthyostega + + + Lumiera documentation + + + + + + + + + + + + + diff --git a/doc/devel/uml/fig151685.png b/doc/devel/uml/fig151685.png deleted file mode 100644 index 77b41e4461a4ee43906885387f508dac49cac77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26030 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�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 + @@ -152,7 +153,7 @@ - + @@ -320,8 +321,179 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -426,9 +598,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -517,7 +727,7 @@ - + @@ -683,7 +893,7 @@ - + @@ -745,16 +955,13 @@ - + - - - @@ -775,8 +982,8 @@ - - + + @@ -816,7 +1023,7 @@ - + @@ -856,6 +1063,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uml/README_UML.txt b/uml/README_UML.txt index c2d418b7b..151a0e07d 100644 --- a/uml/README_UML.txt +++ b/uml/README_UML.txt @@ -45,6 +45,15 @@ Some hints for working with the diagrams: identical to the Latin part in `Noto Sans'. - Disable display of package names, visibility scopes and signatures - Use a 5 x 5 grid for alignment +- do not use inner classes and do not use other elements of the model as parameter types! +- the automatic layout is inconsitent, lacks precision and can kick elements around aribrtarily; + unfortunately it can not be disabled; the only solution is to proceed gradually from element to element. +- Snap-to has numeric problems; need to zoom in and manually adjust lines to avoid jagged edges in PNG export +- Undo / Redo is broken and can totally mess up the layout + +Umbrello can save as SVG; some glitches can thus be cleaned-up with Inkscape afterwards. + +💡 save after each step and make a Git commit; frequently close and re-open the application. BoUML diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 3beeb1677..93b013cf3 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -312,7 +312,7 @@ h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
/*{{{*/
 * html .tiddler {height:1%;}
 
-body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
+body {font-size:.8em; font-family:arial,helvetica; margin:0; padding:0;}
 
 h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
 h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
@@ -5157,7 +5157,7 @@ Thus the mapping is a copyable value object, using an associative array. It may
 First and foremost, mapping can be seen as a //functional abstraction.// As it's used at implementation level, encapsulation of detail types in't the primary concern, so it's a candidate for generic programming: For each of those use cases outlined above, a distinct mapping type is created by instantiating the {{{OutputMapping<DEF>}}} template with a specifically tailored definition context ({{{DEF}}}), which takes on the role of a strategy. Individual instances of this concrete mapping type may be default created and copied freely. This instantiation process includes picking up the concrete result type and building a functor object for resolving on the fly. Thus, in the way typical for generic programming, the more involved special details are moved out of sight, while being still in scope for the purpose of inlining. But there //is// a concern better to be encapsulated and concealed at the usage site, namely accessing the rules system. Thus mapping leads itself to the frequently used implementation pattern where there is a generic frontend as header, calling into opaque functions embedded within a separate compilation unit.
 
-
+
Within the Lumiera player and output subsystem, actually sending data to an external output requires to allocate an ''output slot''
 This is the central metaphor for the organisation of actual (system level) outputs; using this concept allows to separate and abstract the data calculation and the organisation of playback and rendering from the specifics of the actual output sink. Actual output possibilities (video in GUI window, video fullscreen, using a beamer, sound, Jack, rendering to file) can be added and removed dynamically from various components (Vault, Stage), all using the same resolution and mapping mechanisms (&rarr; OutputManagement)
 
@@ -5166,7 +5166,7 @@ Each OutputSlot is an unique and distinguishable entity. It corresponds explicit
 
 In order to be usable as //output sink,// an output slot needs to be //allocated,// i.e. tied to and locked for a specific client. At any time, there may be only a single client using a given output slot this way. To stress this point: output slots don't provide any kind of inherent mixing capability; any adaptation, mixing, overlaying and sharing needs to be done within the nodes network producing the output data fed to the slot. (in special cases, some external output capabilities -- e.g. the Jack audio connection system -- may still provide additional mixing capabilities, but that's beyond the scope of the Lumiera application)
 
-[>img[Outputslot implementation structures|uml/fig151685.png]]
+[>img[Outputslot implementation structures|uml/OutputSlot_components.svg]]
 Once allocated, the output slot returns a set of concrete ''sink handles'' (one for each physical channel expecting data). The calculating process feeds its results into those handles. Size and other characteristics of the data frames are assumed to be suitable, which typically won't be verified at that level anymore (but the sink handle provides a hook for assertions). Besides that, the allocation of an output slot reveals detailed ''timing expectations''. The client is required to comply to these [[timings|Timings]] when ''emitting'' data -- he's even required to provide a //current time specification,// alongside with the data. Based on this information, the output slot has the ability to handle timing failures gracefully; the concrete output slot implementation is expected to provide some kind of de-click or de-flicker facility, which kicks in automatically when a timing failure is detected.
 
 !!!usage and implementation
@@ -7235,7 +7235,7 @@ Later on we expect a distinct __query subsystem__ to emerge, presumably embeddin
 
 &rarr; QuantiserImpl
-
+
//Invoke and control the dependency and time based execution of  [[render jobs|RenderJob]]//
 The Scheduler acts as the central hub in the implementation of the RenderEngine and coordinates the //processing resources// of the application. Regarding architecture, the Scheduler is located in the Vault-Layer and //running// the Scheduler is equivalent to activating the »Vault Subsystem«. An EngineFaçade acts as entrance point, providing high-level render services to other parts of the application: [[render jobs|RenderJob]] can be activated under various timing and dependency constraints. Internally, the implementation is organised into two layers:
 ;Layer-2: Coordination
@@ -7265,7 +7265,7 @@ This leads to a »chaotic«, event-driven processing style without a central man
 &rarr; SchedulerProcessing
 
 !!!Performance
-Processing is not driven by a centralised algorithm, but rather stochastically by workers becoming available for further work. This allows for adaptation to a wide array of load patterns, but turns assessment of the Scheduler's capabilities and limitations into a challenging task. The speed and throughput of the processing are largely defined by the actual scheduler -- up to the point where the Scheduler is overloaded permanently and the //schedule slips away.// Based on that observation, a framework for [[Scheduler Load- and Performance-testing|SchedulerTest]] was^^{{red{12/2023 rather is about to be}}}^^ established.
+Processing is not driven by a centralised algorithm, but rather stochastically by workers becoming available for further work. This allows for adaptation to a wide array of load patterns, but turns assessment of the Scheduler's capabilities and limitations into a challenging task. The speed and throughput of the processing are largely defined by the actual scheduler -- up to the point where the Scheduler is overloaded permanently and the //schedule slips away.// Based on that observation, a framework for [[Scheduler Load- and Performance-testing|SchedulerTest]] was established.
 
 !!!Instructing the Scheduler
 The Scheduler is now considered an implementation-level facility with an interface specifically tailored at the JobPlanningPipeline: the [[»Render Activity Language«|RenderActivity]]. This //builder-style// setup allows to construct an ''~Activity-Term'' to model all the structural properties of an individual rendering invocation -- it is compriesed of a network of {{{Activity}}} records, which can be directly handled by the Scheduler.
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index b7bb08ebe..fa42c6c07 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -137595,6 +137595,23 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
 
 
 
+
+
+
+
+
+  
+    
+  
+  
+    

+ es ist 1 KATASTROFE +

+ + +
+ +
@@ -167743,6 +167760,95 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo + + + + + + + + + + + + + + + + + + + +

+ es verschiebt Assoziationen und sogar benachbarte Klassen, oft in komplett irrsinniger Weise +

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

+ ...dann wandelt sich der Typ auch in Multiline; danach sollte man zunächst die inneren Punkte platzieren, erst zuletzt den Start/Endpunkt. Vorsicht, sobald man eines der verbundenen Objekte weiter editiert oder skaliert, greift wieder das automatische Layout ein +

+ + +
+
+ + + + + + +

+ als SVG exportieren und im Inkscape reparieren +

+ + +
+ + + + + + +

+ das ist besonders ärgerlich, denn das führt zu unscharfen Linien +

+ + +
+
+ + + + +