ULRE/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp

216 lines
5.5 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>
#include<hgl/graph/VKIndexBuffer.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);
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;
}
2024-03-16 00:41:20 +08:00
else if(clear_values)
2020-10-28 19:49:57 +08:00
{
2024-03-16 00:41:20 +08:00
hgl_free(clear_values);
clear_values=nullptr;
2020-10-28 19:49:57 +08:00
}
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);
pipeline_layout=VK_NULL_HANDLE;
return(true);
}
bool RenderCmdBuffer::BindDescriptorSets(Material *mtl)
2021-06-16 20:29:25 +08:00
{
if(!mtl)return(false);
2021-06-16 20:29:25 +08:00
{
uint32_t count=0;
MaterialParameters *mp;
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)
{
2023-10-12 01:40:59 +08:00
mp->Update();
2021-06-16 20:29:25 +08:00
ds[count]=mp->GetVkDescriptorSet();
++count;
}
}
if(count>0)
{
pipeline_layout=mtl->GetPipelineLayout();
2021-06-16 20:29:25 +08:00
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(IndexBuffer *ibo,VkDeviceSize offset)
{
vkCmdBindIndexBuffer(cmd_buf,
ibo->GetBuffer(),
offset*ibo->GetStride(),
VkIndexType(ibo->GetType()));
}
2024-05-25 22:57:29 +08:00
bool RenderCmdBuffer::BindVAB(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->vab_count<=0)
return(false);
2020-10-28 19:49:57 +08:00
const DrawData *dd=ri->GetDrawData();
if(dd->vertex_count<=0)
return(false);
vkCmdBindVertexBuffers(cmd_buf,0,vid->vab_count,vid->vab_list,dd->vab_offset);
2020-10-28 19:49:57 +08:00
if(vid->ibo&&dd->index_count)
BindIBO(vid->ibo,dd->index_start);
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);
}
void RenderCmdBuffer::Draw(const VertexInputData *vid,const DrawData *dd)
{
if(!vid||!dd)
return;
if (vid->ibo)
DrawIndexed(dd->index_count);
else
Draw(dd->vertex_count);
}
//void RenderCmdBuffer::DrawIndexed(const IBAccess *iba,const uint32_t instance_count)
//{
// if(!iba||instance_count<=0)return;
//
// vkCmdBindIndexBuffer(cmd_buf,
// iba->buffer->GetBuffer(),
// iba->start*iba->buffer->GetStride(),
// VkIndexType(iba->buffer->GetType()));
//
// vkCmdDrawIndexed(cmd_buf,
// iba->count,
// instance_count,
// 0, //first index
// 0, //vertex offset
// 0); //first instance
//}
2020-10-28 19:49:57 +08:00
VK_NAMESPACE_END