Invocation: identify problems with buffer handling
The ''design exercise'' started yesterday ran into a total rodadblock. And this is a good thing, as this unveils inconsistencies in our memory handling protocols * Buffer Provider Protocol * Output Slot Protocol The latter exposes a `BuffHandle`, which should be usable from within the Render Node code like any other regular buffer handle — which especially would require to ''delegate the lifecycle calls...'' So while this topic does not hinder us right now to proceed with a Node invocation in test setup, it must be addressed before we're able to deliver data into an actual OutputSlot. Created #1387 to track this topic...
This commit is contained in:
parent
33c8f1c5b1
commit
9484ea0b71
3 changed files with 308 additions and 56 deletions
|
|
@ -15,7 +15,7 @@
|
|||
** Adapter to expose a given memory block through a BuffHandle.
|
||||
** This allows to integrate a specific data access (e.g. related to input / output)
|
||||
** with the buffer lifecycle protocol as defined by BufferProvider.
|
||||
** @see state.hpp
|
||||
** @todo BROKEN as of 12/2024 //////////////////////////////////////////////////////////////////////////////TICKET #1387 : can not properly compose BufferProvider
|
||||
** @see output-slot.hpp
|
||||
*/
|
||||
|
||||
|
|
@ -54,21 +54,64 @@ namespace engine {
|
|||
* @todo WIP-WIP 12/2024 this is a design sketch to explore extension capabilities of BufferProvider
|
||||
*/
|
||||
class BufferProxyProvider
|
||||
: util::MoveOnly
|
||||
: util::NonCopyable
|
||||
{
|
||||
|
||||
std::function<void(size_t,BufferState)> listener_;
|
||||
using Listener = std::function<void(size_t,BufferState)>;
|
||||
|
||||
class ForwardingBufferProvider
|
||||
: public BufferProvider
|
||||
{
|
||||
Listener listener_;
|
||||
|
||||
/* === BufferProvider API === */
|
||||
|
||||
uint
|
||||
prepareBuffers (uint, HashVal) override
|
||||
{
|
||||
NOTREACHED ("this part of the API should not be used");
|
||||
return 1; // can not sensibly do anything for "pre-allocation",
|
||||
} // other than telling the caller that we only "have one buffer to provide"
|
||||
|
||||
BuffHandle
|
||||
provideLockedBuffer (HashVal typeID) override
|
||||
{
|
||||
/////////////////////////////////////////////////////////////////////////////////////TICKET #1387 : BufferProvider default impl. is lacking means to compose and delegate
|
||||
// return buildHandle (typeID, asBuffer(newBlock.accessMemory()), &newBlock);
|
||||
}
|
||||
|
||||
void
|
||||
mark_emitted (HashVal, LocalTag const&) override
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
detachBuffer (HashVal, LocalTag const&, Buff&) override
|
||||
{
|
||||
|
||||
}
|
||||
public:
|
||||
ForwardingBufferProvider (Listener listener)
|
||||
: BufferProvider{"BufferProxyProvider"}
|
||||
, listener_{std::move (listener)}
|
||||
{ }
|
||||
};
|
||||
|
||||
ForwardingBufferProvider passThroughProvider_;
|
||||
|
||||
|
||||
public:
|
||||
template<class LIS, typename = lib::meta::disable_if_self<BufferProxyProvider, LIS>>
|
||||
BufferProxyProvider (LIS&& listener)
|
||||
: listener_{std::forward<LIS> (listener)}
|
||||
: passThroughProvider_{std::forward<LIS> (listener)}
|
||||
{ }
|
||||
|
||||
template<typename TAR>
|
||||
BuffHandle
|
||||
lockBuffer (TAR& dataBlock)
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1387 : impossible due to inner contradictions in BufferProvider and OutputSlot
|
||||
UNIMPLEMENTED ("setup type handler and then create a locked BuffHandle");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,11 +32,11 @@ namespace test {
|
|||
|
||||
|
||||
/***************************************************************//**
|
||||
* @test verify the OutputSlot interface and base implementation
|
||||
* by performing full data exchange cycle. This is a
|
||||
* kind of "dry run" for documentation purposes,
|
||||
* both the actual OutputSlot implementation
|
||||
* as the client using this slot are Mocks.
|
||||
* @test verify the design of OutputSlot and BufferProvider by
|
||||
* implementing a delegating BufferProvider to expose
|
||||
* output data buffers provided from _some implementation._
|
||||
* @todo WIP-WIP 12/2024 this turned out to be impossible,
|
||||
* due to inconsistencies in the default implementation. /////////////////////////////////////////////TICKET #1387 : need to consolidate BufferProvider default implementation
|
||||
*/
|
||||
class OutputProxyProvider_test : public Test
|
||||
{
|
||||
|
|
@ -60,7 +60,7 @@ namespace test {
|
|||
TestFrame dataBlock (frameNr);
|
||||
CHECK ( dataBlock.isPristine());
|
||||
|
||||
BuffHandle handle = proxPro.lockBuffer (dataBlock);
|
||||
BuffHandle handle = proxPro.lockBuffer (dataBlock); ///////////////////////////////////////////////TICKET #1387 : unable to implement this
|
||||
|
||||
// Now a »client« can do awful things to the buffer...
|
||||
CHECK (handle.isValid());
|
||||
|
|
|
|||
|
|
@ -28459,9 +28459,7 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1555080572765" ID="ID_577805455" MODIFIED="1576282358065" TEXT="im Detail etwas komplexer...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
aber es bleibt bei diesem Prinzip.
|
||||
|
|
@ -29130,9 +29128,7 @@
|
|||
</node>
|
||||
<node CREATED="1555808311417" ID="ID_1932269477" MODIFIED="1576282358062" TEXT="oder ist es grade ein Vorteil, wenn sie ein roher Baustein ist">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...weil man stets noch einen Layer darübersetzt?
|
||||
|
|
@ -29691,9 +29687,7 @@
|
|||
<node CREATED="1674176756797" ID="ID_1711694466" MODIFIED="1674176762735" TEXT="berechnet als 14+68+82"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1674177671455" ID="ID_200566627" MODIFIED="1674254483689" TEXT="möglicherweise ist die kombinierte Spalte das Problem">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
|o| cH(line=0) += (14,14)
|
||||
|
|
@ -30878,9 +30872,7 @@
|
|||
</node>
|
||||
<node CREATED="1542383648143" FOLDED="true" HGAP="41" ID="ID_718536842" MODIFIED="1557498707230" VSHIFT="-6">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<b>nicht alles</b> wird gezeichnet
|
||||
|
|
@ -30962,9 +30954,7 @@
|
|||
<node CREATED="1566394504879" ID="ID_106666528" MODIFIED="1566394519122" TEXT="Diskussion 90er-Look vs flat design"/>
|
||||
<node CREATED="1566394541001" ID="ID_878559119" MODIFIED="1566394556367">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>manchmal</i> ist die alte Lösung besser
|
||||
|
|
@ -31985,9 +31975,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1678925372624" ID="ID_348250165" MODIFIED="1678925428123">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
TiddlyWiki + <font face="Monospaced" color="#a63077">doc/technical/stage/style/Timeline.txt</font>
|
||||
|
|
@ -32430,9 +32418,7 @@
|
|||
<node CREATED="1564499271812" ID="ID_287796510" MODIFIED="1564499291455" TEXT="getBorder() macht eine Kopie des Rect"/>
|
||||
<node CREATED="1564500049627" ID="ID_422878118" MODIFIED="1564500092094" TEXT="auch die unterliegenden CssValues sind immutable">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
und mehrfach gekapselt.
|
||||
|
|
@ -33328,9 +33314,7 @@
|
|||
<node CREATED="1611478208171" ID="ID_383778310" MODIFIED="1611478224282" TEXT="in jedem (Teil)-Canvas die "natürlichen" Eigen-Koordinaten zu verwenden"/>
|
||||
<node CREATED="1611478227499" ID="ID_1352834162" MODIFIED="1611482079208" TEXT="die Übersetzung komplett via ViewHook wegzuabstrahieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
tatsächlich ist es dann ein Sub-Interface: der CanvasHook. Und dieser
|
||||
|
|
@ -88166,6 +88150,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<arrowlink COLOR="#fe018a" DESTINATION="ID_673154392" ENDARROW="Default" ENDINCLINATION="3;-16;" ID="Arrow_ID_894402730" STARTARROW="None" STARTINCLINATION="-151;11;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1735004660507" ID="ID_1088386150" MODIFIED="1735005563022" TEXT="#1387 Memory handling scheme for render buffers">
|
||||
<arrowlink COLOR="#ff2921" DESTINATION="ID_1747509213" ENDARROW="Default" ENDINCLINATION="-965;-57;" ID="Arrow_ID_1750574936" STARTARROW="None" STARTINCLINATION="1192;64;"/>
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1713823918124" ID="ID_1749289662" MODIFIED="1713823922851" TEXT="Testbarkeit">
|
||||
|
|
@ -94715,8 +94703,34 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1722279912483" ID="ID_1933308272" MODIFIED="1734901237987" TEXT="er belegt den Buffer per DataSink::lockBufferFor(Frame)">
|
||||
<linktarget COLOR="#53677e" DESTINATION="ID_1933308272" ENDARROW="Default" ENDINCLINATION="170;9;" ID="Arrow_ID_463152101" SOURCE="ID_1044436621" STARTARROW="None" STARTINCLINATION="119;-239;"/>
|
||||
</node>
|
||||
<node CREATED="1722279973483" ID="ID_1607488895" MODIFIED="1722279984643" TEXT="er erstellt daraus das BufferHandle"/>
|
||||
<node CREATED="1722279985641" ID="ID_1333031416" MODIFIED="1722280003882" TEXT="dieses ist so verdrahtet, daß es den emit()-Aufruf weitergibt"/>
|
||||
<node CREATED="1722279973483" ID="ID_1607488895" MODIFIED="1722279984643" TEXT="er erstellt daraus das BufferHandle">
|
||||
<node CREATED="1734920682275" HGAP="37" ID="ID_416353249" MODIFIED="1734920740712" TEXT="das sollte bereits DataSink machen" VSHIFT="6">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
DataSink liefert ein BuffHandle, hat dann aber eine eigne Methode DataSink::emit()
|
||||
</li>
|
||||
<li>
|
||||
die BuffHandle::emit()-Methode ist nicht richtig integriert...
|
||||
</li>
|
||||
<li>
|
||||
deshalb kann derzeit (12/2024) der Render-Node-Code nicht korrekt mit Output-Buffern umgehen!
|
||||
</li>
|
||||
<li>
|
||||
Grund ist zu enge Verkopplung mit der Default-Implementierung. Siehe #1387
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink DESTINATION="ID_1333031416" ENDARROW="Default" ENDINCLINATION="86;0;" ID="Arrow_ID_818357501" STARTARROW="None" STARTINCLINATION="77;7;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1722279985641" ID="ID_1333031416" MODIFIED="1734920740713" TEXT="dieses ist so verdrahtet, daß es den emit()-Aufruf weitergibt">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1333031416" ENDARROW="Default" ENDINCLINATION="86;0;" ID="Arrow_ID_818357501" SOURCE="ID_416353249" STARTARROW="None" STARTINCLINATION="77;7;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1722280039959" ID="ID_1636377754" MODIFIED="1722280058164" TEXT="Möglichkeit-4 : das Output-Protocol umbauen">
|
||||
|
|
@ -94796,8 +94810,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1722444704965" ID="ID_329807269" MODIFIED="1722444730742" TEXT="Aber: nicht den BufferProvider austauschen, sondern bloß das BuffHandle"/>
|
||||
<node CREATED="1722445156984" ID="ID_204443476" MODIFIED="1734901315145" TEXT="der spezielle BufferProvider würde außerhalb, im Top-Level verwendet">
|
||||
<linktarget COLOR="#7b6890" DESTINATION="ID_204443476" ENDARROW="Default" ENDINCLINATION="40;118;" ID="Arrow_ID_594871915" SOURCE="ID_741480483" STARTARROW="None" STARTINCLINATION="138;-806;"/>
|
||||
<node CREATED="1722445156984" ID="ID_204443476" MODIFIED="1734920752327" TEXT="der spezielle BufferProvider würde außerhalb, im Top-Level verwendet">
|
||||
<linktarget COLOR="#7b6890" DESTINATION="ID_204443476" ENDARROW="Default" ENDINCLINATION="-19;547;" ID="Arrow_ID_594871915" SOURCE="ID_741480483" STARTARROW="None" STARTINCLINATION="138;-806;"/>
|
||||
<node CREATED="1734901163415" ID="ID_1044436621" MODIFIED="1734901245821" TEXT="er schlägt die Brücke zum OutputSlot-Protokoll">
|
||||
<arrowlink COLOR="#53677e" DESTINATION="ID_1933308272" ENDARROW="Default" ENDINCLINATION="170;9;" ID="Arrow_ID_463152101" STARTARROW="None" STARTINCLINATION="119;-239;"/>
|
||||
</node>
|
||||
|
|
@ -95165,7 +95179,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1731889686746" ID="ID_5123490" MODIFIED="1731889696552" TEXT="konkreter Buffer-Typ"/>
|
||||
<node CREATED="1731889697236" ID="ID_1573431621" MODIFIED="1731889706151" TEXT="StreamType / ImplType?"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1731890121591" HGAP="46" ID="ID_1319945622" MODIFIED="1731890346832" TEXT="wird relevant in dem Moment wo wir aufrufen wollen...." VSHIFT="-1">
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1731890121591" HGAP="46" ID="ID_1319945622" MODIFIED="1735004946234" TEXT="wird relevant in dem Moment wo wir aufrufen wollen...." VSHIFT="-1">
|
||||
<arrowlink COLOR="#e0092c" DESTINATION="ID_1476280091" ENDARROW="Default" ENDINCLINATION="60;-97;" ID="Arrow_ID_602010804" STARTARROW="None" STARTINCLINATION="-541;28;"/>
|
||||
<linktarget COLOR="#bb4c6b" DESTINATION="ID_1319945622" ENDARROW="Default" ENDINCLINATION="-663;35;" ID="Arrow_ID_542692149" SOURCE="ID_447051297" STARTARROW="None" STARTINCLINATION="745;112;"/>
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
|
|
@ -95190,6 +95205,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238814245" ID="ID_1476280091" MODIFIED="1735004940722" TEXT="Schwierigkeit: BufferProvider im OutputSlot Protokoll">
|
||||
<linktarget COLOR="#fe512a" DESTINATION="ID_1476280091" ENDARROW="Default" ENDINCLINATION="-997;55;" ID="Arrow_ID_4728843" SOURCE="ID_1160117239" STARTARROW="None" STARTINCLINATION="-865;41;"/>
|
||||
<linktarget COLOR="#e0092c" DESTINATION="ID_1476280091" ENDARROW="Default" ENDINCLINATION="60;-97;" ID="Arrow_ID_602010804" SOURCE="ID_1319945622" STARTARROW="None" STARTINCLINATION="-541;28;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1735004955001" ID="ID_393137872" MODIFIED="1735005013973" TEXT="DataSink soll ein BuffHandle liefern">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1735004968712" ID="ID_62347373" MODIFIED="1735005006450" TEXT="aber BufferProvider ist nicht auf Delegieren ausgelegt">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1735005016587" ID="ID_348220482" MODIFIED="1735005042022" TEXT="deshalb verwendet DataSink eine separate emit()-Methode">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1735005044143" ID="ID_1580601333" MODIFIED="1735005667664" TEXT="die ist aber für die Node-Invocation gar nicht zugänglich">
|
||||
<linktarget COLOR="#cc0a6d" DESTINATION="ID_1580601333" ENDARROW="Default" ENDINCLINATION="-290;14;" ID="Arrow_ID_972000949" SOURCE="ID_1501030777" STARTARROW="None" STARTINCLINATION="579;-32;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -97845,6 +97878,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<linktarget COLOR="#cc6e7f" DESTINATION="ID_159987338" ENDARROW="Default" ENDINCLINATION="-37;-657;" ID="Arrow_ID_717618496" SOURCE="ID_1168268714" STARTARROW="None" STARTINCLINATION="827;61;"/>
|
||||
<linktarget COLOR="#cc6e7f" DESTINATION="ID_159987338" ENDARROW="Default" ENDINCLINATION="677;44;" ID="Arrow_ID_544228779" SOURCE="ID_1155618733" STARTARROW="Default" STARTINCLINATION="128;-1039;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1735004660507" ID="ID_1747509213" LINK="https://issues.lumiera.org/ticket/1387" MODIFIED="1735005639316" TEXT="#1387 Buffer Memory Handling konsolidieren">
|
||||
<linktarget COLOR="#ff2921" DESTINATION="ID_1747509213" ENDARROW="Default" ENDINCLINATION="-965;-57;" ID="Arrow_ID_1750574936" SOURCE="ID_1088386150" STARTARROW="None" STARTINCLINATION="1192;64;"/>
|
||||
<linktarget COLOR="#fde0ca" DESTINATION="ID_1747509213" ENDARROW="Default" ENDINCLINATION="-965;-57;" ID="Arrow_ID_1729225053" SOURCE="ID_1832590841" STARTARROW="None" STARTINCLINATION="-1804;99;"/>
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1735005083801" ID="ID_1501030777" MODIFIED="1735005667664" TEXT="Weaving Pattern kann nicht mit Output-Buffern umgehen">
|
||||
<arrowlink COLOR="#cc0a6d" DESTINATION="ID_1580601333" ENDARROW="Default" ENDINCLINATION="-290;14;" ID="Arrow_ID_972000949" STARTARROW="None" STARTINCLINATION="579;-32;"/>
|
||||
<linktarget COLOR="#e3073a" DESTINATION="ID_1501030777" ENDARROW="Default" ENDINCLINATION="49;113;" ID="Arrow_ID_969824036" SOURCE="ID_1911052508" STARTARROW="None" STARTINCLINATION="-147;10;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734893714728" ID="ID_1390040531" MODIFIED="1734894128783" TEXT="Invocation auf Node-Level">
|
||||
|
|
@ -97870,7 +97913,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1734894268221" ID="ID_678148622" MODIFIED="1734894274280" TEXT="scheee...">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734894277732" ID="ID_1911052508" MODIFIED="1734894296705">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734894277732" ID="ID_1911052508" MODIFIED="1735005215586">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -97878,8 +97921,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
brauche also <i>nur noch</i> ein BuffHandle hier
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#e3073a" DESTINATION="ID_1501030777" ENDARROW="Default" ENDINCLINATION="49;113;" ID="Arrow_ID_969824036" STARTARROW="None" STARTINCLINATION="-147;10;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -97905,8 +97948,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
das würde mir eigentlich gefallen ⟹ packe ich diesen Schritt <b>JETZT</b>?
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734895218741" ID="ID_1995663657" MODIFIED="1734895230611" TEXT="ich glaube daß "Ja""/>
|
||||
<node CREATED="1734895343709" ID="ID_352184052" MODIFIED="1734895434823" TEXT="Parameter: nur Zeit + Key sind unabdingbar">
|
||||
|
|
@ -98039,8 +98081,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Das könnte ggfs. sogar eine automatische Transformation sein, auf Basis des jetzt definierten Node-Modells; man würde dann eine DAG ⟼ Tree -Transformation machen und dann die jeweilge ausführbare Node über ein Lambda-Binding über eine Prototyp-Node erzeugen.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -98057,11 +98098,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
alles andere würde eine Art Kollaboration oder Protokoll implizieren
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1734901125292" ID="ID_741480483" MODIFIED="1734907065705" TEXT="es braucht dann doch einen Proxy-Buffer-Provider">
|
||||
<arrowlink COLOR="#7b6890" DESTINATION="ID_204443476" ENDARROW="Default" ENDINCLINATION="40;118;" ID="Arrow_ID_594871915" STARTARROW="None" STARTINCLINATION="138;-806;"/>
|
||||
<node COLOR="#5b280f" CREATED="1734901125292" ID="ID_741480483" MODIFIED="1734920752327" TEXT="es braucht dann doch einen Proxy-Buffer-Provider">
|
||||
<arrowlink COLOR="#7b6890" DESTINATION="ID_204443476" ENDARROW="Default" ENDINCLINATION="-19;547;" ID="Arrow_ID_594871915" STARTARROW="None" STARTINCLINATION="138;-806;"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1734901329053" ID="ID_890459099" MODIFIED="1734901340477" TEXT="war mal als generischer OutputBufferProvider geplant"/>
|
||||
<node CREATED="1734901344895" ID="ID_1829576069" MODIFIED="1734901358806" TEXT="nach der Analys und dem Design mit dem LocalTag aufgegeben"/>
|
||||
|
|
@ -98105,8 +98145,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Deshalb möchte ich nun doch einmal aus-implementieren, was denn erforderlich wäre, einen <b>frei-stehenden</b> Buffer-Provider neu zu implementieren, welcher an einen dahinter liegenden OutputSlot delegiert....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#30ff00" DESTINATION="ID_579607510" ENDARROW="Default" ENDINCLINATION="35;-65;" ID="Arrow_ID_660020375" SOURCE="ID_1073109637" STARTARROW="None" STARTINCLINATION="-185;13;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1734903143791" ID="ID_1525724764" MODIFIED="1734903173828" TEXT="ein limitierter Proxy Buffer-Provider">
|
||||
|
|
@ -98149,8 +98188,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
...und zwar schon längere Zeit bezüglich der <i>Implementierung</i>  des BufferProvider — das Konzept halte ich für sehr wichtig und auch gelngen. Aber immer wieder, wenn ich dann die Implementierung anschaue, dann springt man irgendwo zwischen dieser Default-Implementierung und dem TrackingHeapBlockProvider hin und her — und der ganze Code „riecht schief“, irgendwie (weiß aber nicht warum) ... Hinzu kommen Probleme (und, wie ich inzwischen weiß, tatsächliche Bugs) in der Typ-Registrierung, also BufferMetadata
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1734908668473" ID="ID_1923176208" MODIFIED="1734908680600" TEXT="andererseits sollte man das einfach zusammendängeln können"/>
|
||||
<node CREATED="1734908683135" ID="ID_137786655" MODIFIED="1734908706479" TEXT="und dann könnte man klarer sehen, was die Buffer-Provider default-Implementierung taugt"/>
|
||||
|
|
@ -98163,8 +98201,171 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1734915691998" ID="ID_878475118" MODIFIED="1734915711342" TEXT="über einen Listener von den Protokoll-Schritten benachrichtigt werden"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734915714004" ID="ID_1586315790" MODIFIED="1734915746917" TEXT="Proxy-Implementierung über private BufferProvider-Impl">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#5b280f" CREATED="1734915714004" ID="ID_1586315790" MODIFIED="1734998276312" TEXT="Proxy-Implementierung über private BufferProvider-Impl">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1734919740843" ID="ID_1216051347" MODIFIED="1734919756141" TEXT="TrackingHeapBlockProvider-Implementierung lesen....">
|
||||
<node CREATED="1734919757688" ID="ID_1725773036" MODIFIED="1734919925652" TEXT="sieht jetzt wieder ganz offensichtlich aus">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...es sind ja nur vier abstrakte Methoden zu implementieren, die die tatsächlichen Zustandsübergänge markieren
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1734919769391" ID="ID_1373808995" MODIFIED="1734919895583">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die Idee war damals wohl, daß die BufferProvider-Basis-Impl einen <i>Sicherheits-Layer</i>  bietet
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...will sagen, die Implementierung muß sich bloß noch um ihr eigenes Memory-Management kümmern, aber nicht mehr darum, Typen und Lifecycle-Phasen zu tracken. Das erscheint mir nun durchaus ein plausibler Ansatz zu sein (hätte man bloß besser dokumentieren sollen)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734919936639" ID="ID_1371720455" MODIFIED="1734919955314" TEXT="Frage: was registrieren wir also als Descriptor?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1734919957318" ID="ID_1734760542" MODIFIED="1734919997853" TEXT="wir wollen hier erst mal keinerlei »auto-placement«">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734919974540" ID="ID_381640008" MODIFIED="1734919993649" TEXT="könnte man später noch draufsatteln....">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734920107873" ID="ID_1746490029" MODIFIED="1734920133153" TEXT="damit reduziert sich aber die Typ-Registrierung rein auf die Storage-Größe">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1734920139741" ID="ID_1313207379" MODIFIED="1734920165622" TEXT="das genügt nicht">
|
||||
<icon BUILTIN="closed"/>
|
||||
<node CREATED="1734920195773" ID="ID_220914611" MODIFIED="1734920200393" TEXT="oder doch?">
|
||||
<node CREATED="1734921431454" ID="ID_123233296" MODIFIED="1734921445152" TEXT="in den konkreten Typ (HashKey) geht die Buffer-Adressse ein"/>
|
||||
<node CREATED="1734921449556" ID="ID_460391398" MODIFIED="1734921472324" TEXT="und ggfs. zusätzlich das LocalTag (das dann aber im Parent nicht gesetzt sein darf)"/>
|
||||
</node>
|
||||
<node CREATED="1734921474623" ID="ID_1175854038" MODIFIED="1734921501112" TEXT="diesen konkreten Typ (also diese Adresse) darf man nur einmal locken"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734920777070" ID="ID_1821068828" MODIFIED="1734920821636" TEXT="Problem: die vorgegebene Adresse ins BuffHandle übertragen">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734920824441" ID="ID_624823364" MODIFIED="1734920846332" TEXT="gefühlsmäßig ist genau hier der Knoten im Design">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node COLOR="#5b280f" CREATED="1734921591825" ID="ID_1860867282" MODIFIED="1734921664368" TEXT="(virtual) provideLockedBuffer ⟵ nur von lockBuffer(Desrc) aufgerufen">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1734921647001" ID="ID_241122408" MODIFIED="1734921704408" TEXT="d.h. es gibt nur diesen einzigen Pfad">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
und das Ergebnis, das BuffHandle "ist es dann auch"
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734920849660" ID="ID_1514999057" MODIFIED="1734920879576" TEXT="...auffälligerweise tricksen alle bisher bekannten Implementierungen mit dem »LocalTag«">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
</node>
|
||||
<node CREATED="1734921822219" ID="ID_1812269406" MODIFIED="1734921898515" TEXT="also — wenn überhaupt, dann müßte das LocalTag in provideLockedBuffer mitgegeben werden"/>
|
||||
<node CREATED="1734922029549" ID="ID_1100314957" MODIFIED="1734922045485" TEXT="das wäre dann eine (optional nutzbare) »Hintertür«">
|
||||
<node CREATED="1734922052257" ID="ID_1465090356" MODIFIED="1734922072323" TEXT="also glücklich bin ich mit diesem Design nicht...">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
<node CREATED="1734922084008" ID="ID_548220515" MODIFIED="1734922155412">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
allerdings war das Design nie etwas anderes als <i>vorläufig</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...denn in all honesty, die Prämisse war und ist, daß man auf dieser Basis einen echten BufferProvider implementieren können dürfen sollte
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#650099" CREATED="1734922183448" ID="ID_410220659" MODIFIED="1734963807037" TEXT="also durch die Hintertür gehen?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1734963612356" ID="ID_595048331" MODIFIED="1734963638965" TEXT="die Bedeutung des LocalTag habe ich schon nachgeschärft"/>
|
||||
<node CREATED="1734963640916" ID="ID_1219225733" MODIFIED="1734963697420" TEXT="es sollte ein essentielles Merkmal im Anwendungsfall darstellen"/>
|
||||
<node CREATED="1734963699688" ID="ID_1232330574" MODIFIED="1734963719840" TEXT="hier ist das definitiv die bestimmte Speicher-Adresse"/>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1734963767255" ID="ID_194976077" MODIFIED="1734963791910" TEXT="Insofern: das ist ein valider Zugang">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734964608165" ID="ID_399530510" MODIFIED="1734998018142" TEXT="einen offiziellen Zugang mit Zustatz-Info schafen...?">
|
||||
<node CREATED="1734964627594" ID="ID_1037692936" MODIFIED="1734997526342" TEXT="Frage: beide qualifizierende Detail-Infos?">
|
||||
<node CREATED="1734965120531" ID="ID_1584497125" MODIFIED="1734965128727" TEXT="ein LocalTag"/>
|
||||
<node CREATED="1734965129950" ID="ID_424022129" MODIFIED="1734965135601" TEXT="eine Adresse"/>
|
||||
</node>
|
||||
<node CREATED="1734965138870" ID="ID_1530672531" MODIFIED="1734965191874" TEXT="die Interface-Methode provideLockedBuffer symmetrisch zu detachBuffer"/>
|
||||
<node CREATED="1734965377702" ID="ID_1007085431" MODIFIED="1734965393200" TEXT="auch prepareBuffers sollte ein optionales LocalTag akzeptieren"/>
|
||||
<node CREATED="1734965605030" ID="ID_640801382" MODIFIED="1734965635056" TEXT="dies ist aber nur ein API für abgeleitete Klassen">
|
||||
<node CREATED="1734965642496" ID="ID_76298640" MODIFIED="1734965648781" TEXT="das ist wichtig"/>
|
||||
<node CREATED="1734965650073" ID="ID_153512216" MODIFIED="1734965668179" TEXT="die Interpretation von LocalTag gehört dem Implementator"/>
|
||||
<node CREATED="1734965670301" ID="ID_183213969" MODIFIED="1734965686112" TEXT="LocalTag sollte nie in dieser Form auf das public API gelangen"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ddab9a" COLOR="#990033" CREATED="1734997559023" ID="ID_542332973" MODIFIED="1734997748715" TEXT="Vorsicht! Wie legt eigentlich OutputSlot den Typ an??">
|
||||
<arrowlink COLOR="#de054b" DESTINATION="ID_1650398278" ENDARROW="Default" ENDINCLINATION="29;-92;" ID="Arrow_ID_1889984976" STARTARROW="None" STARTINCLINATION="-411;22;"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1734998092530" ID="ID_1890469222" MODIFIED="1734998144523" TEXT="macht nur die Dummy-Impl (im ctor)"/>
|
||||
<node CREATED="1734998118124" ID="ID_1704898808" MODIFIED="1734998162177" TEXT="BuffDesrc bufferType_ ≔ buffProvider_.getDescriptor<TestFrame>()"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734997567180" ID="ID_1650398278" MODIFIED="1734998330539" TEXT="Schwerwiegende Design-Probleme">
|
||||
<arrowlink COLOR="#ff117a" DESTINATION="ID_149589561" ENDARROW="Default" ENDINCLINATION="158;17;" ID="Arrow_ID_1019099346" STARTARROW="None" STARTINCLINATION="-68;116;"/>
|
||||
<linktarget COLOR="#de054b" DESTINATION="ID_1650398278" ENDARROW="Default" ENDINCLINATION="29;-92;" ID="Arrow_ID_1889984976" SOURCE="ID_542332973" STARTARROW="None" STARTINCLINATION="-411;22;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734997763651" ID="ID_1134096744" MODIFIED="1734997799494" TEXT="die OutpotSlot::Connection arbeitet am BufferProvider vorbei">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fed199" COLOR="#c90056" CREATED="1734997802742" ID="ID_662253623" MODIFIED="1734997859748" TEXT="der Client kann aber (und wird tatsächlich) BuffHandle::emit() aufrufen">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f4a9a4" COLOR="#ea015e" CREATED="1734997909991" ID="ID_639039454" MODIFIED="1734997979245" TEXT="fest in OutputProvider eingabauter BufferMetata-Ptr ist so nicht Threadsafe">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#bda4e7" COLOR="#5b280f" CREATED="1734998206023" ID="ID_629938630" MODIFIED="1734998258936" TEXT="Interface und Default-Impl sind viel zu eng verflochten">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1734998279533" ID="ID_149589561" MODIFIED="1734998323684" TEXT="so nicht durchführbar!">
|
||||
<linktarget COLOR="#ff117a" DESTINATION="ID_149589561" ENDARROW="Default" ENDINCLINATION="158;17;" ID="Arrow_ID_1019099346" SOURCE="ID_1650398278" STARTARROW="None" STARTINCLINATION="-68;116;"/>
|
||||
<icon BUILTIN="closed"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238837562" HGAP="148" ID="ID_1160117239" MODIFIED="1735004853222" STYLE="bubble" TEXT="Output BufferProvider kann nicht delegieren" VSHIFT="44">
|
||||
<edge COLOR="#ff5d00" STYLE="sharp_linear"/>
|
||||
<arrowlink COLOR="#fe512a" DESTINATION="ID_284736049" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_749038566" STARTARROW="None" STARTINCLINATION="-865;41;"/>
|
||||
<arrowlink COLOR="#fe512a" DESTINATION="ID_1476280091" ENDARROW="Default" ENDINCLINATION="-997;55;" ID="Arrow_ID_4728843" STARTARROW="None" STARTINCLINATION="-865;41;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
<node CREATED="1721239003353" ID="ID_1369893688" MODIFIED="1735004566787" STYLE="fork" TEXT="Er bekommt einen Buffer von „woanders“">
|
||||
<font NAME="SansSerif" SIZE="8"/>
|
||||
</node>
|
||||
<node CREATED="1721239003353" ID="ID_1138093656" MODIFIED="1735004585568" STYLE="fork" TEXT="muß Lifecylce-Events delegieren können">
|
||||
<font NAME="SansSerif" SIZE="8"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -100036,6 +100237,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<linktarget COLOR="#fe512a" DESTINATION="ID_344362560" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_1035098256" SOURCE="ID_285031565" STARTARROW="None" STARTINCLINATION="-799;81;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238814245" ID="ID_284736049" MODIFIED="1735004524906" TEXT="Schwierigkeit: BufferProvider schwer zu Erweitern">
|
||||
<linktarget COLOR="#fe512a" DESTINATION="ID_284736049" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_749038566" SOURCE="ID_1160117239" STARTARROW="None" STARTINCLINATION="-865;41;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e2caa2" COLOR="#990000" CREATED="1729956600896" ID="ID_1377083965" MODIFIED="1729956915005" STYLE="fork" TEXT="Einsichten">
|
||||
<edge COLOR="#b14253" STYLE="sharp_linear"/>
|
||||
|
|
@ -148844,6 +149049,10 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo
|
|||
<arrowlink COLOR="#fde0ca" DESTINATION="ID_943908122" ENDARROW="Default" ENDINCLINATION="-1682;204;" ID="Arrow_ID_1115019309" STARTARROW="None" STARTINCLINATION="-1643;116;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735004660507" ID="ID_1832590841" LINK="https://issues.lumiera.org/ticket/1387" MODIFIED="1735005639316" TEXT="#1387 Memory handling scheme for render buffers">
|
||||
<arrowlink COLOR="#fde0ca" DESTINATION="ID_1747509213" ENDARROW="Default" ENDINCLINATION="-965;-57;" ID="Arrow_ID_1729225053" STARTARROW="None" STARTINCLINATION="-1804;99;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680196129567" ID="ID_988036389" LINK="https://issues.lumiera.org/ticket/1288" MODIFIED="1680392639594" TEXT="#1288 simple video display widget">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue