1.将DescriptorSetLayoutCreater类独立到src目录做为私有代码隐藏
2.将shader数据更改放在DescriptorSets类
This commit is contained in:
parent
14fe3c7629
commit
9425a2a91e
@ -4,7 +4,7 @@
|
|||||||
using namespace hgl;
|
using namespace hgl;
|
||||||
using namespace hgl::graph;
|
using namespace hgl::graph;
|
||||||
|
|
||||||
void SaveToTOML(const OSString &filename,const VkGraphicsPipelineCreateInfo *info);
|
//void SaveToTOML(const OSString &filename,const VkGraphicsPipelineCreateInfo *info);
|
||||||
|
|
||||||
constexpr uint32_t SCREEN_WIDTH=1280;
|
constexpr uint32_t SCREEN_WIDTH=1280;
|
||||||
constexpr uint32_t SCREEN_HEIGHT=720;
|
constexpr uint32_t SCREEN_HEIGHT=720;
|
||||||
@ -36,6 +36,7 @@ private:
|
|||||||
uint swap_chain_count=0;
|
uint swap_chain_count=0;
|
||||||
|
|
||||||
vulkan::Material * material =nullptr;
|
vulkan::Material * material =nullptr;
|
||||||
|
vulkan::DescriptorSets * desciptor_sets =nullptr;
|
||||||
vulkan::Renderable * render_obj =nullptr;
|
vulkan::Renderable * render_obj =nullptr;
|
||||||
vulkan::Buffer * ubo_mvp =nullptr;
|
vulkan::Buffer * ubo_mvp =nullptr;
|
||||||
|
|
||||||
@ -55,6 +56,7 @@ public:
|
|||||||
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(material);
|
SAFE_CLEAR(material);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +70,7 @@ private:
|
|||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
render_obj=material->CreateRenderable();
|
render_obj=material->CreateRenderable();
|
||||||
|
desciptor_sets=material->CreateDescriptorSets();
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +85,7 @@ private:
|
|||||||
if(!ubo_mvp)
|
if(!ubo_mvp)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
return material->UpdateUBO("world",*ubo_mvp);
|
return desciptor_sets->UpdateUBO(material->GetUBOBinding("world"),*ubo_mvp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitVBO()
|
void InitVBO()
|
||||||
@ -103,7 +106,7 @@ private:
|
|||||||
pipeline_creater->CloseCullFace();
|
pipeline_creater->CloseCullFace();
|
||||||
pipeline_creater->Set(PRIM_TRIANGLES);
|
pipeline_creater->Set(PRIM_TRIANGLES);
|
||||||
|
|
||||||
SaveToTOML(OS_TEXT("pipeline.toml"),pipeline_creater->GetInfo());
|
// SaveToTOML(OS_TEXT("pipeline.toml"),pipeline_creater->GetInfo());
|
||||||
|
|
||||||
pipeline=pipeline_creater->Create();
|
pipeline=pipeline_creater->Create();
|
||||||
|
|
||||||
@ -125,7 +128,7 @@ private:
|
|||||||
cmd_buf[i]->Begin();
|
cmd_buf[i]->Begin();
|
||||||
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
|
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
|
||||||
cmd_buf[i]->Bind(pipeline);
|
cmd_buf[i]->Bind(pipeline);
|
||||||
cmd_buf[i]->Bind(material);
|
cmd_buf[i]->Bind(desciptor_sets);
|
||||||
cmd_buf[i]->Bind(render_obj);
|
cmd_buf[i]->Bind(render_obj);
|
||||||
cmd_buf[i]->Draw(VERTEX_COUNT);
|
cmd_buf[i]->Draw(VERTEX_COUNT);
|
||||||
cmd_buf[i]->EndRenderPass();
|
cmd_buf[i]->EndRenderPass();
|
||||||
|
@ -6,7 +6,7 @@ VK_NAMESPACE_BEGIN
|
|||||||
class RenderPass;
|
class RenderPass;
|
||||||
class Framebuffer;
|
class Framebuffer;
|
||||||
class Pipeline;
|
class Pipeline;
|
||||||
class Material;
|
class DescriptorSets;
|
||||||
class Renderable;
|
class Renderable;
|
||||||
|
|
||||||
class CommandBuffer
|
class CommandBuffer
|
||||||
@ -47,7 +47,7 @@ public:
|
|||||||
bool Begin();
|
bool Begin();
|
||||||
bool BeginRenderPass(RenderPass *rp,Framebuffer *fb);
|
bool BeginRenderPass(RenderPass *rp,Framebuffer *fb);
|
||||||
bool Bind(Pipeline *p);
|
bool Bind(Pipeline *p);
|
||||||
bool Bind(Material *);
|
bool Bind(DescriptorSets *);
|
||||||
bool Bind(Renderable *);
|
bool Bind(Renderable *);
|
||||||
void EndRenderPass();
|
void EndRenderPass();
|
||||||
bool End();
|
bool End();
|
||||||
|
@ -6,11 +6,10 @@
|
|||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
class Device;
|
class Device;
|
||||||
|
|
||||||
class DescriptorSetLayout
|
class DescriptorSets
|
||||||
{
|
{
|
||||||
Device *device;
|
Device *device;
|
||||||
int count;
|
int count;
|
||||||
VkDescriptorSetLayout *desc_set_layout_list;
|
|
||||||
VkDescriptorSet *desc_set_list;
|
VkDescriptorSet *desc_set_list;
|
||||||
Map<uint32_t,int> index_by_binding;
|
Map<uint32_t,int> index_by_binding;
|
||||||
|
|
||||||
@ -20,11 +19,10 @@ private:
|
|||||||
|
|
||||||
friend class DescriptorSetLayoutCreater;
|
friend class DescriptorSetLayoutCreater;
|
||||||
|
|
||||||
DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkPipelineLayout pl,VkDescriptorSet *desc_set,Map<uint32_t,int> &bi)
|
DescriptorSets(Device *dev,const int c,VkPipelineLayout pl,VkDescriptorSet *desc_set,Map<uint32_t,int> &bi)
|
||||||
{
|
{
|
||||||
device=dev;
|
device=dev;
|
||||||
count=c;
|
count=c;
|
||||||
desc_set_layout_list=dsl_list;
|
|
||||||
desc_set_list=desc_set;
|
desc_set_list=desc_set;
|
||||||
index_by_binding=bi;
|
index_by_binding=bi;
|
||||||
pipeline_layout=pl;
|
pipeline_layout=pl;
|
||||||
@ -32,56 +30,21 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
~DescriptorSetLayout();
|
~DescriptorSets();
|
||||||
|
|
||||||
const uint32_t GetCount ()const{return count;}
|
const uint32_t GetCount ()const{return count;}
|
||||||
const VkDescriptorSetLayout * GetLayouts ()const{return desc_set_layout_list;}
|
|
||||||
const VkDescriptorSet * GetDescriptorSets ()const{return desc_set_list;}
|
const VkDescriptorSet * GetDescriptorSets ()const{return desc_set_list;}
|
||||||
VkDescriptorSet GetDescriptorSet (const uint32_t binding);
|
VkDescriptorSet GetDescriptorSet (const uint32_t binding);
|
||||||
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
|
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
|
||||||
};//class DescriptorSetLayout
|
|
||||||
|
|
||||||
/**
|
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
|
||||||
* 描述符合集创造器
|
//bool UpdateUBO(const UTF8String &name,const VkDescriptorBufferInfo *buf_info)
|
||||||
*/
|
//{
|
||||||
class DescriptorSetLayoutCreater
|
// if(name.IsEmpty()||!buf_info)
|
||||||
{
|
// return(false);
|
||||||
Device *device;
|
|
||||||
|
|
||||||
List<VkDescriptorSetLayoutBinding> layout_binding_list;
|
// return UpdateUBO(GetUBOBinding(name),buf_info);
|
||||||
|
//}
|
||||||
Map<uint32_t,int> index_by_binding;
|
};//class DescriptorSets
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
DescriptorSetLayoutCreater(Device *dev):device(dev){}
|
|
||||||
~DescriptorSetLayoutCreater()=default;
|
|
||||||
|
|
||||||
void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits);
|
|
||||||
void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage);
|
|
||||||
|
|
||||||
#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \
|
|
||||||
void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);}
|
|
||||||
|
|
||||||
DESC_SET_BIND_FUNC(Sampler, SAMPLER);
|
|
||||||
DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER);
|
|
||||||
DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER);
|
|
||||||
|
|
||||||
DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER);
|
|
||||||
DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE);
|
|
||||||
DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE);
|
|
||||||
DESC_SET_BIND_FUNC(UniformTexelBuffer, UNIFORM_TEXEL_BUFFER);
|
|
||||||
DESC_SET_BIND_FUNC(StorageTexelBuffer, STORAGE_TEXEL_BUFFER);
|
|
||||||
|
|
||||||
|
|
||||||
DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC);
|
|
||||||
DESC_SET_BIND_FUNC(SBODynamic, STORAGE_BUFFER_DYNAMIC);
|
|
||||||
|
|
||||||
DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT);
|
|
||||||
|
|
||||||
#undef DESC_SET_BIND_FUNC
|
|
||||||
|
|
||||||
DescriptorSetLayout *Create();
|
|
||||||
};//class DescriptorSet
|
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_DESCRIPTOR_SETS_LAYOUT_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_DESCRIPTOR_SETS_LAYOUT_INCLUDE
|
||||||
|
@ -8,8 +8,8 @@ VK_NAMESPACE_BEGIN
|
|||||||
class Device;
|
class Device;
|
||||||
class ShaderModule;
|
class ShaderModule;
|
||||||
class VertexShaderModule;
|
class VertexShaderModule;
|
||||||
|
class DescriptorSets;
|
||||||
class DescriptorSetLayoutCreater;
|
class DescriptorSetLayoutCreater;
|
||||||
class DescriptorSetLayout;
|
|
||||||
class VertexAttributeBinding;
|
class VertexAttributeBinding;
|
||||||
class VertexBuffer;
|
class VertexBuffer;
|
||||||
class Renderable;
|
class Renderable;
|
||||||
@ -23,17 +23,18 @@ using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>;
|
|||||||
*/
|
*/
|
||||||
class Material
|
class Material
|
||||||
{
|
{
|
||||||
VkDevice device;
|
Device *device;
|
||||||
ShaderModuleMap *shader_maps;
|
ShaderModuleMap *shader_maps;
|
||||||
VertexShaderModule *vertex_sm;
|
VertexShaderModule *vertex_sm;
|
||||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list;
|
List<VkPipelineShaderStageCreateInfo> *shader_stage_list;
|
||||||
|
|
||||||
DescriptorSetLayoutCreater *dsl_creater;
|
DescriptorSetLayoutCreater *dsl_creater;
|
||||||
DescriptorSetLayout *desc_set_layout;
|
|
||||||
VertexAttributeBinding *vab;
|
VertexAttributeBinding *vab;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VertexAttributeBinding *v);
|
Material(Device *dev,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc);
|
||||||
~Material();
|
~Material();
|
||||||
|
|
||||||
const int GetUBOBinding(const UTF8String &)const;
|
const int GetUBOBinding(const UTF8String &)const;
|
||||||
@ -42,18 +43,8 @@ public:
|
|||||||
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
||||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
||||||
|
|
||||||
const VkPipelineLayout GetPipelineLayout ()const;
|
const VkPipelineLayout GetPipelineLayout ()const;
|
||||||
const uint32_t GetDescriptorSetCount ()const;
|
DescriptorSets * CreateDescriptorSets()const;
|
||||||
const VkDescriptorSet * GetDescriptorSets ()const;
|
|
||||||
|
|
||||||
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
|
|
||||||
bool UpdateUBO(const UTF8String &name,const VkDescriptorBufferInfo *buf_info)
|
|
||||||
{
|
|
||||||
if(name.IsEmpty()||!buf_info)
|
|
||||||
return(false);
|
|
||||||
|
|
||||||
return UpdateUBO(GetUBOBinding(name),buf_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
|
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ class ShaderParse;
|
|||||||
*/
|
*/
|
||||||
class ShaderModule
|
class ShaderModule
|
||||||
{
|
{
|
||||||
|
VkDevice device;
|
||||||
int shader_id;
|
int shader_id;
|
||||||
|
|
||||||
int ref_count;
|
int ref_count;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -34,7 +34,7 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShaderModule(int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *);
|
ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *);
|
||||||
virtual ~ShaderModule();
|
virtual ~ShaderModule();
|
||||||
|
|
||||||
const int GetID()const{return shader_id;}
|
const int GetID()const{return shader_id;}
|
||||||
@ -78,16 +78,9 @@ private:
|
|||||||
|
|
||||||
Set<VertexAttributeBinding *> vab_sets;
|
Set<VertexAttributeBinding *> vab_sets;
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void ParseVertexInput(const ShaderParse *);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
VertexShaderModule(int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(id,pssci,parse)
|
VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse);
|
||||||
{
|
|
||||||
ParseVertexInput(parse);
|
|
||||||
}
|
|
||||||
virtual ~VertexShaderModule();
|
virtual ~VertexShaderModule();
|
||||||
|
|
||||||
const int GetLocation (const UTF8String &)const;
|
const int GetLocation (const UTF8String &)const;
|
||||||
|
@ -543,7 +543,7 @@ namespace hgl
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename F,typename T,typename DataPair>
|
template<typename F,typename T,typename DataPair>
|
||||||
void _Map<F,T,DataPair>::EnumValue(void (*enum_func)(T))
|
void _Map<F,T,DataPair>::EnumAllValue(void (*enum_func)(T))
|
||||||
{
|
{
|
||||||
const int count=data_list.GetCount();
|
const int count=data_list.GetCount();
|
||||||
|
|
||||||
|
@ -104,9 +104,8 @@ namespace hgl
|
|||||||
|
|
||||||
void Enum(void (*enum_func)(const F &,T)); ///<枚举所有数据项
|
void Enum(void (*enum_func)(const F &,T)); ///<枚举所有数据项
|
||||||
void EnumKey(void (*enum_func)(const F &)); ///<枚举所有索引
|
void EnumKey(void (*enum_func)(const F &)); ///<枚举所有索引
|
||||||
void EnumValue(void (*enum_func)(T)); ///<枚举所有数值
|
void EnumAllValue(void (*enum_func)(T)); ///<枚举所有数值
|
||||||
|
void EnumValue(bool (*enum_func)(T)); ///<枚举所有数值(返回true/false表示是否继续)
|
||||||
void EnumValue(bool (*enum_func)(T)); ///<枚举所有数值
|
|
||||||
};//class _Map
|
};//class _Map
|
||||||
|
|
||||||
template<typename F,typename T> class Map:public _Map<F,T,Pair<F,T> >
|
template<typename F,typename T> class Map:public _Map<F,T,Pair<F,T> >
|
||||||
|
@ -186,8 +186,9 @@ namespace hgl
|
|||||||
return KeyConvert[key];
|
return KeyConvert[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMProcDestroy(WinWindow *,uint32,uint32)
|
void WMProcDestroy(WinWindow *win,uint32,uint32)
|
||||||
{
|
{
|
||||||
|
win->OnClose();
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,12 +122,21 @@ namespace hgl
|
|||||||
|
|
||||||
void WinWindow::Close()
|
void WinWindow::Close()
|
||||||
{
|
{
|
||||||
ReleaseDC(win_hwnd, win_dc);
|
if(win_hwnd)
|
||||||
DestroyWindow(win_hwnd);
|
{
|
||||||
|
if(win_dc)
|
||||||
|
{
|
||||||
|
ReleaseDC(win_hwnd,win_dc);
|
||||||
|
win_dc = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
DestroyWindow(win_hwnd);
|
||||||
|
|
||||||
|
win_hwnd = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
UnregisterClassW(WIN_CLASS_NAME,hInstance);
|
UnregisterClassW(WIN_CLASS_NAME,hInstance);
|
||||||
|
|
||||||
win_dc = nullptr;
|
|
||||||
win_hwnd = nullptr;
|
|
||||||
is_close = true;
|
is_close = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,8 +19,6 @@ namespace hgl
|
|||||||
|
|
||||||
bool Create();
|
bool Create();
|
||||||
|
|
||||||
void OnClose() override{Close();}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using Window::Window;
|
using Window::Window;
|
||||||
|
@ -34,6 +34,8 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp
|
|||||||
VKDeviceBuffer.cpp
|
VKDeviceBuffer.cpp
|
||||||
VKBuffer.cpp
|
VKBuffer.cpp
|
||||||
VKDescriptorSets.cpp
|
VKDescriptorSets.cpp
|
||||||
|
VKDescriptorSetLayoutCreater.cpp
|
||||||
|
VKDescriptorSetLayoutCreater.h
|
||||||
VKRenderPass.cpp
|
VKRenderPass.cpp
|
||||||
VKShaderModule.cpp
|
VKShaderModule.cpp
|
||||||
VKShaderModuleManage.cpp
|
VKShaderModuleManage.cpp
|
||||||
@ -46,11 +48,11 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp
|
|||||||
VKRenderable.cpp)
|
VKRenderable.cpp)
|
||||||
|
|
||||||
#SET(RENDER_DEVICE_VULKAN_TOML_SOURCE toml/VKPipelineCreateInfo.TOML.cpp)
|
#SET(RENDER_DEVICE_VULKAN_TOML_SOURCE toml/VKPipelineCreateInfo.TOML.cpp)
|
||||||
SET(RENDER_DEVICE_VULKAN_JSON_SOURCE json/VKPipelineCreateInfo.JSON.cpp)
|
#SET(RENDER_DEVICE_VULKAN_JSON_SOURCE json/VKPipelineCreateInfo.JSON.cpp)
|
||||||
|
|
||||||
SOURCE_GROUP("Header Files" FILES ${RENDER_DEVICE_VULKAN_HEADER})
|
SOURCE_GROUP("Header Files" FILES ${RENDER_DEVICE_VULKAN_HEADER})
|
||||||
SOURCE_GROUP("Source Files" FILES ${RENDER_DEVICE_VULKAN_SOURCE})
|
SOURCE_GROUP("Source Files" FILES ${RENDER_DEVICE_VULKAN_SOURCE})
|
||||||
SOURCE_GROUP("JSON Source Files" FILES ${RENDER_DEVICE_VULKAN_JSON_SOURCE})
|
#SOURCE_GROUP("JSON Source Files" FILES ${RENDER_DEVICE_VULKAN_JSON_SOURCE})
|
||||||
|
|
||||||
add_library(ULRE.RenderDevice.Vulkan STATIC ${RENDER_DEVICE_VULKAN_HEADER}
|
add_library(ULRE.RenderDevice.Vulkan STATIC ${RENDER_DEVICE_VULKAN_HEADER}
|
||||||
${RENDER_DEVICE_VULKAN_SOURCE}
|
${RENDER_DEVICE_VULKAN_SOURCE}
|
||||||
|
@ -80,15 +80,15 @@ bool CommandBuffer::Bind(Pipeline *p)
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CommandBuffer::Bind(Material *mat)
|
bool CommandBuffer::Bind(DescriptorSets *dsl)
|
||||||
{
|
{
|
||||||
if(!mat)
|
if(!dsl)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
const uint32_t count=mat->GetDescriptorSetCount();
|
const uint32_t count=dsl->GetCount();
|
||||||
|
|
||||||
if(count>0)
|
if(count>0)
|
||||||
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,mat->GetPipelineLayout(),0,count,mat->GetDescriptorSets(),0,nullptr);
|
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,dsl->GetPipelineLayout(),0,count,dsl->GetDescriptorSets(),0,nullptr);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
131
src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.cpp
Normal file
131
src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.cpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
#include"VKDescriptorSetLayoutCreater.h"
|
||||||
|
#include<hgl/graph/vulkan/VKDescriptorSets.h>
|
||||||
|
#include<hgl/graph/vulkan/VKDevice.h>
|
||||||
|
|
||||||
|
VK_NAMESPACE_BEGIN
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
void DestroyDescriptorSetLayout(VkDevice device,const int count,VkDescriptorSetLayout *dsl_list)
|
||||||
|
{
|
||||||
|
if(count<=0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(int i=0;i<count;i++)
|
||||||
|
{
|
||||||
|
vkDestroyDescriptorSetLayout(device,*dsl_list,nullptr);
|
||||||
|
++dsl_list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
DescriptorSetLayoutCreater::~DescriptorSetLayoutCreater()
|
||||||
|
{
|
||||||
|
if(pipeline_layout)
|
||||||
|
vkDestroyPipelineLayout(*device,pipeline_layout,nullptr);
|
||||||
|
|
||||||
|
if(dsl_list)
|
||||||
|
{
|
||||||
|
DestroyDescriptorSetLayout(*device,layout_binding_list.GetCount(),dsl_list);
|
||||||
|
delete[] dsl_list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
||||||
|
{
|
||||||
|
VkDescriptorSetLayoutBinding layout_binding = {};
|
||||||
|
layout_binding.binding = binding;
|
||||||
|
layout_binding.descriptorType = desc_type;
|
||||||
|
layout_binding.descriptorCount = 1;
|
||||||
|
layout_binding.stageFlags = stageFlags;
|
||||||
|
layout_binding.pImmutableSamplers = nullptr;
|
||||||
|
|
||||||
|
const int index=layout_binding_list.Add(layout_binding);
|
||||||
|
|
||||||
|
index_by_binding.Add(binding,index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
||||||
|
{
|
||||||
|
const uint old_count=layout_binding_list.GetCount();
|
||||||
|
|
||||||
|
layout_binding_list.SetCount(old_count+count);
|
||||||
|
|
||||||
|
VkDescriptorSetLayoutBinding *p=layout_binding_list.GetData()+old_count;
|
||||||
|
|
||||||
|
for(uint i=old_count;i<old_count+count;i++)
|
||||||
|
{
|
||||||
|
p->binding = *binding;
|
||||||
|
p->descriptorType = desc_type;
|
||||||
|
p->descriptorCount = 1;
|
||||||
|
p->stageFlags = stageFlags;
|
||||||
|
p->pImmutableSamplers = nullptr;
|
||||||
|
|
||||||
|
index_by_binding.Add(*binding,i);
|
||||||
|
|
||||||
|
++binding;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DescriptorSetLayoutCreater::CreatePipelineLayout()
|
||||||
|
{
|
||||||
|
const int count=layout_binding_list.GetCount();
|
||||||
|
|
||||||
|
if(count<=0)
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
VkDescriptorSetLayoutCreateInfo descriptor_layout = {};
|
||||||
|
descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||||
|
descriptor_layout.pNext = nullptr;
|
||||||
|
descriptor_layout.bindingCount = count;
|
||||||
|
descriptor_layout.pBindings = layout_binding_list.GetData();
|
||||||
|
|
||||||
|
dsl_list=new VkDescriptorSetLayout[count];
|
||||||
|
|
||||||
|
if(vkCreateDescriptorSetLayout(*device,&descriptor_layout,nullptr,dsl_list)==VK_SUCCESS)
|
||||||
|
{
|
||||||
|
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
|
||||||
|
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||||
|
pPipelineLayoutCreateInfo.pNext = nullptr;
|
||||||
|
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
|
||||||
|
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
|
||||||
|
pPipelineLayoutCreateInfo.setLayoutCount = count;
|
||||||
|
pPipelineLayoutCreateInfo.pSetLayouts = dsl_list;
|
||||||
|
|
||||||
|
if(vkCreatePipelineLayout(*device,&pPipelineLayoutCreateInfo,nullptr,&pipeline_layout)==VK_SUCCESS)
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] dsl_list;
|
||||||
|
dsl_list=nullptr;
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
DescriptorSets *DescriptorSetLayoutCreater::Create()
|
||||||
|
{
|
||||||
|
if(!pipeline_layout||!dsl_list)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const int count=layout_binding_list.GetCount();
|
||||||
|
|
||||||
|
if(count<=0)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
VkDescriptorSetAllocateInfo alloc_info;
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
alloc_info.pNext = nullptr;
|
||||||
|
alloc_info.descriptorPool = device->GetDescriptorPool();
|
||||||
|
alloc_info.descriptorSetCount = count;
|
||||||
|
alloc_info.pSetLayouts = dsl_list;
|
||||||
|
|
||||||
|
VkDescriptorSet *desc_set=new VkDescriptorSet[count];
|
||||||
|
|
||||||
|
if(vkAllocateDescriptorSets(*device,&alloc_info,desc_set)!=VK_SUCCESS)
|
||||||
|
{
|
||||||
|
delete[] desc_set;
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(new DescriptorSets(device,count,pipeline_layout,desc_set,index_by_binding));
|
||||||
|
}
|
||||||
|
VK_NAMESPACE_END
|
57
src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h
Normal file
57
src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include<hgl/graph/vulkan/VK.h>
|
||||||
|
#include<hgl/type/Map.h>
|
||||||
|
VK_NAMESPACE_BEGIN
|
||||||
|
class Device;
|
||||||
|
class DescriptorSets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述符合集创造器
|
||||||
|
*/
|
||||||
|
class DescriptorSetLayoutCreater
|
||||||
|
{
|
||||||
|
Device *device;
|
||||||
|
|
||||||
|
List<VkDescriptorSetLayoutBinding> layout_binding_list;
|
||||||
|
VkDescriptorSetLayout *dsl_list=nullptr;
|
||||||
|
Map<uint32_t,int> index_by_binding;
|
||||||
|
|
||||||
|
VkPipelineLayout pipeline_layout=nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
DescriptorSetLayoutCreater(Device *dev):device(dev){}
|
||||||
|
~DescriptorSetLayoutCreater();
|
||||||
|
|
||||||
|
void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits);
|
||||||
|
void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage);
|
||||||
|
|
||||||
|
#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \
|
||||||
|
void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);}
|
||||||
|
|
||||||
|
DESC_SET_BIND_FUNC(Sampler, SAMPLER);
|
||||||
|
DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER);
|
||||||
|
DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER);
|
||||||
|
|
||||||
|
DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER);
|
||||||
|
DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE);
|
||||||
|
DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE);
|
||||||
|
DESC_SET_BIND_FUNC(UniformTexelBuffer, UNIFORM_TEXEL_BUFFER);
|
||||||
|
DESC_SET_BIND_FUNC(StorageTexelBuffer, STORAGE_TEXEL_BUFFER);
|
||||||
|
|
||||||
|
|
||||||
|
DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC);
|
||||||
|
DESC_SET_BIND_FUNC(SBODynamic, STORAGE_BUFFER_DYNAMIC);
|
||||||
|
|
||||||
|
DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT);
|
||||||
|
|
||||||
|
#undef DESC_SET_BIND_FUNC
|
||||||
|
|
||||||
|
bool CreatePipelineLayout();
|
||||||
|
|
||||||
|
const VkPipelineLayout GetPipelineLayout()const{return pipeline_layout;}
|
||||||
|
|
||||||
|
DescriptorSets *Create();
|
||||||
|
};//class DescriptorSetLayoutCreater
|
||||||
|
VK_NAMESPACE_END
|
@ -2,22 +2,7 @@
|
|||||||
#include<hgl/graph/vulkan/VKDevice.h>
|
#include<hgl/graph/vulkan/VKDevice.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
namespace
|
VkDescriptorSet DescriptorSets::GetDescriptorSet(const uint32_t binding)
|
||||||
{
|
|
||||||
void DestroyDescriptorSetLayout(VkDevice device,const int count,VkDescriptorSetLayout *dsl_list)
|
|
||||||
{
|
|
||||||
if(count<=0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for(int i=0;i<count;i++)
|
|
||||||
{
|
|
||||||
vkDestroyDescriptorSetLayout(device,*dsl_list,nullptr);
|
|
||||||
++dsl_list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}//namespace
|
|
||||||
|
|
||||||
VkDescriptorSet DescriptorSetLayout::GetDescriptorSet(const uint32_t binding)
|
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
@ -27,111 +12,28 @@ VkDescriptorSet DescriptorSetLayout::GetDescriptorSet(const uint32_t binding)
|
|||||||
return desc_set_list[index];
|
return desc_set_list[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
DescriptorSetLayout::~DescriptorSetLayout()
|
DescriptorSets::~DescriptorSets()
|
||||||
{
|
{
|
||||||
//if(count>0)
|
//if(count>0)
|
||||||
// vkFreeDescriptorSets(device->GetDevice(),device->GetDescriptorPool(),count,desc_set_list);
|
// vkFreeDescriptorSets(device->GetDevice(),device->GetDescriptorPool(),count,desc_set_list);
|
||||||
|
|
||||||
if(pipeline_layout)
|
|
||||||
vkDestroyPipelineLayout(*device,pipeline_layout,nullptr);
|
|
||||||
|
|
||||||
delete[] desc_set_list;
|
delete[] desc_set_list;
|
||||||
DestroyDescriptorSetLayout(*device,count,desc_set_layout_list);
|
|
||||||
delete[] desc_set_layout_list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
bool DescriptorSets::UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info)
|
||||||
{
|
{
|
||||||
VkDescriptorSetLayoutBinding layout_binding = {};
|
VkDescriptorSet set=GetDescriptorSet(binding);
|
||||||
layout_binding.binding = binding;
|
|
||||||
layout_binding.descriptorType = desc_type;
|
|
||||||
layout_binding.descriptorCount = 1;
|
|
||||||
layout_binding.stageFlags = stageFlags;
|
|
||||||
layout_binding.pImmutableSamplers = nullptr;
|
|
||||||
|
|
||||||
const int index=layout_binding_list.Add(layout_binding);
|
VkWriteDescriptorSet writeDescriptorSet = {};
|
||||||
|
|
||||||
index_by_binding.Add(binding,index);
|
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
}
|
writeDescriptorSet.dstSet = set;
|
||||||
|
writeDescriptorSet.descriptorCount = 1;
|
||||||
|
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
|
writeDescriptorSet.pBufferInfo = buf_info;
|
||||||
|
writeDescriptorSet.dstBinding = binding;
|
||||||
|
|
||||||
void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
vkUpdateDescriptorSets(*device,1,&writeDescriptorSet,0,nullptr);
|
||||||
{
|
return(true);
|
||||||
const uint old_count=layout_binding_list.GetCount();
|
|
||||||
|
|
||||||
layout_binding_list.SetCount(old_count+count);
|
|
||||||
|
|
||||||
VkDescriptorSetLayoutBinding *p=layout_binding_list.GetData()+old_count;
|
|
||||||
|
|
||||||
for(uint i=old_count;i<old_count+count;i++)
|
|
||||||
{
|
|
||||||
p->binding = *binding;
|
|
||||||
p->descriptorType = desc_type;
|
|
||||||
p->descriptorCount = 1;
|
|
||||||
p->stageFlags = stageFlags;
|
|
||||||
p->pImmutableSamplers = nullptr;
|
|
||||||
|
|
||||||
index_by_binding.Add(*binding,i);
|
|
||||||
|
|
||||||
++binding;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DescriptorSetLayout *DescriptorSetLayoutCreater::Create()
|
|
||||||
{
|
|
||||||
const int count=layout_binding_list.GetCount();
|
|
||||||
|
|
||||||
if(count<=0)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
VkDescriptorSetLayoutCreateInfo descriptor_layout = {};
|
|
||||||
descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
||||||
descriptor_layout.pNext = nullptr;
|
|
||||||
descriptor_layout.bindingCount = count;
|
|
||||||
descriptor_layout.pBindings = layout_binding_list.GetData();
|
|
||||||
|
|
||||||
VkDescriptorSetLayout *dsl_list=new VkDescriptorSetLayout[count];
|
|
||||||
|
|
||||||
if(vkCreateDescriptorSetLayout(*device,&descriptor_layout, nullptr, dsl_list)!=VK_SUCCESS)
|
|
||||||
{
|
|
||||||
delete[] dsl_list;
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
|
|
||||||
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
||||||
pPipelineLayoutCreateInfo.pNext = nullptr;
|
|
||||||
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
|
|
||||||
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
|
|
||||||
pPipelineLayoutCreateInfo.setLayoutCount = count;
|
|
||||||
pPipelineLayoutCreateInfo.pSetLayouts = dsl_list;
|
|
||||||
|
|
||||||
VkPipelineLayout pipeline_layout;
|
|
||||||
|
|
||||||
if(vkCreatePipelineLayout(*device, &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)!=VK_SUCCESS)
|
|
||||||
{
|
|
||||||
delete[] dsl_list;
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
VkDescriptorSetAllocateInfo alloc_info;
|
|
||||||
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
||||||
alloc_info.pNext = nullptr;
|
|
||||||
alloc_info.descriptorPool = device->GetDescriptorPool();
|
|
||||||
alloc_info.descriptorSetCount = count;
|
|
||||||
alloc_info.pSetLayouts = dsl_list;
|
|
||||||
|
|
||||||
VkDescriptorSet *desc_set=new VkDescriptorSet[count];
|
|
||||||
|
|
||||||
if(vkAllocateDescriptorSets(*device,&alloc_info,desc_set)!=VK_SUCCESS)
|
|
||||||
{
|
|
||||||
vkDestroyPipelineLayout(*device,pipeline_layout,nullptr);
|
|
||||||
delete[] desc_set;
|
|
||||||
DestroyDescriptorSetLayout(*device,count,dsl_list);
|
|
||||||
delete[] dsl_list;
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(new DescriptorSetLayout(device,count,dsl_list,pipeline_layout,desc_set,index_by_binding));
|
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -5,82 +5,75 @@
|
|||||||
#include<hgl/graph/vulkan/VKVertexAttributeBinding.h>
|
#include<hgl/graph/vulkan/VKVertexAttributeBinding.h>
|
||||||
#include<hgl/graph/vulkan/VKRenderable.h>
|
#include<hgl/graph/vulkan/VKRenderable.h>
|
||||||
#include<hgl/graph/vulkan/VKBuffer.h>
|
#include<hgl/graph/vulkan/VKBuffer.h>
|
||||||
|
#include"VKDescriptorSetLayoutCreater.h"
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps)
|
Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps)
|
||||||
{
|
{
|
||||||
DescriptorSetLayoutCreater *dsl_creater=new DescriptorSetLayoutCreater(dev);
|
|
||||||
|
|
||||||
const int shader_count=shader_maps->GetCount();
|
const int shader_count=shader_maps->GetCount();
|
||||||
|
|
||||||
|
if(shader_count<2)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const ShaderModule *sm;
|
||||||
|
|
||||||
|
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const VertexShaderModule *vertex_sm=(VertexShaderModule *)sm;
|
||||||
|
|
||||||
|
DescriptorSetLayoutCreater *dsl_creater=new DescriptorSetLayoutCreater(dev);
|
||||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
||||||
|
|
||||||
shader_stage_list->SetCount(shader_count);
|
shader_stage_list->SetCount(shader_count);
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
||||||
|
|
||||||
VertexShaderModule *vertex_sm;
|
|
||||||
const ShaderModule *sm;
|
|
||||||
auto **itp=shader_maps->GetDataList();
|
auto **itp=shader_maps->GetDataList();
|
||||||
for(int i=0;i<shader_count;i++)
|
for(int i=0;i<shader_count;i++)
|
||||||
{
|
{
|
||||||
sm=(*itp)->right;
|
sm=(*itp)->right;
|
||||||
|
|
||||||
if(sm->GetStage()==VK_SHADER_STAGE_VERTEX_BIT)
|
|
||||||
vertex_sm=(VertexShaderModule *)sm;
|
|
||||||
|
|
||||||
memcpy(p,sm->GetCreateInfo(),sizeof(VkPipelineShaderStageCreateInfo));
|
memcpy(p,sm->GetCreateInfo(),sizeof(VkPipelineShaderStageCreateInfo));
|
||||||
++p;
|
|
||||||
++itp;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const ShaderBindingList &ubo_list=sm->GetUBOBindingList();
|
const ShaderBindingList &ubo_list=sm->GetUBOBindingList();
|
||||||
|
|
||||||
dsl_creater->BindUBO(ubo_list.GetData(),ubo_list.GetCount(),sm->GetStage());
|
dsl_creater->BindUBO(ubo_list.GetData(),ubo_list.GetCount(),sm->GetStage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
++p;
|
||||||
|
++itp;
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAttributeBinding *vab=vertex_sm->CreateVertexAttributeBinding();
|
dsl_creater->CreatePipelineLayout();
|
||||||
|
|
||||||
DescriptorSetLayout *dsl=dsl_creater->Create();
|
return(new Material(dev,shader_maps,shader_stage_list,dsl_creater));
|
||||||
|
|
||||||
if(dsl)
|
|
||||||
{
|
|
||||||
return(new Material(dev,shader_maps,vertex_sm,shader_stage_list,dsl_creater,dsl,vab));
|
|
||||||
}
|
|
||||||
|
|
||||||
return(nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VertexAttributeBinding *v)
|
Material::Material(Device *dev,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc)
|
||||||
{
|
{
|
||||||
device=*dev;
|
device=dev;
|
||||||
shader_maps=smm;
|
shader_maps=smm;
|
||||||
vertex_sm=vsm;
|
|
||||||
shader_stage_list=psci_list;
|
shader_stage_list=psci_list;
|
||||||
dsl_creater=dslc;
|
dsl_creater=dslc;
|
||||||
desc_set_layout=dsl;
|
|
||||||
vab=v;
|
const ShaderModule *sm;
|
||||||
|
if(smm->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
||||||
|
{
|
||||||
|
vertex_sm=(VertexShaderModule *)sm;
|
||||||
|
vab=vertex_sm->CreateVertexAttributeBinding();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//理论上不可能到达这里,前面CreateMaterial已经检测过了
|
||||||
|
vertex_sm=nullptr;
|
||||||
|
vab=nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Material::~Material()
|
Material::~Material()
|
||||||
{
|
{
|
||||||
delete vab;
|
|
||||||
|
|
||||||
delete desc_set_layout;
|
|
||||||
delete dsl_creater;
|
delete dsl_creater;
|
||||||
|
delete vab;
|
||||||
const int count=shader_stage_list->GetCount();
|
|
||||||
|
|
||||||
if(count>0)
|
|
||||||
{
|
|
||||||
VkPipelineShaderStageCreateInfo *ss=shader_stage_list->GetData();
|
|
||||||
for(int i=0;i<count;i++)
|
|
||||||
{
|
|
||||||
vkDestroyShaderModule(device,ss->module,nullptr);
|
|
||||||
++ss;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete shader_stage_list;
|
delete shader_stage_list;
|
||||||
delete shader_maps;
|
delete shader_maps;
|
||||||
}
|
}
|
||||||
@ -114,34 +107,12 @@ const int Material::GetVBOBinding(const UTF8String &name)const
|
|||||||
|
|
||||||
const VkPipelineLayout Material::GetPipelineLayout()const
|
const VkPipelineLayout Material::GetPipelineLayout()const
|
||||||
{
|
{
|
||||||
return desc_set_layout->GetPipelineLayout();
|
return dsl_creater->GetPipelineLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t Material::GetDescriptorSetCount()const
|
DescriptorSets *Material::CreateDescriptorSets()const
|
||||||
{
|
{
|
||||||
return desc_set_layout->GetCount();
|
return dsl_creater->Create();
|
||||||
}
|
|
||||||
|
|
||||||
const VkDescriptorSet *Material::GetDescriptorSets()const
|
|
||||||
{
|
|
||||||
return desc_set_layout->GetDescriptorSets();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Material::UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info)
|
|
||||||
{
|
|
||||||
VkDescriptorSet set=desc_set_layout->GetDescriptorSet(binding);
|
|
||||||
|
|
||||||
VkWriteDescriptorSet writeDescriptorSet = {};
|
|
||||||
|
|
||||||
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
|
||||||
writeDescriptorSet.dstSet = set;
|
|
||||||
writeDescriptorSet.descriptorCount = 1;
|
|
||||||
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
|
||||||
writeDescriptorSet.pBufferInfo = buf_info;
|
|
||||||
writeDescriptorSet.dstBinding = binding;
|
|
||||||
|
|
||||||
vkUpdateDescriptorSets(device,1,&writeDescriptorSet,0,nullptr);
|
|
||||||
return(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Material::Write(VkPipelineVertexInputStateCreateInfo &vis)const
|
void Material::Write(VkPipelineVertexInputStateCreateInfo &vis)const
|
||||||
|
@ -3,8 +3,9 @@
|
|||||||
#include<hgl/graph/vulkan/VKShaderParse.h>
|
#include<hgl/graph/vulkan/VKShaderParse.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
ShaderModule::ShaderModule(int id,VkPipelineShaderStageCreateInfo *sci,const ShaderParse *sp)
|
ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *sci,const ShaderParse *sp)
|
||||||
{
|
{
|
||||||
|
device=dev;
|
||||||
shader_id=id;
|
shader_id=id;
|
||||||
ref_count=0;
|
ref_count=0;
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ ShaderModule::ShaderModule(int id,VkPipelineShaderStageCreateInfo *sci,const Sha
|
|||||||
|
|
||||||
ShaderModule::~ShaderModule()
|
ShaderModule::~ShaderModule()
|
||||||
{
|
{
|
||||||
|
vkDestroyShaderModule(device,stage_create_info->module,nullptr);
|
||||||
delete stage_create_info;
|
delete stage_create_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,11 +32,11 @@ void ShaderModule::ParseUBO(const ShaderParse *parse)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexShaderModule::ParseVertexInput(const ShaderParse *parse)
|
VertexShaderModule::VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(dev,id,pssci,parse)
|
||||||
{
|
{
|
||||||
const auto &stage_inputs=parse->GetStageInput();
|
const auto &stage_inputs=parse->GetStageInput();
|
||||||
|
|
||||||
attr_count=stage_inputs.size();
|
attr_count=(uint32_t)stage_inputs.size();
|
||||||
binding_list=new VkVertexInputBindingDescription[attr_count];
|
binding_list=new VkVertexInputBindingDescription[attr_count];
|
||||||
attribute_list=new VkVertexInputAttributeDescription[attr_count];
|
attribute_list=new VkVertexInputAttributeDescription[attr_count];
|
||||||
|
|
||||||
|
@ -49,9 +49,9 @@ const ShaderModule *ShaderModuleManage::CreateShader(const VkShaderStageFlagBits
|
|||||||
ShaderParse *parse=new ShaderParse(spv_data,spv_size);
|
ShaderParse *parse=new ShaderParse(spv_data,spv_size);
|
||||||
|
|
||||||
if(shader_stage_bit==VK_SHADER_STAGE_VERTEX_BIT)
|
if(shader_stage_bit==VK_SHADER_STAGE_VERTEX_BIT)
|
||||||
sm=new VertexShaderModule(shader_count,shader_stage,parse);
|
sm=new VertexShaderModule(*device,shader_count,shader_stage,parse);
|
||||||
else
|
else
|
||||||
sm=new ShaderModule(shader_count,shader_stage,parse);
|
sm=new ShaderModule(*device,shader_count,shader_stage,parse);
|
||||||
|
|
||||||
delete parse;
|
delete parse;
|
||||||
shader_list.Add(shader_count,sm);
|
shader_list.Add(shader_count,sm);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user