ULRE/src/RenderDevice/Vulkan/VKCommandBuffer.cpp

100 lines
2.7 KiB
C++
Raw Normal View History

#include<hgl/graph/vulkan/VKCommandBuffer.h>
#include<hgl/graph/vulkan/VKRenderPass.h>
#include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKPipeline.h>
#include<hgl/graph/vulkan/VKBuffer.h>
#include<hgl/graph/vulkan/VKMaterial.h>
#include<hgl/graph/vulkan/VKRenderable.h>
#include<hgl/graph/vulkan/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN
2019-04-20 02:28:57 +08:00
CommandBuffer::CommandBuffer(VkDevice dev,const VkExtent2D &extent,VkCommandPool cp,VkCommandBuffer cb)
2019-04-18 22:10:24 +08:00
{
device=dev;
pool=cp;
cmd_buf=cb;
clear_values[0].color.float32[0] = 0.2f;
clear_values[0].color.float32[1] = 0.2f;
clear_values[0].color.float32[2] = 0.2f;
clear_values[0].color.float32[3] = 0.2f;
clear_values[1].depthStencil.depth = 1.0f;
clear_values[1].depthStencil.stencil = 0;
2019-04-20 02:28:57 +08:00
render_area.offset.x=0;
render_area.offset.y=0;
render_area.extent=extent;
2019-07-06 16:46:19 +08:00
pipeline_layout=VK_NULL_HANDLE;
2019-04-18 22:10:24 +08:00
}
CommandBuffer::~CommandBuffer()
{
vkFreeCommandBuffers(device,pool,1,&cmd_buf);
}
bool CommandBuffer::Begin()
2019-04-18 22:10:24 +08:00
{
2019-07-01 19:25:07 +08:00
VkCommandBufferBeginInfo cmd_buf_info;
2019-04-20 02:28:57 +08:00
cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
cmd_buf_info.pNext = nullptr;
cmd_buf_info.flags = 0;
cmd_buf_info.pInheritanceInfo = nullptr;
if(vkBeginCommandBuffer(cmd_buf, &cmd_buf_info)!=VK_SUCCESS)
return(false);
return(true);
}
bool CommandBuffer::BeginRenderPass(RenderPass *rp,Framebuffer *fb)
{
2019-04-18 22:10:24 +08:00
VkRenderPassBeginInfo rp_begin;
rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
rp_begin.pNext = nullptr;
rp_begin.renderPass = *rp;
rp_begin.framebuffer = *fb;
rp_begin.renderArea = render_area;
rp_begin.clearValueCount = 2;
rp_begin.pClearValues = clear_values;
2019-04-18 22:10:24 +08:00
vkCmdBeginRenderPass(cmd_buf, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
viewport.x = 0;
viewport.y = 0;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
viewport.width = render_area.extent.width;
viewport.height = render_area.extent.height;
vkCmdSetViewport(cmd_buf,0,1,&viewport);
vkCmdSetScissor(cmd_buf,0,1,&render_area);
2019-07-06 16:46:19 +08:00
pipeline_layout=VK_NULL_HANDLE;
2019-04-18 22:10:24 +08:00
return(true);
}
bool CommandBuffer::Bind(Renderable *render_obj)
2019-04-18 22:10:24 +08:00
{
if(!render_obj)
2019-04-18 22:10:24 +08:00
return(false);
const uint count=render_obj->GetBufferCount();
2019-04-18 22:10:24 +08:00
if(count<=0)
2019-04-18 22:10:24 +08:00
return(false);
vkCmdBindVertexBuffers(cmd_buf,0,count,render_obj->GetBuffer(),render_obj->GetOffset());
2019-04-25 14:10:18 +08:00
IndexBuffer *indices_buffer=render_obj->GetIndexBuffer();
2019-04-25 14:10:18 +08:00
if(indices_buffer)
2019-07-06 16:46:19 +08:00
vkCmdBindIndexBuffer(cmd_buf,indices_buffer->GetBuffer(),render_obj->GetIndexOffset(),indices_buffer->GetType());
2019-04-25 14:10:18 +08:00
2019-04-18 22:10:24 +08:00
return(true);
}
VK_NAMESPACE_END