From eff681ca33a9370f285bf62d832390d46148b2f8 Mon Sep 17 00:00:00 2001 From: kotofyt Date: Wed, 20 Aug 2025 01:27:25 +0300 Subject: [PATCH] started working on ini parser --- .gitmodules | 6 + build.cpp | 8 +- engine/__build.cpp | 4 +- engine/cvar.cpp | 338 ++++++++++++++++++ engine/engine.cpp | 5 +- engine/filesystem_pak.cpp | 14 +- engine/gamewindow_sdl.cpp | 72 +++- external/Vulkan-Headers | 2 +- external/Vulkan-Utility-Libraries | 1 + external/volk | 1 + fpc/fpc_temp | Bin 0 -> 315456 bytes fpc/library/clang/c.cpp | 6 +- fpc/library/clang/c_libclang.cpp | 5 +- fpc/library/clang/c_libclang.h | 2 +- fpc/library/clang/ld.cpp | 2 +- materialsystem/__build.cpp | 7 +- materialsystem/materialsystem.cpp | 41 +++ .../{vulkan_state.cpp => commandbuffer.cpp} | 0 materialsystem/vulkan/computeshader.cpp | 0 materialsystem/vulkan/device_extensions.h | 2 + materialsystem/vulkan/materialsystem.cpp | 40 --- materialsystem/vulkan/raytracingshader.cpp | 0 materialsystem/vulkan/rendercontext.cpp | 274 ++++++++++++++ materialsystem/vulkan/vulkan_state.h | 57 +++ public/funnyformat.h | 2 +- public/icvar.h | 119 ++++++ public/igamewindow.h | 14 + .../{imaterialsystem.h => materialsystem.h} | 19 +- public/tier0/lib.h | 21 ++ public/tier1/utlbuffer.h | 12 +- public/tier2/fileformats/ini.h | 3 +- public/{ => tier2}/ifilesystem.h | 29 +- tests/ini/build.cpp | 35 ++ tests/ini/initest | Bin 0 -> 168848 bytes tests/ini/main.cpp | 49 +++ tests/ini/test1.ini | 12 + tests/ini/test2.ini | 1 + tests/ini/test3.ini | 1 + tests/ini/test4.ini | 1 + tests/ini/test5.ini | 2 + tests/ini/test6.ini | 2 + tests/ini/test7.ini | 2 + tests/ini/test8.ini | 5 + tier2/__build.cpp | 31 ++ tier2/fileformats/ini.cpp | 246 ++++++++++++- {engine => tier2}/filesystem.cpp | 43 ++- {engine => tier2}/filesystem_libc.cpp | 41 ++- 47 files changed, 1465 insertions(+), 112 deletions(-) create mode 160000 external/Vulkan-Utility-Libraries create mode 160000 external/volk create mode 100644 fpc/fpc_temp create mode 100644 materialsystem/materialsystem.cpp rename materialsystem/vulkan/{vulkan_state.cpp => commandbuffer.cpp} (100%) create mode 100644 materialsystem/vulkan/computeshader.cpp create mode 100644 materialsystem/vulkan/device_extensions.h delete mode 100644 materialsystem/vulkan/materialsystem.cpp create mode 100644 materialsystem/vulkan/raytracingshader.cpp create mode 100644 materialsystem/vulkan/rendercontext.cpp rename public/materialsystem/{imaterialsystem.h => materialsystem.h} (77%) rename public/{ => tier2}/ifilesystem.h (69%) create mode 100644 tests/ini/build.cpp create mode 100644 tests/ini/initest create mode 100644 tests/ini/main.cpp create mode 100644 tests/ini/test1.ini create mode 100644 tests/ini/test2.ini create mode 100644 tests/ini/test3.ini create mode 100644 tests/ini/test4.ini create mode 100644 tests/ini/test5.ini create mode 100644 tests/ini/test6.ini create mode 100644 tests/ini/test7.ini create mode 100644 tests/ini/test8.ini create mode 100644 tier2/__build.cpp rename {engine => tier2}/filesystem.cpp (64%) rename {engine => tier2}/filesystem_libc.cpp (76%) diff --git a/.gitmodules b/.gitmodules index 072c876..c2c720e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,9 @@ [submodule "external/GameNetworkingSockets"] path = external/GameNetworkingSockets url = https://github.com/ValveSoftware/GameNetworkingSockets.git +[submodule "external/volk"] + path = external/volk + url = https://github.com/zeux/volk +[submodule "external/Vulkan-Utility-Libraries"] + path = external/Vulkan-Utility-Libraries + url = https://github.com/KhronosGroup/Vulkan-Utility-Libraries diff --git a/build.cpp b/build.cpp index 79f9659..2443b5b 100644 --- a/build.cpp +++ b/build.cpp @@ -1,11 +1,14 @@ -#include "build/tools/public/target.h" #include "target.h" -#include "tier1/utlstring.h" #include "helper.h" +#include "tier1/utlstring.h" + CUtlVector all_IncludeDirectories = { "public", "external", + "external/Vulkan-Headers/include", + "external/Vulkan-Utility-Libraries/include", + "external/volk", "external/cglm/include", "external/stb", "external/SDL/include", @@ -71,6 +74,7 @@ CUtlString client_lib; #include "tier0/__build.cpp" #include "tier1/__build.cpp" +#include "tier2/__build.cpp" #include "game/server/__build.cpp" #include "game/client/__build.cpp" diff --git a/engine/__build.cpp b/engine/__build.cpp index 0fc93d1..3c3eb22 100644 --- a/engine/__build.cpp +++ b/engine/__build.cpp @@ -7,9 +7,7 @@ CUtlVector engine_CompiledFiles = { "engine/engine.cpp", "engine/cvar.cpp", - "engine/filesystem.cpp", "engine/filesystem_pak.cpp", - "engine/filesystem_libc.cpp", "engine/gamewindow_sdl.cpp", @@ -38,7 +36,9 @@ DECLARE_BUILD_STAGE(engine) else { ldProject.objects.AppendTail((Object_t){tier1_lib}); + ldProject.objects.AppendTail((Object_t){tier2_lib}); ldProject.objects.AppendTail((Object_t){rapier_lib}); + ldProject.objects.AppendTail((Object_t){material_lib}); if (bSteam) ldProject.objects.AppendTail((Object_t){steam_lib}); ldProject.linkType = ELINK_DYNAMIC_LIBRARY; diff --git a/engine/cvar.cpp b/engine/cvar.cpp index e69de29..dada8ce 100644 --- a/engine/cvar.cpp +++ b/engine/cvar.cpp @@ -0,0 +1,338 @@ +#include "icvar.h" +#include "tier2/ifilesystem.h" +#include "tier1/utlstring.h" +#include "tier1/utlvector.h" +#include "stdarg.h" + + +enum EConsoleMessageType +{ + CONSOLE_MESSAGE_TYPE_MESSAGE, + CONSOLE_MESSAGE_TYPE_WARNING, + CONSOLE_MESSAGE_TYPE_ERROR, +}; + +struct ConsoleMessage_t +{ + EConsoleMessageType type; + CUtlString szMessage; +}; + +void Msg( const char* message ) +{ + printf(message); + +} + +void Warning( const char* message ) +{ + +} + +void Error( const char* message ) +{ + +} + +class CConsole: public IConsole +{ +public: + virtual void Init() override; + virtual void Shutdown() override; + + // Variables + virtual void RegisterVar( ConVar *cvar ) override; + virtual void UnRegisterVar( ConVar *cvar ) override; + virtual ConVar *FindVar( const char *pName ) override; + + // Commands + virtual void RegisterCommand( ConCommand *cvar ) override; + virtual void UnRegisterCommand( ConCommand *cvar ) override; + virtual ConCommand *FindCommand( const char *pName ) override; + + // Command buffer + virtual void Execute( void ) override; + virtual void ExecuteArguments( CUtlVector &args ) override; + virtual CUtlVector> ParseCommandLine( CUtlString psz ) override; + + virtual void AddCommand( const char *psz ) override; + virtual void InsertCommand( const char *psz ) override; +}; + +IConsole *Console() +{ + static CConsole s_console; + return &s_console; +} + +void CConsole::Init() +{ +} + +void CConsole::Shutdown() +{ + +} + + +void CConsole::RegisterVar( ConVar *cvar ) +{ + m_convars.AppendTail(cvar); +} +void CConsole::UnRegisterVar( ConVar *cvar ) +{ + +} +ConVar *CConsole::FindVar( const char *pName ) +{ + for (auto &var: m_convars) + { + if (!V_strcmp(var->GetName(), pName)) + return var; + } + return NULL; +} + +void CConsole::RegisterCommand( ConCommand *cvar ) +{ + m_commands.AppendTail(cvar); +} +void CConsole::UnRegisterCommand( ConCommand *cvar ) +{ + +} +ConCommand *CConsole::FindCommand( const char *pName ) +{ + for (auto &var: m_commands) + { + if (!V_strcmp(var->GetName(), pName)) + return var; + } + return NULL; +} +CUtlString g_commandBuffer; + +//----------------------------------------------------------------------------- +// Executes arguments from CConsole::Execute +//----------------------------------------------------------------------------- +void CConsole::ExecuteArguments( CUtlVector &args ) +{ + if (args.GetSize()<1) + return; + + ConCommand *cmd = CConsole::FindCommand(args[0]); + if (!cmd) + { + V_printf("%s not found\n", args[0].GetString()); + return; + } + CUtlBuffer strbuffer(args.GetSize()); + for ( size_t i = 0; i < args.GetSize(); i++) + { + strbuffer[i] = args[i].GetString(); + }; + (cmd->GetCallback())(args.GetSize(), strbuffer); +} + +void CConsole::Execute( void ) +{ + CUtlVector> commands = ParseCommandLine(g_commandBuffer); + g_commandBuffer = 0; + for (auto &command: commands) + { + ExecuteArguments(command); + } +} + +//----------------------------------------------------------------------------- +// Parses command buffer. +//----------------------------------------------------------------------------- +CUtlVector> CConsole::ParseCommandLine( CUtlString psz ) +{ + CUtlVector arguments; + CUtlVector> commands; + CUtlString szArgument; + bool bIsQuote = false; + for ( auto &c: (CUtlVector&)psz ) + { + if ( c == '\"' ) + { + bIsQuote = !bIsQuote; + continue; + } + + if ( c == ';' || c == '\n' ) + { + if (bIsQuote) + { + continue; + } + if (szArgument != 0) + arguments.AppendTail(szArgument); + if ( arguments.GetSize() > 0 ) + commands.AppendTail(arguments); + szArgument = 0; + arguments = {}; + continue; + } + if ( c == '\t' || c == ' ' ) + { + if (bIsQuote) + { + szArgument.AppendTail(c); + continue; + } + + if (szArgument != 0) + arguments.AppendTail(szArgument); + szArgument = 0; + continue; + } + szArgument.AppendTail(c); + }; + if (szArgument != 0) + arguments.AppendTail(szArgument); + if ( arguments.GetSize() > 0 ) + commands.AppendTail(arguments); + return commands; +} + +void CConsole::AddCommand( const char *psz ) +{ + g_commandBuffer.AppendTail(psz); +} + +void CConsole::InsertCommand( const char *psz ) +{ + g_commandBuffer.AppendHead(psz); +}; + +ConVar::ConVar( const char *pName, const char *pDefaultValue, int flags ) + : ConVar(pName, pDefaultValue, flags, 0) +{ + +} +ConVar::ConVar( const char *pName, const char *pDefaultValue, int flags, + const char *pHelpString ) + : ConVar(pName, pDefaultValue, flags, pHelpString, 0) +{ +} +ConVar::ConVar( const char *pName, const char *pDefaultValue, int flags, + const char *pHelpString, ConCommandFn callback ) +{ + m_szName = pName; + m_flags = flags; + m_szValue = pDefaultValue; + m_fValue = V_atof(pDefaultValue); + m_nValue = V_atoi(pDefaultValue); + Console()->RegisterVar(this); +} + +bool ConVar::IsFlagSet( int flag ) +{ + +} +const char *ConVar::GetHelpText( void ) +{ + return m_szHelpString; +} +bool ConVar::IsRegistered( void ) +{ + +} +const char *ConVar::GetName( void ) +{ + return m_szName; +} +void ConVar::AddFlags( int flags ) +{ + +} +bool ConVar::IsCommand( void ) +{ + +} + +void ConVar::InstallChangeCallback( ConCommandFn ) +{ + +} + +float ConVar::GetFloat( void ) +{ + return m_fValue; +} +int ConVar::GetInt( void ) +{ + return m_nValue; +} +bool ConVar::GetBool( void ) +{ + return m_nValue; +} +const char *ConVar::GetString( void ) +{ + +} + +void ConVar::SetValue( const char *szValue ) +{ + if (!szValue) + return; + m_szValue = szValue; + m_fValue = V_atof(szValue); + m_nValue = V_atoi(szValue); +} +void ConVar::SetValue( float fValue ) +{ + m_fValue = fValue; + m_nValue = fValue; + m_szValue = CUtlString("%f\n",fValue); +} +void ConVar::SetValue( int iValue ) +{ + m_fValue = iValue; + m_nValue = iValue; + m_szValue = CUtlString("%i\n",iValue); +} + +ConCommand::ConCommand(const char *pName, ConCommandFn callback, + const char *pHelpString, int flags) +{ + m_szName = pName; + m_callback = callback; + m_flags = flags; + Console()->RegisterCommand(this); +}; +const char *ConCommand::GetHelpText( void ) +{ + return m_szHelpString; +} +const char *ConCommand::GetName( void ) +{ + return m_szName; +} +ConCommandFn ConCommand::GetCallback( void ) +{ + return m_callback; +} + + + +void IConsole_Exec( int argc, char **argv) +{ + if (argc != 2) + return; + + IFileHandle *f = filesystem->Open(argv[1], FILEMODE_READ); + if (!f) + return; + CUtlBuffer b(f->Size()+1); + f->Read(b, b.GetSize()); + b[b.GetSize()-1] = 0; + Console()->AddCommand(b); + Console()->AddCommand(";"); + Console()->Execute(); +} + +ConCommand IConsole_ExecCmd("exec", IConsole_Exec); diff --git a/engine/engine.cpp b/engine/engine.cpp index 2135997..4ca6efe 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -1,6 +1,7 @@ -#include "ifilesystem.h" +#include "tier2/ifilesystem.h" #include "igamewindow.h" +#include "materialsystem/materialsystem.h" #include "tier1/interface.h" #include "tier1/commandline.h" #include "tier0/mem.h" @@ -16,6 +17,8 @@ extern "C" void FunnyMain( int argc, char **argv ) ServerGameDLL()->Init(); + Materials()->Init(); + for (;;) { gamewindow->UpdateWindow(); diff --git a/engine/filesystem_pak.cpp b/engine/filesystem_pak.cpp index 28029fc..675f50e 100644 --- a/engine/filesystem_pak.cpp +++ b/engine/filesystem_pak.cpp @@ -1,4 +1,4 @@ -#include "ifilesystem.h" +#include "tier2/ifilesystem.h" #include "tier1/interface.h" #include "tier0/lib.h" @@ -47,14 +47,14 @@ public: { int eLibcSeekMode = 0; switch (eSeekMode) { - case SEEKMODE_SET: - eLibcSeekMode = SEEK_SET; + case SEEKMODE_RELATIVE_CURRENT: + eLibcSeekMode = SEEK_CUR; break; case SEEKMODE_RELATIVE_END: eLibcSeekMode = SEEK_END; break; case SEEKMODE_RELATIVE_START: - eLibcSeekMode = SEEK_CUR; + eLibcSeekMode = SEEK_SET; break; } CPAKFileHandle *pHandle = (CPAKFileHandle*)pFile; @@ -68,6 +68,12 @@ public: if (!pHandle) return 0; } + virtual size_t Size( IFileHandle *pFile ) override + { + CPAKFileHandle *pHandle = (CPAKFileHandle*)pFile; + if (!pHandle) + return 0; + } virtual void Close( IFileHandle *pFile ) override { diff --git a/engine/gamewindow_sdl.cpp b/engine/gamewindow_sdl.cpp index d77f18b..3c909a5 100644 --- a/engine/gamewindow_sdl.cpp +++ b/engine/gamewindow_sdl.cpp @@ -11,7 +11,6 @@ #include "SDL3/SDL_vulkan.h" #include "SDL3/SDL_events.h" -SDL_Window *g_pWindow; class CSDLGameWindow: public IGameWindow { @@ -19,6 +18,20 @@ public: virtual void Init() override; virtual void Shutdown() override; virtual void UpdateWindow() override; + + virtual EGraphicsAPI GetGraphicsAPI() override; + + virtual int GetVulkanInstanceExtensionCount() override; + virtual const char **GetVulkanInstanceExtensions() override; + virtual void CreateVulkanSurface( void *pInstance ) override; + virtual void DestroyVulkanSurface( void *pInstance ) override; + virtual void *GetVulkanSurface() override; + +private: + SDL_Window *m_pWindow; + EGraphicsAPI m_ePreferredGraphicsAPI; + + void *m_pVulkanSurface; }; CSDLGameWindow g_sdlGameWindow; @@ -27,12 +40,14 @@ IGameWindow *gamewindow = &g_sdlGameWindow; void CSDLGameWindow::Init() { + m_ePreferredGraphicsAPI = GRAPHICS_API_VULKAN; + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_GAMEPAD)) Plat_FatalErrorFunc("SDL_Init: %s\n", SDL_GetError()); - g_pWindow = SDL_CreateWindow("funnygame", 1280, 720, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); - if (!g_pWindow) - Plat_FatalErrorFunc("SDL_Init: %s\n", SDL_GetError()); + m_pWindow = SDL_CreateWindow("funnygame", 1280, 720, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); + if (!m_pWindow) + Plat_FatalErrorFunc("SDL_CreateWindow: %s\n", SDL_GetError()); } void CSDLGameWindow::Shutdown() @@ -47,6 +62,8 @@ void CSDLGameWindow::UpdateWindow() { switch (event.type) { + case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + break; case SDL_EVENT_QUIT: SDL_Quit(); Plat_Exit(0); @@ -56,3 +73,50 @@ void CSDLGameWindow::UpdateWindow() } } } +EGraphicsAPI CSDLGameWindow::GetGraphicsAPI() +{ + return GRAPHICS_API_VULKAN; +} + +int CSDLGameWindow::GetVulkanInstanceExtensionCount() +{ + if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) + return -1; + + uint32_t nCount; + SDL_Vulkan_GetInstanceExtensions(&nCount); + + return nCount; +} + +const char **CSDLGameWindow::GetVulkanInstanceExtensions() +{ + if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) + return 0; + + uint32_t nCount; + return (const char **)SDL_Vulkan_GetInstanceExtensions(&nCount); +} + +void CSDLGameWindow::CreateVulkanSurface( void *pInstance ) +{ + if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) + return; + + SDL_Vulkan_CreateSurface(m_pWindow, (VkInstance)pInstance, NULL, (VkSurfaceKHR*)&m_pVulkanSurface); +} + +void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) +{ + SDL_Vulkan_DestroySurface((VkInstance)pInstance, (VkSurfaceKHR)m_pVulkanSurface, NULL); +} + +void *CSDLGameWindow::GetVulkanSurface() +{ + if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) + return 0; + + + return m_pVulkanSurface; +} + diff --git a/external/Vulkan-Headers b/external/Vulkan-Headers index 75ad707..2e0a6e6 160000 --- a/external/Vulkan-Headers +++ b/external/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 75ad707a587e1469fb53a901b9b68fe9f6fbc11f +Subproject commit 2e0a6e699e35c9609bde2ca4abb0d380c0378639 diff --git a/external/Vulkan-Utility-Libraries b/external/Vulkan-Utility-Libraries new file mode 160000 index 0000000..4f4c0b6 --- /dev/null +++ b/external/Vulkan-Utility-Libraries @@ -0,0 +1 @@ +Subproject commit 4f4c0b6c61223b703f1c753a404578d7d63932ad diff --git a/external/volk b/external/volk new file mode 160000 index 0000000..d64d20b --- /dev/null +++ b/external/volk @@ -0,0 +1 @@ +Subproject commit d64d20b4eaf2698296e085d9d9638c69af280e3e diff --git a/fpc/fpc_temp b/fpc/fpc_temp new file mode 100644 index 0000000000000000000000000000000000000000..6b5b7488b4a6141cc1c94c665af249ded96f4077 GIT binary patch literal 315456 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%0Al=)E_Svy7AXmbJ0|KX_8$BZ@8?}+&QQ%NR$ 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

~aFoKEJn^#yWOHf1tfd0Ft*<2x?R0ZC_m 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 literal 0 HcmV?d00001 diff --git a/fpc/library/clang/c.cpp b/fpc/library/clang/c.cpp index 7ad6c28..4668901 100644 --- a/fpc/library/clang/c.cpp +++ b/fpc/library/clang/c.cpp @@ -34,7 +34,6 @@ LinkProject_t CClangCompiler::Compile( CProject_t *pProject ) { if (!clangbackend && CommandLine()->CheckParam("-experimental_header_include")) clangbackend = (IClangBackend*)CreateInterface(CLANG_BACKEND_INTERFACE_NAME, NULL); - V_printf("CLANG: %p\n", clangbackend); if (pProject->m_szName == 0) { @@ -121,11 +120,12 @@ LinkProject_t CClangCompiler::Compile( CProject_t *pProject ) } if (clangbackend) - bAreDependenciesUpdated = clangbackend->AreFileDependenciesUpdated(file, szOutputFile, args); + bAreDependenciesUpdated = clangbackend->AreFileDependenciesUpdated(file, 0, szOutputFile, args); if (!filesystem2->ShouldRecompile(file, szOutputFile) && !bAreDependenciesUpdated) goto skipcompile; args.AppendTail("-c"); + args.AppendTail("-g"); args.AppendTail("-o"); args.AppendTail(szOutputFile); args.AppendTail(file); @@ -150,7 +150,7 @@ skipcompile: if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) { if (!pProject->m_target.szSysroot) - Plat_FatalErrorFunc("-sysroot must be specified for android\n"); + Plat_FatalErrorFunc("sysroot must be specified for android\n"); cfile.m_szArguments.AppendHead(CUtlString("%s/bin/clang",pProject->m_target.szSysroot)); } else diff --git a/fpc/library/clang/c_libclang.cpp b/fpc/library/clang/c_libclang.cpp index 455cc8e..c3c5b6d 100644 --- a/fpc/library/clang/c_libclang.cpp +++ b/fpc/library/clang/c_libclang.cpp @@ -10,10 +10,11 @@ class CClangBackend: public IClangBackend { public: - virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlVector arguments ) override; + virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) override; bool bAnyOutdated; CUtlString szCurrentFile; + CUtlString szHashFile; private: static void InclusionVisitor( CXFile included_file, CXSourceLocation *include_stack, unsigned include_len, CXClientData client_data ); @@ -21,7 +22,7 @@ private: EXPOSE_INTERFACE(CClangBackend, IClangBackend, CLANG_BACKEND_INTERFACE_NAME); -bool CClangBackend::AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlVector arguments ) +bool CClangBackend::AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) { szCurrentFile = szOutputFile; bAnyOutdated = false; diff --git a/fpc/library/clang/c_libclang.h b/fpc/library/clang/c_libclang.h index fd6eac7..e726cd6 100644 --- a/fpc/library/clang/c_libclang.h +++ b/fpc/library/clang/c_libclang.h @@ -9,7 +9,7 @@ abstract_class IClangBackend { public: - virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlVector arguments ) = 0; + virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) = 0; }; extern IClangBackend *clangbackend; diff --git a/fpc/library/clang/ld.cpp b/fpc/library/clang/ld.cpp index 6018d9c..c76ebd0 100644 --- a/fpc/library/clang/ld.cpp +++ b/fpc/library/clang/ld.cpp @@ -53,7 +53,7 @@ CUtlString CClangLinker::Link( LinkProject_t *pProject ) filesystem2->MakeDirectory(szOutputDir); if (pProject->linkType == ELINK_STATIC_LIBRARY) { - V_printf(" AR %s\n", pProject->m_szName.GetString()); + V_printf(" AR %s\n", pProject->m_szName.GetString()); bool shouldRecompile = false; CUtlVector args; for (auto object: pProject->objects) diff --git a/materialsystem/__build.cpp b/materialsystem/__build.cpp index 131d013..a33d6d0 100644 --- a/materialsystem/__build.cpp +++ b/materialsystem/__build.cpp @@ -5,10 +5,10 @@ #include "tier1/commandline.h" CUtlVector MaterialSystem_CompiledFiles = { + "materialsystem/materialsystem.cpp", + "materialsystem/vulkan/rendercontext.cpp", "materialsystem/vulkan/material.cpp", - "materialsystem/vulkan/materialsystem.cpp", - "materialsystem/vulkan/shader.cpp", - "materialsystem/vulkan/vulkan_state.cpp", + "external/volk/volk.c", }; CUtlString material_lib; @@ -23,6 +23,7 @@ DECLARE_BUILD_STAGE(MaterialSystem) compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_STATIC_LIBRARY; + ldProject.libraries = { "vulkan" }; CUtlString outputProject = linker->Link(&ldProject); material_lib = outputProject; diff --git a/materialsystem/materialsystem.cpp b/materialsystem/materialsystem.cpp new file mode 100644 index 0000000..5cdf297 --- /dev/null +++ b/materialsystem/materialsystem.cpp @@ -0,0 +1,41 @@ +#include "materialsystem/materialsystem.h" + +class CMaterialSystem: public IMaterialSystem +{ +public: + virtual void Init() override; + virtual void Frame( float fTime ) override; + virtual void Shutdown() override; + + virtual IRenderContext *GetRenderContext( void ) override; +}; + +void CMaterialSystem::Init() +{ + GetRenderContext()->Init(); +} + +void CMaterialSystem::Frame( float fTime ) +{ + GetRenderContext()->Frame(fTime); +} + +void CMaterialSystem::Shutdown() +{ + GetRenderContext()->Shutdown(); +} + +extern IRenderContext *g_pVkRenderContext; + + +IRenderContext *CMaterialSystem::GetRenderContext( void ) +{ + return g_pVkRenderContext; +} + + +IMaterialSystem *Materials( void ) +{ + static CMaterialSystem s_materialSystem; + return &s_materialSystem; +} diff --git a/materialsystem/vulkan/vulkan_state.cpp b/materialsystem/vulkan/commandbuffer.cpp similarity index 100% rename from materialsystem/vulkan/vulkan_state.cpp rename to materialsystem/vulkan/commandbuffer.cpp diff --git a/materialsystem/vulkan/computeshader.cpp b/materialsystem/vulkan/computeshader.cpp new file mode 100644 index 0000000..e69de29 diff --git a/materialsystem/vulkan/device_extensions.h b/materialsystem/vulkan/device_extensions.h new file mode 100644 index 0000000..41747d8 --- /dev/null +++ b/materialsystem/vulkan/device_extensions.h @@ -0,0 +1,2 @@ +REQUIRED_EXTENSION(VK_KHR_SWAPCHAIN) +OPTIONAL_EXTENSION(VK_KHR_RAY_TRACING_PIPELINE) diff --git a/materialsystem/vulkan/materialsystem.cpp b/materialsystem/vulkan/materialsystem.cpp deleted file mode 100644 index 36c0361..0000000 --- a/materialsystem/vulkan/materialsystem.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "materialsystem/imaterialsystem.h" - -class CVkRenderingContext -{ - -}; - -CVkRenderingContext g_vkRenderingContext; - -class CVkMaterialSystem: public IMaterialSystem -{ -public: - virtual void Init(); - virtual void Frame( float fDeltaTime ); - virtual void Shutdown(); - - IRenderContext *GetRenderContext(); -}; - -CVkMaterialSystem g_vkMaterialSystem; -IMaterialSystem *materials = &g_vkMaterialSystem; - - -void CVkMaterialSystem::Init() -{ - -} - -void CVkMaterialSystem::Frame( float fDeltaTime ) -{ - -} - -void CVkMaterialSystem::Shutdown() -{ - -} - - - diff --git a/materialsystem/vulkan/raytracingshader.cpp b/materialsystem/vulkan/raytracingshader.cpp new file mode 100644 index 0000000..e69de29 diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp new file mode 100644 index 0000000..c2997dd --- /dev/null +++ b/materialsystem/vulkan/rendercontext.cpp @@ -0,0 +1,274 @@ +#include "SDL3/SDL_vulkan.h" +#include "materialsystem/materialsystem.h" +#include "tier0/platform.h" +#include "tier1/utlvector.h" +#define VK_NO_PROTOTYPES +#include "vulkan/vulkan_core.h" +#include "vulkan_state.h" +#include "igamewindow.h" + + +#define REQUIRED_EXTENSION(ext) ext##_EXTENSION_NAME, +#define OPTIONAL_EXTENSION(ext) ext##_EXTENSION_NAME, +const char *g_vkDeviceExtensions[] = { +#include "device_extensions.h" +}; +#undef REQUIRED_EXTENSION +#undef OPTIONAL_EXTENSION + + + +class CVkRenderContext: public IRenderContext +{ +public: + virtual void Init() override; + virtual void Frame( float fDeltaTime ) override; + virtual void Shutdown() override; + + virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) override; + virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) override; + virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) override; + virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) override; + + virtual void DestroyBuffer( IBuffer *pBuffer ) override; + virtual void DestroyImage( IImage *pImage ) override; +private: + IBuffer *CreateBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage ); + IBuffer *CreateBufferAligned( uint32_t nSize, uint32_t nAlignment, VkBufferUsageFlags2 eUsage ); + + VkPhysicalDevice SelectPhysicalDevice( CUtlVector physicalDevices ); + + void CreateSwapchain(); + void DestroySwapchain(); +}; + +//----------------------------------------------------------------------------- +// Creates vertex buffer. Wrapper over CreateBuffer +//----------------------------------------------------------------------------- +IVertexBuffer *CVkRenderContext::CreateVertexBuffer( uint32_t nSize ) +{ + return (IVertexBuffer*)CreateBuffer(nSize, VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT); +} + +//----------------------------------------------------------------------------- +// Creates index buffer. Wrapper over CreateBuffer +//----------------------------------------------------------------------------- +IIndexBuffer *CVkRenderContext::CreateIndexBuffer( uint32_t nSize ) +{ + return (IIndexBuffer*)CreateBuffer(nSize, VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT); +} + +//----------------------------------------------------------------------------- +// Creates basic vulkan buffer +//----------------------------------------------------------------------------- +IBuffer *CreateBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage ) +{ +} + +//----------------------------------------------------------------------------- +// Creates vulkan buffer aligned to the nAlignment +// Useful for everything eg: ray tracing, which requires them to be aligned +// to the groupBaseAlignment. +//----------------------------------------------------------------------------- +IBuffer *CreateBufferAligned( uint32_t nSize, uint32_t nAlignment, VkBufferUsageFlags2 eUsage ) +{ + +} + + +IImage *CVkRenderContext::CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) +{ + +} + +IImage *CVkRenderContext::CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) +{ + +} + + +void CVkRenderContext::DestroyBuffer( IBuffer *pBuffer ) +{ + +} + +void CVkRenderContext::DestroyImage( IImage *pImage ) +{ + +} + +CVkRenderContext s_vkRenderContext; +IRenderContext *g_pVkRenderContext = &s_vkRenderContext; + + +uint32_t g_iDrawFamily; +uint32_t g_iPresentFamily; + +VkInstance g_vkInstance; +VkPhysicalDevice g_vkPhysicalDevice; +VkDevice g_vkDevice; +VkSwapchainKHR g_vkSwapchain; + + +void CVkRenderContext::Init() +{ + VkResult r; + + int nExtensionCount; + CUtlVector extensions = {}; + + uint32_t nPhysicalDevicesCount; + CUtlVector physicalDevices; + + uint32_t nNumQueueFamilies = 0; + CUtlVector queueFamilyProperties; + + VkApplicationInfo stApplicationInfo = {}; + VkInstanceCreateInfo stInstanceCreateInfo = {}; + + VkDeviceQueueCreateInfo stDeviceQueueCreateInfo = {}; + VkDeviceCreateInfo stDeviceCreateInfo = {}; + + float fPriority = 1.0; + + r = volkInitialize(); + VULKAN_RESULT_PRINT(r, volkInitialize) + + // Get extensions required by game window + nExtensionCount = gamewindow->GetVulkanInstanceExtensionCount(); + extensions.Resize(nExtensionCount); + V_memcpy(extensions.GetData(), gamewindow->GetVulkanInstanceExtensions(), extensions.GetSize()*sizeof(const char*)); + + // Create instance + stApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + stApplicationInfo.apiVersion = VK_API_VERSION_1_4; + stApplicationInfo.pApplicationName = "funny"; + stApplicationInfo.pEngineName = "funny"; + + stInstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + stInstanceCreateInfo.pApplicationInfo = &stApplicationInfo; + stInstanceCreateInfo.enabledExtensionCount = extensions.GetSize(); + stInstanceCreateInfo.ppEnabledExtensionNames = extensions.GetData(); + + r = vkCreateInstance(&stInstanceCreateInfo, NULL, &g_vkInstance); + VULKAN_RESULT_PRINT(r, vkCreateInstance) + + // volk requires to load instance this way + volkLoadInstance(g_vkInstance); + + + // Get amount of physical devices + r = vkEnumeratePhysicalDevices(g_vkInstance, &nPhysicalDevicesCount, NULL); + VULKAN_RESULT_PRINT(r, vkEnumeratePhysicalDevices) + physicalDevices.Resize(nPhysicalDevicesCount); + + // Read all physical devices + r = vkEnumeratePhysicalDevices(g_vkInstance, &nPhysicalDevicesCount, physicalDevices.GetData()); + VULKAN_RESULT_PRINT(r, vkEnumeratePhysicalDevices) + + g_vkPhysicalDevice = SelectPhysicalDevice(physicalDevices); + + + // Get all queues + vkGetPhysicalDeviceQueueFamilyProperties(g_vkPhysicalDevice, &nNumQueueFamilies, NULL); + queueFamilyProperties.Resize(nNumQueueFamilies); + + uint32_t i = 0; + vkGetPhysicalDeviceQueueFamilyProperties(g_vkPhysicalDevice, &nNumQueueFamilies, queueFamilyProperties.GetData()); + + for (auto &family: queueFamilyProperties) + { + if (family.queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + g_iDrawFamily = i; + g_iPresentFamily = i; + } + i++; + } + + + // Create device + stDeviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + stDeviceQueueCreateInfo.queueCount = 1; + stDeviceQueueCreateInfo.pQueuePriorities = &fPriority; + stDeviceQueueCreateInfo.queueFamilyIndex = g_iDrawFamily; + + stDeviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + stDeviceCreateInfo.queueCreateInfoCount = 1; + stDeviceCreateInfo.pQueueCreateInfos = &stDeviceQueueCreateInfo; + vkCreateDevice(g_vkPhysicalDevice, &stDeviceCreateInfo, NULL, &g_vkDevice); + + CreateSwapchain(); +} + +void CVkRenderContext::Frame( float fDeltaTime ) +{ + +} + +void CVkRenderContext::CreateSwapchain() +{ + gamewindow->CreateVulkanSurface(g_vkInstance); + +} + +void CVkRenderContext::DestroySwapchain() +{ + vkDestroySwapchainKHR(g_vkDevice, g_vkSwapchain, NULL); + gamewindow->DestroyVulkanSurface(g_vkInstance); +} + +//----------------------------------------------------------------------------- +// TODO: Move to the rendering context +//----------------------------------------------------------------------------- +void CVkRenderContext::Shutdown() +{ + vkDestroyInstance(g_vkInstance, NULL); +} + + +//----------------------------------------------------------------------------- +// Selects best device to be used in rendering. +// We want to get the best perfomance out of the GPU, so we need to select the +// best driver. +//----------------------------------------------------------------------------- +VkPhysicalDevice CVkRenderContext::SelectPhysicalDevice( CUtlVector physicalDevices ) +{ + uint32_t uMaxScore = 0; + VkPhysicalDevice selectedDevice = 0; + VkResult r; + + for (auto &device: physicalDevices) + { + uint32_t nExtensionCount; + CUtlVector extensions; + VkPhysicalDeviceFeatures stPhysicalDeviceFeatures; + VkPhysicalDeviceProperties stPhysicalDeviceProperties; + uint32_t uScore = 0; + + r = vkEnumerateDeviceExtensionProperties(device, NULL, &nExtensionCount, NULL); + VULKAN_RESULT_PRINT(r, vkEnumeratePhysicalDevices) + extensions.Resize(nExtensionCount); + + r = vkEnumerateDeviceExtensionProperties(device, NULL, &nExtensionCount, extensions.GetData()); + VULKAN_RESULT_PRINT(r, vkEnumeratePhysicalDevices) + + vkGetPhysicalDeviceProperties(device, &stPhysicalDeviceProperties); + vkGetPhysicalDeviceFeatures(device, &stPhysicalDeviceFeatures); + + if (stPhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + uScore += 1000; + if (stPhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) + uScore += 500; + + if (uScore >= uMaxScore) + { + selectedDevice = device; + uMaxScore = uScore; + } + } + + return selectedDevice; +} + + diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index e69de29..f6fdb92 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -0,0 +1,57 @@ +#ifndef VULKAN_STATE_H +#define VULKAN_STATE_H + + +#include "volk.h" +#include "vk_mem_alloc.h" +#include "tier0/platform.h" +#include "iappsystem.h" +#include "materialsystem/materialsystem.h" + +#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext; +#define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext; +struct SupportedVulkanExtensions_t +{ +#include "device_extensions.h" +}; +#undef REQUIRED_EXTENSION +#undef OPTIONAL_EXTENSION + +enum EDependencyMode +{ + DEPENDENCY_MODE_SHADER_IMAGE, + DEPENDENCY_MODE_SHADER_BUFFER, + DEPENDENCY_MODE_SHADER_ACCELERATION_STRUCTURE, + + + DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER, + DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER, + DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE, +}; + +abstract_class IVkCommand +{ +public: + virtual void Call() = 0; + void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ); +}; + +abstract_class IVkCommandBuffer: public IAppSystem +{ +public: + void PushCommand( IVkCommand *pCommand ); + + void Submit(); +}; + +extern IVkCommandBuffer *vkcommandbuffer; + +#undef __cplusplus +#include "vulkan/vk_enum_string_helper.h" +#define __cplusplus + +#define VULKAN_RESULT_PRINT(r, func) \ +if (r != VK_SUCCESS) \ + Plat_FatalErrorFunc(#func " failed: %s\n", string_VkResult(r)); + +#endif diff --git a/public/funnyformat.h b/public/funnyformat.h index 1611ac7..89dd360 100644 --- a/public/funnyformat.h +++ b/public/funnyformat.h @@ -2,7 +2,7 @@ #define FUNNY_FORMAT_H #include "tier0/platform.h" -#include "ifilesystem.h" +#include "tier2/ifilesystem.h" #include "tier1/utlvector.h" struct FunnyFormatParameter_t diff --git a/public/icvar.h b/public/icvar.h index e69de29..51fe502 100644 --- a/public/icvar.h +++ b/public/icvar.h @@ -0,0 +1,119 @@ +#ifndef CONSOLE_H +#define CONSOLE_H + +#include "iappsystem.h" +#include "tier0/platform.h" +#include "tier1/utlstring.h" +#include "tier1/utlvector.h" + +class ConVar; +class ConCommand; + + +typedef void(*ConCommandFn)(int argc, char **argv); + +abstract_class IConsole: public IAppSystem +{ +public: + // Variables + virtual void RegisterVar( ConVar *cvar ) = 0; + virtual void UnRegisterVar( ConVar *cvar ) = 0; + virtual ConVar *FindVar( const char *pName ) = 0; + + // Commands + virtual void RegisterCommand( ConCommand *cvar ) = 0; + virtual void UnRegisterCommand( ConCommand *cvar ) = 0; + virtual ConCommand *FindCommand( const char *pName ) = 0; + + // Command buffer + virtual void Execute( void ) = 0; + virtual void ExecuteArguments( CUtlVector &args ) = 0; + virtual CUtlVector> ParseCommandLine( CUtlString psz ) = 0; + + virtual void AddCommand( const char *psz ) = 0; + virtual void InsertCommand( const char *psz ) = 0; + + CUtlVector m_convars; + CUtlVector m_commands; +}; + +IConsole *Console(); + + +#define FCVAR_NONE 0 +#define FCVAR_DEVELOPMENTONLY 0x1 +#define FCVAR_GAMEDLL 0x2 +#define FCVAR_CLIENTDLL 0x4 +#define FCVAR_HIDDEN 0x8 + +#define FCVAR_PROTECTED 0x10 +#define FCVAR_SPONLY 0x20 +#define FCVAR_ARCHIVE 0x40 +#define FCVAR_NOTIFY 0x80 +#define FCVAR_CHEAT 0x100 +#define FCVAR_REPLICATED 0x200 + +class ConVar +{ +public: + ConVar( const char *pName, const char *pDefaultValue, int flags ); + ConVar( const char *pName, const char *pDefaultValue, int flags, + const char *pHelpString ); + ConVar( const char *pName, const char *pDefaultValue, int flags, + const char *pHelpString, ConCommandFn callback ); + + bool IsFlagSet( int flag ); + const char *GetHelpText( void ); + bool IsRegistered( void ); + const char *GetName( void ); + void AddFlags( int flags ); + bool IsCommand( void ); + + void InstallChangeCallback( ConCommandFn ); + + float GetFloat( void ); + int GetInt( void ); + bool GetBool( void ); + const char *GetString( void ); + + void SetValue( const char *szValue ); + void SetValue( float fValue ); + void SetValue( int iValue ); +private: + CUtlString m_szName; + CUtlString m_szHelpString; + CUtlString m_szDefaultValue; + + CUtlString m_szValue; + float m_fValue; + int m_nValue; + + int m_flags; +}; + + +class ConCommand +{ +public: + ConCommand(const char *pName, ConCommandFn callback, + const char *pHelpString=0, int flags=0); + + const char *GetName( void ); + const char *GetHelpText( void ); + ConCommandFn GetCallback( void ); +private: + CUtlString m_szName; + CUtlString m_szHelpString = NULL; + ConCommandFn m_callback; + + int m_flags; +}; + +#undef V_printf +#define V_printf(...) Msg(CUtlString(__VA_ARGS__).GetString()) + +void Msg( const char* message ); +void Warning( const char* message ); +void Error( const char* message ); + +#endif diff --git a/public/igamewindow.h b/public/igamewindow.h index 1185399..885cd75 100644 --- a/public/igamewindow.h +++ b/public/igamewindow.h @@ -4,10 +4,24 @@ #include "iappsystem.h" #include "tier0/platform.h" +enum EGraphicsAPI +{ + GRAPHICS_API_METAL, + GRAPHICS_API_VULKAN, +}; + abstract_class IGameWindow: public IAppSystem { public: virtual void UpdateWindow() = 0; + + virtual EGraphicsAPI GetGraphicsAPI() = 0; + + virtual int GetVulkanInstanceExtensionCount() = 0; + virtual const char **GetVulkanInstanceExtensions() = 0; + virtual void CreateVulkanSurface( void *pInstance ) = 0; + virtual void DestroyVulkanSurface( void *pInstance ) = 0; + virtual void *GetVulkanSurface() = 0; }; extern IGameWindow *gamewindow; diff --git a/public/materialsystem/imaterialsystem.h b/public/materialsystem/materialsystem.h similarity index 77% rename from public/materialsystem/imaterialsystem.h rename to public/materialsystem/materialsystem.h index cc68416..049965e 100644 --- a/public/materialsystem/imaterialsystem.h +++ b/public/materialsystem/materialsystem.h @@ -61,31 +61,30 @@ enum EMultisampleType abstract_class IImage : public IRenderingObject { public: - virtual void BlitTo( IImage *pImage ); + }; abstract_class IRenderContext: public IAppSystem { public: + virtual void Frame( float fTime ) = 0; virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) = 0; virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) = 0; - virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ); - virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ); + virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; + virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; - virtual void DestroyBuffer( IBuffer *pBuffer ); - virtual void DestroyImage( IImage *pImage ); + virtual void DestroyBuffer( IBuffer *pBuffer ) = 0; + virtual void DestroyImage( IImage *pImage ) = 0; }; abstract_class IMaterialSystem: public IAppSystem { public: - virtual void Init(); - virtual void Frame( float fTime ); - virtual void Shutdown(); + virtual void Frame( float fTime ) = 0; - IRenderContext *GetRenderContext(); + virtual IRenderContext *GetRenderContext( void) = 0; }; -extern IMaterialSystem *materials; +IMaterialSystem *Materials( void ); #endif diff --git a/public/tier0/lib.h b/public/tier0/lib.h index 78497ec..c6c7b65 100644 --- a/public/tier0/lib.h +++ b/public/tier0/lib.h @@ -13,6 +13,7 @@ #include "string.h" #include "stdio.h" #include "stdlib.h" +#include "ctype.h" //----------------------------------------------------------------------------- // string.h @@ -106,4 +107,24 @@ #define V_atoi atoi #define V_atof atof +//----------------------------------------------------------------------------- +// ctype.h +//----------------------------------------------------------------------------- + +#define V_isalnum isalnum +#define V_isalpha isalpha +#define V_isblank isblank +#define V_iscntrl iscntrl +#define V_isdigit isdigit +#define V_isgraph isgraph +#define V_islower islower +#define V_isprint isprint +#define V_ispunct ispunct +#define V_isspace isspace +#define V_isupper isupper +#define V_isxdigit isxdigit +#define V_tolower tolower +#define V_toupper toupper + + #endif diff --git a/public/tier1/utlbuffer.h b/public/tier1/utlbuffer.h index 549b646..0d0b525 100644 --- a/public/tier1/utlbuffer.h +++ b/public/tier1/utlbuffer.h @@ -23,10 +23,11 @@ template class CUtlBuffer { public: - CUtlBuffer( void ); + CUtlBuffer( void ); CUtlBuffer( size_t nSize ); CUtlBuffer( const CUtlBuffer& buffer ); CUtlBuffer( const CUtlResizableBuffer& buffer ); + ~CUtlBuffer( void ); size_t GetSize( void ) const; T* GetMemory(void) const; @@ -81,6 +82,12 @@ CUtlBuffer::CUtlBuffer( const CUtlResizableBuffer& buffer ) : m_nSize(buff V_memcpy(m_pData,buffer.pData,sizeof(T)*buffer.nSize); } +template +CUtlBuffer::~CUtlBuffer() +{ + if ( m_pData != 0) + V_free(m_pData); +} //----------------------------------------------------------------------------- // Gets memory size. //----------------------------------------------------------------------------- @@ -145,9 +152,10 @@ CUtlBuffer& CUtlBuffer::operator=(const CUtlBuffer& other) if ( m_pData != 0) V_free(m_pData); m_pData = (T*)V_malloc(sizeof(T)*other.m_nSize); + m_nSize = other.m_nSize; V_memcpy(m_pData, other.m_pData, sizeof(T)*other.m_nSize); } - return this; + return *this; } //----------------------------------------------------------------------------- diff --git a/public/tier2/fileformats/ini.h b/public/tier2/fileformats/ini.h index 1c2306a..fe16be0 100644 --- a/public/tier2/fileformats/ini.h +++ b/public/tier2/fileformats/ini.h @@ -3,6 +3,7 @@ #include "tier0/platform.h" #include "tier1/utlstring.h" +#include "tier1/utlvector.h" abstract_class IINISection { @@ -16,7 +17,7 @@ public: abstract_class IINIFile { public: - virtual void GetSection( const char *szSectionName ) = 0; + virtual IINISection *GetSection( const char *szSectionName ) = 0; }; abstract_class IINIManager diff --git a/public/ifilesystem.h b/public/tier2/ifilesystem.h similarity index 69% rename from public/ifilesystem.h rename to public/tier2/ifilesystem.h index bedf6f5..2f26440 100644 --- a/public/ifilesystem.h +++ b/public/tier2/ifilesystem.h @@ -11,15 +11,9 @@ enum EFileMode FILEMODE_APPEND = 0x04, }; -enum EFileType { - FILETYPE_NONE, - FILETYPE_SYSTEM, - FILETYPE_PAK, -}; - enum ESeekMode { - SEEKMODE_SET, + SEEKMODE_RELATIVE_CURRENT, SEEKMODE_RELATIVE_START, SEEKMODE_RELATIVE_END, }; @@ -35,6 +29,7 @@ public: size_t Read( void *pData, size_t nDataSize ); size_t Seek( ESeekMode eSeekMode, size_t nOffset ); size_t Tell( void ); + size_t Size( void ); void Close( void ); @@ -56,12 +51,28 @@ public: virtual size_t Seek( IFileHandle *pFile, ESeekMode eSeekMode, size_t nOffset ) = 0; virtual size_t Tell( IFileHandle *pFile ) = 0; + virtual size_t Size( IFileHandle *pFile ) = 0; virtual void Close( IFileHandle *pFile ) = 0; + + IFileSystem *m_pNext; + + void RegisterFileSystem(); }; extern IFileSystem *filesystem; -extern IFileSystem *filesystem_backend; -extern IFileSystem *filesystem_pak; +extern IFileSystem *g_pFileSystems; + +typedef IFileSystem *( *InstantiateFileSystemFn )( void ); +class CFileSystemRegistry +{ +public: + CFileSystemRegistry( InstantiateFileSystemFn fn, const char *szFileSystem ); +}; + +#define EXPOSE_FILESYSTEM( className, filesystemName ) \ + static IFileSystem *__Create##className##_filesystem() { return ( IFileSystem* )( new className ); }; \ + static CFileSystemRegistry __Create##className##_registry( __Create##className##_filesystem, filesystemName ); + #endif diff --git a/tests/ini/build.cpp b/tests/ini/build.cpp new file mode 100644 index 0000000..2ef1f20 --- /dev/null +++ b/tests/ini/build.cpp @@ -0,0 +1,35 @@ +#include "c.h" +#include "target.h" +#include "helper.h" + +DECLARE_BUILD_STAGE(ini_test) +{ + CProject_t p = { + .files = { + "../../tier0/lib.cpp", + "../../tier0/mem.cpp", + "../../tier0/platform.cpp", + "../../tier1/interface.cpp", + "../../tier1/utlbuffer.cpp", + "../../tier1/utlstring.cpp", + "../../tier1/utlvector.cpp", + "../../tier1/utlmap.cpp", + "../../tier1/commandline.cpp", + "../../tier2/fileformats/ini.cpp", + "../../tier2/filesystem.cpp", + "../../tier2/filesystem_libc.cpp", + "main.cpp", + }, + .includeDirectories = + { + "../../public" + }, + }; + p.m_szName = "initest"; + LinkProject_t l = ccompiler->Compile(&p); + CUtlString szPath = linker->Link(&l); + filesystem2->CopyFile("./", szPath); + + + return 0; +} diff --git a/tests/ini/initest b/tests/ini/initest new file mode 100644 index 0000000000000000000000000000000000000000..01d2d95353a142d6b57cab4e6787483a6710912b GIT binary patch literal 168848 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%0DlVXz@7eOZqgZ_@?{m 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

@rWj{TlacF-*hh{Z66SGZf>iC_ z#oa9#Gia>gHa~G`d8aeHoM$8MZK{WU`|j4M{EQNoM- zjzD;4{P(?Q!rk|K-2 zOE^KCfbfKq{LB7|O&mTYgzS35pUm-l^C{uIc*%~q(>c5+8tZnBe82CHdGlHNf}xC^?jK(G(790Z?4*nz zWdyJK5GOXDHqGI^@qg@i6aE`gvCKx|5_da?cgJE`bLgrS{I;_Ei@$`E_p1to|Mp2H z;KIUZLXgWKjpWFJ{6|Iaa^g|Ge=JFA)B> Omz(gncmjA{t^WgA%E#mY literal 0 HcmV?d00001 diff --git a/tests/ini/main.cpp b/tests/ini/main.cpp new file mode 100644 index 0000000..14b74fa --- /dev/null +++ b/tests/ini/main.cpp @@ -0,0 +1,49 @@ +#include "tier0/lib.h" +#include "tier0/mem.h" +#include "tier1/utlbuffer.h" +#include "tier1/commandline.h" +#include "tier2/fileformats/ini.h" +#include "tier2/ifilesystem.h" + +int main( int argc, char **argv ) +{ + + const char *szFileName; + IFileHandle *pHandle = NULL; + size_t nSize = 0; + CUtlBuffer szData; + + CommandLine()->CreateCommandLine(argc, argv); + filesystem->Init(); + + // Get file + szFileName = CommandLine()->ParamValue("-f"); + if (!szFileName) + return 0; + + // Load it + pHandle = filesystem->Open(szFileName, FILEMODE_READ); + if (!pHandle) + return 0; + + // Get size + pHandle->Seek(SEEKMODE_RELATIVE_END, 0); + nSize = pHandle->Tell(); + pHandle->Seek(SEEKMODE_RELATIVE_START, 0); + + // Read it + szData = CUtlBuffer(nSize+1); + pHandle->Read(szData, nSize); + pHandle->Close(); + + szData[nSize] = 0; + + IINIFile *pIniFile = INIManager()->ReadString(szData); + if (!pIniFile) + return 0; + IINISection *pTestValues = pIniFile->GetSection("Test_Values"); + if (!pTestValues) + return 0; + V_printf("%s\n",pTestValues->GetStringValue("abc3d")); + +}; diff --git a/tests/ini/test1.ini b/tests/ini/test1.ini new file mode 100644 index 0000000..f86614a --- /dev/null +++ b/tests/ini/test1.ini @@ -0,0 +1,12 @@ + +[Test_Values] +a = "Hello world!\n" +b = true +c = false +c = 3.1415926 +d = 123456 +e = -2.71828 +f = -890 +g = .34 +abc3d = "Hello world from the funny engine, you can use \" to add quotes" + diff --git a/tests/ini/test2.ini b/tests/ini/test2.ini new file mode 100644 index 0000000..558ed37 --- /dev/null +++ b/tests/ini/test2.ini @@ -0,0 +1 @@ +[ diff --git a/tests/ini/test3.ini b/tests/ini/test3.ini new file mode 100644 index 0000000..95ef80c --- /dev/null +++ b/tests/ini/test3.ini @@ -0,0 +1 @@ +[Hello diff --git a/tests/ini/test4.ini b/tests/ini/test4.ini new file mode 100644 index 0000000..e849c76 --- /dev/null +++ b/tests/ini/test4.ini @@ -0,0 +1 @@ +[Test Hello] diff --git a/tests/ini/test5.ini b/tests/ini/test5.ini new file mode 100644 index 0000000..5ef5672 --- /dev/null +++ b/tests/ini/test5.ini @@ -0,0 +1,2 @@ +["Hello world"] +Test diff --git a/tests/ini/test6.ini b/tests/ini/test6.ini new file mode 100644 index 0000000..53973bf --- /dev/null +++ b/tests/ini/test6.ini @@ -0,0 +1,2 @@ +[Test] +a b diff --git a/tests/ini/test7.ini b/tests/ini/test7.ini new file mode 100644 index 0000000..4df87f3 --- /dev/null +++ b/tests/ini/test7.ini @@ -0,0 +1,2 @@ +[Test] +a = diff --git a/tests/ini/test8.ini b/tests/ini/test8.ini new file mode 100644 index 0000000..f6da3f4 --- /dev/null +++ b/tests/ini/test8.ini @@ -0,0 +1,5 @@ +[Test] +a = b +c = d + +d = test diff --git a/tier2/__build.cpp b/tier2/__build.cpp new file mode 100644 index 0000000..b13ac9e --- /dev/null +++ b/tier2/__build.cpp @@ -0,0 +1,31 @@ +#include "helper.h" +#include "c.h" +#include "ld.h" +#include "tier1/utlstring.h" +#include "tier1/commandline.h" + +CUtlVector tier2_CompiledFiles = { + "tier2/fileformats/ini.cpp", + "tier2/fileformats/json.cpp", + "tier2/filesystem.cpp", + "tier2/filesystem_libc.cpp", +}; +CUtlString tier2_lib; + +DECLARE_BUILD_STAGE(tier2) +{ + CProject_t compileProject = {}; + LinkProject_t ldProject = {}; + + compileProject.m_szName = "tier2"; + compileProject.files = tier2_CompiledFiles; + compileProject.includeDirectories = all_IncludeDirectories; + compileProject.bFPIC = true; + ldProject = ccompiler->Compile(&compileProject); + ldProject.linkType = ELINK_STATIC_LIBRARY; + + CUtlString outputProject = linker->Link(&ldProject); + tier2_lib = outputProject; + + return 0; +}; diff --git a/tier2/fileformats/ini.cpp b/tier2/fileformats/ini.cpp index 01a65ab..03daf55 100644 --- a/tier2/fileformats/ini.cpp +++ b/tier2/fileformats/ini.cpp @@ -1,7 +1,27 @@ #include "tier2/fileformats/ini.h" +#include "tier0/platform.h" #include "tier1/utlstring.h" #include "tier1/utlvector.h" +#include "tier0/lib.h" + +enum ESectionType +{ + SECTIONTYPE_String, + SECTIONTYPE_Boolean, + SECTIONTYPE_Float, +}; + + +struct SectionData_t +{ + ESectionType m_eSectionType; + CUtlString m_szKey; + + bool m_bData; + float m_fData; + CUtlString m_szData; +}; abstract_class CINISection: public IINISection { @@ -11,27 +31,247 @@ public: virtual const char *GetStringValue( const char *szKeyName ) override; virtual CUtlString GetUTLStringValue( const char *szKeyName ) override; - CUtlVector m_values; + CUtlVector m_values; + CUtlString m_szSectionName; }; +bool CINISection::GetBoolValue( const char *szKeyName ) +{ + +} + +int CINISection::GetIntValue( const char *szKeyName ) +{ + +} + +const char *CINISection::GetStringValue( const char *szKeyName ) +{ + return 0; +} + +CUtlString CINISection::GetUTLStringValue( const char *szKeyName ) +{ + +} + class CINIFile: public IINIFile { - virtual void GetSection( const char *szSectionName ) override; +public: + virtual IINISection *GetSection( const char *szSectionName ) override; CUtlVector m_sections; }; +IINISection *CINIFile::GetSection( const char *szSectionName ) +{ + for ( auto §ion: m_sections ) + { + if ( section->m_szSectionName == szSectionName ) + return (IINISection*)§ion; + } + return 0; +} + + class CINIManager: public IINIManager { public: virtual IINIFile *ReadString( const char *psz ) override; + bool IsWordSymbol( char c ); + CUtlVector TokenizeString(); }; IINIFile *CINIManager::ReadString( const char *psz ) { - CINIFile *pFile = new CINIFile; + CINIFile *pFile = 0; + CINIFile file = {}; + bool bIsQuoted; + bool bIsSlash; + + bool bIsVarName; + bool bIsVarValue; + bool bIsSectionName; + + CINISection currentSection; + SectionData_t currentSectionData; + size_t i = 0; + + char c; + + CUtlString szStringValue; + + CUtlVector tokens; + uint32_t nCurrentLine = 0; + + while (true) + { + c = psz[i]; + i++; + if (c == '\0') + break; + if (c == '\n') + nCurrentLine++; + + + if (bIsQuoted) + { + if (bIsSlash) + { + bIsSlash = false; + switch (c) + { + case '\\': + szStringValue.AppendTail('\\'); + continue; + case '"': + szStringValue.AppendTail('"'); + continue; + case 'n': + szStringValue.AppendTail('\n'); + continue; + case 't': + szStringValue.AppendTail('\n'); + continue; + case '\n': + szStringValue.AppendTail('\n'); + continue; + default: + szStringValue.AppendTail(c); + continue; + } + } else { + switch (c) + { + + case '\\': + bIsSlash = true; + continue; + + case '\n': + V_printf("line %i: new line was found but the string wasn't finished, did you forget to place \" in the end of the line?\n", nCurrentLine); + case '"': + bIsQuoted = false; + if (szStringValue == 0) + continue; + tokens.AppendTail(szStringValue); + szStringValue = 0; + continue; + default: + szStringValue.AppendTail(c); + continue; + } + } + + } else { + if (c == '"') + { + bIsQuoted = true; + } + + if (IsWordSymbol(c)) + { + szStringValue.AppendTail(c); + continue; + } else { + if (szStringValue != 0) + tokens.AppendTail(szStringValue); + szStringValue = 0; + if (V_isgraph(c) && c != '"') + tokens.AppendTail(CUtlString("%c", c)); + } + } + }; + + currentSectionData.m_eSectionType = SECTIONTYPE_String; + + for ( int i = 0; i < tokens.GetSize(); i++ ) + { + if (tokens[i] == "]") + { + V_printf("Error: unexpected ]\n"); + return 0; + } + if (tokens[i] == "[") + { + i++; + if (i>=tokens.GetSize()) + { + V_printf("Error: Trailing section start\n"); + return 0; + } + currentSection = {}; + currentSection.m_szSectionName = tokens[i]; + V_printf("[%s]\n",currentSection.m_szSectionName.GetString()); + + i++; + if (i>=tokens.GetSize()) + { + V_printf("Error: Trailing section name\n"); + return 0; + } + if (tokens[i] != "]") + { + V_printf("Error: expected ]\n"); + return 0; + } + continue; + } + if (tokens[i] == "=") + { + V_printf("Error: expected key\n"); + return 0; + } + currentSectionData = {}; + currentSectionData.m_szKey = tokens[i]; + + + + i++; + if (i>=tokens.GetSize()) + { + V_printf("Error: trailing key\n"); + return 0; + } + if (tokens[i] != "=") + { + V_printf("Error: expected =\n"); + return 0; + } + + i++; + + if (i>=tokens.GetSize()) + { + V_printf("Error: expected value\n"); + return 0; + } + currentSectionData.m_szData = tokens[i]; + currentSection.m_values.AppendTail(currentSectionData); + + } + + pFile = new CINIFile; + *pFile = file; + return (IINIFile*)pFile; } +bool CINIManager::IsWordSymbol( char c ) +{ + if (V_isalnum(c)) + return true; + switch (c) + { + case '-': + case '_': + case '.': + return true; + default: + return false; + } +} + +CUtlVector TokenizeString(); IINIManager *INIManager() { diff --git a/engine/filesystem.cpp b/tier2/filesystem.cpp similarity index 64% rename from engine/filesystem.cpp rename to tier2/filesystem.cpp index 25d627a..e2b7ad9 100644 --- a/engine/filesystem.cpp +++ b/tier2/filesystem.cpp @@ -1,4 +1,4 @@ -#include "ifilesystem.h" +#include "tier2/ifilesystem.h" #include "tier1/interface.h" #include "tier0/lib.h" @@ -22,6 +22,11 @@ size_t IFileHandle::Tell( void ) return m_pFileSystem->Tell(this); } +size_t IFileHandle::Size( void ) +{ + return m_pFileSystem->Size(this); +} + void IFileHandle::Close( void ) { m_pFileSystem->Close(this); @@ -32,8 +37,6 @@ class CFileSystem : public IFileSystem { public: virtual void Init() override { - filesystem_backend->Init(); - filesystem_pak->Init(); }; virtual void Shutdown() override { @@ -41,13 +44,14 @@ public: virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override { + IFileSystem *pFileSystem; IFileHandle *pHandle = NULL; - pHandle = filesystem_pak->Open(szFileName, eOpCode); - if (pHandle) return pHandle; - - pHandle = filesystem_backend->Open(szFileName, eOpCode); - if (pHandle) return pHandle; + for ( pFileSystem = g_pFileSystems; pFileSystem; pFileSystem = pFileSystem->m_pNext ) + { + pHandle = pFileSystem->Open(szFileName, eOpCode); + if (pHandle) return pHandle; + } return NULL; } @@ -71,11 +75,30 @@ public: { return pFile->Tell(); } + virtual size_t Size( IFileHandle *pFile ) override + { + return pFile->Size(); + } virtual void Close( IFileHandle *pFile ) override { } }; -CFileSystem g_fileSystem; -IFileSystem *filesystem = &g_fileSystem; + +static CFileSystem s_fileSystem; +IFileSystem *filesystem = &s_fileSystem; + +IFileSystem *g_pFileSystems; + +CFileSystemRegistry::CFileSystemRegistry( InstantiateFileSystemFn fn, const char *szFileSystem ) +{ + IFileSystem *pFileSystem = fn(); + pFileSystem->RegisterFileSystem(); +} + +void IFileSystem::RegisterFileSystem() +{ + m_pNext = g_pFileSystems; + g_pFileSystems = this; +}; diff --git a/engine/filesystem_libc.cpp b/tier2/filesystem_libc.cpp similarity index 76% rename from engine/filesystem_libc.cpp rename to tier2/filesystem_libc.cpp index 1718620..821d7a8 100644 --- a/engine/filesystem_libc.cpp +++ b/tier2/filesystem_libc.cpp @@ -1,4 +1,4 @@ -#include "ifilesystem.h" +#include "tier2/ifilesystem.h" #include "tier1/interface.h" #include "tier0/lib.h" @@ -6,14 +6,16 @@ class CLIBCFileHandle : public IFileHandle { public: FILE *m_pFile; - + size_t m_nSize; }; class CLIBCFileSystem : public IFileSystem { public: - virtual void Init() override {}; + virtual void Init() override { + + }; virtual void Shutdown() override {}; virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override @@ -25,7 +27,7 @@ public: switch (eOpCode) { case FILEMODE_READ: - szOperation = "r"; + szOperation = "rb"; break; default: V_printf("Operation is not supported\n"); @@ -39,6 +41,9 @@ public: pHandle = new CLIBCFileHandle; pHandle->m_pFileSystem = this; pHandle->m_pFile = pFile; + pHandle->Seek(SEEKMODE_RELATIVE_START, 0); + pHandle->m_nSize = pHandle->Tell(); + pHandle->Seek(SEEKMODE_RELATIVE_END, 0); return pHandle; } virtual size_t Write( IFileHandle *pFile, const void *pData, size_t nDataSize ) override @@ -57,20 +62,23 @@ public: { CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; int eLibcSeekMode = 0; + + if (!pHandle) + return 0; + switch (eSeekMode) { - case SEEKMODE_SET: - eLibcSeekMode = SEEK_SET; + case SEEKMODE_RELATIVE_CURRENT: + eLibcSeekMode = SEEK_CUR; break; case SEEKMODE_RELATIVE_END: eLibcSeekMode = SEEK_END; break; case SEEKMODE_RELATIVE_START: - eLibcSeekMode = SEEK_CUR; + eLibcSeekMode = SEEK_SET; break; } - if (!pHandle) - return 0; - return V_fseek( pHandle->m_pFile, eLibcSeekMode, nOffset ); + + return V_fseek( pHandle->m_pFile, nOffset, eLibcSeekMode ); } virtual size_t Tell( IFileHandle *pFile ) override @@ -80,6 +88,16 @@ public: return 0; return V_ftell(pHandle->m_pFile); } + + virtual size_t Size( IFileHandle *pFile ) override + { + CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; + if (!pHandle) + return 0; + return pHandle->m_nSize; + } + + virtual void Close( IFileHandle *pFile ) override { @@ -91,5 +109,4 @@ public: } }; -CLIBCFileSystem g_libcFileSystem; -IFileSystem *filesystem_backend = &g_libcFileSystem; +EXPOSE_FILESYSTEM(CLIBCFileSystem, "sysfs");