diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 8785dde6..70bdd7bc 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -71,19 +71,25 @@ public: public: const uint32_t GetMICount ()const{return mi_count;} - const uint32_t GetMISize ()const{return mi_size;} + const uint32_t GetMISize ()const{return data->mi_size;} const void * GetMIData ()const{return data->mi_data;} template - T * GetMIData (const uint32_t index)const{return data->mi_data?(T *)(data->mi_data+index*mi_size):nullptr;} + T * GetMIData (const uint32_t index)const + { + if(!data->mi_data)return(nullptr); + if(index>=mi_count)return(nullptr); + + return data->mi_data+index*mi_size; + } template - bool WriteMIData (const uint32_t index,const T *data) + bool WriteMIData (const uint32_t index,const T *write_data) { if(!data->mi_data)return(false); if(index>=mi_count)return(false); - memcpy(mi_data+index*mi_size,data,mi_size); + memcpy(data->mi_data+index*mi_size,write_data,data->mi_size); return(true); } diff --git a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp index dc4a20b8..32f00e87 100644 --- a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp @@ -62,7 +62,7 @@ namespace // FEATURE_COPY(imageCubeArray); // FEATURE_COPY(fullDrawIndexUint32); -// FEATURE_COPY(wideLines) + FEATURE_COPY(wideLines) // FEATURE_COPY(largePoints) #undef FEATURE_COPY diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index f1aedfa3..cd038463 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -119,15 +119,20 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * const VkDeviceSize ubo_range=this->GetUBORange(); + //手机一般ubo_range为16k,PC独显一般为64k + //intel 核显随显存基本无限制 + //我们使用uint8类型在vertex input中保存MaterialInstance ID,表示范围0-255。 + //所以MaterialInstance结构容量在手机上尽量不要超过64字节,在PC上不要超过256字节,当然intel核显无所谓 + if(desc_manager->hasSet(DescriptorSetType::PerMaterial)) { - data->mi_data=new uint8[ubo_range]; data->mi_size + data->mi_data=new uint8[data->mi_size*256]; } else { - data->mi_data=nullptr; data->mi_size=0; + data->mi_data=nullptr; } return(new Material(data)); diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index d86c9de1..10859bed 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -18,7 +18,6 @@ MaterialData::~MaterialData() Material::Material(MaterialData *md):data(md) { - mi_size=0; mi_count=0; }