#include #include #include VK_NAMESPACE_BEGIN RenderableInstance::RenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p,const uint32_t count,VkBuffer *bl,VkDeviceSize *bs) { render_obj=r; mat_inst=mi; pipeline=p; buffer_count=count; buffer_list=bl; buffer_size=bs; } RenderableInstance::~RenderableInstance() { //需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码 delete[] buffer_list; delete[] buffer_size; } RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p) { if(!r||!mi||!p)return(nullptr); Material *mtl=mi->GetMaterial(); if(!mtl)return(nullptr); const VertexShaderModule *vsm=mtl->GetVertexShaderModule(); const ShaderStageList &ssl=vsm->GetStageInputs(); const int input_count=ssl.GetCount(); if(r->GetBufferCount() buffer_list=new VkBuffer[input_count]; AutoDeleteArray buffer_size=new VkDeviceSize[input_count]; ShaderStage **ss=ssl.GetData(); VAB *vab; const VkVertexInputBindingDescription *desc; const VkVertexInputAttributeDescription *attr; for(int i=0;iGetDesc(i); attr=vsm->GetAttr(i); vab=r->GetVAB((*ss)->name,buffer_size+i); if(!vab)return(nullptr); if(vab->GetFormat()!=attr->format)return(nullptr); if(vab->GetStride()!=desc->stride)return(nullptr); buffer_list[i]=vab->GetBuffer(); ++ss; } RenderableInstance *ri=new RenderableInstance(r,mi,p,input_count,buffer_list,buffer_size); buffer_list.Discard(); buffer_size.Discard(); return ri; } VK_NAMESPACE_END