ULRE/inc/hgl/graph/VKCommandBuffer.h

315 lines
12 KiB
C
Raw Normal View History

#pragma once
#include<hgl/graph/VK.h>
2024-05-25 22:57:29 +08:00
#include<hgl/graph/VKVABList.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKDescriptorSet.h>
#include<hgl/graph/Mesh.h>
#include<hgl/color/Color4f.h>
VK_NAMESPACE_BEGIN
class VulkanCmdBuffer
2019-04-18 22:10:24 +08:00
{
protected:
const VulkanDevAttr *dev_attr;
2019-04-18 22:10:24 +08:00
VkCommandBuffer cmd_buf;
2019-04-16 13:21:21 +08:00
bool cmd_begin;
public:
VulkanCmdBuffer(const VulkanDevAttr *attr,VkCommandBuffer cb);
virtual ~VulkanCmdBuffer();
operator VkCommandBuffer(){return cmd_buf;}
operator const VkCommandBuffer()const{return cmd_buf;}
operator const VkCommandBuffer *()const{return &cmd_buf;}
const bool IsBegin()const{return cmd_begin;}
virtual bool Begin();
virtual bool End()
{
if(!cmd_begin)
return(false);
cmd_begin=false;
return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS);
}
2021-11-23 11:54:54 +08:00
#ifdef _DEBUG
2024-07-26 03:25:09 +08:00
void SetDebugName(const AnsiString &);
void BeginRegion(const AnsiString &,const Color4f &);
2021-11-23 11:54:54 +08:00
void EndRegion();
#else
2024-07-26 03:25:09 +08:00
void BeginRegion(const AnsiString &,const Color4f &){}
2021-11-23 11:54:54 +08:00
void EndRegion(){}
#endif//_DEBUG
};//class VulkanCmdBuffer
class DescriptorBinding;
2025-06-07 01:39:27 +08:00
using DescriptorBindingPtr=DescriptorBinding *;
2025-06-07 01:39:27 +08:00
using DescriptorBindingPtrArray=DescriptorBindingPtr[size_t(DescriptorSetType::RANGE_SIZE)];
class RenderCmdBuffer:public VulkanCmdBuffer
{
uint32_t cv_count;
VkClearValue *clear_values;
2019-04-18 22:10:24 +08:00
VkRect2D render_area;
VkViewport viewport;
RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout;
/*
* desc绑定会全部使用这些自动绑定器绑定
*
2025-06-07 01:39:27 +08:00
*
* DescriptSetType::RenderTarget RenderTarget模块设置
* DescriptSetType::Scene Scene模块设置
*/
2025-06-07 01:39:27 +08:00
DescriptorBindingPtrArray desc_binding{};
private:
void SetClear();
2019-04-16 13:21:21 +08:00
public:
RenderCmdBuffer(const VulkanDevAttr *attr,VkCommandBuffer cb);
~RenderCmdBuffer();
bool SetDescriptorBinding(DescriptorBinding *);
bool End() override
{
hgl_zero(desc_binding);
return VulkanCmdBuffer::End();
}
2019-04-18 22:10:24 +08:00
void SetRenderArea(const VkRect2D &ra){render_area=ra;}
void SetRenderArea(const VkExtent2D &);
void SetViewport(const VkViewport &vp){viewport=vp;}
void SetClearColor(uint32_t index,const Color4f &cc)
{
if(index>=cv_count)return;
2023-07-29 01:54:01 +08:00
hgl_cpy(clear_values[index].color.float32,cc.rgba,4);
}
void SetClearDepthStencil(uint32_t index,float d=1.0f,float s=0)
{
if(index>=cv_count)return;
VkClearValue *cv=clear_values+index;
cv->depthStencil.depth=d;
cv->depthStencil.stencil=s;
}
2019-04-25 11:42:00 +08:00
//以上设定在Begin开始后即不可改变
bool BindFramebuffer(Framebuffer *);
bool BeginRenderPass();
2022-08-18 19:01:08 +08:00
void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);}
void EndRenderPass(){vkCmdEndRenderPass(cmd_buf);}
void BeginRendering(const VkRenderingInfoKHR *ri)
{
if(!ri)return;
vkCmdBeginRenderingKHR(cmd_buf,ri);
}
void EndRendering()
{
vkCmdEndRenderingKHR(cmd_buf);
}
bool BindPipeline(Pipeline *p)
{
if(!p)return(false);
vkCmdBindPipeline(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,*p);
return(true);
}
bool BindDescriptorSets(DescriptorSet *dsl)
{
if(!dsl)return(false);
pipeline_layout=dsl->GetPipelineLayout();
2021-06-16 20:29:25 +08:00
const VkDescriptorSet ds=dsl->GetDescriptorSet();
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,0,1,&ds,0,nullptr);
return(true);
}
bool BindDescriptorSets(DescriptorSet *dsl,const uint32_t offset)
{
if(!dsl)return(false);
pipeline_layout=dsl->GetPipelineLayout();
2021-06-16 20:29:25 +08:00
const VkDescriptorSet ds=dsl->GetDescriptorSet();
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,0,1,&ds,1,&offset);
return(true);
}
bool BindDescriptorSets(VkPipelineLayout pipeline_layout,const uint32_t first_set,const VkDescriptorSet *ds_list,const uint32_t ds_count,const uint32_t *offset,const uint32_t offset_count)
2021-06-16 20:29:25 +08:00
{
if(!ds_list||ds_count<=0)return(false);
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,first_set,ds_count,ds_list,offset_count,offset);
2021-06-16 20:29:25 +08:00
return(true);
}
bool BindDescriptorSets(Material *);
2021-06-16 20:29:25 +08:00
bool PushDescriptorSet(VkPipelineLayout pipeline_layout,uint32_t set,uint32_t count,const VkWriteDescriptorSet *write_desc_set)
{
vkCmdPushDescriptorSetKHR(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,set,count,write_desc_set);
}
void PushConstants(VkShaderStageFlagBits shader_stage_bit,uint32_t offset,uint32_t size,const void *pValues)
2019-05-28 20:12:55 +08:00
{
2020-06-09 19:40:08 +08:00
vkCmdPushConstants(cmd_buf,pipeline_layout,(VkShaderStageFlagBits)shader_stage_bit,offset,size,pValues);
2019-05-28 20:12:55 +08:00
}
void PushConstants(const void *data,const uint32_t size) {vkCmdPushConstants(cmd_buf,pipeline_layout,VK_SHADER_STAGE_VERTEX_BIT,0, size,data);}
void PushConstants(const void *data,const uint32_t offset,const uint32_t size) {vkCmdPushConstants(cmd_buf,pipeline_layout,VK_SHADER_STAGE_VERTEX_BIT,offset, size,data);}
2024-05-25 22:57:29 +08:00
void BindVAB(const uint32_t first,const uint32_t count,const VkBuffer *vab,const VkDeviceSize *offsets)
{
2024-04-24 01:38:55 +08:00
vkCmdBindVertexBuffers(cmd_buf,first,count,vab,offsets);
}
2024-05-25 22:57:29 +08:00
bool BindVAB(VABList *vab_list)
{
2024-05-25 22:57:29 +08:00
if(!vab_list)return(false);
2024-05-25 22:57:29 +08:00
if(!vab_list->IsFull())return(false);
2024-05-28 02:21:33 +08:00
vkCmdBindVertexBuffers(cmd_buf,
0, //first binding
vab_list->vab_count, //binding count
vab_list->vab_list, //buffers
vab_list->vab_offset); //buffer offsets
return(true);
}
void BindIBO(IndexBuffer *,const VkDeviceSize byte_offset=0);
bool BindDataBuffer(const MeshDataBuffer *);
2019-04-25 11:42:00 +08:00
2019-05-28 16:50:22 +08:00
void SetViewport (uint32_t first,uint32_t count,const VkViewport *vp) {vkCmdSetViewport(cmd_buf,first,count,vp);}
void SetScissor (uint32_t first,uint32_t count,const VkRect2D *sci) {vkCmdSetScissor(cmd_buf,first,count,sci);}
2019-04-25 11:42:00 +08:00
2019-05-28 16:50:22 +08:00
void SetDepthBias (float constant_factor,float clamp,float slope_factor) {vkCmdSetDepthBias(cmd_buf,constant_factor,clamp,slope_factor);}
void SetDepthBounds (float min_db,float max_db) {vkCmdSetDepthBounds(cmd_buf,min_db,max_db);}
void SetBlendConstants (const float constants[4]) {vkCmdSetBlendConstants(cmd_buf,constants);}
2019-04-25 11:38:57 +08:00
2019-05-28 16:50:22 +08:00
void SetStencilCompareMask (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilCompareMask(cmd_buf,faceMask,compareMask);}
void SetStencilWriteMask (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilWriteMask(cmd_buf,faceMask,compareMask);}
void SetStencilReference (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilReference(cmd_buf,faceMask,compareMask);}
2020-10-19 22:26:42 +08:00
public: //draw
2019-05-28 16:50:22 +08:00
void Draw (const uint32_t vertex_count) {vkCmdDraw(cmd_buf,vertex_count,1,0,0);}
void DrawIndexed (const uint32_t index_count ) {vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
void Draw (const uint32_t vertex_count,const uint32_t instance_count) {vkCmdDraw(cmd_buf,vertex_count,instance_count,0,0);}
void DrawIndexed (const uint32_t index_count ,const uint32_t instance_count) {vkCmdDrawIndexed(cmd_buf,index_count,instance_count,0,0,0);}
void DrawIndexed (const uint32_t index_count ,const uint32_t instance_count,const uint32_t firstIndex,const int32_t vertexOffset,const uint32_t firstInstance)
{
vkCmdDrawIndexed(cmd_buf,
index_count,
instance_count,
firstIndex,
vertexOffset,
firstInstance);
}
// template<typename ...ARGS> void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
// template<typename ...ARGS> void DrawIndexed (ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);}
void DrawIndirect (VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand ));
void DrawIndexedIndirect(VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand ));
void DrawIndirect (VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand )){return DrawIndirect( buf,0,drawCount,stride);}
void DrawIndexedIndirect(VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand )){return DrawIndexedIndirect( buf,0,drawCount,stride);}
2019-04-25 11:42:00 +08:00
void Draw (const MeshDataBuffer *prb,const MeshRenderData *prd,const uint32_t instance_count=1,const uint32_t first_instance=0);
public: //dynamic state
public:
2025-05-18 02:03:16 +08:00
void Render(Mesh *ri)
{
if(!ri)return;
BindPipeline(ri->GetPipeline());
BindDescriptorSets(ri->GetMaterial());
BindDataBuffer(ri->GetDataBuffer());
Draw(ri->GetDataBuffer(),ri->GetRenderData());
}
};//class RenderCmdBuffer:public VulkanCmdBuffer
class TextureCmdBuffer:public VulkanCmdBuffer
{
2021-12-15 14:24:35 +08:00
VkImageMemoryBarrier imageMemoryBarrier;
public:
TextureCmdBuffer(const VulkanDevAttr *attr,VkCommandBuffer cb):VulkanCmdBuffer(attr,cb)
2021-12-15 14:24:35 +08:00
{
imageMemoryBarrier.sType=VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imageMemoryBarrier.pNext=nullptr;
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
}
template<typename ...ARGS> void PipelineBarrier (ARGS...args){vkCmdPipelineBarrier (cmd_buf,args...);}
template<typename ...ARGS> void CopyBufferToImage (ARGS...args){vkCmdCopyBufferToImage(cmd_buf,args...);}
template<typename ...ARGS> void CopyImageToBuffer (ARGS...args){vkCmdCopyImageToBuffer(cmd_buf,args...);}
template<typename ...ARGS> void BlitImage (ARGS...args){vkCmdBlitImage (cmd_buf,args...);}
2021-12-15 14:24:35 +08:00
void ImageMemoryBarrier(VkImage image,
VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask,
VkAccessFlags srcAccessMask,
VkAccessFlags dstAccessMask,
VkImageLayout oldImageLayout,
VkImageLayout newImageLayout,
VkImageSubresourceRange subresourceRange)
{
imageMemoryBarrier.srcAccessMask = srcAccessMask;
imageMemoryBarrier.dstAccessMask = dstAccessMask;
imageMemoryBarrier.oldLayout = oldImageLayout;
imageMemoryBarrier.newLayout = newImageLayout;
imageMemoryBarrier.image = image;
imageMemoryBarrier.subresourceRange = subresourceRange;
vkCmdPipelineBarrier( cmd_buf,
srcStageMask,
dstStageMask,
0,
0, nullptr,
0, nullptr,
1, &imageMemoryBarrier);
}
};//class TextureCmdBuffer:public VulkanCmdBuffer
VK_NAMESPACE_END