Add create graphycs_pipeline
This commit is contained in:
@@ -363,6 +363,37 @@ void RenderEngine::create_image_views()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderEngine::create_render_pass()
|
||||||
|
{
|
||||||
|
VkAttachmentDescription attachment_description{};
|
||||||
|
attachment_description.format = swapchain_image_format_;
|
||||||
|
attachment_description.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
|
attachment_description.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
|
attachment_description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachment_description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
attachment_description.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
|
|
||||||
|
VkAttachmentReference attachment_reference{};
|
||||||
|
attachment_reference.attachment = 0;
|
||||||
|
attachment_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
VkSubpassDescription subpass_description{};
|
||||||
|
subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
subpass_description.colorAttachmentCount = 1;
|
||||||
|
subpass_description.pColorAttachments = &attachment_reference;
|
||||||
|
|
||||||
|
VkRenderPassCreateInfo render_pass_info{};
|
||||||
|
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
|
render_pass_info.attachmentCount = 1;
|
||||||
|
render_pass_info.pAttachments = &attachment_description;
|
||||||
|
render_pass_info.subpassCount = 1;
|
||||||
|
render_pass_info.pSubpasses = &subpass_description;
|
||||||
|
|
||||||
|
VK_CHECK(vkCreateRenderPass(device_, &render_pass_info, nullptr, &render_pass_));
|
||||||
|
}
|
||||||
|
|
||||||
void RenderEngine::create_graphycs_pipleline()
|
void RenderEngine::create_graphycs_pipleline()
|
||||||
{
|
{
|
||||||
std::ifstream vertex_shader_file("Shaders/vertex.spv", std::ios::binary);
|
std::ifstream vertex_shader_file("Shaders/vertex.spv", std::ios::binary);
|
||||||
@@ -389,10 +420,10 @@ void RenderEngine::create_graphycs_pipleline()
|
|||||||
vertex_shader_stage_info.pName = "main";
|
vertex_shader_stage_info.pName = "main";
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo fragment_shader_stage_info{};
|
VkPipelineShaderStageCreateInfo fragment_shader_stage_info{};
|
||||||
vertex_shader_stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
fragment_shader_stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
vertex_shader_stage_info.stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
fragment_shader_stage_info.stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
vertex_shader_stage_info.module = fragment_shader;
|
fragment_shader_stage_info.module = fragment_shader;
|
||||||
vertex_shader_stage_info.pName = "main";
|
fragment_shader_stage_info.pName = "main";
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo shader_stages[] = {vertex_shader_stage_info, fragment_shader_stage_info};
|
VkPipelineShaderStageCreateInfo shader_stages[] = {vertex_shader_stage_info, fragment_shader_stage_info};
|
||||||
const std::vector<VkDynamicState> dynamic_states = {
|
const std::vector<VkDynamicState> dynamic_states = {
|
||||||
@@ -446,6 +477,11 @@ void RenderEngine::create_graphycs_pipleline()
|
|||||||
rasterization_info.frontFace = VK_FRONT_FACE_CLOCKWISE;
|
rasterization_info.frontFace = VK_FRONT_FACE_CLOCKWISE;
|
||||||
rasterization_info.depthBiasEnable = VK_FALSE;
|
rasterization_info.depthBiasEnable = VK_FALSE;
|
||||||
|
|
||||||
|
VkPipelineMultisampleStateCreateInfo multisample_info{};
|
||||||
|
multisample_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||||
|
multisample_info.sampleShadingEnable = VK_FALSE;
|
||||||
|
multisample_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
|
||||||
VkPipelineColorBlendAttachmentState color_blend_attachment_state{};
|
VkPipelineColorBlendAttachmentState color_blend_attachment_state{};
|
||||||
color_blend_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
color_blend_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
||||||
color_blend_attachment_state.blendEnable = VK_TRUE;
|
color_blend_attachment_state.blendEnable = VK_TRUE;
|
||||||
@@ -460,6 +496,7 @@ void RenderEngine::create_graphycs_pipleline()
|
|||||||
color_blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
color_blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
color_blend_info.logicOpEnable = VK_FALSE;
|
color_blend_info.logicOpEnable = VK_FALSE;
|
||||||
color_blend_info.attachmentCount = 1;
|
color_blend_info.attachmentCount = 1;
|
||||||
|
color_blend_info.pAttachments = &color_blend_attachment_state;
|
||||||
color_blend_info.blendConstants[0] = 0.0f;
|
color_blend_info.blendConstants[0] = 0.0f;
|
||||||
color_blend_info.blendConstants[1] = 0.0f;
|
color_blend_info.blendConstants[1] = 0.0f;
|
||||||
color_blend_info.blendConstants[2] = 0.0f;
|
color_blend_info.blendConstants[2] = 0.0f;
|
||||||
@@ -469,6 +506,26 @@ void RenderEngine::create_graphycs_pipleline()
|
|||||||
pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||||
|
|
||||||
VK_CHECK(vkCreatePipelineLayout(device_, &pipeline_layout_info, nullptr, &pipeline_layout_));
|
VK_CHECK(vkCreatePipelineLayout(device_, &pipeline_layout_info, nullptr, &pipeline_layout_));
|
||||||
|
|
||||||
|
VkGraphicsPipelineCreateInfo graphics_pipeline_info{};
|
||||||
|
graphics_pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
graphics_pipeline_info.stageCount = 2;
|
||||||
|
graphics_pipeline_info.pStages = shader_stages;
|
||||||
|
graphics_pipeline_info.layout = pipeline_layout_;
|
||||||
|
graphics_pipeline_info.pColorBlendState = &color_blend_info;
|
||||||
|
graphics_pipeline_info.pDynamicState = &dynamic_state_info;
|
||||||
|
graphics_pipeline_info.pInputAssemblyState = &input_assembly_info;
|
||||||
|
graphics_pipeline_info.pMultisampleState = &multisample_info;
|
||||||
|
graphics_pipeline_info.pRasterizationState = &rasterization_info;
|
||||||
|
graphics_pipeline_info.pViewportState = &viewport_info;
|
||||||
|
graphics_pipeline_info.pVertexInputState = &vertex_input_info;
|
||||||
|
graphics_pipeline_info.pDepthStencilState = nullptr;
|
||||||
|
graphics_pipeline_info.renderPass = render_pass_;
|
||||||
|
graphics_pipeline_info.subpass = 0;
|
||||||
|
graphics_pipeline_info.basePipelineHandle = nullptr;
|
||||||
|
graphics_pipeline_info.basePipelineIndex = -1;
|
||||||
|
|
||||||
|
VK_CHECK(vkCreateGraphicsPipelines(device_, nullptr, 1, &graphics_pipeline_info, nullptr, &graphycs_pipeline_));
|
||||||
|
|
||||||
vkDestroyShaderModule(device_, vertex_shader, nullptr);
|
vkDestroyShaderModule(device_, vertex_shader, nullptr);
|
||||||
vkDestroyShaderModule(device_, fragment_shader, nullptr);
|
vkDestroyShaderModule(device_, fragment_shader, nullptr);
|
||||||
@@ -492,13 +549,20 @@ window_(window)
|
|||||||
create_logical_device();
|
create_logical_device();
|
||||||
create_swapchain(desired_present_mode);
|
create_swapchain(desired_present_mode);
|
||||||
create_image_views();
|
create_image_views();
|
||||||
|
create_render_pass();
|
||||||
create_graphycs_pipleline();
|
create_graphycs_pipleline();
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderEngine::~RenderEngine()
|
RenderEngine::~RenderEngine()
|
||||||
{
|
{
|
||||||
|
if (graphycs_pipeline_ != VK_NULL_HANDLE)
|
||||||
|
vkDestroyPipeline(device_, graphycs_pipeline_, nullptr);
|
||||||
|
|
||||||
if (pipeline_layout_ != VK_NULL_HANDLE)
|
if (pipeline_layout_ != VK_NULL_HANDLE)
|
||||||
vkDestroyPipelineLayout(device_, pipeline_layout_, nullptr);
|
vkDestroyPipelineLayout(device_, pipeline_layout_, nullptr);
|
||||||
|
|
||||||
|
if (render_pass_ != VK_NULL_HANDLE)
|
||||||
|
vkDestroyRenderPass(device_, render_pass_, nullptr);
|
||||||
|
|
||||||
for (auto image_view : swapchain_image_views_)
|
for (auto image_view : swapchain_image_views_)
|
||||||
vkDestroyImageView(device_, image_view, nullptr);
|
vkDestroyImageView(device_, image_view, nullptr);
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ class RenderEngine
|
|||||||
VkFormat swapchain_image_format_;
|
VkFormat swapchain_image_format_;
|
||||||
VkExtent2D swapchain_extent_;
|
VkExtent2D swapchain_extent_;
|
||||||
std::vector<VkImageView> swapchain_image_views_;
|
std::vector<VkImageView> swapchain_image_views_;
|
||||||
|
VkRenderPass render_pass_ = VK_NULL_HANDLE;
|
||||||
VkPipelineLayout pipeline_layout_ = VK_NULL_HANDLE;
|
VkPipelineLayout pipeline_layout_ = VK_NULL_HANDLE;
|
||||||
|
VkPipeline graphycs_pipeline_ = VK_NULL_HANDLE;
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
VkResult enable_layer_validation(VkDebugUtilsMessengerCreateInfoEXT* create_info);
|
VkResult enable_layer_validation(VkDebugUtilsMessengerCreateInfoEXT* create_info);
|
||||||
@@ -71,6 +73,7 @@ class RenderEngine
|
|||||||
void create_logical_device();
|
void create_logical_device();
|
||||||
void create_swapchain(VkPresentModeKHR desired_present_mode);
|
void create_swapchain(VkPresentModeKHR desired_present_mode);
|
||||||
void create_image_views();
|
void create_image_views();
|
||||||
|
void create_render_pass();
|
||||||
void create_graphycs_pipleline();
|
void create_graphycs_pipleline();
|
||||||
public:
|
public:
|
||||||
// Can throw the exception
|
// Can throw the exception
|
||||||
|
|||||||
Reference in New Issue
Block a user