preparing VKIndirectCommandBuffer.h

This commit is contained in:
hyzboy 2024-05-30 01:14:27 +08:00
parent cc80fe7f39
commit bf7c6bdeac
9 changed files with 58 additions and 8 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 3c382665efe376af10b231f603344cfd8a5758e8 Subproject commit ee2bf2b9b854871b7af3c5e46007fe979119a338

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include<hgl/graph/RenderNode.h> #include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKVABList.h> #include<hgl/graph/VKVABList.h>
#include<hgl/type/SortedSets.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
class RenderAssignBuffer; class RenderAssignBuffer;
@ -37,6 +38,8 @@ private:
void Set(Renderable *); void Set(Renderable *);
}; };
SortedSets<const VDM *> vdm_set;
DataArray<RenderItem> ri_array; DataArray<RenderItem> ri_array;
uint ri_count; uint ri_count;
@ -48,7 +51,7 @@ protected:
Pipeline * last_pipeline; Pipeline * last_pipeline;
const PrimitiveDataBuffer * last_data_buffer; const PrimitiveDataBuffer * last_data_buffer;
const VertexDataManager * last_vdm; const VDM * last_vdm;
const PrimitiveRenderData * last_render_data; const PrimitiveRenderData * last_render_data;
bool BindVAB(const PrimitiveDataBuffer *,const uint); bool BindVAB(const PrimitiveDataBuffer *,const uint);

View File

@ -104,6 +104,8 @@ class Primitive;
class Renderable; class Renderable;
class VertexDataManager; class VertexDataManager;
using VDM=VertexDataManager;
class RenderResource; class RenderResource;
enum class SharingMode enum class SharingMode

View File

@ -0,0 +1,37 @@
#pragma once
#include<hgl/graph/VKBuffer.h>
VK_NAMESPACE_BEGIN
class IndirectCommandBuffer:public DeviceBuffer
{
protected:
uint32_t max_count;
uint32_t stride;
private:
friend class GPUDevice;
IndirectCommandBuffer(VkDevice d,const DeviceBufferData &vb,const uint32_t mc,const uint32_t s):DeviceBuffer(d,vb)
{
max_count=mc;
stride=s;
}
~IndirectCommandBuffer()=default;
const uint32_t GetMaxCount ()const { return max_count; }
const VkDeviceSize GetTotalBytes()const { return stride*max_count; }
void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);}
void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride);}
void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);}
bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);}
bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);}
};//class IndirectCommandBuffer:public DeviceBuffer
VK_NAMESPACE_END

View File

@ -1,5 +1,4 @@
#ifndef HGL_GRAPH_RENDERABLE_INCLUDE #pragma once
#define HGL_GRAPH_RENDERABLE_INCLUDE
#include<hgl/graph/VKPrimitive.h> #include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VKPipeline.h> #include<hgl/graph/VKPipeline.h>
@ -69,7 +68,7 @@ public:
}; };
/** /**
* <br> * ()
*/ */
class Renderable ///可渲染对象实例 class Renderable ///可渲染对象实例
{ {
@ -111,4 +110,3 @@ public:
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_RENDERABLE_INCLUDE

View File

@ -32,12 +32,12 @@ namespace hgl
const uint32_t GetStride()const { return stride; } const uint32_t GetStride()const { return stride; }
const uint32_t GetCount ()const { return count; } const uint32_t GetCount ()const { return count; }
const VkDeviceSize GetBytes()const { return stride*count; } const VkDeviceSize GetTotalBytes()const { return stride*count; }
public: public:
void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);}
void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride); } void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride);}
void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);}
bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);}

View File

@ -57,4 +57,6 @@ public:
IndexBuffer *GetIBO(){return ibo;} IndexBuffer *GetIBO(){return ibo;}
VAB *GetVAB(const uint index){return vab[index];} VAB *GetVAB(const uint index){return vab[index];}
};//class VertexDataManager };//class VertexDataManager
using VDM=VertexDataManager;
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -236,6 +236,7 @@ SOURCE_GROUP("Vulkan\\Render Pass" FILES ${VK_RENDER_PASS_SOURCE})
SOURCE_GROUP("Vulkan\\Render Context" FILES ${VK_RENDER_CONTEXT_SOURCE}) SOURCE_GROUP("Vulkan\\Render Context" FILES ${VK_RENDER_CONTEXT_SOURCE})
SET(VK_CMD_BUFFER_SOURCE ${SG_INCLUDE_PATH}/VKCommandBuffer.h SET(VK_CMD_BUFFER_SOURCE ${SG_INCLUDE_PATH}/VKCommandBuffer.h
${SG_INCLUDE_PATH}/VKIndirectCommandBuffer.h
Vulkan/VKCommandBuffer.cpp Vulkan/VKCommandBuffer.cpp
Vulkan/VKCommandBufferRender.cpp) Vulkan/VKCommandBufferRender.cpp)

View File

@ -135,6 +135,9 @@ void MaterialRenderList::Stat()
last_vdm =ri->pdb->vdm; last_vdm =ri->pdb->vdm;
last_render_data=ri->prd; last_render_data=ri->prd;
if(last_vdm)
vdm_set.Add(last_vdm);
++rn; ++rn;
for(uint i=1;i<count;i++) for(uint i=1;i<count;i++)
@ -174,8 +177,12 @@ void MaterialRenderList::Stat()
last_vdm =ri->pdb->vdm; last_vdm =ri->pdb->vdm;
last_render_data=ri->prd; last_render_data=ri->prd;
if(last_vdm)
vdm_set.Add(last_vdm);
++rn; ++rn;
} }
} }
bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *pdb,const uint ri_index) bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *pdb,const uint ri_index)