vkCreateShaderModule bugfix
This commit is contained in:
parent
9d09dee27f
commit
e6d4313f90
@ -44,7 +44,7 @@ namespace refl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool Check(const UClass* toClass)const;
|
bool Check(const UClass* toClass)const;
|
||||||
constexpr bool IsValid() const{
|
constexpr operator bool() const{
|
||||||
return cls != nullptr && ptr != nullptr;
|
return cls != nullptr && ptr != nullptr;
|
||||||
}
|
}
|
||||||
constexpr int Size()const;
|
constexpr int Size()const;
|
||||||
|
|||||||
18
engine/3rdparty/zlib/include/refl/detail/field.h
vendored
18
engine/3rdparty/zlib/include/refl/detail/field.h
vendored
@ -58,6 +58,24 @@ namespace refl {
|
|||||||
Data data{};
|
Data data{};
|
||||||
uint32_t flag{};
|
uint32_t flag{};
|
||||||
|
|
||||||
|
Offset GetOffset() const{
|
||||||
|
if (flag & FIELD_ATTRIBUTE_FLAG) {
|
||||||
|
return data.member.offset;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Any GetValue()const {
|
||||||
|
if (flag & FIELD_ATTRIBUTE_FLAG)
|
||||||
|
return data.member.value;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
Any GetMeta()const {
|
||||||
|
if (flag & FIELD_ATTRIBUTE_FLAG)
|
||||||
|
return data.member.meta;
|
||||||
|
if(flag & FIELD_METHOD_FLAG)
|
||||||
|
return data.method.meta;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
//unsafe
|
//unsafe
|
||||||
bool Invoke(const sarray<Any>& ArgsList)const;
|
bool Invoke(const sarray<Any>& ArgsList)const;
|
||||||
//safe
|
//safe
|
||||||
|
|||||||
@ -19,7 +19,7 @@ namespace refl {
|
|||||||
method.value = args.ToSArray();
|
method.value = args.ToSArray();
|
||||||
memory += args.Size();
|
memory += args.Size();
|
||||||
}
|
}
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
method.meta = data.meta.Change(memory);
|
method.meta = data.meta.Change(memory);
|
||||||
Convert::Construct(method.meta, data.meta);
|
Convert::Construct(method.meta, data.meta);
|
||||||
memory += data.meta.Size();
|
memory += data.meta.Size();
|
||||||
@ -33,12 +33,12 @@ namespace refl {
|
|||||||
MemberData member;
|
MemberData member;
|
||||||
auto cls = &TypeInfo<T>::StaticClass;
|
auto cls = &TypeInfo<T>::StaticClass;
|
||||||
member.offset = reinterpret_cast<std::size_t>(&(reinterpret_cast<const Obj*>(0)->*ptr));
|
member.offset = reinterpret_cast<std::size_t>(&(reinterpret_cast<const Obj*>(0)->*ptr));
|
||||||
if (data.value.IsValid()) {
|
if (data.value) {
|
||||||
member.value = Any(memory, cls);
|
member.value = Any(memory, cls);
|
||||||
assert(Convert::Construct(member.value, data.value));
|
assert(Convert::Construct(member.value, data.value));
|
||||||
memory += member.value.Size();
|
memory += member.value.Size();
|
||||||
}
|
}
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
member.meta = data.meta.Change(memory);
|
member.meta = data.meta.Change(memory);
|
||||||
Convert::Construct(member.meta, data.meta);
|
Convert::Construct(member.meta, data.meta);
|
||||||
memory += data.meta.Size();
|
memory += data.meta.Size();
|
||||||
@ -58,7 +58,7 @@ namespace refl {
|
|||||||
method.value = args.ToSArray();
|
method.value = args.ToSArray();
|
||||||
memory += args.Size();
|
memory += args.Size();
|
||||||
}
|
}
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
method.meta = data.meta.Change(memory);
|
method.meta = data.meta.Change(memory);
|
||||||
Convert::Construct(method.meta, data.meta);
|
Convert::Construct(method.meta, data.meta);
|
||||||
memory += data.meta.Size();
|
memory += data.meta.Size();
|
||||||
@ -78,7 +78,7 @@ namespace refl {
|
|||||||
method.value = args.ToSArray();
|
method.value = args.ToSArray();
|
||||||
memory += args.Size();
|
memory += args.Size();
|
||||||
}
|
}
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
method.meta = data.meta.Change(memory);
|
method.meta = data.meta.Change(memory);
|
||||||
Convert::Construct(method.meta, data.meta);
|
Convert::Construct(method.meta, data.meta);
|
||||||
memory += data.meta.Size();
|
memory += data.meta.Size();
|
||||||
@ -98,7 +98,7 @@ namespace refl {
|
|||||||
method.value = args.ToSArray();
|
method.value = args.ToSArray();
|
||||||
memory += args.Size();
|
memory += args.Size();
|
||||||
}
|
}
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
method.meta = data.meta.Change(memory);
|
method.meta = data.meta.Change(memory);
|
||||||
Convert::Construct(method.meta, data.meta);
|
Convert::Construct(method.meta, data.meta);
|
||||||
memory += data.meta.Size();
|
memory += data.meta.Size();
|
||||||
|
|||||||
1
engine/3rdparty/zlib/include/refl/macro.h
vendored
1
engine/3rdparty/zlib/include/refl/macro.h
vendored
@ -27,6 +27,7 @@
|
|||||||
#define USING_OVERLOAD_FUNC(R, ...) using USING_FUNC_NAME = R(*)(__VA_ARGS__);
|
#define USING_OVERLOAD_FUNC(R, ...) using USING_FUNC_NAME = R(*)(__VA_ARGS__);
|
||||||
#define USING_OVERLOAD_CLASS_FUNC(R, Class, ...) using USING_FUNC_NAME = R(Class::*)(__VA_ARGS__);
|
#define USING_OVERLOAD_CLASS_FUNC(R, Class, ...) using USING_FUNC_NAME = R(Class::*)(__VA_ARGS__);
|
||||||
|
|
||||||
|
#define REGISTER_META_TABLE(Class) refl::UClass::MetaTable.emplace(type_name<Class>().View(), &refl::TypeInfo<Class>::StaticClass);
|
||||||
/*
|
/*
|
||||||
struct vec3{
|
struct vec3{
|
||||||
USING_OVERLOAD_CTOR(vec3)
|
USING_OVERLOAD_CTOR(vec3)
|
||||||
|
|||||||
12
engine/3rdparty/zlib/include/refl/refl.h
vendored
12
engine/3rdparty/zlib/include/refl/refl.h
vendored
@ -11,7 +11,7 @@ namespace refl {
|
|||||||
consteval FieldPtr StaticCtorField(T(*ptr)(Args...), const MethodData& data = {}) {
|
consteval FieldPtr StaticCtorField(T(*ptr)(Args...), const MethodData& data = {}) {
|
||||||
uint32_t flag = FIELD_CTOR_FLAG;
|
uint32_t flag = FIELD_CTOR_FLAG;
|
||||||
Offset offset = AnyArgs::GetArgsSize<void,void*, Args...>(data.value);
|
Offset offset = AnyArgs::GetArgsSize<void,void*, Args...>(data.value);
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
offset += data.meta.Size();
|
offset += data.meta.Size();
|
||||||
}
|
}
|
||||||
FieldPtr::Data method(offset);
|
FieldPtr::Data method(offset);
|
||||||
@ -19,8 +19,8 @@ namespace refl {
|
|||||||
}
|
}
|
||||||
template<typename T, typename Obj>
|
template<typename T, typename Obj>
|
||||||
consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberData& data = {}) {
|
consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberData& data = {}) {
|
||||||
Offset offset = data.value.IsValid() ? sizeof(T) : 0;
|
Offset offset = data.value ? sizeof(T) : 0;
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
offset += data.meta.Size();
|
offset += data.meta.Size();
|
||||||
}
|
}
|
||||||
FieldPtr::Data member(offset);
|
FieldPtr::Data member(offset);
|
||||||
@ -31,7 +31,7 @@ namespace refl {
|
|||||||
consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
||||||
uint32_t flag = FIELD_METHOD_FLAG;
|
uint32_t flag = FIELD_METHOD_FLAG;
|
||||||
Offset offset = AnyArgs::GetArgsSize<R, Args...>(data.value);
|
Offset offset = AnyArgs::GetArgsSize<R, Args...>(data.value);
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
offset += data.meta.Size();
|
offset += data.meta.Size();
|
||||||
}
|
}
|
||||||
FieldPtr::Data method(offset);
|
FieldPtr::Data method(offset);
|
||||||
@ -41,7 +41,7 @@ namespace refl {
|
|||||||
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
||||||
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
||||||
Offset offset = AnyArgs::GetArgsSize<R,void*, Args...>(data.value);
|
Offset offset = AnyArgs::GetArgsSize<R,void*, Args...>(data.value);
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
offset += data.meta.Size();
|
offset += data.meta.Size();
|
||||||
}
|
}
|
||||||
FieldPtr::Data method(offset);
|
FieldPtr::Data method(offset);
|
||||||
@ -51,7 +51,7 @@ namespace refl {
|
|||||||
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...)const, const Name& name, const MethodData& data = {}) {
|
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...)const, const Name& name, const MethodData& data = {}) {
|
||||||
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
||||||
Offset offset = AnyArgs::GetArgsSize<R, void*, Args...>(data.value);
|
Offset offset = AnyArgs::GetArgsSize<R, void*, Args...>(data.value);
|
||||||
if (data.meta.IsValid()) {
|
if (data.meta) {
|
||||||
offset += data.meta.Size();
|
offset += data.meta.Size();
|
||||||
}
|
}
|
||||||
FieldPtr::Data method(offset);
|
FieldPtr::Data method(offset);
|
||||||
|
|||||||
@ -50,7 +50,7 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
inline Node TextArchive::Serialize(const Any& any)
|
inline Node TextArchive::Serialize(const Any& any)
|
||||||
{
|
{
|
||||||
if (!any.IsValid()) {
|
if (!any) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
auto it = FuncMap.find(any.cls);
|
auto it = FuncMap.find(any.cls);
|
||||||
@ -81,7 +81,7 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
inline bool TextArchive::Unserialize(const Node& res, const Any& any)
|
inline bool TextArchive::Unserialize(const Node& res, const Any& any)
|
||||||
{
|
{
|
||||||
if (!any.IsValid()) {
|
if (!any) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (res.IsNull()) {
|
if (res.IsNull()) {
|
||||||
|
|||||||
3
engine/3rdparty/zlib/include/zstd/harray.h
vendored
3
engine/3rdparty/zlib/include/zstd/harray.h
vendored
@ -50,7 +50,7 @@ namespace zstd {
|
|||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
constexpr bool IsValid() const noexcept {
|
constexpr operator bool() const noexcept {
|
||||||
return m_count > 0;
|
return m_count > 0;
|
||||||
}
|
}
|
||||||
constexpr bool empty() const noexcept {
|
constexpr bool empty() const noexcept {
|
||||||
@ -78,7 +78,6 @@ namespace zstd {
|
|||||||
++ptr;
|
++ptr;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
//这里其实是--it,而不是it--
|
|
||||||
constexpr iterator& operator--(int) noexcept {
|
constexpr iterator& operator--(int) noexcept {
|
||||||
--ptr;
|
--ptr;
|
||||||
return *this;
|
return *this;
|
||||||
|
|||||||
2
engine/3rdparty/zlib/include/zstd/svector.h
vendored
2
engine/3rdparty/zlib/include/zstd/svector.h
vendored
@ -25,7 +25,7 @@ namespace zstd {
|
|||||||
m_count++;
|
m_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
constexpr bool IsValid() const noexcept {
|
constexpr operator bool() const noexcept {
|
||||||
return m_count > 0;
|
return m_count > 0;
|
||||||
}
|
}
|
||||||
constexpr bool empty() const noexcept {
|
constexpr bool empty() const noexcept {
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "refl/refl.h"
|
|
||||||
namespace engineapi {
|
|
||||||
struct VertexMeta {
|
|
||||||
uint32_t format;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,18 +1,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "math/vector3.h"
|
#include "math/vector3.h"
|
||||||
#include "math/vector2.h"
|
#include "math/vector2.h"
|
||||||
#include "meta.h"
|
#include "refl/refl.h"
|
||||||
// 顶点最多关联4个骨骼
|
// 顶点最多关联4个骨骼
|
||||||
#define MAX_NUM_BONES_PER_VERTEX 4
|
#define MAX_NUM_BONES_PER_VERTEX 4
|
||||||
|
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
struct Vertex {};
|
struct Vertex {};
|
||||||
struct PosVertex : public Vertex {
|
struct PosVertex : public Vertex {
|
||||||
UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT })
|
UPROPERTY_vk({}, uint32_t{ VK_FORMAT_R32G32B32_SFLOAT })
|
||||||
Vector3 Position = {};
|
Vector3 Position = {};
|
||||||
};
|
};
|
||||||
struct TexVertex : public Vertex {
|
struct TexVertex : public Vertex {
|
||||||
UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT })
|
UPROPERTY_vk({}, uint32_t{ VK_FORMAT_R32G32B32_SFLOAT })
|
||||||
Vector3 Position = {};
|
Vector3 Position = {};
|
||||||
UPROPERTY_vk()
|
UPROPERTY_vk()
|
||||||
Vector3 Normal = {};
|
Vector3 Normal = {};
|
||||||
@ -21,7 +20,7 @@ namespace engineapi {
|
|||||||
};
|
};
|
||||||
struct BoneVertex : public Vertex
|
struct BoneVertex : public Vertex
|
||||||
{
|
{
|
||||||
UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT })
|
UPROPERTY_vk({}, uint32_t{ VK_FORMAT_R32G32B32_SFLOAT })
|
||||||
Vector3 Position = {};
|
Vector3 Position = {};
|
||||||
UPROPERTY_vk()
|
UPROPERTY_vk()
|
||||||
Vector2 TexCoords = {};
|
Vector2 TexCoords = {};
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include "asset/file_manager.h"
|
#include "asset/file_manager.h"
|
||||||
#include "render/meta/vertex.h"
|
#include "render/meta/vertex.h"
|
||||||
#include "vkmeta_vertex_gen.inl"
|
#include "vkmeta_vertex_gen.inl"
|
||||||
|
#include <spirv_cross/spirv_reflect.hpp>
|
||||||
using namespace engineapi;
|
using namespace engineapi;
|
||||||
namespace vulkanapi {
|
namespace vulkanapi {
|
||||||
vk::ShaderStageFlagBits GetShaderType(string_view ext)
|
vk::ShaderStageFlagBits GetShaderType(string_view ext)
|
||||||
@ -21,16 +22,23 @@ namespace vulkanapi {
|
|||||||
}
|
}
|
||||||
void VulkanGlslLoader::Init()
|
void VulkanGlslLoader::Init()
|
||||||
{
|
{
|
||||||
|
REGISTER_META_TABLE(PosVertex);
|
||||||
|
REGISTER_META_TABLE(TexVertex);
|
||||||
|
REGISTER_META_TABLE(BoneVertex);
|
||||||
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".geom");
|
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".geom");
|
||||||
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".frag");
|
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".frag");
|
||||||
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".vert");
|
ResourceManager::GetSingleton().RegisterLoader<VulkanGlslLoader>(".vert");
|
||||||
}
|
}
|
||||||
void VulkanGlslLoader::LoadShaderInfo(const std::string_view& name)
|
void VulkanGlslLoader::LoadShaderInfo(const engineapi::Guid& guid, const std::vector<uint32_t>& spirv)
|
||||||
{
|
{
|
||||||
auto it = refl::UClass::MetaTable.find(Name(name));
|
spirv_cross::Compiler compiler(spirv);
|
||||||
auto meta = it->second->vtable.GetMeta("vkMeta");
|
auto resources = compiler.get_shader_resources();
|
||||||
int x = 1;
|
for (auto& ub : resources.uniform_buffers)
|
||||||
int y = 2;
|
{
|
||||||
|
auto type = compiler.get_type(ub.type_id);
|
||||||
|
auto binding = compiler.get_decoration(ub.id, spv::Decoration::DecorationBinding);
|
||||||
|
auto set = compiler.get_decoration(ub.id, spv::Decoration::DecorationDescriptorSet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ResourceBundle VulkanGlslLoader::LoadFile(PackagePath handle, const MetaBundle& meta)
|
ResourceBundle VulkanGlslLoader::LoadFile(PackagePath handle, const MetaBundle& meta)
|
||||||
{
|
{
|
||||||
@ -45,10 +53,10 @@ namespace vulkanapi {
|
|||||||
if (res) {
|
if (res) {
|
||||||
string glsl = res.value();
|
string glsl = res.value();
|
||||||
auto shader_enum = GetShaderType(handle.GetExtension());
|
auto shader_enum = GetShaderType(handle.GetExtension());
|
||||||
//glsl = GlslToSpirv::PreprocessGlsl(glsl);
|
|
||||||
auto spirv = GlslToSpirv::spirv(glsl, shader_enum, handle.GetFileName());
|
auto spirv = GlslToSpirv::spirv(glsl, shader_enum, handle.GetFileName());
|
||||||
if (spirv) {
|
if (spirv) {
|
||||||
program->Load(*spirv);
|
program->Load(*spirv);
|
||||||
|
LoadShaderInfo(program->GetHandle().guid, *spirv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,9 +14,10 @@ namespace vulkanapi {
|
|||||||
};
|
};
|
||||||
class VulkanGlslLoader : public engineapi::IFileLoader
|
class VulkanGlslLoader : public engineapi::IFileLoader
|
||||||
{
|
{
|
||||||
|
inline static table<engineapi::Guid, void*> ShaderTable;
|
||||||
public:
|
public:
|
||||||
static void Init();
|
static void Init();
|
||||||
static void LoadShaderInfo(const std::string_view& name);
|
static void LoadShaderInfo(const engineapi::Guid& guid, const std::vector<unsigned int>& spirv);
|
||||||
engineapi::ResourceBundle LoadFile(engineapi::PackagePath handle, const engineapi::MetaBundle& meta) override;
|
engineapi::ResourceBundle LoadFile(engineapi::PackagePath handle, const engineapi::MetaBundle& meta) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -8,18 +8,6 @@ namespace vulkanapi
|
|||||||
{
|
{
|
||||||
using std::vector;
|
using std::vector;
|
||||||
using zstd::hash_table;
|
using zstd::hash_table;
|
||||||
constexpr auto replacer = R"(
|
|
||||||
#ifdef OGL
|
|
||||||
#define U_LAYOUT(SET, BIND)
|
|
||||||
#define S_LAYOUT(SET, BIND)
|
|
||||||
#define BLOCK(X) struct X
|
|
||||||
#endif
|
|
||||||
#ifdef VULKAN
|
|
||||||
#define U_LAYOUT(SET, BIND) layout(std140, set = SET, binding = BIND)
|
|
||||||
#define S_LAYOUT(SET, BIND) layout(set = SET, binding = BIND)
|
|
||||||
#define BLOCK(X) X
|
|
||||||
#endif
|
|
||||||
)";
|
|
||||||
shaderc_shader_kind ConvertStageSC(vk::ShaderStageFlagBits stage)
|
shaderc_shader_kind ConvertStageSC(vk::ShaderStageFlagBits stage)
|
||||||
{
|
{
|
||||||
static hash_table< vk::ShaderStageFlagBits, shaderc_shader_kind> conv
|
static hash_table< vk::ShaderStageFlagBits, shaderc_shader_kind> conv
|
||||||
@ -33,29 +21,18 @@ namespace vulkanapi
|
|||||||
auto itr = conv.find(stage);
|
auto itr = conv.find(stage);
|
||||||
return itr->second;
|
return itr->second;
|
||||||
}
|
}
|
||||||
string GlslToSpirv::PreprocessGlsl(string glsl)
|
std::optional<std::vector<uint32_t>> GlslToSpirv::spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id)
|
||||||
{
|
{
|
||||||
string shader_code = glsl;
|
std::optional<std::vector<uint32_t>> spirv_out;
|
||||||
|
|
||||||
//shader_code = ProcessIncludes(shader_code);
|
|
||||||
|
|
||||||
auto version_pos = shader_code.find("#version");
|
|
||||||
auto version_end = shader_code.find("\n", version_pos);
|
|
||||||
|
|
||||||
return shader_code.substr(0, version_end) + replacer + shader_code.substr(version_end, shader_code.size() - version_end);
|
|
||||||
}
|
|
||||||
std::optional<std::vector<unsigned int>> GlslToSpirv::spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id)
|
|
||||||
{
|
|
||||||
std::optional<std::vector<unsigned int>> spirv_out;
|
|
||||||
{
|
{
|
||||||
shaderc::Compiler compiler;
|
shaderc::Compiler compiler;
|
||||||
shaderc::CompileOptions options;
|
shaderc::CompileOptions options;
|
||||||
options.SetOptimizationLevel(shaderc_optimization_level_performance);
|
options.SetOptimizationLevel(shaderc_optimization_level_performance);
|
||||||
options.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_2);
|
options.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3);
|
||||||
auto result = compiler.CompileGlslToSpv(glsl, ConvertStageSC(v_stage), code_id.data(), options);
|
auto result = compiler.CompileGlslToSpv(glsl, ConvertStageSC(v_stage), code_id.data(), options);
|
||||||
if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success)
|
if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success)
|
||||||
return spirv_out;
|
return spirv_out;
|
||||||
spirv_out = vector<unsigned int>{ result.begin(),result.end() };
|
spirv_out = vector<uint32_t>{ result.cbegin(),result.cend() };
|
||||||
}
|
}
|
||||||
return spirv_out;
|
return spirv_out;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,6 @@ namespace vulkanapi
|
|||||||
class GlslToSpirv
|
class GlslToSpirv
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static string PreprocessGlsl(string glsl);
|
static std::optional<std::vector<uint32_t>> spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id = "unknown_shader");
|
||||||
static std::optional<std::vector<unsigned int>> spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id = "unknown_shader");
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -151,7 +151,6 @@ namespace vulkanapi {
|
|||||||
}
|
}
|
||||||
void RenderVulkanAPI::LoadShader(Shader* shader)
|
void RenderVulkanAPI::LoadShader(Shader* shader)
|
||||||
{
|
{
|
||||||
VulkanGlslLoader::LoadShaderInfo(shader->GetVertexName());
|
|
||||||
vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
||||||
std::map<VkShaderStageFlagBits, VkShaderModule> shaderModules;
|
std::map<VkShaderStageFlagBits, VkShaderModule> shaderModules;
|
||||||
auto device = backend.GetDevice();
|
auto device = backend.GetDevice();
|
||||||
@ -168,43 +167,31 @@ namespace vulkanapi {
|
|||||||
shaderStageInfo.pName = "main";
|
shaderStageInfo.pName = "main";
|
||||||
shaderStages.push_back(shaderStageInfo);
|
shaderStages.push_back(shaderStageInfo);
|
||||||
}
|
}
|
||||||
|
auto it = refl::UClass::MetaTable.find(shader->GetVertexName());
|
||||||
|
auto meta = it->second->vtable.GetMeta("vkMeta");
|
||||||
// 设置顶点输入格式
|
// 设置顶点输入格式
|
||||||
|
VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
|
||||||
VkVertexInputBindingDescription bindingDescription = {};
|
VkVertexInputBindingDescription bindingDescription = {};
|
||||||
bindingDescription.binding = 0;
|
bindingDescription.binding = 0;
|
||||||
bindingDescription.stride = sizeof(Vertex);
|
bindingDescription.stride = meta->size;
|
||||||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
|
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
|
||||||
|
//这里顶点属性不能大余16
|
||||||
array<VkVertexInputAttributeDescription, 6> attributeDescriptions = { };
|
array<VkVertexInputAttributeDescription, 16> attributeDescriptions = { };
|
||||||
attributeDescriptions[0].binding = 0;
|
{
|
||||||
attributeDescriptions[0].location = 0;
|
uint32_t count = 0;
|
||||||
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
|
for (auto& field : meta->GetFields(refl::FIND_ALL_MEMBER, FName(""))) {
|
||||||
attributeDescriptions[0].offset = offsetof(BoneVertex, Position);
|
auto& attr = attributeDescriptions[count];
|
||||||
attributeDescriptions[1].binding = 0;
|
attr.binding = 0;
|
||||||
attributeDescriptions[1].location = 1;
|
attr.location = count++;
|
||||||
attributeDescriptions[1].format = VK_FORMAT_R32G32_SFLOAT;
|
attr.format = field.GetMeta() ? (VkFormat)field.GetMeta().CastTo<uint32_t>() : VK_FORMAT_R32G32B32_SFLOAT;
|
||||||
attributeDescriptions[1].offset = offsetof(BoneVertex, TexCoords);
|
attr.offset = field.GetOffset();
|
||||||
attributeDescriptions[2].binding = 0;
|
}
|
||||||
attributeDescriptions[2].location = 2;
|
vertexInputInfo.vertexAttributeDescriptionCount = count;
|
||||||
attributeDescriptions[2].format = VK_FORMAT_R32G32B32_SFLOAT;
|
}
|
||||||
attributeDescriptions[2].offset = offsetof(BoneVertex, Normal);
|
|
||||||
attributeDescriptions[3].binding = 0;
|
|
||||||
attributeDescriptions[3].location = 3;
|
|
||||||
attributeDescriptions[3].format = VK_FORMAT_R32G32B32_SFLOAT;
|
|
||||||
attributeDescriptions[3].offset = offsetof(BoneVertex, Tangent);
|
|
||||||
attributeDescriptions[4].binding = 0;
|
|
||||||
attributeDescriptions[4].location = 4;
|
|
||||||
attributeDescriptions[4].format = VK_FORMAT_R32G32B32A32_SFLOAT;
|
|
||||||
attributeDescriptions[4].offset = offsetof(BoneVertex, Weights);
|
|
||||||
attributeDescriptions[5].binding = 0;
|
|
||||||
attributeDescriptions[5].location = 5;
|
|
||||||
attributeDescriptions[5].format = VK_FORMAT_R32G32B32A32_UINT;
|
|
||||||
attributeDescriptions[5].offset = offsetof(BoneVertex, BoneIDs);
|
|
||||||
VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
|
|
||||||
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
vertexInputInfo.pVertexBindingDescriptions = &bindingDescription;
|
vertexInputInfo.pVertexBindingDescriptions = &bindingDescription;
|
||||||
vertexInputInfo.vertexBindingDescriptionCount = 1;
|
|
||||||
vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();
|
vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();
|
||||||
vertexInputInfo.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size());
|
vertexInputInfo.vertexBindingDescriptionCount = 1;
|
||||||
|
|
||||||
// 设置图元
|
// 设置图元
|
||||||
VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo = {};
|
VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo = {};
|
||||||
@ -315,8 +302,8 @@ namespace vulkanapi {
|
|||||||
if (vkCreateGraphicsPipelines(device.Ptr(), VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &pipeLine) != VK_SUCCESS)
|
if (vkCreateGraphicsPipelines(device.Ptr(), VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &pipeLine) != VK_SUCCESS)
|
||||||
throw std::runtime_error("failed to create graphics pipeline!");
|
throw std::runtime_error("failed to create graphics pipeline!");
|
||||||
|
|
||||||
for (auto& shaderModule : shaderModules)
|
//for (auto& shaderModule : shaderModules)
|
||||||
vkDestroyShaderModule(device.Ptr(), shaderModule.second, nullptr);
|
//vkDestroyShaderModule(device.Ptr(), shaderModule.second, nullptr);
|
||||||
|
|
||||||
auto vulkan_pipeline = GetNextPipeline(shader->GetID());
|
auto vulkan_pipeline = GetNextPipeline(shader->GetID());
|
||||||
vulkan_pipeline->name = "";//shader->GetName();
|
vulkan_pipeline->name = "";//shader->GetName();
|
||||||
|
|||||||
@ -91,12 +91,12 @@ namespace vulkanapi {
|
|||||||
VkResult result = vkCreateShaderModule(mPtr, &createInfo, nullptr, &module);
|
VkResult result = vkCreateShaderModule(mPtr, &createInfo, nullptr, &module);
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
VkShaderModule Device::CreateShaderModule(vector<unsigned int> code)
|
VkShaderModule Device::CreateShaderModule(vector<uint32_t> code)
|
||||||
{
|
{
|
||||||
VkShaderModuleCreateInfo createInfo = {};
|
VkShaderModuleCreateInfo createInfo = {};
|
||||||
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||||
// 这里需要确保数据满足uint32_t的对齐要求,存储在vector中,默认分配器已经确保数据满足最差情况下的对齐要求
|
//code size 是字节大小,需要 * sizeof
|
||||||
createInfo.codeSize = code.size();
|
createInfo.codeSize = code.size() * sizeof(uint32_t);
|
||||||
// 转换为Vulkan要求的uint32_t指针
|
// 转换为Vulkan要求的uint32_t指针
|
||||||
createInfo.pCode = reinterpret_cast<const uint32_t*>(code.data());
|
createInfo.pCode = reinterpret_cast<const uint32_t*>(code.data());
|
||||||
VkShaderModule module;
|
VkShaderModule module;
|
||||||
|
|||||||
@ -25,6 +25,6 @@ namespace vulkanapi {
|
|||||||
VkFence CreateFence();
|
VkFence CreateFence();
|
||||||
VkSemaphore CreateSemaphore();
|
VkSemaphore CreateSemaphore();
|
||||||
VkShaderModule CreateShaderModule(vector<char> code);
|
VkShaderModule CreateShaderModule(vector<char> code);
|
||||||
VkShaderModule CreateShaderModule(vector<unsigned int> code);
|
VkShaderModule CreateShaderModule(vector<uint32_t> code);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
Loading…
Reference in New Issue
Block a user