Browse Source

Abhängigkeit von direct x 11 entfernt (wird dynamisch hinzu geladen wenn es benötigt wird)

Kolja Strohm 5 years ago
parent
commit
74cf6e1089
7 changed files with 205 additions and 319 deletions
  1. 17 15
      DXBuffer.cpp
  2. 4 4
      DXBuffer.h
  3. 3 3
      Framework.vcxproj
  4. 53 34
      GraphicsApi.cpp
  5. 4 4
      GraphicsApi.h
  6. 88 206
      Shader.cpp
  7. 36 53
      Shader.h

+ 17 - 15
DXBuffer.cpp

@@ -35,7 +35,6 @@ void DXBuffer::setChanged()
 void DXBuffer::setLength( int len )
 {
     this->len = len;
-    changed = 1;
 }
 
 // Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
@@ -78,7 +77,7 @@ DXBuffer *DXBuffer::release()
 
 
 #ifdef WIN32
-// Inhalt der DXVertexBuffer Klasse
+// Inhalt der DX11Buffer Klasse
 
 // Konstruktor
 // eSize: Die Länge eines Elementes in Bytes
@@ -106,11 +105,13 @@ DX11Buffer::~DX11Buffer()
 
 // Kopiert die Daten in den Buffer, fals sie sich verändert haben
 //  zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
-void DX11Buffer::copieren()
+void DX11Buffer::copieren( int byteCount )
 {
-    if( !changed || !len || !data )
+    if( !len )
         return;
-    if( description->ByteWidth != (unsigned)len )
+    if( byteCount < 0 )
+        byteCount = len;
+    if( description->ByteWidth < (unsigned)len )
     {
         if( buffer )
             buffer->Release();
@@ -118,18 +119,19 @@ void DX11Buffer::copieren()
     }
     if( !buffer )
     {
-        D3D11_SUBRESOURCE_DATA ini;
-        memset( &ini, 0, sizeof( ini ) );
-        ini.pSysMem = data;
         description->ByteWidth = len;
-
-        device->CreateBuffer( description, &ini, &buffer );
+        device->CreateBuffer( description, 0, &buffer );
+        if( data )
+            changed = 1;
     }
-    else if( changed )
+    if( changed )
     {
         D3D11_MAPPED_SUBRESOURCE map;
-        context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &map );
-        memcpy( map.pData, data, len );
+        if( ( description->Usage | D3D11_USAGE_DYNAMIC ) == description->Usage )
+            context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &map );
+        else
+            context->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE, 0, &map );
+        memcpy( map.pData, data, byteCount );
         context->Unmap( buffer, 0 );
         changed = 0;
     }
@@ -164,10 +166,10 @@ DX11StructuredBuffer::~DX11StructuredBuffer()
 
 // Kopiert die Daten in den Buffer, fals sie sich verändert haben
 //  zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
-void DX11StructuredBuffer::copieren()
+void DX11StructuredBuffer::copieren( int byteCount )
 {
     ID3D11Buffer *old = buffer;
-    DX11Buffer::copieren();
+    DX11Buffer::copieren( byteCount );
     if( buffer != old )
     {
         if( view )

+ 4 - 4
DXBuffer.h

@@ -40,7 +40,7 @@ namespace Framework
         //  data: Ein zeiger auf die Daten
         __declspec( dllexport ) void setData( void *data );
         // Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        __declspec( dllexport ) virtual void copieren() = 0;
+        __declspec( dllexport ) virtual void copieren( int byteCount = -1 ) = 0;
         // Gibt die Länge eines Elementes in bytes zurück
         __declspec( dllexport ) int getElementLength() const;
         // Gibt die Anzahl der Elemente im Buffer zurück
@@ -54,7 +54,7 @@ namespace Framework
     };
 
 #ifdef WIN32
-    // Ein Buffer von Eckpunkten eines 3D Models
+    // Ein Buffer mit Daten im Grafikspeicher
     class DX11Buffer : public DXBuffer
     {
     protected:
@@ -69,7 +69,7 @@ namespace Framework
         // Destruktor
         __declspec( dllexport ) virtual ~DX11Buffer();
         // Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        __declspec( dllexport ) void copieren() override;
+        __declspec( dllexport ) void copieren( int byteCount = -1 ) override;
         // Gibt den Buffer zurück
         __declspec( dllexport ) ID3D11Buffer *zBuffer() const;
     };
@@ -86,7 +86,7 @@ namespace Framework
         // Destruktor
         __declspec( dllexport ) virtual ~DX11StructuredBuffer();
         // Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        __declspec( dllexport ) void copieren() override;
+        __declspec( dllexport ) void copieren( int byteCount = -1 ) override;
         // Gibt die verwendtete Shader Resource View zurück
         __declspec( dllexport ) operator ID3D11ShaderResourceView *() const;
     };

+ 3 - 3
Framework.vcxproj

@@ -125,7 +125,7 @@
     <Link>
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <CustomBuildStep>
       <Command>copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\Klient\Start\Start\framework.dll"
@@ -157,7 +157,7 @@ copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\Klient\Fertig\Debug\x64\fr
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <CustomBuildStep>
       <Command>copy "Release\Framework.dll" "..\..\Spiele Platform\Klient\Fertig\x32\framework.dll"
@@ -184,7 +184,7 @@ copy "Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x32\framework.dll
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <CustomBuildStep>
       <Command>copy "x64\Release\Framework.dll" "..\..\Spiele Platform\Klient\Fertig\x64\framework.dll"

+ 53 - 34
GraphicsApi.cpp

@@ -376,6 +376,12 @@ DirectX11::~DirectX11()
     }
 }
 
+typedef HRESULT( *D3D11CreateDeviceAndSwapChainFunction )( IDXGIAdapter *, D3D_DRIVER_TYPE,
+                                                           HMODULE, UINT, const D3D_FEATURE_LEVEL *,
+                                                           UINT, UINT, const DXGI_SWAP_CHAIN_DESC *,
+                                                           IDXGISwapChain * *, ID3D11Device * *,
+                                                           D3D_FEATURE_LEVEL *, ID3D11DeviceContext * * );
+
 void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool fullScreen )
 {
     if( d3d11Device )
@@ -384,6 +390,19 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     //--------------------------------------------------------------------
     // Create Device
 
+    HINSTANCE dll = getDLLRegister()->ladeDLL( "d3d11.dll", "d3d11.dll" );
+    if( !dll )
+    {
+        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht gefunden werden." ), MB_ICONERROR );
+        return;
+    }
+    D3D11CreateDeviceAndSwapChainFunction createDeviceAndSwapChain = (D3D11CreateDeviceAndSwapChainFunction)GetProcAddress( dll, "D3D11CreateDeviceAndSwapChain" );
+    if( !createDeviceAndSwapChain )
+    {
+        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Der Einstiegspunkt D3D11CreateDeviceAndSwapChain fon DirectX 11 konnte nicht gefunden werden." ), MB_ICONERROR );
+        return;
+    }
+
     // create a struct to hold information about the swap chain
     DXGI_SWAP_CHAIN_DESC scd;
 
@@ -415,18 +434,18 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
 #ifdef _DEBUG
     flag |= D3D11_CREATE_DEVICE_DEBUG;
 #endif
-    HRESULT result = D3D11CreateDeviceAndSwapChain( NULL,
-                                                    D3D_DRIVER_TYPE_HARDWARE,
-                                                    NULL,
-                                                    flag,
-                                                    &featureLevel,
-                                                    1,
-                                                    D3D11_SDK_VERSION,
-                                                    &scd,
-                                                    &d3d11SpawChain,
-                                                    &d3d11Device,
-                                                    &support,
-                                                    &d3d11Context );
+    HRESULT result = createDeviceAndSwapChain( NULL,
+                                               D3D_DRIVER_TYPE_HARDWARE,
+                                               NULL,
+                                               flag,
+                                               &featureLevel,
+                                               1,
+                                               D3D11_SDK_VERSION,
+                                               &scd,
+                                               &d3d11SpawChain,
+                                               &d3d11Device,
+                                               &support,
+                                               &d3d11Context );
     if( result != S_OK )
     {
         std::cout << "ERROR: D3D11CreateDeviceAndSwapChain returned " << result << "\n";
@@ -563,11 +582,11 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     }
     //-------------------------------------------------
     // Shaders
-    vertexShader = new VertexShader();
-    vertexShader->setCompiledByteArray( d3d11Device, (unsigned char *)UIVertexShader, sizeof( UIVertexShader ) );
+    vertexShader = new DX11VertexShader( d3d11Device, d3d11Context );
+    vertexShader->setCompiledByteArray( (unsigned char *)UIVertexShader, sizeof( UIVertexShader ) );
 
-    pixelShader = new PixelShader();
-    pixelShader->setCompiledByteArray( d3d11Device, (unsigned char *)UIPixelShader, sizeof( UIPixelShader ) );
+    pixelShader = new DX11PixelShader( d3d11Device, d3d11Context );
+    pixelShader->setCompiledByteArray( (unsigned char *)UIPixelShader, sizeof( UIPixelShader ) );
 
     D3D11_INPUT_ELEMENT_DESC polygonLayout[ 4 ];
     // Create the vertex input layout description.
@@ -604,16 +623,16 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     polygonLayout[ 3 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
     polygonLayout[ 3 ].InstanceDataStepRate = 0;
 
-    vertexShader->erstelleInputLayout( d3d11Device, polygonLayout, 4 );
-    vertexShader->erstelleConstBuffer( d3d11Device, sizeof( Mat4< float > ) * MAX_KNOCHEN_ANZ, 0 ); // matrizen für skelett annimationen
-    vertexShader->erstelleConstBuffer( d3d11Device, sizeof( Mat4< float > ) * 2, 1 ); // View and Projection Matrix
+    vertexShader->erstelleInputLayout( polygonLayout, 4 );
+    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * MAX_KNOCHEN_ANZ, 0 ); // matrizen für skelett annimationen
+    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * 2, 1 ); // View and Projection Matrix
 
-    pixelShader->erstelleConstBuffer( d3d11Device, sizeof( float ) * 3, 0 ); // Kamera Position
-    pixelShader->erstelleConstBuffer( d3d11Device, sizeof( float ) * 3, 1 ); // materialkonstanten nach phong model
-    pixelShader->erstelleConstBuffer( d3d11Device, sizeof( int ) * 2, 2 ); // materialkonstanten nach phong model
+    pixelShader->erstelleConstBuffer( sizeof( float ) * 3, 0 ); // Kamera Position
+    pixelShader->erstelleConstBuffer( sizeof( float ) * 3, 1 ); // materialkonstanten nach phong model
+    pixelShader->erstelleConstBuffer( sizeof( int ) * 2, 2 ); // materialkonstanten nach phong model
     // TODO: Remove Following Test Code
-    int lc[] = { 0, 0 };
-    pixelShader->füllConstBuffer( d3d11Context, (char *)lc, 2, sizeof( int ) * 2 );
+    int lc[] = { 1, 6 };
+    pixelShader->füllConstBuffer( (char *)lc, 2, sizeof( int ) * 2 );
 
     // Create a texture sampler state description.
     D3D11_SAMPLER_DESC samplerDesc;
@@ -668,9 +687,9 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
 
     // Setup Render Objekt
 
-    vertexShader->benutzeShader( d3d11Context );
+    vertexShader->benutzeShader();
     d3d11Context->PSSetSamplers( 0, 1, &sampleState );
-    pixelShader->benutzeShader( d3d11Context );
+    pixelShader->benutzeShader();
 
     D3D11_RASTERIZER_DESC rasterDesc;
     ZeroMemory( &rasterDesc, sizeof( rasterDesc ) );
@@ -699,7 +718,7 @@ void DirectX11::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
 
     d3d11Context->RSSetState( texturRS );
 
-    Bild * b = new Bild();
+    Bild *b = new Bild();
     b->neuBild( 10, 10, 0xFFFFFFFF );
     defaultTextur = createOrGetTextur( "_default_textur", b );
 
@@ -857,13 +876,13 @@ void DirectX11::renderObject( Model3D * zObj )
     Mat4< float > trans = Mat4< float >::identity();
     int anz = zObj->errechneMatrizen( trans, matrixBuffer );
     if( vertexShader )
-        vertexShader->füllConstBuffer( d3d11Context, (char *)matrixBuffer, 0, sizeof( Mat4< float > ) * anz );
+        vertexShader->füllConstBuffer( (char *)matrixBuffer, 0, sizeof( Mat4< float > ) * anz );
     float matirialBuffer[ 3 ]; // light factors (phong model)
     matirialBuffer[ 0 ] = zObj->getAmbientFactor();
     matirialBuffer[ 1 ] = zObj->getDiffusFactor();
     matirialBuffer[ 2 ] = zObj->getSpecularFactor();
     if( pixelShader )
-        pixelShader->füllConstBuffer( d3d11Context, (char *)matirialBuffer, 1, sizeof( float ) * 3 );
+        pixelShader->füllConstBuffer( (char *)matirialBuffer, 1, sizeof( float ) * 3 );
     unsigned int offset = 0;
     unsigned int es = (unsigned)vertexBuffer->getElementLength();
     ID3D11Buffer * vBuffer = vertexBuffer->zBuffer();
@@ -968,9 +987,9 @@ void DirectX11::renderKamera( Kam3D * zKamera )
     viewAndProj[ 1 ] = zKamera->getProjectionMatrix();
     kamPos = zKamera->getWorldPosition();
     if( vertexShader )
-        vertexShader->füllConstBuffer( d3d11Context, (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
+        vertexShader->füllConstBuffer( (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
     if( pixelShader )
-        pixelShader->füllConstBuffer( d3d11Context, (char *)& kamPos, 0, sizeof( float ) * 3 );
+        pixelShader->füllConstBuffer( (char *)& kamPos, 0, sizeof( float ) * 3 );
     Welt3D * w = zKamera->zWelt();
     w->lock();
     int alphaAnzahl = 0;
@@ -1037,10 +1056,10 @@ void DirectX11::presentFrame()
     viewAndProj[ 1 ] = view.projektion( (float)PI / 4.0f, screenAspect, 0.1f, 10000.f );
     kamPos = Vec3< float >( 0.f, 0.f, backBufferSize.y * 1.2075f );
     if( vertexShader )
-        vertexShader->füllConstBuffer( d3d11Context, (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
+        vertexShader->füllConstBuffer( (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
     if( pixelShader )
-        pixelShader->füllConstBuffer( d3d11Context, (char *)& kamPos, 0, sizeof( float ) * 3 );
-    
+        pixelShader->füllConstBuffer( (char *)& kamPos, 0, sizeof( float ) * 3 );
+
     if( fenster && !IsIconic( fenster->getFensterHandle() ) )
         renderObject( texturModel );
 

+ 4 - 4
GraphicsApi.h

@@ -31,8 +31,8 @@ namespace Framework
     class WFenster;
     class Bild;
     class Textur;
-    class PixelShader;
-    class VertexShader;
+    class DX11PixelShader;
+    class DX11VertexShader;
     class TexturModel;
     class Render3D;
     class TexturList;
@@ -118,8 +118,8 @@ namespace Framework
         ID3D11DeviceContext *d3d11Context;
         IDXGISwapChain *d3d11SpawChain;
         Textur *uiTextur;
-        VertexShader *vertexShader;
-        PixelShader *pixelShader;
+        DX11VertexShader *vertexShader;
+        DX11PixelShader *pixelShader;
         ID3D11SamplerState *sampleState;
         ID3D11RenderTargetView *rtview;
         ID3D11DepthStencilView *dsView;

+ 88 - 206
Shader.cpp

@@ -1,8 +1,8 @@
 #include "Shader.h"
 #include "Text.h"
 #include "Datei.h"
+#include "DXBuffer.h"
 #include <d3d11.h>
-#include <D3Dcompiler.h>
 #include <iostream>
 
 using namespace Framework;
@@ -12,119 +12,20 @@ using namespace Framework;
 // Konstruktor
 Shader::Shader()
 {
-    shader = new Text();
-    shaderBuffer = 0;
     type = UNBEKANNT;
     for( int i = 0; i < 14; i++ )
-    {
         constBuffers[ i ] = 0;
-        buffLen[ i ] = 0;
-    }
-    buffAnz = 0;
     ref = 1;
 }
 
 // Destruktor
 Shader::~Shader()
 {
-    shader->release();
-    if( shaderBuffer )
-        shaderBuffer->Release();
     for( int i = 0; i < 14; i++ )
     {
         if( constBuffers[ i ] )
-            constBuffers[ i ]->Release();
-    }
-}
-
-// Lähdt den Shader Quellcode aus einer Textdatei
-//  pfad: Der Pfad zur Datei
-//  return: true, wenn der Shader erfolgreich geladen wurde
-bool Shader::ladeAusDatei( const char* pfad )
-{
-    Datei d;
-    d.setDatei( pfad );
-    __int64 gr = d.getSize();
-    if( gr > 10 * 1024 )
-        return 0; // Datei zu groß für Shader Quellcode
-    shader->fillText( ' ', (int)gr );
-    if( !d.open( Datei::Style::lesen ) )
-        return 0;
-    d.lese( shader->getText(), (int)gr );
-    d.close();
-    return 1;
-}
-
-// Setzt den Shader Quellcode
-//  zCode: Der Quellcode des Shaders
-void Shader::setShaderCode( Text * zCode )
-{
-    shader->setText( zCode->getText() );
-}
-
-// Compiliert den Shader Quellcode
-//  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-//  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-//  type: Der Typ und die Version des Shaders. Beispiel: 'vs_5_0' für Vertexshader, 'ps_5_0' für Pixelshader.
-//  return: true, wenn der Quellcode keine Fehler enthällt
-bool Shader::compile( ID3D11Device * zD3d11Device, const char* einstiegsFunktion, const char* type )
-{
-    ID3D10Blob* errorMessage = 0;
-    unsigned int flag = D3D10_SHADER_ENABLE_STRICTNESS;
-#ifdef _DEBUG
-    flag |= D3D10_SHADER_DEBUG;
-#endif
-    if( shaderBuffer )
-        shaderBuffer->Release();
-    HRESULT result = D3DCompile( shader->getText(), shader->getLength(), 0, 0, 0, einstiegsFunktion, type, flag, 0, &shaderBuffer, &errorMessage );
-    if( errorMessage )
-    {
-        char* err = (char*)errorMessage->GetBufferPointer();
-        std::cout << err;
-        errorMessage->Release();
+            constBuffers[ i ]->release();
     }
-    return result == S_OK;
-}
-
-// Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
-//  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-void Shader::benutzeShader( ID3D11DeviceContext * zD3d11Context )
-{}
-
-// erstellt ein constanten Buffer, der constante daten an den Shader übergibt
-// es können maximal 14 Buffer erstellt werden
-//  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
-//  größe: Die größe des buffers in byte
-//  index: Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
-bool Shader::erstelleConstBuffer( ID3D11Device * zD3d11Device, int größe, int index )
-{
-    if( index < 0 || index >= 14 )
-        return 0;
-    bool ok = 1;
-    for( int i = 0; i < index; i++ )
-        ok &= constBuffers[ i ] != 0;
-    if( !ok )
-        return 0;
-    D3D11_BUFFER_DESC bufferDesc;
-    bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
-    while( (größe / 16) * 16 != größe ) // es sind nur vielfache von 16 als größe erlaubt
-        größe++;
-    bufferDesc.ByteWidth = größe;
-    bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-    bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
-    bufferDesc.MiscFlags = 0;
-    bufferDesc.StructureByteStride = 0;
-    if( constBuffers[ index ] )
-    {
-        constBuffers[ index ]->Release();
-        constBuffers[ index ] = 0;
-        buffLen[ index ] = 0;
-    }
-    HRESULT res = zD3d11Device->CreateBuffer( &bufferDesc, 0, &constBuffers[ index ] );
-    if( res == S_OK )
-        buffLen[ index ] = größe;
-    for( buffAnz = 0; buffAnz < 14 && constBuffers[ buffAnz ]; buffAnz++ );
-    return res == S_OK;
 }
 
 // Löscht einen constanten Buffer
@@ -140,11 +41,9 @@ bool Shader::removeConstBuffer( int index )
         return 0;
     if( constBuffers[ index ] )
     {
-        constBuffers[ index ]->Release();
+        constBuffers[ index ]->release();
         constBuffers[ index ] = 0;
-        buffLen[ index ] = 0;
     }
-    for( buffAnz = 0; buffAnz < 14 && constBuffers[ buffAnz ]; buffAnz++ );
     return 1;
 }
 
@@ -153,20 +52,16 @@ bool Shader::removeConstBuffer( int index )
 //  data: Einen zeiger auf en byte Array der größe des Buffers
 //  index: Der Index des Buffers
 //  län: Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
-bool Shader::füllConstBuffer( ID3D11DeviceContext * zD3d11Context, char* data, int index, int län )
+bool Shader::füllConstBuffer( char *data, int index, int len )
 {
     if( index < 0 || index >= 14 )
         return 0;
     if( !constBuffers[ index ] )
         return 0;
-    if( län < 0 )
-        län = buffLen[ index ];
-    D3D11_MAPPED_SUBRESOURCE mappedResource;
-    HRESULT res = zD3d11Context->Map( constBuffers[ index ], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource );
-    if( res != S_OK )
-        return 0;
-    memcpy( mappedResource.pData, data, län );
-    zD3d11Context->Unmap( constBuffers[ index ], 0 );
+    if( len < 0 )
+        len = constBuffers[ index ]->getElementAnzahl() * constBuffers[ index ]->getElementLength();
+    constBuffers[ index ]->setData( data );
+    constBuffers[ index ]->copieren( len );
     return 1;
 }
 
@@ -176,7 +71,9 @@ int Shader::getConstBufferL
 {
     if( index < 0 || index >= 14 )
         return 0;
-    return buffLen[ index ];
+    if( !constBuffers[ index ] )
+        return 0;
+    return constBuffers[ index ]->getElementAnzahl() * constBuffers[ index ]->getElementLength();
 }
 
 // Gibt den Shadertyp zurück
@@ -187,7 +84,7 @@ ShaderType Shader::getType() const
 
 // Erhöht den Reference Counter um 1
 //  Return: Ein zeiger auf diesen Shader
-Shader* Shader::getThis()
+Shader *Shader::getThis()
 {
     ref++;
     return this;
@@ -195,7 +92,7 @@ Shader* Shader::getThis()
 
 // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
 //  Return: 0
-Shader* Shader::release()
+Shader *Shader::release()
 {
     ref--;
     if( !ref )
@@ -203,77 +100,90 @@ Shader* Shader::release()
     return 0;
 }
 
+DX11Shader::DX11Shader( ID3D11Device *device, ID3D11DeviceContext *context )
+    : Shader()
+{
+    this->device = device;
+    this->context = context;
+}
+
+DX11Shader::~DX11Shader()
+{}
+
+// erstellt ein constanten Buffer, der constante daten an den Shader übergibt
+// es können maximal 14 Buffer erstellt werden
+//  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
+//  größe: Die größe des buffers in byte
+//  index: Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
+bool DX11Shader::erstelleConstBuffer( int größe, int index )
+{
+    if( index < 0 || index >= 14 )
+        return 0;
+    bool ok = 1;
+    for( int i = 0; i < index; i++ )
+        ok &= constBuffers[ i ] != 0;
+    if( !ok )
+        return 0;
+    while( ( größe / 16 ) * 16 != größe ) // es sind nur vielfache von 16 als größe erlaubt
+        größe++;
+    if( constBuffers[ index ] )
+        constBuffers[ index ]->release();
+    constBuffers[ index ] = new DX11Buffer( 1, device, context, D3D11_BIND_CONSTANT_BUFFER );
+    constBuffers[ index ]->setLength( größe );
+    return 1;
+}
+
+
 // Inhalt der PixelShader Klasse
 
 // Konstruktor
-PixelShader::PixelShader()
-    : Shader()
+DX11PixelShader::DX11PixelShader( ID3D11Device *device, ID3D11DeviceContext *context )
+    : DX11Shader( device, context )
 {
     pixelShader = 0;
 }
 
 // Destruktor
-PixelShader::~PixelShader()
+DX11PixelShader::~DX11PixelShader()
 {
     if( pixelShader )
         pixelShader->Release();
 }
 
-// Compiliert den Shader Quellcode
-//  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-//  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-//  type: Der die Version des Shaders. Beispiel: '5_0', '4_0'
-//  return: true, wenn kein Fehler aufgetreten ist
-bool PixelShader::compile( ID3D11Device * zD3d11Device, const char* einstiegsFunktion, const char* version )
-{
-    Text v = "ps_";
-    v += version;
-    if( !__super::compile( zD3d11Device, einstiegsFunktion, v ) )
-        return 0;
-    if( pixelShader )
-        pixelShader->Release();
-    pixelShader = 0;
-    HRESULT result = zD3d11Device->CreatePixelShader( shaderBuffer->GetBufferPointer(), shaderBuffer->GetBufferSize(), 0, &pixelShader );
-    shaderBuffer->Release();
-    shaderBuffer = 0;
-    return result == S_OK;
-}
-
 // Setzt den Compilierten Shader
 //  bytes: Die Bytes des compilierten codes
 //  length: die Länge des bytearrays
 //  return: true, wenn bytes gültig ist, false sonst
-bool PixelShader::setCompiledByteArray( ID3D11Device * zD3d11Device, unsigned char* bytes, int length )
+bool DX11PixelShader::setCompiledByteArray( unsigned char *bytes, int length )
 {
-    HRESULT result = zD3d11Device->CreatePixelShader( bytes, length, 0, &pixelShader );
+    HRESULT result = device->CreatePixelShader( bytes, length, 0, &pixelShader );
     return result == S_OK;
 }
 
 // Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
 //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-void PixelShader::benutzeShader( ID3D11DeviceContext * zD3d11Context )
+void DX11PixelShader::benutzeShader()
 {
-    if( buffAnz )
-        zD3d11Context->PSSetConstantBuffers( 0, buffAnz, constBuffers );
+    ID3D11Buffer *buffer[ 14 ];
+    int anz = 0;
+    for( ; anz < 14 && constBuffers[ anz ]; anz++ )
+    {
+        if( !( (DX11Buffer *)constBuffers[ anz ] )->zBuffer() )
+            constBuffers[ anz ]->copieren();
+        buffer[ anz ] = ( (DX11Buffer *)constBuffers[ anz ] )->zBuffer();
+    }
+    if( anz )
+        context->PSSetConstantBuffers( 0, anz, buffer );
     if( pixelShader )
-        zD3d11Context->PSSetShader( pixelShader, 0, 0 );
+        context->PSSetShader( pixelShader, 0, 0 );
 }
 
-// Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-//  Return: 0
-Shader * PixelShader::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
 
 // Inhalt der VertexShader Klasse
 
 // Konstruktor
-VertexShader::VertexShader()
-    : Shader()
+DX11VertexShader::DX11VertexShader( ID3D11Device *device, ID3D11DeviceContext *context )
+    : DX11Shader( device, context )
 {
     vertexShader = 0;
     inputLayout = 0;
@@ -282,7 +192,7 @@ VertexShader::VertexShader()
 }
 
 // Destruktor
-VertexShader::~VertexShader()
+DX11VertexShader::~DX11VertexShader()
 {
     if( vertexShader )
         vertexShader->Release();
@@ -290,33 +200,15 @@ VertexShader::~VertexShader()
         inputLayout->Release();
 }
 
-// Compiliert den Shader Quellcode
-//  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-//  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-//  type: Der die Version des Shaders. Beispiel: '5_0', '4_0'
-//  return: true, wenn kein Fehler aufgetreten ist
-bool VertexShader::compile( ID3D11Device * zD3d11Device, const char* einstiegsFunktion, const char* version )
-{
-    Text v = "vs_";
-    v += version;
-    if( !__super::compile( zD3d11Device, einstiegsFunktion, v ) )
-        return 0;
-    if( vertexShader )
-        vertexShader->Release();
-    vertexShader = 0;
-    HRESULT result = zD3d11Device->CreateVertexShader( shaderBuffer->GetBufferPointer(), shaderBuffer->GetBufferSize(), 0, &vertexShader );
-    return result == S_OK;
-}
-
 // Setzt den Compilierten Shader
 //  bytes: Die Bytes des compilierten codes
 //  length: die Länge des bytearrays
 //  return: true, wenn bytes gültig ist, false sonst
-bool VertexShader::setCompiledByteArray( ID3D11Device * zD3d11Device, unsigned char* bytes, int length )
+bool DX11VertexShader::setCompiledByteArray(unsigned char *bytes, int length )
 {
-    shaderByteBuffer = (unsigned char*)bytes;
+    shaderByteBuffer = (unsigned char *)bytes;
     byteBufferSize = length;
-    HRESULT result = zD3d11Device->CreateVertexShader( bytes, length, 0, &vertexShader );
+    HRESULT result = device->CreateVertexShader( bytes, length, 0, &vertexShader );
     return result == S_OK;
 }
 
@@ -325,48 +217,38 @@ bool VertexShader::setCompiledByteArray( ID3D11Device * zD3d11Device, unsigned c
 //  zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
 //  descArray: Ein Array mit initialisierungsdaten
 //  anz: Die Anzahl der Elemente im Array
-bool VertexShader::erstelleInputLayout( ID3D11Device * zD3d11Device, D3D11_INPUT_ELEMENT_DESC * descArray, int anz )
+bool DX11VertexShader::erstelleInputLayout( D3D11_INPUT_ELEMENT_DESC * descArray, int anz )
 {
-    if( !shaderBuffer && !shaderByteBuffer )
+    if( !shaderByteBuffer )
         return 0;
     if( inputLayout )
         inputLayout->Release();
     inputLayout = 0;
-    HRESULT res = zD3d11Device->CreateInputLayout( descArray, anz, shaderBuffer ? shaderBuffer->GetBufferPointer() : shaderByteBuffer, shaderBuffer ? shaderBuffer->GetBufferSize() : byteBufferSize, &inputLayout );
+    HRESULT res = device->CreateInputLayout( descArray, anz, shaderByteBuffer, byteBufferSize, &inputLayout );
     if( res == S_OK )
     {
-        if( shaderBuffer )
-        {
-            shaderBuffer->Release();
-            shaderBuffer = 0;
-        }
-        else
-        {
-            shaderByteBuffer = 0;
-            byteBufferSize = 0;
-        }
+        shaderByteBuffer = 0;
+        byteBufferSize = 0;
     }
     return res == S_OK;
 }
 
 // Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
 //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-void VertexShader::benutzeShader( ID3D11DeviceContext * zD3d11Context )
+void DX11VertexShader::benutzeShader()
 {
-    if( buffAnz )
-        zD3d11Context->VSSetConstantBuffers( 0, buffAnz, constBuffers );
+    ID3D11Buffer *buffer[ 14 ];
+    int anz = 0;
+    for( ; anz < 14 && constBuffers[ anz ]; anz++ )
+    {
+        if( !( (DX11Buffer *)constBuffers[ anz ] )->zBuffer() )
+            constBuffers[ anz ]->copieren();
+        buffer[ anz ] = ( (DX11Buffer *)constBuffers[ anz ] )->zBuffer();
+    }
+    if( anz )
+        context->VSSetConstantBuffers( 0, anz, buffer );
     if( inputLayout )
-        zD3d11Context->IASetInputLayout( inputLayout );
+        context->IASetInputLayout( inputLayout );
     if( vertexShader )
-        zD3d11Context->VSSetShader( vertexShader, 0, 0 );
-}
-
-// Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-//  Return: 0
-Shader * VertexShader::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
+        context->VSSetShader( vertexShader, 0, 0 );
 }

+ 36 - 53
Shader.h

@@ -12,6 +12,7 @@ struct ID3D11InputLayout;
 namespace Framework
 {
     class Text;
+    class DXBuffer;
 
     enum ShaderType
     {
@@ -24,47 +25,30 @@ namespace Framework
     class Shader
     {
     protected:
-        Text* shader;
-        ID3D10Blob* shaderBuffer;
         ShaderType type;
-        ID3D11Buffer* constBuffers[ 14 ];
-        int buffLen[ 14 ];
-        int buffAnz;
+        DXBuffer * constBuffers[ 14 ];
         int ref;
 
     public:
         // Konstruktor
         Shader();
         // Destruktor
-        ~Shader();
-        // Lähdt den Shader Quellcode aus einer Textdatei
-        //  pfad: Der Pfad zur Datei
-        //  return: true, wenn der Shader erfolgreich geladen wurde
-        bool ladeAusDatei( const char* pfad );
-        // Setzt den Shader Quellcode
-        //  zCode: Der Quellcode des Shaders
-        void setShaderCode( Text* zCode );
-        // Compiliert den Shader Quellcode
-        //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-        //  type: Der Typ und die Version des Shaders. Beispiel: 'vs_5_0' für Vertexshader, 'ps_5_0' für Pixelshader.
-        //  return: true, wenn der Quellcode keine Fehler enthällt
-        virtual bool compile( ID3D11Device* zD3d11Device, const char* einstiegsFunktion, const char* type );
+        virtual ~Shader();
         // Setzt den Compilierten Shader
         //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
         //  bytes: Die Bytes des compilierten codes
         //  length: die Länge des bytearrays
         //  return: true, wenn bytes gültig ist, false sonst
-        virtual bool setCompiledByteArray( ID3D11Device* zD3d11Device, unsigned char* bytes, int length ) = 0;
+        virtual bool setCompiledByteArray( unsigned char* bytes, int length ) = 0;
         // Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
         //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        virtual void benutzeShader( ID3D11DeviceContext* zD3d11Context );
+        virtual void benutzeShader() = 0;
         // erstellt ein constanten Buffer, der constante daten an den Shader übergibt
         // es können maximal 14 Buffer erstellt werden
         //  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
         //  size: Die größe des buffers in byte
         //  index: Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
-        bool erstelleConstBuffer( ID3D11Device* zD3d11Device, int size, int index );
+        virtual bool erstelleConstBuffer( int size, int index ) = 0;
         // Löscht einen constanten Buffer
         //  index: der Index des Buffers, der gelöscht werden soll. Buffer 0 kann nicht gelöscht werden, solange Buffer 1 noch existiert usw.
         bool removeConstBuffer( int index );
@@ -73,7 +57,7 @@ namespace Framework
         //  data: Einen zeiger auf en byte Array der größe des Buffers
         //  index: Der Index des Buffers
         //  len: Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
-        bool füllConstBuffer( ID3D11DeviceContext* zD3d11Context, char* data, int index, int len = -1 );
+        bool füllConstBuffer( char* data, int index, int len = -1 );
         // Gibt die Länge eines constanten Buffers zurück
         //  index: Der Index des Buffers
         int getConstBufferLänge( int index ) const;
@@ -84,42 +68,50 @@ namespace Framework
         Shader* getThis();
         // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
         //  Return: 0
-        virtual Shader* release();
+        Shader* release();
+    };
+
+    class DX11Shader : public Shader
+    {
+    protected:
+        ID3D11Device *device;
+        ID3D11DeviceContext *context;
+
+    public:
+        DX11Shader( ID3D11Device *device, ID3D11DeviceContext *context );
+        virtual ~DX11Shader();
+        // erstellt ein constanten Buffer, der constante daten an den Shader übergibt
+        // es können maximal 14 Buffer erstellt werden
+        //  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
+        //  size: Die größe des buffers in byte
+        //  index: Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
+        virtual bool erstelleConstBuffer( int size, int index ) override;
     };
 
     // Verwaltet einen Pixel Shader
-    class PixelShader : public Shader
+    class DX11PixelShader : public DX11Shader
     {
     private:
         ID3D11PixelShader* pixelShader;
 
     public:
         // Konstruktor
-        PixelShader();
+        DX11PixelShader( ID3D11Device *device, ID3D11DeviceContext *context );
         // Destruktor
-        ~PixelShader();
-        // Compiliert den Shader Quellcode
-        //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-        //  type: Der die Version des Shaders. Beispiel: '5_0', '4_0'
-        //  return: true, wenn kein Fehler aufgetreten ist
-        bool compile( ID3D11Device* zD3d11Device, const char* einstiegsFunktion, const char* version ) override;
+        ~DX11PixelShader();
         // Setzt den Compilierten Shader
         //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
         //  bytes: Die Bytes des compilierten codes
         //  length: die Länge des bytearrays
         //  return: true, wenn bytes gültig ist, false sonst
-        bool setCompiledByteArray( ID3D11Device* zD3d11Device, unsigned char* bytes, int length ) override;
+        bool setCompiledByteArray(unsigned char *bytes, int length ) override;
         // Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
         //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        void benutzeShader( ID3D11DeviceContext* zD3d11Context );
-        // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //  Return: 0
-        Shader* release();
+        void benutzeShader() override;
     };
 
     // Verwaltet einen Vertex Shader
-    class VertexShader : public Shader
+    class DX11VertexShader : public DX11Shader
     {
     private:
         ID3D11VertexShader* vertexShader;
@@ -129,32 +121,23 @@ namespace Framework
 
     public:
         // Konstruktor
-        VertexShader();
+        DX11VertexShader( ID3D11Device *device, ID3D11DeviceContext *context );
         // Destruktor
-        ~VertexShader();
-        // Compiliert den Shader Quellcode
-        //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //  einstiegsFunktion: Der Name der Funktion, die als erstes aufgerufen werden soll
-        //  type: Der die Version des Shaders. Beispiel: '5_0', '4_0'
-        //  return: true, wenn kein Fehler aufgetreten ist
-        bool compile( ID3D11Device* zD3d11Device, const char* einstiegsFunktion, const char* version ) override;
+        ~DX11VertexShader();
         // Setzt den Compilierten Shader
         //  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
         //  bytes: Die Bytes des compilierten codes
         //  length: die Länge des bytearrays
         //  return: true, wenn bytes gültig ist, false sonst
-        bool setCompiledByteArray( ID3D11Device* zD3d11Device, unsigned char* bytes, int length ) override;
+        bool setCompiledByteArray( unsigned char *bytes, int length ) override;
         // erstellt ein InputLayout für den Shader
         // Darf erst nach compile aufgerufen werden
         //  zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
         //  descArray: Ein Array mit initialisierungsdaten
         //  anz: Die Anzahl der Elemente im Array
-        bool erstelleInputLayout( ID3D11Device* zD3d11Device, D3D11_INPUT_ELEMENT_DESC* descArray, int anz );
+        bool erstelleInputLayout( D3D11_INPUT_ELEMENT_DESC* descArray, int anz );
         // Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
         //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        void benutzeShader( ID3D11DeviceContext* zD3d11Context );
-        // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //  Return: 0
-        Shader* release();
+        void benutzeShader() override;
     };
 }