Files
FlaxEngine/Source/Engine/GraphicsDevice/DirectX/DX12/GPUPipelineStateDX12.h
2025-01-11 22:44:38 +01:00

85 lines
2.9 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#if GRAPHICS_API_DIRECTX12
#include "Engine/Graphics/GPUPipelineState.h"
#include "GPUDeviceDX12.h"
#include "Types.h"
#include "Engine/Core/Collections/Dictionary.h"
#include "../IncludeDirectXHeaders.h"
class GPUTextureViewDX12;
class GPUVertexLayoutDX12;
struct GPUPipelineStateKeyDX12
{
int32 RTsCount;
MSAALevel MSAA;
GPUVertexLayout* VertexLayout;
PixelFormat DepthFormat;
PixelFormat RTVsFormats[GPU_MAX_RT_BINDED];
bool operator==(const GPUPipelineStateKeyDX12& other) const
{
return Platform::MemoryCompare((void*)this, &other, sizeof(GPUPipelineStateKeyDX12)) == 0;
}
friend inline uint32 GetHash(const GPUPipelineStateKeyDX12& key)
{
uint32 hash = (int32)key.MSAA * 11;
CombineHash(hash, (uint32)key.DepthFormat * 93473262);
CombineHash(hash, key.RTsCount * 136);
CombineHash(hash, GetHash(key.VertexLayout));
CombineHash(hash, (uint32)key.RTVsFormats[0]);
CombineHash(hash, (uint32)key.RTVsFormats[1]);
CombineHash(hash, (uint32)key.RTVsFormats[2]);
CombineHash(hash, (uint32)key.RTVsFormats[3]);
CombineHash(hash, (uint32)key.RTVsFormats[4]);
CombineHash(hash, (uint32)key.RTVsFormats[5]);
static_assert(GPU_MAX_RT_BINDED == 6, "Update hash combine code to match RT count (manually inlined loop).");
return hash;
}
};
/// <summary>
/// Graphics pipeline state object for DirectX 12 backend.
/// </summary>
class GPUPipelineStateDX12 : public GPUResourceDX12<GPUPipelineState>
{
private:
Dictionary<GPUPipelineStateKeyDX12, ID3D12PipelineState*> _states;
D3D12_GRAPHICS_PIPELINE_STATE_DESC _desc;
public:
GPUPipelineStateDX12(GPUDeviceDX12* device);
public:
D3D_PRIMITIVE_TOPOLOGY PrimitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
DxShaderHeader Header;
GPUVertexLayoutDX12* VertexBufferLayout = nullptr;
GPUVertexLayoutDX12* VertexInputLayout = nullptr;
/// <summary>
/// Gets DirectX 12 graphics pipeline state object for the given rendering state. Uses depth buffer and render targets formats and multi-sample levels to setup a proper PSO. Uses caching.
/// </summary>
/// <param name="depth">The depth buffer (can be null).</param>
/// <param name="rtCount">The render targets count (can be 0).</param>
/// <param name="rtHandles">The render target handles array.</param>
/// <param name="vertexLayout">The vertex buffers layout.</param>
/// <returns>DirectX 12 graphics pipeline state object</returns>
ID3D12PipelineState* GetState(GPUTextureViewDX12* depth, int32 rtCount, GPUTextureViewDX12** rtHandles, GPUVertexLayoutDX12* vertexLayout);
public:
// [GPUPipelineState]
bool IsValid() const override;
bool Init(const Description& desc) override;
protected:
// [GPUResourceDX12]
void OnReleaseGPU() override;
};
#endif