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
27
29 {
30 if (!resource)
31 return;
32 switch (resource->getType())
33 {
35 m_blendState = static_cast<VK_BlendState*>(resource);
36 m_blendState->addRef();
37 break;
39 m_rasterizationState = static_cast<VK_RasterizationState*>(resource);
40 m_rasterizationState->addRef();
41 break;
43 m_viewportState = static_cast<VK_ViewportState*>(resource);
44 m_viewportState->addRef();
45 break;
47 m_inputLayout = static_cast<VK_InputLayout*>(resource);
48 m_inputLayout->addRef();
49 break;
50 default:
51 ferr << "Unsupported pipeline resource type: " << (unsigned int)(resource->getType()) << std::endl;
52 break;
53 }
54 }
55
57 {
59
60 //fill resource
61 std::vector<vk::DynamicState> dynamicStates = {
62 vk::DynamicState::eViewport,
63 vk::DynamicState::eScissor
64 };
65 m_dynamicState = vk::PipelineDynamicStateCreateInfo();
66 m_dynamicState.setDynamicStates(dynamicStates);
67 m_createInfo.pDynamicState = &m_dynamicState;
68 m_createInfo.renderPass = static_cast<VK_PassGroup*>(m_pass->passGroup())->getRenderPass();
69 m_createInfo.subpass = m_pass->index();
71 m_createInfo.pVertexInputState = m_inputLayout->pInputStateInfo();
72 m_createInfo.pRasterizationState = &m_rasterizationState->rasterizationStateCreateInfo();
73 m_createInfo.pMultisampleState = &m_rasterizationState->multisampleStateCreateInfo();
74 m_inputAssemblyState = vk::PipelineInputAssemblyStateCreateInfo{};
75 m_inputAssemblyState.topology = vk::PrimitiveTopology::eTriangleList;
76 m_inputAssemblyState.primitiveRestartEnable = VK_FALSE;
77 m_createInfo.pInputAssemblyState = &m_inputAssemblyState;
78 m_createInfo.pViewportState = &m_viewportState->viewportStateCreateInfo();
79 m_createInfo.pDepthStencilState = &m_depthStencilState->getCreateInfo();
80 m_createInfo.pColorBlendState = &m_blendState->colorBlendStateCreateInfo();
81
82 m_createInfo.stageCount = m_shaderStages.size();
83 m_createInfo.pStages = m_shaderStages.data();
84 m_pipeline = m_ctx->getDevice().createGraphicsPipeline(nullptr,m_createInfo).value;
85 }
86
88 {
89 m_pass = static_cast<VK_Pass*>(pass);
90 }
91
93 {
94 if (!m_blendState)
95 {
97 if (m_pass->renderTargets().size())
98 m_blendState->targets(m_pass->renderTargets().rbegin()->first + 1);
99 m_blendState->create();
100 }
102 {
104 m_rasterizationState->create();
105 }
106 if (!m_viewportState)
107 {
109 m_viewportState->create();
110 }
111 if (!m_inputLayout)
112 {
114 m_inputLayout->create();
115 }
117 {
119 m_depthStencilState->create();
120 }
121 }
122}
123
124
125
#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