Files
FlaxEngine/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp

90 lines
2.5 KiB
C++

// Copyright (c) Wojciech Figat. All rights reserved.
#if GRAPHICS_API_DIRECTX12
#include "GPUShaderDX12.h"
#include "Engine/Serialization/MemoryReadStream.h"
#include "GPUShaderProgramDX12.h"
#include "Types.h"
#include "../RenderToolsDX.h"
GPUShaderProgram* GPUShaderDX12::CreateGPUShaderProgram(ShaderStage type, const GPUShaderProgramInitializer& initializer, Span<byte> bytecode, MemoryReadStream& stream)
{
// Extract the DX shader header from the cache
DxShaderHeader* header = (DxShaderHeader*)bytecode.Get();
bytecode = bytecode.Slice(sizeof(DxShaderHeader));
GPUShaderProgram* shader = nullptr;
switch (type)
{
case ShaderStage::Vertex:
{
GPUVertexLayout* inputLayout, *vertexLayout;
ReadVertexLayout(stream, inputLayout, vertexLayout);
shader = New<GPUShaderProgramVSDX12>(initializer, header, bytecode, inputLayout, vertexLayout);
break;
}
#if GPU_ALLOW_TESSELLATION_SHADERS
case ShaderStage::Hull:
{
int32 controlPointsCount;
stream.ReadInt32(&controlPointsCount);
shader = New<GPUShaderProgramHSDX12>(initializer, header, bytecode, controlPointsCount);
break;
}
case ShaderStage::Domain:
{
shader = New<GPUShaderProgramDSDX12>(initializer, header, bytecode);
break;
}
#else
case ShaderStage::Hull:
{
int32 controlPointsCount;
stream.ReadInt32(&controlPointsCount);
break;
}
#endif
#if GPU_ALLOW_GEOMETRY_SHADERS
case ShaderStage::Geometry:
{
shader = New<GPUShaderProgramGSDX12>(initializer, header, bytecode);
break;
}
#endif
case ShaderStage::Pixel:
{
shader = New<GPUShaderProgramPSDX12>(initializer, header, bytecode);
break;
}
case ShaderStage::Compute:
{
shader = New<GPUShaderProgramCSDX12>(_device, initializer, header, bytecode);
break;
}
}
return shader;
}
ID3D12PipelineState* GPUShaderProgramCSDX12::GetOrCreateState()
{
if (_state)
return _state;
// Create description
D3D12_COMPUTE_PIPELINE_STATE_DESC psDesc;
Platform::MemoryClear(&psDesc, sizeof(D3D12_COMPUTE_PIPELINE_STATE_DESC));
psDesc.pRootSignature = _device->GetRootSignature();
// Shader
psDesc.CS = { GetBufferHandle(), GetBufferSize() };
// Create object
const HRESULT result = _device->GetDevice()->CreateComputePipelineState(&psDesc, IID_PPV_ARGS(&_state));
LOG_DIRECTX_RESULT(result);
return _state;
}
#endif