FCT
载入中...
搜索中...
未找到
VK_RasterizationPipeline.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/24.
3//
4#include "./VK_Pass.h"
5#include "./VK_PassGroup.h"
7
8namespace FCT::RHI
9{
11 {
12 m_ctx = ctx;
13 m_blendState = nullptr;
14 m_rasterizationState = nullptr;
15 m_viewportState = nullptr;
16 m_inputLayout = nullptr;
17 m_depthStencilState = nullptr;
18 }
19
28
30 {
31 if (!resource)
32 return;
33 switch (resource->getType())
34 {
36 m_blendState = static_cast<VK_BlendState*>(resource);
37 m_blendState->addRef();
38 break;
40 m_rasterizationState = static_cast<VK_RasterizationState*>(resource);
41 m_rasterizationState->addRef();
42 break;
44 m_viewportState = static_cast<VK_ViewportState*>(resource);
45 m_viewportState->addRef();
46 break;
48 m_inputLayout = static_cast<VK_InputLayout*>(resource);
49 m_inputLayout->addRef();
50 break;
51 default:
52 ferr << "Unsupported pipeline resource type: " << (unsigned int)(resource->getType()) << std::endl;
53 break;
54 }
55 }
56
58 {
60
61 //fill resource
62 std::vector<vk::DynamicState> dynamicStates = {
63 vk::DynamicState::eViewport,
64 vk::DynamicState::eScissor
65 };
66 m_dynamicState = vk::PipelineDynamicStateCreateInfo();
67 m_dynamicState.setDynamicStates(dynamicStates);
68 m_createInfo.pDynamicState = &m_dynamicState;
69 m_createInfo.renderPass = static_cast<VK_PassGroup*>(m_pass->passGroup())->getRenderPass();
70 m_createInfo.subpass = m_pass->index();
72 m_createInfo.pVertexInputState = m_inputLayout->pInputStateInfo();
73 m_createInfo.pRasterizationState = &m_rasterizationState->rasterizationStateCreateInfo();
74 m_createInfo.pMultisampleState = &m_rasterizationState->multisampleStateCreateInfo();
75 m_inputAssemblyState = vk::PipelineInputAssemblyStateCreateInfo{};
76 m_inputAssemblyState.topology = vk::PrimitiveTopology::eTriangleList;
77 m_inputAssemblyState.primitiveRestartEnable = VK_FALSE;
78 m_createInfo.pInputAssemblyState = &m_inputAssemblyState;
79 m_createInfo.pViewportState = &m_viewportState->viewportStateCreateInfo();
80 m_createInfo.pDepthStencilState = &m_depthStencilState->getCreateInfo();
81 m_createInfo.pColorBlendState = &m_blendState->colorBlendStateCreateInfo();
82
83 m_createInfo.stageCount = m_shaderStages.size();
84 m_createInfo.pStages = m_shaderStages.data();
85 m_pipeline = m_ctx->getDevice().createGraphicsPipeline(nullptr,m_createInfo).value;
86 }
87
89 {
90 m_pass = static_cast<VK_Pass*>(pass);
91 }
92
94 {
95 if (!m_blendState)
96 {
98 if (m_pass->renderTargets().size())
99 m_blendState->targets(m_pass->renderTargets().rbegin()->first + 1);
100 m_blendState->create();
101 }
103 {
105 m_rasterizationState->create();
106 }
107 if (!m_viewportState)
108 {
110 m_viewportState->create();
111 }
112 if (!m_inputLayout)
113 {
115 m_inputLayout->create();
116 }
118 {
120 m_depthStencilState->create();
121 }
122 }
123}
124
125
126
#define FCT_SAFE_RELEASE(obj)
virtual PipelineResourceType getType() const =0
vk::RenderPass getRenderPass() const
vk::PipelineDynamicStateCreateInfo m_dynamicState
std::vector< vk::PipelineShaderStageCreateInfo > m_shaderStages
vk::PipelineInputAssemblyStateCreateInfo m_inputAssemblyState
virtual void addResources(IPipelineResource *resource)
std::ostream & ferr