VAB改为同时备份Attribute属性,虽然大部分情况下无需修改
This commit is contained in:
parent
1e26f9e482
commit
6a313c9e25
@ -1,7 +1,7 @@
|
|||||||
#include"VKMaterial.h"
|
#include"VKMaterial.h"
|
||||||
#include"VKDescriptorSets.h"
|
#include"VKDescriptorSets.h"
|
||||||
#include"VKShader.h"
|
#include"VKShader.h"
|
||||||
#include"VKVertexInput.h"
|
#include"VKVertexAttributeBinding.h"
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
Material::~Material()
|
Material::~Material()
|
||||||
{
|
{
|
||||||
@ -11,13 +11,13 @@ Material::~Material()
|
|||||||
|
|
||||||
MaterialInstance *Material::CreateInstance()
|
MaterialInstance *Material::CreateInstance()
|
||||||
{
|
{
|
||||||
VertexAttributeBinding *vis_instance=shader->CreateVertexAttributeBinding();
|
VertexAttributeBinding *vab=shader->CreateVertexAttributeBinding();
|
||||||
|
|
||||||
return(new MaterialInstance(this,vis_instance));
|
return(new MaterialInstance(this,vab));
|
||||||
}
|
}
|
||||||
|
|
||||||
MaterialInstance::~MaterialInstance()
|
MaterialInstance::~MaterialInstance()
|
||||||
{
|
{
|
||||||
delete vis_instance;
|
delete vab;
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -6,7 +6,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
class Shader;
|
class Shader;
|
||||||
class DescriptorSetLayoutCreater;
|
class DescriptorSetLayoutCreater;
|
||||||
class MaterialInstance;
|
class MaterialInstance;
|
||||||
class VertexInputState;
|
|
||||||
class VertexAttributeBinding;
|
class VertexAttributeBinding;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,14 +36,14 @@ public:
|
|||||||
class MaterialInstance
|
class MaterialInstance
|
||||||
{
|
{
|
||||||
const Material *mat; ///<这里的是对material的完全引用,不做任何修改
|
const Material *mat; ///<这里的是对material的完全引用,不做任何修改
|
||||||
VertexAttributeBinding *vis_instance; ///<这里的vis是Material中vis的复制体
|
VertexAttributeBinding *vab; ///<这里的vis是Material中vis的复制体
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MaterialInstance(Material *m,VertexAttributeBinding *vi)
|
MaterialInstance(Material *m,VertexAttributeBinding *vi)
|
||||||
{
|
{
|
||||||
mat=m;
|
mat=m;
|
||||||
vis_instance=vi;
|
vab=vi;
|
||||||
}
|
}
|
||||||
|
|
||||||
~MaterialInstance();
|
~MaterialInstance();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include"VKPipeline.h"
|
#include"VKPipeline.h"
|
||||||
#include"VKDevice.h"
|
#include"VKDevice.h"
|
||||||
#include"VKShader.h"
|
#include"VKShader.h"
|
||||||
#include"VKVertexInput.h"
|
#include"VKVertexAttributeBinding.h"
|
||||||
#include"VKRenderPass.h"
|
#include"VKRenderPass.h"
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include"VKShader.h"
|
#include"VKShader.h"
|
||||||
#include"VKVertexInput.h"
|
#include"VKVertexAttributeBinding.h"
|
||||||
#include"spirv_cross.hpp"
|
#include"spirv_cross.hpp"
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
|
@ -6,50 +6,66 @@ VertexAttributeBinding::VertexAttributeBinding(Shader *s)
|
|||||||
{
|
{
|
||||||
shader=s;
|
shader=s;
|
||||||
|
|
||||||
const int count=shader->GetAttrCount();
|
attr_count=shader->GetAttrCount();
|
||||||
|
|
||||||
if(count<=0)
|
if(attr_count<=0)
|
||||||
{
|
{
|
||||||
binding_list=nullptr;
|
binding_list=nullptr;
|
||||||
|
attribute_list=nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
binding_list=hgl_copy_new(count,shader->GetDescList());
|
binding_list=hgl_copy_new(attr_count,shader->GetDescList());
|
||||||
|
attribute_list=hgl_copy_new(attr_count,shader->GetAttrList());
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAttributeBinding::~VertexAttributeBinding()
|
VertexAttributeBinding::~VertexAttributeBinding()
|
||||||
{
|
{
|
||||||
|
delete[] attribute_list;
|
||||||
delete[] binding_list;
|
delete[] binding_list;
|
||||||
|
|
||||||
shader->Release(this);
|
shader->Release(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint VertexAttributeBinding::GetIndex(const UTF8String &name)
|
||||||
|
{
|
||||||
|
return shader->GetBinding(name);
|
||||||
|
}
|
||||||
|
|
||||||
bool VertexAttributeBinding::SetInstance(const uint index,bool instance)
|
bool VertexAttributeBinding::SetInstance(const uint index,bool instance)
|
||||||
{
|
{
|
||||||
if(index>=shader->GetAttrCount())return(false);
|
if(index>=attr_count)return(false);
|
||||||
|
|
||||||
binding_list[index].inputRate=instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX;
|
binding_list[index].inputRate=instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX;
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VertexAttributeBinding::SetInstance(const UTF8String &name,bool instance)
|
bool VertexAttributeBinding::SetStride(const uint index,const uint32_t &stride)
|
||||||
{
|
{
|
||||||
return SetInstance(shader->GetBinding(name),instance);
|
if(index>=attr_count)return(false);
|
||||||
}
|
|
||||||
|
|
||||||
bool VertexAttributeBinding::SetStride(const uint index,uint32_t stride)
|
|
||||||
{
|
|
||||||
if(index>=shader->GetAttrCount())return(false);
|
|
||||||
|
|
||||||
binding_list[index].stride=stride;
|
binding_list[index].stride=stride;
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VertexAttributeBinding::SetStride(const UTF8String &name,uint32_t stride)
|
bool VertexAttributeBinding::SetFormat(const uint index,const VkFormat &format)
|
||||||
{
|
{
|
||||||
return SetStride(shader->GetBinding(name),stride);
|
if(index>=attr_count)return(false);
|
||||||
|
|
||||||
|
attribute_list[index].format=format;
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VertexAttributeBinding::SetOffset(const uint index,const uint32_t offset)
|
||||||
|
{
|
||||||
|
if(index>=attr_count)return(false);
|
||||||
|
|
||||||
|
attribute_list[index].offset=offset;
|
||||||
|
|
||||||
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexAttributeBinding::Write(VkPipelineVertexInputStateCreateInfo &vis_create_info) const
|
void VertexAttributeBinding::Write(VkPipelineVertexInputStateCreateInfo &vis_create_info) const
|
||||||
@ -62,6 +78,6 @@ void VertexAttributeBinding::Write(VkPipelineVertexInputStateCreateInfo &vis_cre
|
|||||||
vis_create_info.pVertexBindingDescriptions = binding_list;
|
vis_create_info.pVertexBindingDescriptions = binding_list;
|
||||||
|
|
||||||
vis_create_info.vertexAttributeDescriptionCount = count;
|
vis_create_info.vertexAttributeDescriptionCount = count;
|
||||||
vis_create_info.pVertexAttributeDescriptions = shader->GetAttrList();
|
vis_create_info.pVertexAttributeDescriptions = attribute_list;
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -15,7 +15,9 @@ class Shader;
|
|||||||
class VertexAttributeBinding
|
class VertexAttributeBinding
|
||||||
{
|
{
|
||||||
Shader *shader;
|
Shader *shader;
|
||||||
|
uint32_t attr_count;
|
||||||
VkVertexInputBindingDescription *binding_list;
|
VkVertexInputBindingDescription *binding_list;
|
||||||
|
VkVertexInputAttributeDescription *attribute_list;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -27,11 +29,17 @@ public:
|
|||||||
|
|
||||||
~VertexAttributeBinding();
|
~VertexAttributeBinding();
|
||||||
|
|
||||||
bool SetInstance(const uint index,bool instance);
|
const uint GetIndex(const UTF8String &name);
|
||||||
bool SetInstance(const UTF8String &name,bool instance);
|
|
||||||
|
|
||||||
bool SetStride(const uint index,uint32_t stride);
|
bool SetInstance(const uint index,bool instance);
|
||||||
bool SetStride(const UTF8String &name,uint32_t stride);
|
bool SetStride (const uint index,const uint32_t & stride);
|
||||||
|
bool SetFormat (const uint index,const VkFormat & format);
|
||||||
|
bool SetOffset (const uint index,const uint32_t offset);
|
||||||
|
|
||||||
|
bool SetInstance(const UTF8String &name,bool instance){return SetInstance(GetIndex(name),instance);}
|
||||||
|
bool SetStride (const UTF8String &name,const uint32_t &stride ){return SetStride (GetIndex(name),stride);}
|
||||||
|
bool SetFormat (const UTF8String &name,const VkFormat &format ){return SetFormat (GetIndex(name),format);}
|
||||||
|
bool SetOffset (const UTF8String &name,const uint32_t offset ){return SetOffset (GetIndex(name),offset);}
|
||||||
|
|
||||||
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
|
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
|
||||||
};//class VertexAttributeBinding
|
};//class VertexAttributeBinding
|
||||||
|
Loading…
x
Reference in New Issue
Block a user