diff --git a/engine/3rdparty/xmake.lua b/engine/3rdparty/xmake.lua index 128f5ad..7bcc3c3 100644 --- a/engine/3rdparty/xmake.lua +++ b/engine/3rdparty/xmake.lua @@ -7,4 +7,5 @@ local utils = { "glslang", "SPIRV", "SPIRV-Tools", "shaderc", "shaderc_shared","shaderc_util", "shaderc_combined", "spirv-cross-glsl","spirv-cross-cpp", "spirv-cross-core", "spirv-cross-reflect","spirv-cross-util" } -add_requires("vulkansdk",{configs = {utils = utils}}) \ No newline at end of file +add_requires("vulkansdk",{configs = {utils = utils}}) +add_requires("opengl", "opencl-headers") \ No newline at end of file diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index f01fb19..a019eb1 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -12,7 +12,7 @@ namespace engineapi { const char* name = "zengine"; SystemList.push_back(new FileManager()); SystemList.push_back(new ResourceManager()); - SystemList.push_back(RenderAPI::MakeInstance()); + SystemList.push_back(RenderAPI::API(GraphicsAPI::OpenGL)); SystemList.push_back(Window::MakeInstance(3, 640, 720, name)); SystemList.push_back(new SceneManager()); } diff --git a/engine/src/engine/openglapi/backend.cpp b/engine/src/engine/openglapi/backend.cpp new file mode 100644 index 0000000..37d3b7f --- /dev/null +++ b/engine/src/engine/openglapi/backend.cpp @@ -0,0 +1,4 @@ +#include "backend.h" +namespace openglapi { + +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/backend.h b/engine/src/engine/openglapi/backend.h new file mode 100644 index 0000000..a32bf86 --- /dev/null +++ b/engine/src/engine/openglapi/backend.h @@ -0,0 +1,4 @@ +#pragma once +namespace openglapi { + +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/loader/opengl_glsl_loader.cpp b/engine/src/engine/openglapi/loader/opengl_glsl_loader.cpp new file mode 100644 index 0000000..b454ce2 --- /dev/null +++ b/engine/src/engine/openglapi/loader/opengl_glsl_loader.cpp @@ -0,0 +1,15 @@ +#include "opengl_glsl_loader.h" +#include "asset/file_handle.h" +using namespace engineapi; +namespace openglapi { + void OpenGLGlslLoader::Init() + { + ResourceManager::GetSingleton().RegisterLoader(".frag"); + ResourceManager::GetSingleton().RegisterLoader(".vert"); + } + ResourceBundle OpenGLGlslLoader::LoadFile(PackagePath path, const MetaBundle& meta) + { + return {}; + } +} + diff --git a/engine/src/engine/openglapi/loader/opengl_glsl_loader.h b/engine/src/engine/openglapi/loader/opengl_glsl_loader.h new file mode 100644 index 0000000..58ce554 --- /dev/null +++ b/engine/src/engine/openglapi/loader/opengl_glsl_loader.h @@ -0,0 +1,13 @@ +#pragma once +#include "render/asset/shader.h" +#include "asset/resource_manager.h" +namespace openglapi { + using engineapi::table; + class OpenGLGlslLoader : public engineapi::IFileLoader + { + inline static table ShaderTable; + public: + static void Init(); + engineapi::ResourceBundle LoadFile(engineapi::PackagePath handle, const engineapi::MetaBundle& meta) override; + }; +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/openglapi.cpp b/engine/src/engine/openglapi/openglapi.cpp new file mode 100644 index 0000000..d643626 --- /dev/null +++ b/engine/src/engine/openglapi/openglapi.cpp @@ -0,0 +1,33 @@ +#include "openglapi.h" +#include "loader/opengl_glsl_loader.h" +namespace openglapi { + void RenderOpenGLApi::SwitchContext() + { + } + void RenderOpenGLApi::Init() + { + OpenGLGlslLoader::Init(); + } + void RenderOpenGLApi::InitRenderPass() + { + } + void RenderOpenGLApi::SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset) + { + + } + void RenderOpenGLApi::BeginFrame() + { + } + void RenderOpenGLApi::EndFrame() + { + } + void RenderOpenGLApi::SetStaticMesh(Mesh& mesh) + { + } + void RenderOpenGLApi::DrawStaticMesh(Mesh& mesh) + { + } + void RenderOpenGLApi::LoadShader(Shader& shader) + { + } +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/openglapi.h b/engine/src/engine/openglapi/openglapi.h new file mode 100644 index 0000000..15bf900 --- /dev/null +++ b/engine/src/engine/openglapi/openglapi.h @@ -0,0 +1,30 @@ +#pragma once +#include "render/renderapi.h" +#include "asset/render/asset_struct.h" +#include "gl/GL.h" +namespace openglapi { + using engineapi::RenderContext; + using engineapi::Mesh; + using engineapi::Shader; + class RenderOpenGLApi : public engineapi::RenderAPI { + RenderContext context; + public: + RenderContext* GetContext() override { + return &context; + }; + public: + void SwitchContext()override; + public: + void Init() override; + void InitRenderPass()override; + public: + void SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset = 0, uint32_t yOffset = 0)override; + + void BeginFrame()override; + void EndFrame()override; + void SetStaticMesh(Mesh& mesh)override; + void DrawStaticMesh(Mesh& mesh)override; + + void LoadShader(Shader& shader)override; + }; +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/window.cpp b/engine/src/engine/openglapi/window.cpp new file mode 100644 index 0000000..3b1a477 --- /dev/null +++ b/engine/src/engine/openglapi/window.cpp @@ -0,0 +1,7 @@ +#include "window.h" +namespace openglapi { + OpenGLWindow::OpenGLWindow(int frames, uint32_t width, uint32_t height, const char* title) + :engineapi::Window(width, height, title) + { + } +} \ No newline at end of file diff --git a/engine/src/engine/openglapi/window.h b/engine/src/engine/openglapi/window.h new file mode 100644 index 0000000..96c4e4a --- /dev/null +++ b/engine/src/engine/openglapi/window.h @@ -0,0 +1,8 @@ +#pragma once +#include "render/window.h" +namespace openglapi { + class OpenGLWindow : public engineapi::Window { + public: + OpenGLWindow(int frames, uint32_t width, uint32_t height, const char* title); + }; +} \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.cpp b/engine/src/engine/render/renderapi.cpp index 4dc2a27..2c2851a 100644 --- a/engine/src/engine/render/renderapi.cpp +++ b/engine/src/engine/render/renderapi.cpp @@ -4,6 +4,9 @@ #ifdef VULKAN_API #include "vulkanapi/vulkanapi.h" #endif // VULKAN_API +#ifdef OPENGL_API +#include "openglapi/openglapi.h" +#endif // OPENGL_API namespace engineapi { RenderAPI::RenderAPI() { @@ -34,7 +37,22 @@ namespace engineapi { RenderAPI* RenderAPI::MakeInstance() { #ifdef VULKAN_API - return new vulkanapi::RenderVulkanAPI(); + if(api == GraphicsAPI::Vulkan) + return new vulkanapi::RenderVulkanAPI(); #endif +#ifdef OPENGL_API + if (api == GraphicsAPI::OpenGL) + return new openglapi::RenderOpenGLApi(); +#endif + return nullptr; + } + RenderAPI* RenderAPI::API(GraphicsAPI _api) + { + if (ms_Singleton) { + delete ms_Singleton; + ms_Singleton = nullptr; + } + api = _api; + return MakeInstance(); } } \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.h b/engine/src/engine/render/renderapi.h index cd6631c..d204e15 100644 --- a/engine/src/engine/render/renderapi.h +++ b/engine/src/engine/render/renderapi.h @@ -40,5 +40,11 @@ namespace engineapi public: static RenderAPI* MakeInstance(); + static GraphicsAPI API() { + return api; + } + static RenderAPI* API(GraphicsAPI _api); + private: + inline static GraphicsAPI api = GraphicsAPI::Vulkan; }; } \ No newline at end of file diff --git a/engine/src/engine/render/tool/glsl_to_spirv.cpp b/engine/src/engine/render/tool/glsl_to_spirv.cpp new file mode 100644 index 0000000..074cb80 --- /dev/null +++ b/engine/src/engine/render/tool/glsl_to_spirv.cpp @@ -0,0 +1,21 @@ +#include "glsl_to_spirv.h" +#include +namespace engineapi +{ + optional> GlslToSpirv::spirv(const string& glsl, shaderc_shader_kind kind, string_view code_id) + { + optional> spirv_out; + { + shaderc::Compiler compiler; + shaderc::CompileOptions options; + options.SetOptimizationLevel(shaderc_optimization_level_performance); + options.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3); + auto result = compiler.CompileGlslToSpv(glsl, kind, code_id.data(), options); + if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) + return spirv_out; + spirv_out = vector{ result.cbegin(),result.cend() }; + } + return spirv_out; + } + +} diff --git a/engine/src/engine/render/tool/glsl_to_spirv.h b/engine/src/engine/render/tool/glsl_to_spirv.h new file mode 100644 index 0000000..9024ef4 --- /dev/null +++ b/engine/src/engine/render/tool/glsl_to_spirv.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include +#include +#include +namespace engineapi +{ + using std::string_view; + using std::string; + using std::vector; + using std::optional; + class GlslToSpirv + { + public: + static optional> spirv(const string& glsl, shaderc_shader_kind kind, string_view code_id = "unknown_shader"); + }; +} \ No newline at end of file diff --git a/engine/src/engine/render/window.cpp b/engine/src/engine/render/window.cpp index 341e256..c93e9aa 100644 --- a/engine/src/engine/render/window.cpp +++ b/engine/src/engine/render/window.cpp @@ -1,14 +1,25 @@ #include "window.h" +#include "renderapi.h" #ifdef VULKAN_API #include "vulkanapi/window.h" #endif // VULKAN_API +#ifdef OPENGL_API +#include "openglapi/window.h" +#endif // OPENGL_API namespace engineapi { Window::WindowClass Window::WindowClass::wndClass; Window* Window::MakeInstance(int frames, uint32_t width, uint32_t height, const char* title) { + GraphicsAPI api = RenderAPI::API(); #ifdef VULKAN_API + if(api == GraphicsAPI::Vulkan) return new vulkanapi::VulkanWindow(frames, width, height, title); #endif +#ifdef OPENGL_API + if (api == GraphicsAPI::OpenGL) + return new openglapi::OpenGLWindow(frames, width, height, title); +#endif + return nullptr; } Window::WindowClass::WindowClass() noexcept : diff --git a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp index 1f45ac3..2aaed8b 100644 --- a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp +++ b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp @@ -1,13 +1,28 @@ #include "vulkan_glsl_loader.h" -#include "vulkanapi/tool/glsl_to_spirv.h" #include "vulkanapi/vulkanapi.h" -#include "asset/file_manager.h" +#include "render/tool/glsl_to_spirv.h" #include "render/asset/vertex.h" #include "vkmeta_vertex_gen.inl" -#include #include "asset/file_handle.h" +#include "meta/hash.h" +#include using namespace engineapi; namespace vulkanapi { + using std::string_view; + using meta::string_hash; + shaderc_shader_kind ConvertStageSC(vk::ShaderStageFlagBits stage) + { + static hash_table< vk::ShaderStageFlagBits, shaderc_shader_kind> conv + { + { vk::ShaderStageFlagBits::eVertex ,shaderc_shader_kind::shaderc_vertex_shader }, + { vk::ShaderStageFlagBits::eFragment ,shaderc_shader_kind::shaderc_fragment_shader }, + { vk::ShaderStageFlagBits::eGeometry ,shaderc_shader_kind::shaderc_geometry_shader }, + { vk::ShaderStageFlagBits::eTessellationControl ,shaderc_shader_kind::shaderc_tess_control_shader }, + { vk::ShaderStageFlagBits::eTessellationEvaluation,shaderc_shader_kind::shaderc_tess_evaluation_shader }, + }; + auto itr = conv.find(stage); + return itr->second; + } vk::ShaderStageFlagBits GetShaderType(string_view ext) { switch (string_hash(ext)) @@ -30,17 +45,6 @@ namespace vulkanapi { ResourceManager::GetSingleton().RegisterLoader(".frag"); ResourceManager::GetSingleton().RegisterLoader(".vert"); } - void VulkanGlslLoader::LoadShaderInfo(const engineapi::Guid& guid, const std::vector& spirv) - { - spirv_cross::Compiler compiler(spirv); - auto resources = compiler.get_shader_resources(); - for (auto& ub : resources.uniform_buffers) - { - 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 path, const MetaBundle& meta) { auto m = meta.FetchMeta(); @@ -55,15 +59,15 @@ namespace vulkanapi { std::vector spirv(data.size() / 4); std::memcpy(spirv.data(), data.data(), data.size()); program->Load(spirv); - LoadShaderInfo(program->GetGuid(), spirv); + //LoadShaderInfo(program->GetGuid(), spirv); } else { string glsl = handle.ReadAll(); auto shader_enum = GetShaderType(path.GetExtension()); - auto spirv = GlslToSpirv::spirv(glsl, shader_enum, path.GetFileName()); + auto spirv = GlslToSpirv::spirv(glsl, ConvertStageSC(shader_enum), path.GetFileName()); if (spirv) { program->Load(*spirv); - LoadShaderInfo(program->GetGuid(), *spirv); + //LoadShaderInfo(program->GetGuid(), *spirv); } } return program; diff --git a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h index c190209..dfefdb7 100644 --- a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h +++ b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h @@ -17,7 +17,6 @@ namespace vulkanapi { inline static table ShaderTable; public: static void Init(); - static void LoadShaderInfo(const engineapi::Guid& guid, const std::vector& spirv); engineapi::ResourceBundle LoadFile(engineapi::PackagePath handle, const engineapi::MetaBundle& meta) override; }; } \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp b/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp deleted file mode 100644 index c285973..0000000 --- a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "glsl_to_spirv.h" -#include "zstd/table.h" -#include "meta/hash.h" -#include "yaml/yaml.h" -#include -#include -namespace vulkanapi -{ - using std::vector; - using zstd::hash_table; - shaderc_shader_kind ConvertStageSC(vk::ShaderStageFlagBits stage) - { - static hash_table< vk::ShaderStageFlagBits, shaderc_shader_kind> conv - { - { vk::ShaderStageFlagBits::eVertex ,shaderc_shader_kind::shaderc_vertex_shader }, - { vk::ShaderStageFlagBits::eFragment ,shaderc_shader_kind::shaderc_fragment_shader }, - { vk::ShaderStageFlagBits::eGeometry ,shaderc_shader_kind::shaderc_geometry_shader }, - { vk::ShaderStageFlagBits::eTessellationControl ,shaderc_shader_kind::shaderc_tess_control_shader }, - { vk::ShaderStageFlagBits::eTessellationEvaluation,shaderc_shader_kind::shaderc_tess_evaluation_shader }, - }; - auto itr = conv.find(stage); - return itr->second; - } - std::optional> GlslToSpirv::spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id) - { - std::optional> spirv_out; - { - shaderc::Compiler compiler; - shaderc::CompileOptions options; - options.SetOptimizationLevel(shaderc_optimization_level_performance); - 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); - if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) - return spirv_out; - spirv_out = vector{ result.cbegin(),result.cend() }; - } - return spirv_out; - } - -} diff --git a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.h b/engine/src/engine/vulkanapi/tool/glsl_to_spirv.h deleted file mode 100644 index 430de18..0000000 --- a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include "vulkan/vulkan.hpp" -#include -#include -#include -namespace vulkanapi -{ - using std::string_view; - using std::string; - class GlslToSpirv - { - public: - static std::optional> spirv(const string& glsl, vk::ShaderStageFlagBits v_stage, string_view code_id = "unknown_shader"); - }; -} \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/tool/spirv_compiler.cpp b/engine/src/engine/vulkanapi/tool/spirv_compiler.cpp deleted file mode 100644 index 44dc34d..0000000 --- a/engine/src/engine/vulkanapi/tool/spirv_compiler.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "spirv_compiler.h" - -namespace vulkanapi { - void SPIRVCompiler::CompileAllShader(string path) - { - for (const auto& entry : std::filesystem::directory_iterator(path)) - { - string extension = entry.path().filename().extension().string(); - if (extension == ".vert") - GenerateSPIRVVertFile(entry.path().string()); - else if (extension == ".frag") - GenerateSPIRVFragFile(entry.path()); - else if (extension == "") - CompileAllShader(entry.path().string()); - } - } - void SPIRVCompiler::GenerateSPIRVFragFile(const filesystem::path& path) - { - string filePath = path.string(); - string outputFinalPath = path.parent_path().string() + "\\" + path.stem().string() + ".spv"; - //glslc simple.vert -o simple.vert.spv - //glslc simple.frag -o simple.frag.spv - //glslc -fshader-stage=vertex simple.vs.glsl -o simple.vert.spv - //glslc -fshader-stage=fragment simple.ps.glsl -o simple.frag.spv - string command = "glslc "; - - std::system(command.c_str()); - } - void SPIRVCompiler::GenerateSPIRVVertFile(const filesystem::path& path) - { - - } -} \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/tool/spirv_compiler.h b/engine/src/engine/vulkanapi/tool/spirv_compiler.h deleted file mode 100644 index 0df915b..0000000 --- a/engine/src/engine/vulkanapi/tool/spirv_compiler.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "../vulkan.h" -#include -namespace filesystem = std::filesystem; -namespace vulkanapi { - class Device; - class Queue; - class SPIRVCompiler { - public: - static void CompileAllShader(string path); - - private: - static void GenerateSPIRVFragFile(const filesystem::path& path); - static void GenerateSPIRVVertFile(const filesystem::path& path); - }; -} \ No newline at end of file diff --git a/engine/xmake.lua b/engine/xmake.lua index 8462147..015e1ce 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -12,8 +12,8 @@ target("zengine") "src/engine/asset/res/*.h"} }) add_deps("zlog","zlib") - add_defines("VULKAN_API") - add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json") + add_defines("VULKAN_API", "OPENGL_API") + add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json","opencl", "opencl-headers") add_includedirs("src/engine") add_includedirs("src/3rdparty/volk", "src/3rdparty/vulkan-memory-allocator", "src/3rdparty/template") add_syslinks("user32", "Ole32")