Add graphics shader support to RHI pipeline states
This commit is contained in:
@@ -32,6 +32,7 @@ public:
|
||||
void SetRenderTargetFormats(uint32_t count, const uint32_t* formats, uint32_t depthFormat) override;
|
||||
void SetSampleCount(uint32_t count) override;
|
||||
void SetComputeShader(RHIShader* shader) override;
|
||||
void SetRootSignature(ID3D12RootSignature* rootSignature);
|
||||
|
||||
// State query
|
||||
const RasterizerDesc& GetRasterizerState() const override { return m_rasterizerDesc; }
|
||||
@@ -54,6 +55,7 @@ public:
|
||||
void Shutdown() override;
|
||||
ID3D12PipelineState* GetPipelineState() const { return m_pipelineState.Get(); }
|
||||
ID3D12PipelineState* GetComputePipelineState() const { return m_computePipelineState.Get(); }
|
||||
ID3D12RootSignature* GetRootSignature() const { return m_rootSignature.Get(); }
|
||||
void* GetNativeHandle() override { return m_pipelineState.Get(); }
|
||||
PipelineType GetType() const override { return HasComputeShader() ? PipelineType::Compute : PipelineType::Graphics; }
|
||||
|
||||
@@ -99,7 +101,7 @@ private:
|
||||
D3D12_SHADER_BYTECODE m_gsBytecode = {};
|
||||
D3D12_SHADER_BYTECODE m_csBytecode = {};
|
||||
class RHIShader* m_computeShader = nullptr;
|
||||
ID3D12RootSignature* m_rootSignature = nullptr;
|
||||
ComPtr<ID3D12RootSignature> m_rootSignature;
|
||||
|
||||
// D3D12 resources
|
||||
ComPtr<ID3D12PipelineState> m_pipelineState;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "../RHIPipelineState.h"
|
||||
@@ -121,6 +122,7 @@ public:
|
||||
void Clear(unsigned int buffers);
|
||||
void AttachShader(unsigned int program);
|
||||
void DetachShader();
|
||||
void SetOwnedGraphicsShader(std::unique_ptr<class OpenGLShader> shader);
|
||||
|
||||
const OpenGLDepthStencilState& GetOpenGLDepthStencilState() const;
|
||||
const OpenGLBlendState& GetOpenGLBlendState() const;
|
||||
@@ -135,6 +137,7 @@ private:
|
||||
unsigned int m_program = 0;
|
||||
unsigned int m_computeProgram = 0;
|
||||
class RHIShader* m_computeShader = nullptr;
|
||||
std::unique_ptr<class OpenGLShader> m_graphicsShader;
|
||||
bool m_programAttached = false;
|
||||
|
||||
// OpenGL specific state
|
||||
|
||||
@@ -245,17 +245,17 @@ struct RootSignatureDesc {
|
||||
// ========== Pipeline State Structures (Unity SRP style) ==========
|
||||
|
||||
struct StencilOpDesc {
|
||||
uint32_t failOp = 0; // StencilOp
|
||||
uint32_t passOp = 0; // StencilOp
|
||||
uint32_t depthFailOp = 0; // StencilOp
|
||||
uint32_t func = 0; // ComparisonFunc
|
||||
uint32_t failOp = static_cast<uint32_t>(StencilOp::Keep);
|
||||
uint32_t passOp = static_cast<uint32_t>(StencilOp::Keep);
|
||||
uint32_t depthFailOp = static_cast<uint32_t>(StencilOp::Keep);
|
||||
uint32_t func = static_cast<uint32_t>(ComparisonFunc::Always);
|
||||
};
|
||||
|
||||
struct DepthStencilStateDesc {
|
||||
bool depthTestEnable = true;
|
||||
bool depthWriteEnable = true;
|
||||
bool depthBoundsEnable = false;
|
||||
uint32_t depthFunc = 0; // ComparisonFunc
|
||||
uint32_t depthFunc = static_cast<uint32_t>(ComparisonFunc::Less);
|
||||
bool stencilEnable = false;
|
||||
uint8_t stencilReadMask = 0xFF;
|
||||
uint8_t stencilWriteMask = 0xFF;
|
||||
@@ -265,20 +265,20 @@ struct DepthStencilStateDesc {
|
||||
|
||||
struct BlendDesc {
|
||||
bool blendEnable = false;
|
||||
uint32_t srcBlend = 0; // BlendFactor
|
||||
uint32_t dstBlend = 0; // BlendFactor
|
||||
uint32_t srcBlendAlpha = 0; // BlendFactor
|
||||
uint32_t dstBlendAlpha = 0; // BlendFactor
|
||||
uint32_t blendOp = 0; // BlendOp
|
||||
uint32_t blendOpAlpha = 0; // BlendOp
|
||||
uint32_t srcBlend = static_cast<uint32_t>(BlendFactor::One);
|
||||
uint32_t dstBlend = static_cast<uint32_t>(BlendFactor::Zero);
|
||||
uint32_t srcBlendAlpha = static_cast<uint32_t>(BlendFactor::One);
|
||||
uint32_t dstBlendAlpha = static_cast<uint32_t>(BlendFactor::Zero);
|
||||
uint32_t blendOp = static_cast<uint32_t>(BlendOp::Add);
|
||||
uint32_t blendOpAlpha = static_cast<uint32_t>(BlendOp::Add);
|
||||
uint8_t colorWriteMask = 0xF;
|
||||
float blendFactor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
};
|
||||
|
||||
struct RasterizerDesc {
|
||||
uint32_t fillMode = 0; // FillMode (default: Solid)
|
||||
uint32_t cullMode = 0; // CullMode (default: Back)
|
||||
uint32_t frontFace = 0; // FrontFace (default: CounterClockwise)
|
||||
uint32_t fillMode = static_cast<uint32_t>(FillMode::Solid);
|
||||
uint32_t cullMode = static_cast<uint32_t>(CullMode::Back);
|
||||
uint32_t frontFace = static_cast<uint32_t>(FrontFace::CounterClockwise);
|
||||
bool depthClipEnable = true;
|
||||
bool scissorTestEnable = false;
|
||||
bool multisampleEnable = false;
|
||||
@@ -307,12 +307,15 @@ struct PipelineStateHash {
|
||||
};
|
||||
|
||||
struct GraphicsPipelineDesc {
|
||||
ShaderCompileDesc vertexShader;
|
||||
ShaderCompileDesc fragmentShader;
|
||||
ShaderCompileDesc geometryShader;
|
||||
InputLayoutDesc inputLayout;
|
||||
RasterizerDesc rasterizerState;
|
||||
BlendDesc blendState;
|
||||
DepthStencilStateDesc depthStencilState;
|
||||
|
||||
uint32_t topologyType = 0; // PrimitiveTopologyType
|
||||
uint32_t topologyType = static_cast<uint32_t>(PrimitiveTopologyType::Triangle);
|
||||
uint32_t renderTargetCount = 1;
|
||||
uint32_t renderTargetFormats[8] = { 0 }; // Format
|
||||
uint32_t depthStencilFormat = 0; // Format
|
||||
|
||||
Reference in New Issue
Block a user