From d3afabc1702f0abbcf3b40a381d3e29adc97d0c7 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 22 Sep 2021 18:08:46 +0800 Subject: [PATCH] merged GetUBO/GetUBODynamic and GetSSBO/GetSSBODynamic at MaterialDescriptorSets --- CMCore | 2 +- example/Vulkan/InlineGeometryScene.cpp | 24 ++++++++++++------- example/common/VulkanAppFramework.h | 5 ++++ inc/hgl/graph/VKArrayBuffer.h | 6 +---- inc/hgl/graph/VKMaterialDescriptorSets.h | 8 +++---- .../Vulkan/VKMaterialParameters.cpp | 4 ++-- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/CMCore b/CMCore index 7cdc5071..2493989c 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 7cdc507194cdbb90aeda83948a712af7c767fd3e +Subproject commit 2493989c5e830bd954c326772b4410580e975c8d diff --git a/example/Vulkan/InlineGeometryScene.cpp b/example/Vulkan/InlineGeometryScene.cpp index e145c914..c460f9b3 100644 --- a/example/Vulkan/InlineGeometryScene.cpp +++ b/example/Vulkan/InlineGeometryScene.cpp @@ -125,8 +125,15 @@ private: material_instance=db->CreateMaterialInstance(material); if(!material_instance)return(false); - material_instance->BindSampler("TexColor" ,texture.color, texture.sampler); - material_instance->BindSampler("TexNormal" ,texture.normal, texture.sampler); + { + MaterialParameters *mp_texture=material_instance->GetMP(DescriptorSetType::Value); + + if(!mp_texture) + return(false); + + mp_texture->BindSampler("TexColor" ,texture.color, texture.sampler); + mp_texture->BindSampler("TexNormal" ,texture.normal, texture.sampler); + } } pipeline_data=GetPipelineData(InlinePipeline::Solid3D); @@ -200,15 +207,13 @@ private: { ubo_light=db->CreateUBO(sizeof(PhongLight),&light); ubo_phong=db->CreateUBO(sizeof(PhongMaterial),&phong); - + material_instance->BindUBO("light",ubo_light); material_instance->BindUBO("phong",ubo_phong); if(!material_instance->BindUBO("camera",GetCameraInfoBuffer())) return(false); - material_instance->BindUBO("fs_light",ubo_light); - material_instance->Update(); if(!axis_mi->BindUBO("camera",GetCameraInfoBuffer())) @@ -222,19 +227,20 @@ private: { auto ri=db->CreateRenderableInstance(r,material_instance,pl); - render_root.Add(ri); + render_root.CreateSubNode(ri); } void Add(Renderable *r,Pipeline *pl,const Matrix4f &mat) { auto ri=db->CreateRenderableInstance(r,material_instance,pl); - render_root.Add(ri,mat); + render_root.CreateSubNode(mat,ri); } bool InitScene() { - render_root.Add(db->CreateRenderableInstance(ro_axis,axis_mi,axis_pipeline)); + render_root.CreateSubNode(db->CreateRenderableInstance(ro_axis,axis_mi,axis_pipeline)); + Add(ro_torus ,pipeline_solid); Add(ro_cube ,pipeline_solid,translate(-10, 0, 5)*scale(10,10,10)); Add(ro_sphere ,pipeline_solid,translate( 10, 0, 5)*scale(10,10,10)); @@ -242,7 +248,7 @@ private: Add(ro_cone ,pipeline_solid,translate( 0,-16, 0)); render_root.RefreshMatrix(); - render_root.ExpendToList(&render_list); + render_list.Expend(GetCameraInfo(),&render_root); return(true); } diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 750b982c..fc820373 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -357,6 +357,11 @@ public: ubo_camera_info->Write(&camera->info); } + const CameraInfo &GetCameraInfo() + { + return camera->info; + } + GPUBuffer *GetCameraInfoBuffer() { return ubo_camera_info; diff --git a/inc/hgl/graph/VKArrayBuffer.h b/inc/hgl/graph/VKArrayBuffer.h index fb680fd8..72a0489c 100644 --- a/inc/hgl/graph/VKArrayBuffer.h +++ b/inc/hgl/graph/VKArrayBuffer.h @@ -35,11 +35,7 @@ namespace hgl { ubo_offset_alignment=device->GetUBOAlign(); - uint32_t unit_size=sizeof(T); - - const uint32_t align_size=ubo_offset_alignment-1; - - unit_size=(unit_size+align_size)&(~align_size); + const uint32_t unit_size=hgl_align(sizeof(T),ubo_offset_alignment); vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment MemoryBlock *mb=new MemoryBlock(vk_ma); diff --git a/inc/hgl/graph/VKMaterialDescriptorSets.h b/inc/hgl/graph/VKMaterialDescriptorSets.h index 0e4daf9f..5d41a92c 100644 --- a/inc/hgl/graph/VKMaterialDescriptorSets.h +++ b/inc/hgl/graph/VKMaterialDescriptorSets.h @@ -41,11 +41,9 @@ public: const int GetBinding(const VkDescriptorType &desc_type,const AnsiString &name)const; - const int GetUBO (const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, name);} - const int GetSSBO (const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, name);} - const int GetUBODynamic (const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, name);} - const int GetSSBODynamic(const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, name);} - const int GetSampler (const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, name);} + const int GetUBO (const AnsiString &name,bool dynamic)const{return GetBinding(dynamic?VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,name);} + const int GetSSBO (const AnsiString &name,bool dynamic)const{return GetBinding(dynamic?VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,name);} + const int GetSampler (const AnsiString &name )const{return GetBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, name);} const DescriptorSetLayoutCreateInfo *GetBinding(const DescriptorSetType &type)const{return sds+size_t(type);} };//class MaterialDescriptorSets diff --git a/src/SceneGraph/Vulkan/VKMaterialParameters.cpp b/src/SceneGraph/Vulkan/VKMaterialParameters.cpp index ed39f436..c9979deb 100644 --- a/src/SceneGraph/Vulkan/VKMaterialParameters.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialParameters.cpp @@ -21,7 +21,7 @@ bool MaterialParameters::BindUBO(const AnsiString &name,GPUBuffer *ubo,bool dyna if(name.IsEmpty()||!ubo) return(false); - const int index=dynamic?mds->GetUBODynamic(name):mds->GetUBO(name); + const int index=mds->GetUBO(name,dynamic); if(index<0) return(false); @@ -37,7 +37,7 @@ bool MaterialParameters::BindSSBO(const AnsiString &name,GPUBuffer *ssbo,bool dy if(name.IsEmpty()||!ssbo) return(false); - const int index=dynamic?mds->GetSSBODynamic(name):mds->GetSSBO(name); + const int index=mds->GetSSBO(name,dynamic); if(index<0) return(false);