Invocation: introduce engine-context for dependency injection

...by relying on DI for some effectively global services, notably
the cache provider, the API for building and wiring render nodes
can be simplified to cover only the actual node connectivity
This commit is contained in:
Fischlurch 2024-08-03 03:21:59 +02:00
parent 38dd3a738e
commit 409f2f20b8
6 changed files with 173 additions and 28 deletions

View file

@ -1,5 +1,5 @@
/*
BUFFER-LOCAL-KEY.hpp - opaque data for BufferProvider implementation
BUFFER-LOCAL-TAG.hpp - opaque data for BufferProvider implementation
Copyright (C) Lumiera.org
2011, Hermann Vosseler <Ichthyostega@web.de>
@ -21,13 +21,13 @@
*/
/** @file buffer-local-key.hpp
/** @file buffer-local-tag.hpp
** A marker data type used in metadata / buffer management of the render engine.
*/
#ifndef STEAM_ENGINE_BUFFR_LOCAL_KEY_H
#define STEAM_ENGINE_BUFFR_LOCAL_KEY_H
#ifndef STEAM_ENGINE_BUFFR_LOCAL_TAG_H
#define STEAM_ENGINE_BUFFR_LOCAL_TAG_H
#include "lib/error.hpp"
@ -130,4 +130,4 @@ namespace engine {
}} // namespace steam::engine
#endif
#endif /*STEAM_ENGINE_BUFFR_LOCAL_TAG_H*/

View file

@ -61,7 +61,7 @@
#include "include/logging.h"
#include "steam/streamtype.hpp"
#include "steam/engine/type-handler.hpp"
#include "steam/engine/buffer-local-key.hpp"
#include "steam/engine/buffer-local-tag.hpp"
#include "lib/nocopy.hpp"
#include <unordered_map>

View file

@ -46,8 +46,9 @@
#include "lib/symbol.hpp"
#include "lib/hash-value.h"
#include "steam/engine/buffhandle.hpp"
#include "steam/engine/engine-ctx.hpp"
#include "steam/engine/type-handler.hpp"
#include "steam/engine/buffer-local-key.hpp"
#include "steam/engine/buffer-local-tag.hpp"
#include "lib/nocopy.hpp"
#include <utility>
@ -173,4 +174,4 @@ namespace engine {
}} // namespace steam::engine
#endif
#endif /*STEAM_ENGINE_BUFFR_PROVIDER_H*/

View file

@ -0,0 +1,73 @@
/*
ENGINE-CTX.hpp - Services and parameters used globally within the render engine
Copyright (C) Lumiera.org
2024, 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 engine-ctx.hpp
** Dependency context to hold global parameters and services for the render engine.
** Notably the services to provide access to working buffers are linked directly into the
** render node connectivity, where they are used for each invocation of a render job.
**
** The EngineCtx itself is meant to be [dependency injected](\ref lib::Depend), so that
** tests can use suitably adapted variants for verifications.
** @todo who is responsible for setup of the services for the actual render engine?
** Might be closely related to brining up façade interfaces.
** @todo WIP 8/2024 provide render node structures
**
** @see buffer-provider.hpp
** @see buffhandle.hpp
*/
#ifndef STEAM_ENGINE_ENGINE_CTX_H
#define STEAM_ENGINE_ENGINE_CTX_H
#include "lib/depend.hpp"
#include "steam/engine/buffhandle.hpp"
#include "lib/nocopy.hpp"
//#include <utility>
#include <memory>
namespace steam {
namespace engine {
// using lib::Literal;
using std::unique_ptr;
// using std::forward;
class EngineCtx
: util::NonCopyable
{
public:
BufferProvider& mem;
BufferProvider& cache;
BufferProvider& output;
class Services;
EngineCtx();
};
}} // namespace steam::engine
#endif /*STEAM_ENGINE_ENGINE_CTX_H*/

View file

@ -41,6 +41,7 @@
//#include "vault/gear/job.h"
#include "lib/several-builder.hpp"
#include "steam/engine/turnout.hpp"
#include "steam/engine/engine-ctx.hpp"
#include "steam/engine/buffer-provider.hpp"
//#include "lib/util-foreach.hpp"
//#include "lib/iter-adapter.hpp"

View file

@ -88552,10 +88552,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721956892200" ID="ID_1451110951" MODIFIED="1722384486637" TEXT="strukturell w&#xe4;re das Spezial-Tag die beste L&#xf6;sung">
<node COLOR="#5b280f" CREATED="1721956892200" ID="ID_1451110951" MODIFIED="1722470788939" TEXT="strukturell w&#xe4;re das Spezial-Tag die beste L&#xf6;sung">
<arrowlink COLOR="#4395d3" DESTINATION="ID_1329080039" ENDARROW="Default" ENDINCLINATION="-105;0;" ID="Arrow_ID_1999279188" STARTARROW="None" STARTINCLINATION="6;-21;"/>
<arrowlink COLOR="#414bc3" DESTINATION="ID_603785440" ENDARROW="Default" ENDINCLINATION="-465;-28;" ID="Arrow_ID_1386315858" STARTARROW="None" STARTINCLINATION="-31;500;"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="button_cancel"/>
<node COLOR="#435e98" CREATED="1721957000178" ID="ID_917881726" MODIFIED="1721962405933" TEXT="fragt sich nur: ist das m&#xf6;glich...?">
<icon BUILTIN="help"/>
<node CREATED="1721957022223" ID="ID_936909569" MODIFIED="1722091785735" TEXT="stelle fest: damals habe ich einen &#xbb;LocalKey&#xab; eingef&#xfc;hrt">
@ -88640,8 +88641,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721962419154" ID="ID_197438854" MODIFIED="1721962438994" TEXT="zu &#xfc;berlegen: wann im Lebenszyklus mu&#xdf; diese Info gegeben werden">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#5b280f" CREATED="1721962419154" ID="ID_197438854" MODIFIED="1722470869273" TEXT="zu &#xfc;berlegen: wann im Lebenszyklus mu&#xdf; diese Info gegeben werden">
<icon BUILTIN="yes"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1722005002357" ID="ID_1859901064" MODIFIED="1722005054298" TEXT="im Kern ist es eine spezielle Marke f&#xfc;r jeden einzelnen Aufruf"/>
<node CREATED="1722005137995" ID="ID_1498833312" MODIFIED="1722005163168" TEXT="damit kann sie stets nur f&#xfc;r die einzelne Job-Invocation gegeben sein"/>
<node CREATED="1722005561810" ID="ID_605283552" MODIFIED="1722005604557" TEXT="zu dem Zeitpunkt haben wir einen Buffer-Descriptor vorliegen">
@ -88681,7 +88683,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#980e5e" CREATED="1722129450311" ID="ID_584023703" MODIFIED="1722129479340" TEXT="hab ein ganz ungutes Gef&#xfc;hl hier">
<icon BUILTIN="smily_bad"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722129503142" ID="ID_791304404" MODIFIED="1722210017088" TEXT="Gefahr, einen bereits bestehenden Eintrag nicht mehr zu finden">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722129503142" FOLDED="true" ID="ID_791304404" MODIFIED="1722470733127" TEXT="Gefahr, einen bereits bestehenden Eintrag nicht mehr zu finden">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -88844,7 +88846,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink DESTINATION="ID_743923267" ENDARROW="Default" ENDINCLINATION="9;90;" ID="Arrow_ID_674912377" STARTARROW="None" STARTINCLINATION="189;8;"/>
<arrowlink COLOR="#8e30c2" DESTINATION="ID_128884200" ENDARROW="Default" ENDINCLINATION="53;-3;" ID="Arrow_ID_182326182" STARTARROW="None" STARTINCLINATION="-9;58;"/>
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1722392552172" HGAP="40" ID="ID_1570989783" MODIFIED="1722392597788" TEXT="es bleiben aber Zweifel" VSHIFT="21">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722392552172" HGAP="40" ID="ID_1570989783" MODIFIED="1722470706776" TEXT="es bleiben aber Zweifel" VSHIFT="21">
<arrowlink COLOR="#ff0c4e" DESTINATION="ID_93208083" ENDARROW="Default" ENDINCLINATION="2326;0;" ID="Arrow_ID_1577193633" STARTARROW="Default" STARTINCLINATION="-344;36;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1722392616475" ID="ID_946046395" MODIFIED="1722392747592" TEXT="diese ganze L&#xf6;sung erscheint mir als unsaubere Manipulation">
@ -88862,10 +88864,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1722393055292" ID="ID_1420696816" MODIFIED="1722393080929" TEXT="gibt es denn wirklich keinen direkten Zugang f&#xfc;r diesen einen Spezialfall?">
<node COLOR="#435e98" CREATED="1722393055292" ID="ID_1420696816" MODIFIED="1722470703558" TEXT="gibt es denn wirklich keinen direkten Zugang f&#xfc;r diesen einen Spezialfall?">
<icon BUILTIN="help"/>
<node CREATED="1722393091606" ID="ID_1834757825" MODIFIED="1722393104456" TEXT="ich wei&#xdf; da&#xdf; es der top-Level-Aufruf ist"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1722393128569" ID="ID_403641521" MODIFIED="1722393479947" TEXT="und wenn man nun doch den Buffer hier direkt injiziert?">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722393128569" ID="ID_403641521" MODIFIED="1722470695946" TEXT="und wenn man nun doch den Buffer hier direkt injiziert?">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -88875,6 +88877,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<arrowlink COLOR="#ff2d7f" DESTINATION="ID_327945127" ENDARROW="Default" ENDINCLINATION="3056;127;" ID="Arrow_ID_824161116" STARTARROW="None" STARTINCLINATION="309;-17;"/>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1722444761326" ID="ID_1520971495" MODIFIED="1722445151092" TEXT="man k&#xf6;nnte tats&#xe4;chlich den Aufruf mit zus&#xe4;tzlichem Argument erm&#xf6;glichen">
<richcontent TYPE="NOTE"><html>
@ -88884,11 +88887,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
dieser w&#252;rde dann nur von top-Level aus so erfolgen, womit der Spezialfall ganz nat&#252;rlich ausgew&#228;hlt w&#228;re
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1722393034722" ID="ID_1964241515" MODIFIED="1722393053508" TEXT="Eine Nacht dar&#xfc;ber schlafen!">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#ff0000" CREATED="1722393034722" ID="ID_1964241515" MODIFIED="1722470683538" TEXT="Eine Nacht dar&#xfc;ber schlafen!">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1722444566657" ID="ID_901551782" MODIFIED="1722444590633" TEXT="Es gen&#xfc;gt, den OutputBufferProvider anders einzubinden">
@ -88900,8 +88902,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
...d.h. da&#223; man das Output-Protokoll hinter einem BufferProvider versteckt, um einen uniformen Zugriff zu erm&#246;glichen.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1722444704965" ID="ID_329807269" MODIFIED="1722444730742" TEXT="Aber: nicht den BufferProvider austauschen, sondern blo&#xdf; das BuffHandle"/>
<node CREATED="1722445156984" ID="ID_204443476" MODIFIED="1722445177473" TEXT="der spezielle BufferProvider w&#xfc;rde au&#xdf;erhalb, im Top-Level verwendet"/>
@ -88997,6 +88998,71 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1722470806994" ID="ID_1582495836" MODIFIED="1722470851140" TEXT="letztlich andere L&#xf6;sung gew&#xe4;hlt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
n&#228;mlich den OutputBufferProvider explizit eine Ebene dar&#252;ber verwenden und dann das BuffHandle direkt in den weave()-Aufruf geben
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node CREATED="1722612598373" ID="ID_1824837145" MODIFIED="1722612697640" TEXT="Fazit: damit ist ein globaler Scope m&#xf6;glich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Den OutputBufferProvider handhaben wir jetzt eine Ebene h&#246;her, und dort k&#246;nnen wir direkt ein LocalTag setzen und dann ein zugeh&#246;riges BuffHandle erstellen, das nur an einen bestimmten Buffer im Output-system gebunden ist. Alle anderen Use-Cases (Memory-Bl&#246;cke und Cache) sind ohnehin global f&#252;r die gesamte RenderEngine
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node CREATED="1722612720083" ID="ID_990757618" MODIFIED="1722612743013" TEXT="brauche nun Name und Ort f&#xfc;r den &#xbb;ServiceCtx&#xab;">
<node CREATED="1722613854403" ID="ID_492566303" MODIFIED="1722647335650" TEXT="also nehmen wir mal &#xbb;EngineCtx&#xab;">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1722612834244" ID="ID_1346948140" LINK="#ID_1426982855" MODIFIED="1722612929319" TEXT="der (einfallslose) Name &#xbb;Engine-Service&#xab; ist bereits vergeben">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
wenngleich auch dort Zweifel zum Namen bestehen
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="smily_bad"/>
</node>
</node>
<node CREATED="1722647413798" ID="ID_1607895967" MODIFIED="1722647418305" TEXT="Struktur">
<node CREATED="1722647419605" ID="ID_1700431737" MODIFIED="1722647426928" TEXT="ein Front-End mit Referenzen"/>
<node CREATED="1722647429699" ID="ID_1374967687" MODIFIED="1722647484152" TEXT="ein (opaque) Services-Objekt"/>
<node CREATED="1722647819006" ID="ID_1544083902" MODIFIED="1722647825463" TEXT="Anforderungen">
<node CREATED="1722647826990" ID="ID_1595414802" MODIFIED="1722647863118" TEXT="EngineCtx soll default-konstruierbar sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
damit lib::Depend ohne Weiteres einfach funktioniert
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1722648096856" ID="ID_1675656022" MODIFIED="1722648117988" TEXT="kann explizit einen Kontext f&#xfc;r die RenderEngine hochfahren"/>
</node>
</node>
</node>
@ -89008,18 +89074,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#3159bc" DESTINATION="ID_1809654586" ENDARROW="Default" ENDINCLINATION="151;-415;" ID="Arrow_ID_946061354" SOURCE="ID_537635442" STARTARROW="None" STARTINCLINATION="-305;0;"/>
<icon BUILTIN="edit"/>
<node CREATED="1722384964234" ID="ID_1078579384" MODIFIED="1722384990515" TEXT="der OutputBufferProvider funktioniert rein als Proxy"/>
<node CREATED="1722384991671" ID="ID_74035909" MODIFIED="1722385019119" TEXT="man gibt hierf&#xfc;r die Referenz auf eine OutputSink verpackt in ein LocalTag mit"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1722385049647" ID="ID_657216791" MODIFIED="1722385115272" TEXT="zu kl&#xe4;ren bleibt: wie kommt das LocalTag genau an die richtige Stelle?">
<node CREATED="1722384991671" ID="ID_74035909" MODIFIED="1722470465381" TEXT="er erm&#xf6;glicht Zugriff auf den Output-Buffer durch ein BuffHandle"/>
<node COLOR="#5b280f" CREATED="1722385049647" ID="ID_657216791" MODIFIED="1722470540470" TEXT="zu kl&#xe4;ren bleibt: wie kommt dieses Handle an die richtige Stelle">
<linktarget COLOR="#932840" DESTINATION="ID_657216791" ENDARROW="Default" ENDINCLINATION="103;-2;" ID="Arrow_ID_1546346335" SOURCE="ID_438526459" STARTARROW="None" STARTINCLINATION="-431;18;"/>
<icon BUILTIN="help"/>
<node CREATED="1722470545556" HGAP="29" ID="ID_983108939" MODIFIED="1722470577738" TEXT="Antwort: wir geben es direkt in den top-Level Aufruf" VSHIFT="7">
<arrowlink DESTINATION="ID_1622065787" ENDARROW="Default" ENDINCLINATION="221;0;" ID="Arrow_ID_1811024321" STARTARROW="None" STARTINCLINATION="206;12;"/>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1722385152329" ID="ID_1882977627" MODIFIED="1722385161927" TEXT="Problem: Aufrufstruktur">
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722385152329" ID="ID_1882977627" MODIFIED="1722470581306" TEXT="Problem: Aufrufstruktur">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1722385165975" ID="ID_59108048" MODIFIED="1722385176210" TEXT="die Formulierung ist generisch-rekursiv"/>
<node CREATED="1722385177230" ID="ID_795154055" MODIFIED="1722385231890" TEXT="das LocalTag wird aber nur an einer Stelle (top-Level) gebraucht">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1722385605151" ID="ID_519028808" MODIFIED="1722385612920" TEXT="Markieren des Output-Slot">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1722385177230" ID="ID_795154055" MODIFIED="1722385231890" TEXT="das LocalTag wird aber nur an einer Stelle (top-Level) gebraucht"/>
<node COLOR="#5b280f" CREATED="1722385605151" ID="ID_519028808" MODIFIED="1722470379074" TEXT="Markieren des Output-Slot">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1722389530744" ID="ID_1277418704" MODIFIED="1722389536610" TEXT="zu unterscheiden">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1722389538361" ID="ID_35436842" MODIFIED="1722389799354" TEXT="der resultSlot (auf jeder Ebene)">
@ -89079,13 +89148,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<node CREATED="1722445348793" ID="ID_1622065787" MODIFIED="1722445364447" TEXT="zus&#xe4;tzliches Argument: optional&lt;BuffHandle&gt;"/>
<node CREATED="1722445348793" ID="ID_1622065787" MODIFIED="1722470577738" TEXT="zus&#xe4;tzliches Argument: optional&lt;BuffHandle&gt;">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1622065787" ENDARROW="Default" ENDINCLINATION="221;0;" ID="Arrow_ID_1811024321" SOURCE="ID_983108939" STARTARROW="None" STARTINCLINATION="206;12;"/>
</node>
<node CREATED="1722445366619" ID="ID_1805188384" MODIFIED="1722445398466" TEXT="wenn gegeben &#x27f9; der f&#xfc;r den Slot konfigurierte BufferProvider wird &#xfc;berhaupt nicht verwendet"/>
<node CREATED="1722445400526" ID="ID_270562222" MODIFIED="1722445411968" TEXT="daf&#xfc;r ist nur ein einziger Eingriff in shed() notwendig"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721003681836" ID="ID_536010685" MODIFIED="1721061587708" TEXT="erst mal: Bulk-Konfig f&#xfc;r alle">
<icon BUILTIN="flag-yellow"/>
</node>