Add graphics shader support to RHI pipeline states

This commit is contained in:
2026-03-25 23:19:18 +08:00
parent aaf9cce418
commit 1597181458
10 changed files with 311 additions and 40 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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