Typumwandlung für Shaderkonstanten und Texelformate
Verfasst: 15.12.2012, 16:02
Guten Tag
Zwei meiner Klassen müssen vermutlich geändert werden: es geht um Texture und ShaderConstantBuffer. Beide haben gemeinsam, dass sie mit verschiedenen Eingabedaten umgehen müssen. Bei der Textur sind es die verschiedenen Texelformate und bei den Shaderkonstanten alle möglichen Arten von Skalar, Vektor, Matrix mit bool, int, float als Typ.
Jetzt dachte ich mir lass ich den Compiler die Arbeit machen und verpacke das ganze in Templates.
Am Beispiel der Textur: ich schreibe mir also eine Klasse für jedes Texelformat und eine Konvertierungsfunktion:
Das funktioniert soweit auch wunderbar, das Problem ist allerdings, dass alle Convert<SRC, DEST>s in die DLL wandern. Dadurch braucht gcc zum linken nur der Textur ca. 5 Minuten und die DLL wird doch recht groß. Für die Shaderkonstanten hatte ich mir das ähnlich vorgestellt. Der Shader wird aus der Datei geladen und bekommt eine Write-Funktion wie die Textur. Allerdings sind es hier um einiges mehr verschiedene Formate ((Skalar, Vektor2, Vektor3, ..., Matrix 2x2, Matrix3x3, ..., Matrix2x2_ColumnMajor, ...) x (bool, int, float)), ihr versteht worauf ich hinaus will?...
Wie würdet ihr das handhaben? Muss beim Aufruf von Write/Read das Format/der Typ bekannt sein? Oder soll ich mir eine Convert-Funktion ohne Template schreiben (Performance?)
Vielen Dank fürs Durchlesen :)
mfg JFF_B.G.Michi
Zwei meiner Klassen müssen vermutlich geändert werden: es geht um Texture und ShaderConstantBuffer. Beide haben gemeinsam, dass sie mit verschiedenen Eingabedaten umgehen müssen. Bei der Textur sind es die verschiedenen Texelformate und bei den Shaderkonstanten alle möglichen Arten von Skalar, Vektor, Matrix mit bool, int, float als Typ.
Jetzt dachte ich mir lass ich den Compiler die Arbeit machen und verpacke das ganze in Templates.
Am Beispiel der Textur: ich schreibe mir also eine Klasse für jedes Texelformat und eine Konvertierungsfunktion:
Code: Alles auswählen
enum TexelFormat {
R8, RGBA32, ..., RGBA128F, ... // insgesamt 34 verschiedene
};
template<TexelFormat FORMAT>
class Texel { /* ... */ };
template<TexelFormat DEST, TexelFormat SRC>
void Convert(const Texel<SRC>* _pSrc, Texel<DEST>* _pDest, ...)
{
for(int x ...)
_pDest[x] = (Texel<DEST>)(_pSrc[x]);
}
// Textur
class Texture {
void* m_pData;
TexelFormat m_Format;
/* ... */
template<TexelFormat SRC>
void Write(const Texel<SRC>* _pData, ...)
{
template_for<0, 34> // template for loop über alle möglichen Zielformate
if(template_x == m_Format)
Convert<SRC, template_x>(_pData, m_pData, ...);
}
}
Wie würdet ihr das handhaben? Muss beim Aufruf von Write/Read das Format/der Typ bekannt sein? Oder soll ich mir eine Convert-Funktion ohne Template schreiben (Performance?)
Vielen Dank fürs Durchlesen :)
mfg JFF_B.G.Michi