将cmd_buf,SceneDB转移到VulkanApplicationFramework中,以减少每个Example中的代码

This commit is contained in:
hyzboy 2019-06-11 23:14:13 +08:00
parent 029d00b28e
commit a33d76da09
10 changed files with 136 additions and 354 deletions

View File

@ -29,9 +29,6 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
SceneDB * db =nullptr;
SceneNode render_root; SceneNode render_root;
RenderList render_list; RenderList render_list;
@ -45,16 +42,6 @@ private:
vulkan::Buffer * ubo_mvp =nullptr; vulkan::Buffer * ubo_mvp =nullptr;
vulkan::Pipeline * pipeline =nullptr; vulkan::Pipeline * pipeline =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
public:
~TestApp()
{
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
}
private: private:
@ -152,27 +139,7 @@ private:
render_root.ExpendToList(&render_list); render_root.ExpendToList(&render_list);
return(true); BuildCommandBuffer(&render_list);
}
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
render_list.Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true); return(true);
} }
@ -183,10 +150,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
db=new SceneDB(device);
if(!InitMaterial()) if(!InitMaterial())
return(false); return(false);
@ -201,20 +164,8 @@ public:
if(!InitScene()) if(!InitScene())
return(false); return(false);
if(!InitCommandBuffer())
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
int main(int,char **) int main(int,char **)

View File

@ -10,16 +10,13 @@
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=256; constexpr uint32_t SCREEN_WIDTH=128;
constexpr uint32_t SCREEN_HEIGHT=256; constexpr uint32_t SCREEN_HEIGHT=128;
class TestApp:public VulkanApplicationFramework class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
SceneDB * db =nullptr;
SceneNode render_root; SceneNode render_root;
RenderList render_list; RenderList render_list;
@ -33,16 +30,6 @@ private:
vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr;
vulkan::Pipeline * pipeline_line =nullptr; vulkan::Pipeline * pipeline_line =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
public:
~TestApp()
{
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
}
private: private:
@ -73,34 +60,32 @@ private:
void CreateRenderObject() void CreateRenderObject()
{ {
{ struct PlaneGridCreateInfo pgci;
struct PlaneGridCreateInfo pgci;
pgci.coord[0].Set(-100,-100,0); pgci.coord[0].Set(-100,-100,0);
pgci.coord[1].Set( 100,-100,0); pgci.coord[1].Set( 100,-100,0);
pgci.coord[2].Set( 100, 100,0); pgci.coord[2].Set( 100, 100,0);
pgci.coord[3].Set(-100, 100,0); pgci.coord[3].Set(-100, 100,0);
pgci.step.u=20; pgci.step.u=20;
pgci.step.v=20; pgci.step.v=20;
pgci.side_step.u=10; pgci.side_step.u=10;
pgci.side_step.v=10; pgci.side_step.v=10;
pgci.color.Set(0.75,0,0,1); pgci.color.Set(0.75,0,0,1);
pgci.side_color.Set(1,0,0,1); pgci.side_color.Set(1,0,0,1);
ro_plane_grid[0]=CreatePlaneGrid(db,material,&pgci); ro_plane_grid[0]=CreatePlaneGrid(db,material,&pgci);
pgci.color.Set(0,0.75,0,1); pgci.color.Set(0,0.75,0,1);
pgci.side_color.Set(0,1,0,1); pgci.side_color.Set(0,1,0,1);
ro_plane_grid[1]=CreatePlaneGrid(db,material,&pgci); ro_plane_grid[1]=CreatePlaneGrid(db,material,&pgci);
pgci.color.Set(0,0,0.75,1); pgci.color.Set(0,0,0.75,1);
pgci.side_color.Set(0,0,1,1); pgci.side_color.Set(0,0,1,1);
ro_plane_grid[2]=CreatePlaneGrid(db,material,&pgci); ro_plane_grid[2]=CreatePlaneGrid(db,material,&pgci);
}
} }
bool InitUBO() bool InitUBO()
@ -153,26 +138,7 @@ private:
render_root.RefreshMatrix(); render_root.RefreshMatrix();
render_root.ExpendToList(&render_list); render_root.ExpendToList(&render_list);
return(true); BuildCommandBuffer(&render_list);
}
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
render_list.Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true); return(true);
} }
@ -184,10 +150,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
db=new SceneDB(device);
InitCamera(); InitCamera();
if(!InitMaterial()) if(!InitMaterial())
@ -204,20 +166,8 @@ public:
if(!InitScene()) if(!InitScene())
return(false); return(false);
if(!InitCommandBuffer())
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
int main(int,char **) int main(int,char **)

View File

@ -4,9 +4,7 @@
#include"VulkanAppFramework.h" #include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h> #include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h> #include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneDB.h>
#include<hgl/graph/RenderableInstance.h> #include<hgl/graph/RenderableInstance.h>
#include<hgl/graph/RenderList.h>
#include"AssimpLoaderMesh.h" #include"AssimpLoaderMesh.h"
#include<hgl/graph/VertexBuffer.h> #include<hgl/graph/VertexBuffer.h>
@ -74,6 +72,7 @@ vulkan::Renderable *CreateMeshRenderable(SceneDB *db,vulkan::Material *mtl,const
else else
render_obj->Set(db->CreateIBO32(mesh->indices32.GetCount(),mesh->indices32.GetData())); render_obj->Set(db->CreateIBO32(mesh->indices32.GetCount(),mesh->indices32.GetData()));
db->Add(render_obj);
return(render_obj); return(render_obj);
} }
@ -81,9 +80,6 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
SceneDB * db =nullptr;
SceneNode render_root; SceneNode render_root;
RenderList render_list; RenderList render_list;
@ -95,21 +91,20 @@ private:
vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr;
vulkan::Pipeline * pipeline_line =nullptr; vulkan::Pipeline * pipeline_line =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
private: private:
ModelData *model_data; ModelData *model_data;
vulkan::Renderable **mesh_renderable; vulkan::Renderable **mesh_renderable;
RenderableInstance **mesh_renderable_instance;
public: public:
~TestApp() ~TestApp()
{ {
SAFE_CLEAR(db); delete[] mesh_renderable_instance;
delete[] mesh_renderable;
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
} }
private: private:
@ -151,11 +146,13 @@ private:
const uint count=model_data->mesh_data.GetCount(); const uint count=model_data->mesh_data.GetCount();
MeshData **md=model_data->mesh_data.GetData(); MeshData **md=model_data->mesh_data.GetData();
mesh_renderable=new vulkan::Renderable *[count]; mesh_renderable =new vulkan::Renderable *[count];
mesh_renderable_instance=new RenderableInstance *[count];
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
mesh_renderable[i]=CreateMeshRenderable(db,material,*md); mesh_renderable[i]=CreateMeshRenderable(db,material,*md);
mesh_renderable_instance[i]=db->CreateRenderableInstance(pipeline_line,descriptor_sets,mesh_renderable[i]);
++md; ++md;
} }
} }
@ -200,7 +197,7 @@ private:
return pipeline_line; return pipeline_line;
} }
void CreateRenderableInstance(SceneNode *scene_node,ModelSceneNode *model_node) void CreateSceneNode(SceneNode *scene_node,ModelSceneNode *model_node)
{ {
scene_node->SetLocalMatrix(model_node->local_matrix); scene_node->SetLocalMatrix(model_node->local_matrix);
@ -210,7 +207,7 @@ private:
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
scene_node->Add(db->CreateRenderableInstance(pipeline_line,descriptor_sets,mesh_renderable[*mesh_index])); scene_node->Add(mesh_renderable_instance[*mesh_index]);
++mesh_index; ++mesh_index;
} }
@ -222,7 +219,7 @@ private:
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
CreateRenderableInstance(scene_node->CreateSubNode(),*sub_model_node); CreateSceneNode(scene_node->CreateSubNode(),*sub_model_node);
++sub_model_node; ++sub_model_node;
} }
@ -231,32 +228,12 @@ private:
bool InitScene() bool InitScene()
{ {
CreateRenderableInstance(&render_root,model_data->root_node); CreateSceneNode(&render_root,model_data->root_node);
render_root.RefreshMatrix(); render_root.RefreshMatrix();
render_root.ExpendToList(&render_list); render_root.ExpendToList(&render_list);
return(true); BuildCommandBuffer(&render_list);
}
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
render_list.Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true); return(true);
} }
@ -272,15 +249,9 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
db=new SceneDB(device);
if(!InitMaterial()) if(!InitMaterial())
return(false); return(false);
CreateRenderObject();
InitCamera(); InitCamera();
if(!InitUBO()) if(!InitUBO())
@ -289,23 +260,13 @@ public:
if(!InitPipeline()) if(!InitPipeline())
return(false); return(false);
CreateRenderObject();
if(!InitScene()) if(!InitScene())
return(false); return(false);
if(!InitCommandBuffer())
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
#ifdef _WIN32 #ifdef _WIN32

View File

@ -12,18 +12,15 @@
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=256; constexpr uint32_t SCREEN_WIDTH=128;
constexpr uint32_t SCREEN_HEIGHT=256; constexpr uint32_t SCREEN_HEIGHT=128;
class TestApp:public VulkanApplicationFramework class TestApp:public VulkanApplicationFramework
{ {
private: private:
double start_time; double start_time;
uint swap_chain_count=0;
SceneDB * db =nullptr;
SceneNode render_root; SceneNode render_root;
RenderList render_list; RenderList render_list;
@ -37,7 +34,6 @@ private:
vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr;
vulkan::Pipeline * pipeline_line =nullptr; vulkan::Pipeline * pipeline_line =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
public: public:
@ -46,12 +42,7 @@ public:
start_time=GetDoubleTime(); start_time=GetDoubleTime();
} }
~TestApp() ~TestApp()=default;
{
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
}
private: private:
@ -150,32 +141,14 @@ private:
cur_node->Add(ri,translate(0,0,size*n*1.01)); cur_node->Add(ri,translate(0,0,size*n*1.01));
} }
render_root.RefreshMatrix();
render_list.Clear();
render_root.ExpendToList(&render_list);
BuildCommandBuffer(&render_list);
return(true); return(true);
} }
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateCommandBuffer();
return BuildCommandBuffer();
}
bool BuildCommandBuffer()
{
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
render_list.Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true);
}
public: public:
@ -184,10 +157,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
db=new SceneDB(device);
InitCamera(); InitCamera();
if(!InitMaterial()) if(!InitMaterial())
@ -204,17 +173,12 @@ public:
if(!InitScene()) if(!InitScene())
return(false); return(false);
if(!InitCommandBuffer())
return(false);
return(true); return(true);
} }
void Draw() override void Draw() override
{ {
vulkan::CommandBuffer *cb=cmd_buf[device->GetCurrentFrameIndices()]; VulkanApplicationFramework::Draw();
Submit(*cb);
Matrix4f rot=rotate(GetDoubleTime()-start_time,camera.up_vector); Matrix4f rot=rotate(GetDoubleTime()-start_time,camera.up_vector);
@ -222,7 +186,7 @@ public:
render_list.Clear(); render_list.Clear();
render_root.ExpendToList(&render_list); render_root.ExpendToList(&render_list);
BuildCommandBuffer(); BuildCommandBuffer(&render_list);
} }
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework

View File

@ -15,6 +15,8 @@
#include<hgl/graph/vulkan/VKFormat.h> #include<hgl/graph/vulkan/VKFormat.h>
#include<hgl/graph/vulkan/VKFramebuffer.h> #include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKMaterial.h> #include<hgl/graph/vulkan/VKMaterial.h>
#include<hgl/graph/SceneDB.h>
#include<hgl/graph/RenderList.h>
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
@ -31,10 +33,23 @@ protected:
vulkan::Device * device =nullptr; vulkan::Device * device =nullptr;
vulkan::ShaderModuleManage *shader_manage =nullptr; vulkan::ShaderModuleManage *shader_manage =nullptr;
private:
uint32_t swap_chain_count=0;
vulkan::CommandBuffer ** cmd_buf =nullptr;
protected:
SceneDB * db =nullptr;
public: public:
virtual ~VulkanApplicationFramework() virtual ~VulkanApplicationFramework()
{ {
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR(shader_manage); SAFE_CLEAR(shader_manage);
SAFE_CLEAR(win); //win中会删除device所以必须放在instance前删除 SAFE_CLEAR(win); //win中会删除device所以必须放在instance前删除
SAFE_CLEAR(inst); SAFE_CLEAR(inst);
@ -67,9 +82,61 @@ public:
return(false); return(false);
shader_manage=device->CreateShaderModuleManage(); shader_manage=device->CreateShaderModuleManage();
swap_chain_count = device->GetSwapChainImageCount();
{
cmd_buf = hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for (uint i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateCommandBuffer();
}
db=new SceneDB(device);
return(true); return(true);
} }
void BuildCommandBuffer(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r)
{
if(!p||!ds||!r)
return;
const vulkan::IndexBuffer *ib=r->GetIndexBuffer();
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
cmd_buf[i]->Bind(p);
cmd_buf[i]->Bind(ds);
cmd_buf[i]->Bind(r);
if (ib)
cmd_buf[i]->DrawIndexed(ib->GetCount());
else
cmd_buf[i]->Draw(r->GetDrawCount());
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
}
void BuildCommandBuffer(RenderList *rl)
{
if(!rl)return;
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
rl->Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
}
private:
void AcquireNextFrame() void AcquireNextFrame()
{ {
device->AcquireNextImage(); device->AcquireNextImage();
@ -82,7 +149,14 @@ public:
device->QueuePresent(); device->QueuePresent();
} }
virtual void Draw()=0; public:
virtual void Draw()
{
const vulkan::CommandBuffer *cb=cmd_buf[device->GetCurrentFrameIndices()];
Submit(*cb);
}
bool Run() bool Run()
{ {

View File

@ -37,15 +37,12 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
vulkan::Material * material =nullptr; vulkan::Material * material =nullptr;
vulkan::DescriptorSets * descriptor_sets =nullptr; vulkan::DescriptorSets * descriptor_sets =nullptr;
vulkan::Renderable * render_obj =nullptr; vulkan::Renderable * render_obj =nullptr;
vulkan::Buffer * ubo_mvp =nullptr; vulkan::Buffer * ubo_mvp =nullptr;
vulkan::Pipeline * pipeline =nullptr; vulkan::Pipeline * pipeline =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
vulkan::VertexBuffer * vertex_buffer =nullptr; vulkan::VertexBuffer * vertex_buffer =nullptr;
vulkan::IndexBuffer * index_buffer =nullptr; vulkan::IndexBuffer * index_buffer =nullptr;
@ -56,7 +53,6 @@ public:
{ {
SAFE_CLEAR(index_buffer); SAFE_CLEAR(index_buffer);
SAFE_CLEAR(vertex_buffer); SAFE_CLEAR(vertex_buffer);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR(pipeline); SAFE_CLEAR(pipeline);
SAFE_CLEAR(ubo_mvp); SAFE_CLEAR(ubo_mvp);
SAFE_CLEAR(render_obj); SAFE_CLEAR(render_obj);
@ -122,30 +118,6 @@ private:
return pipeline; return pipeline;
} }
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
cmd_buf[i]->Bind(pipeline);
cmd_buf[i]->Bind(descriptor_sets);
cmd_buf[i]->Bind(render_obj);
cmd_buf[i]->DrawIndexed(INDEX_COUNT);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true);
}
public: public:
bool Init() bool Init()
@ -153,8 +125,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
if(!InitMaterial()) if(!InitMaterial())
return(false); return(false);
@ -165,21 +135,11 @@ public:
if(!InitPipeline()) if(!InitPipeline())
return(false); return(false);
if(!InitCommandBuffer()) BuildCommandBuffer(pipeline,descriptor_sets,render_obj);
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
int main(int,char **) int main(int,char **)

View File

@ -38,15 +38,12 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
vulkan::Material * material =nullptr; vulkan::Material * material =nullptr;
vulkan::DescriptorSets * descriptor_sets =nullptr; vulkan::DescriptorSets * descriptor_sets =nullptr;
vulkan::Renderable * render_obj =nullptr; vulkan::Renderable * render_obj =nullptr;
vulkan::Buffer * ubo_mvp =nullptr; vulkan::Buffer * ubo_mvp =nullptr;
vulkan::Pipeline * pipeline =nullptr; vulkan::Pipeline * pipeline =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
vulkan::VertexBuffer * vertex_buffer =nullptr; vulkan::VertexBuffer * vertex_buffer =nullptr;
vulkan::VertexBuffer * color_buffer =nullptr; vulkan::VertexBuffer * color_buffer =nullptr;
@ -57,7 +54,6 @@ public:
{ {
SAFE_CLEAR(color_buffer); SAFE_CLEAR(color_buffer);
SAFE_CLEAR(vertex_buffer); SAFE_CLEAR(vertex_buffer);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR(pipeline); SAFE_CLEAR(pipeline);
SAFE_CLEAR(ubo_mvp); SAFE_CLEAR(ubo_mvp);
SAFE_CLEAR(render_obj); SAFE_CLEAR(render_obj);
@ -136,30 +132,6 @@ private:
return pipeline; return pipeline;
} }
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
cmd_buf[i]->Bind(pipeline);
cmd_buf[i]->Bind(descriptor_sets);
cmd_buf[i]->Bind(render_obj);
cmd_buf[i]->Draw(VERTEX_COUNT);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true);
}
public: public:
bool Init() bool Init()
@ -167,8 +139,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
if(!InitMaterial()) if(!InitMaterial())
return(false); return(false);
@ -180,20 +150,10 @@ public:
if(!InitPipeline()) if(!InitPipeline())
return(false); return(false);
if(!InitCommandBuffer()) BuildCommandBuffer(pipeline,descriptor_sets,render_obj);
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
int main(int,char **) int main(int,char **)

View File

@ -51,17 +51,14 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
uint swap_chain_count=0;
vulkan::Material * material =nullptr; vulkan::Material * material =nullptr;
vulkan::Texture2D * texture =nullptr; vulkan::Texture2D * texture =nullptr;
vulkan::Sampler * sampler =nullptr; vulkan::Sampler * sampler =nullptr;
vulkan::DescriptorSets * desciptor_sets =nullptr; vulkan::DescriptorSets * descriptor_sets =nullptr;
vulkan::Renderable * render_obj =nullptr; vulkan::Renderable * render_obj =nullptr;
vulkan::Buffer * ubo_mvp =nullptr; vulkan::Buffer * ubo_mvp =nullptr;
vulkan::Pipeline * pipeline =nullptr; vulkan::Pipeline * pipeline =nullptr;
vulkan::CommandBuffer ** cmd_buf =nullptr;
vulkan::VertexBuffer * vertex_buffer =nullptr; vulkan::VertexBuffer * vertex_buffer =nullptr;
vulkan::VertexBuffer * tex_coord_buffer =nullptr; vulkan::VertexBuffer * tex_coord_buffer =nullptr;
@ -74,11 +71,10 @@ public:
SAFE_CLEAR(index_buffer); SAFE_CLEAR(index_buffer);
SAFE_CLEAR(tex_coord_buffer); SAFE_CLEAR(tex_coord_buffer);
SAFE_CLEAR(vertex_buffer); SAFE_CLEAR(vertex_buffer);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR(pipeline); SAFE_CLEAR(pipeline);
SAFE_CLEAR(ubo_mvp); SAFE_CLEAR(ubo_mvp);
SAFE_CLEAR(render_obj); SAFE_CLEAR(render_obj);
SAFE_CLEAR(desciptor_sets); SAFE_CLEAR(descriptor_sets);
SAFE_CLEAR(sampler); SAFE_CLEAR(sampler);
SAFE_CLEAR(texture); SAFE_CLEAR(texture);
SAFE_CLEAR(material); SAFE_CLEAR(material);
@ -94,7 +90,7 @@ private:
return(false); return(false);
render_obj=material->CreateRenderable(VERTEX_COUNT); render_obj=material->CreateRenderable(VERTEX_COUNT);
desciptor_sets=material->CreateDescriptorSets(); descriptor_sets=material->CreateDescriptorSets();
texture=vulkan::LoadTGATexture(OS_TEXT("lena.tga"),device); texture=vulkan::LoadTGATexture(OS_TEXT("lena.tga"),device);
@ -113,9 +109,9 @@ private:
sampler=device->CreateSampler(&sampler_create_info); sampler=device->CreateSampler(&sampler_create_info);
desciptor_sets->BindSampler(material->GetSampler("texture_lena"),texture,sampler); descriptor_sets->BindSampler(material->GetSampler("texture_lena"),texture,sampler);
desciptor_sets->BindUBO(material->GetUBO("world"),*ubo_mvp); descriptor_sets->BindUBO(material->GetUBO("world"),*ubo_mvp);
desciptor_sets->Update(); descriptor_sets->Update();
return(true); return(true);
} }
@ -159,30 +155,6 @@ private:
return pipeline; return pipeline;
} }
bool InitCommandBuffer()
{
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
{
cmd_buf[i]=device->CreateCommandBuffer();
if(!cmd_buf[i])
return(false);
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
cmd_buf[i]->Bind(pipeline);
cmd_buf[i]->Bind(desciptor_sets);
cmd_buf[i]->Bind(render_obj);
cmd_buf[i]->DrawIndexed(INDEX_COUNT);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
return(true);
}
public: public:
bool Init() bool Init()
@ -190,8 +162,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
swap_chain_count=device->GetSwapChainImageCount();
if(!InitUBO()) if(!InitUBO())
return(false); return(false);
@ -203,20 +173,10 @@ public:
if(!InitPipeline()) if(!InitPipeline())
return(false); return(false);
if(!InitCommandBuffer()) BuildCommandBuffer(pipeline,descriptor_sets,render_obj);
return(false);
return(true); return(true);
} }
void Draw() override
{
const uint32_t frame_index=device->GetCurrentFrameIndices();
const vulkan::CommandBuffer *cb=cmd_buf[frame_index];
Submit(*cb);
}
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework
int main(int,char **) int main(int,char **)

View File

@ -369,6 +369,7 @@ namespace hgl
} }
render_obj->Set(db->CreateIBO16(6*2*3,indices)); render_obj->Set(db->CreateIBO16(6*2*3,indices));
db->Add(render_obj);
return(render_obj); return(render_obj);
} }
@ -399,6 +400,7 @@ namespace hgl
delete vertex; delete vertex;
} }
db->Add(render_obj);
return render_obj; return render_obj;
} }

View File

@ -86,7 +86,7 @@ namespace hgl
} }
} }
bool RenderList::Render(vulkan::CommandBuffer *cb) bool RenderList::Render(vulkan::CommandBuffer *cb)
{ {
if(!cb) if(!cb)
return(false); return(false);