#include "DX12Shader.h" #include "d3dx12.h" #include "DX12CommandQueue.h" using namespace Framework; DX12Shader::DX12Shader( ID3D12Device* device, DX12CopyCommandQueue* copy, DX12DirectCommandQueue* direct ) : Shader() { shaderByteBuffer = 0; byteBufferSize = 0; this->device = device; this->copy = copy; this->direct = direct; } DX12Shader::~DX12Shader() { delete[] shaderByteBuffer; } // 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 DX12Shader::erstelleConstBuffer( int size, int index ) { if( index < 0 || index >= 14 ) return 0; while( (size / 256) * 256 != size ) size++; while( !constBuffers->hat( index ) ) constBuffers->add( 0 ); constBuffers->set( new DX12VertexBuffer( 1, device, copy, direct ), index ); constBuffers->z( index )->setLength( size ); constBuffers->z( index )->copieren(); return 1; } // 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 DX12Shader::setCompiledByteArray( unsigned char* bytes, int length ) { delete[] shaderByteBuffer; shaderByteBuffer = new unsigned char[ length ]; memcpy( shaderByteBuffer, bytes, length ); byteBufferSize = length; return 1; } // Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt // zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll void DX12Shader::benutzeShader() { // not needet in DirectX 12 } // gibt die compilierten bytes zurück unsigned char* DX12Shader::getCompiledShader() const { return shaderByteBuffer; } // gitbt die anzahl der compilierten bytes zurück int DX12Shader::getCompiledLength() const { return byteBufferSize; } // Erstellt den RootParameter zu einem constanten buffer // index: Der Index des Buffers // view: enthält nach dem Aufruf die position und größe des buffers im speicher void DX12Shader::getViewDesc( int index, D3D12_CONSTANT_BUFFER_VIEW_DESC& view ) { DX12Buffer* zB = (DX12Buffer*)constBuffers->z( index ); if( !zB ) return; view.SizeInBytes = zB->getElementAnzahl() * zB->getElementLength(); view.BufferLocation = zB->zBuffer()->GetGPUVirtualAddress(); } DX12PixelShader::DX12PixelShader( ID3D12Device* device, DX12CopyCommandQueue* copy, DX12DirectCommandQueue* direct ) : DX12Shader( device, copy, direct ) {} // Konstruktor DX12VertexShader::DX12VertexShader( ID3D12Device* device, DX12CopyCommandQueue* copy, DX12DirectCommandQueue* direct ) : DX12Shader( device, copy, direct ) { inputLayout = 0; inputLayoutSize = 0; } // Destruktor DX12VertexShader::~DX12VertexShader() { delete[] inputLayout; } // 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 DX12VertexShader::erstelleInputLayout( D3D12_INPUT_ELEMENT_DESC* descArray, int anz ) { delete[] inputLayout; inputLayout = new D3D12_INPUT_ELEMENT_DESC[ anz ]; memcpy( inputLayout, descArray, anz * sizeof( D3D12_INPUT_ELEMENT_DESC ) ); inputLayoutSize = anz; return 1; } // Gint die Anzahl an eingabeparametern des Shaders zurück int DX12VertexShader::getInputLayoutSize() const { return inputLayoutSize; } // Gibt eine Liste mit formaten für jeden Eingabewert zurück D3D12_INPUT_ELEMENT_DESC* DX12VertexShader::zInputLayout() const { return inputLayout; }