ULRE/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp

189 lines
4.8 KiB
C++
Raw Normal View History

2020-10-28 19:49:57 +08:00
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKRenderPass.h>
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKDeviceAttribute.h>
#include<hgl/graph/VKPhysicalDevice.h>
2020-10-28 19:49:57 +08:00
VK_NAMESPACE_BEGIN
RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb):GPUCmdBuffer(attr,cb)
2020-10-28 19:49:57 +08:00
{
cv_count=0;
clear_values=nullptr;
hgl_zero(render_area);
hgl_zero(viewport);
default_line_width=1.0;
fbo=nullptr;
pipeline_layout=VK_NULL_HANDLE;
}
RenderCmdBuffer::~RenderCmdBuffer()
2020-10-28 19:49:57 +08:00
{
if(clear_values)
hgl_free(clear_values);
}
void RenderCmdBuffer::SetFBO(Framebuffer *fb)
2020-10-28 19:49:57 +08:00
{
if(fbo==fb)return;
fbo=fb;
cv_count=fbo->GetAttachmentCount();
if(cv_count>0)
{
clear_values=hgl_align_realloc<VkClearValue>(clear_values,cv_count);
clear_values[cv_count-1].depthStencil.depth = 1.0f;
clear_values[cv_count-1].depthStencil.stencil = 0;
}
else
{
if(clear_values)
{
hgl_free(clear_values);
clear_values=nullptr;
}
}
render_area.offset.x=0;
render_area.offset.y=0;
render_area.extent.width=0;
render_area.extent.height=0;
}
void RenderCmdBuffer::SetRenderArea(const VkExtent2D &ext2d)
2020-10-28 19:49:57 +08:00
{
render_area.offset.x=0;
render_area.offset.y=0;
render_area.extent=ext2d;
}
bool RenderCmdBuffer::BindFramebuffer(RenderPass *rp,Framebuffer *fb)
2020-10-28 19:49:57 +08:00
{
if(!rp||!fb)return(false);
SetFBO(fb);
render_area.offset.x=0;
render_area.offset.y=0;
render_area.extent=fb->GetExtent();
rp_begin.renderPass = rp->GetVkRenderPass();
2020-10-28 19:49:57 +08:00
rp_begin.framebuffer = *fb;
rp_begin.renderArea = render_area;
rp_begin.clearValueCount = cv_count;
rp_begin.pClearValues = clear_values;
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;
return(true);
};
bool RenderCmdBuffer::BeginRenderPass()
2020-10-28 19:49:57 +08:00
{
vkCmdBeginRenderPass(cmd_buf, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
vkCmdSetViewport(cmd_buf,0,1,&viewport);
vkCmdSetScissor(cmd_buf,0,1,&render_area);
vkCmdSetLineWidth(cmd_buf,default_line_width);
pipeline_layout=VK_NULL_HANDLE;
return(true);
}
bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri)
2021-06-16 20:29:25 +08:00
{
if(!ri)return(false);
{
uint32_t count=0;
MaterialParameters *mp;
2023-06-05 21:39:12 +08:00
Material *mtl=ri->GetMaterial();
VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT];
2021-06-16 20:29:25 +08:00
ENUM_CLASS_FOR(DescriptorSetType,int,i)
2021-06-16 20:29:25 +08:00
{
2023-06-05 21:39:12 +08:00
mp=mtl->GetMP((DescriptorSetType)i);
2021-06-16 20:29:25 +08:00
if(mp)
{
ds[count]=mp->GetVkDescriptorSet();
++count;
}
}
if(count>0)
{
pipeline_layout=ri->GetPipelineLayout();
2023-04-21 20:27:28 +08:00
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,0,count,ds,0,0);
2021-06-16 20:29:25 +08:00
}
}
return(true);
2021-06-16 20:29:25 +08:00
}
void RenderCmdBuffer::BindIBO(const IndexBufferData *ibd)
{
vkCmdBindIndexBuffer( cmd_buf,
ibd->buffer->GetBuffer(),
ibd->offset,
VkIndexType(ibd->buffer->GetType()));
}
bool RenderCmdBuffer::BindVBO(Renderable *ri)
2020-10-28 19:49:57 +08:00
{
if(!ri)
return(false);
const VertexInputData *vid=ri->GetVertexInputData();
2020-10-28 19:49:57 +08:00
if(vid->binding_count<=0)
return(false);
2020-10-28 19:49:57 +08:00
vkCmdBindVertexBuffers(cmd_buf,0,vid->binding_count,vid->buffer_list,vid->buffer_offset);
IndexBuffer *indices_buffer=vid->index_buffer->buffer;
2020-10-28 19:49:57 +08:00
if(indices_buffer)
vkCmdBindIndexBuffer(cmd_buf,indices_buffer->GetBuffer(),vid->index_buffer->offset,VkIndexType(indices_buffer->GetType()));
2020-10-28 19:49:57 +08:00
return(true);
}
void RenderCmdBuffer::DrawIndirect( VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
if(this->dev_attr->physical_device->SupportMDI())
vkCmdDrawIndirect(cmd_buf,buffer,offset,drawCount,stride);
else
for(uint32_t i=0;i<drawCount;i++)
vkCmdDrawIndirect(cmd_buf,buffer,offset+i*stride,1,stride);
}
2020-11-17 14:33:10 +08:00
void RenderCmdBuffer::DrawIndexedIndirect( VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
if(this->dev_attr->physical_device->SupportMDI())
vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset,drawCount,stride);
else
for(uint32_t i=0;i<drawCount;i++)
vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset+i*stride,1,stride);
}
2020-10-28 19:49:57 +08:00
VK_NAMESPACE_END