improvements

This commit is contained in:
2025-12-14 12:32:24 +02:00
parent 90a0c55d1d
commit c4406d1891
20 changed files with 529 additions and 95 deletions

0
engine/assetmgr.cpp Normal file
View File

72
engine/gamemgr.cpp Normal file
View File

@@ -0,0 +1,72 @@
#include "igamemgr.h"
#include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier2/ifilesystem.h"
#include "tier2/fileformats/ini.h"
abstract_class CGame: public IGame {
public:
virtual void Load() override;
virtual void GameFrame() override;
private:
void *m_pLibrary;
};
abstract_class CGameManager: public IGameManager
{
public:
virtual void Init() override;
virtual void Shutdown() override;
virtual IGame *LoadGame( const char *szGameName ) override;
virtual IGameMod *LoadGlobalMod( const char *szModName ) override;
private:
IINIFile *g_pGameParameters;
};
void CGameManager::Init()
{
IFileHandle *pFile;
size_t nDataSize = 0;
CUtlBuffer<char> szData;
IINISection *pMainGame;
CUtlString sz;
pFile = filesystem->Open("game.ini", FILEMODE_READ);
szData = CUtlBuffer<char>(pFile->Size());
pFile->Read(szData.GetMemory(), szData.GetSize());
pFile->Close();
g_pGameParameters= INIManager()->ReadString(szData);
pMainGame = g_pGameParameters->GetSection("MainGame");
LoadGame(pMainGame->GetStringValue("path"));
}
void CGameManager::Shutdown()
{
INIManager()->ReleaseFile(g_pGameParameters);
}
//-----------------------------------------------------------------------------
// Load all the packages
//-----------------------------------------------------------------------------
IGame *CGameManager::LoadGame( const char *szGameName )
{
}
IGameMod *CGameManager::LoadGlobalMod( const char *szModName )
{
}
IGameManager *GameManager()
{
static CGameManager manager;
return (IGameManager*)&manager;
}

View File

@@ -56,13 +56,14 @@ LinkProject_t ICCompiler::Compile( CProject_t *pProject )
// Run CC // Run CC
for (auto &file: pProject->files) for (auto &file: pProject->files)
{ {
V_printf(" CC %s\n", file.GetString());
CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file);
CUtlVector<CUtlString> args; CUtlVector<CUtlString> args;
args = BuildCommandLine(pProject, file, szOutputFile); args = BuildCommandLine(pProject, file, szOutputFile);
if (!filesystem2->ShouldRecompile(file, szOutputFile)) if (!filesystem2->ShouldRecompile(file, szOutputFile))
goto skipcompile; goto skipcompile;
else
V_printf(" CC %s\n", file.GetString());
runner->Run(GetCompilerExecutable(pProject), args); runner->Run(GetCompilerExecutable(pProject), args);
skipcompile: skipcompile:
proj.objects.AppendTail((Object_t){szOutputFile}); proj.objects.AppendTail((Object_t){szOutputFile});

View File

@@ -152,7 +152,6 @@ LinkProject_t CClangCompiler::Compile( CProject_t *pProject )
// Run CC // Run CC
for (auto &file: pProject->files) for (auto &file: pProject->files)
{ {
V_printf(" CC %s\n", file.GetString());
bool bAreDependenciesUpdated = false; bool bAreDependenciesUpdated = false;
CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file);
@@ -201,6 +200,10 @@ LinkProject_t CClangCompiler::Compile( CProject_t *pProject )
args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot)); args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot));
} }
*/ */
if (!filesystem2->ShouldRecompile(file, szOutputFile))
goto skipcompile;
else
V_printf(" CC %s\n", file.GetString());
runner->Run(GetCompilerExecutable(pProject), args); runner->Run(GetCompilerExecutable(pProject), args);
skipcompile: skipcompile:

5
funnyassets/game.ini Normal file
View File

@@ -0,0 +1,5 @@
[MainGame]
name = "FunnyGame"
path = "funnygame"
version = 1

View File

@@ -9,6 +9,7 @@ CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
"materialsystem/vulkan/rendercontext.cpp", "materialsystem/vulkan/rendercontext.cpp",
"materialsystem/vulkan/material.cpp", "materialsystem/vulkan/material.cpp",
"materialsystem/vulkan/commandbuffer.cpp", "materialsystem/vulkan/commandbuffer.cpp",
"materialsystem/vulkan/commands/draw.cpp",
"external/volk/volk.c", "external/volk/volk.c",
}; };
CUtlString material_lib; CUtlString material_lib;

View File

@@ -1,33 +1,169 @@
#include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "vulkan_state.h" #include "vulkan_state.h"
CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
IVkCommandBufferManager *g_pCommandBufferManager;
class CVkCommandBuffer: public IVkCommandBuffer class CVkCommandBuffer: public IVkCommandBuffer
{ {
public: public:
virtual void Init() override; virtual void AddCommand( CVkCommand *pCommand ) override;
virtual void Shutdown() override; virtual void Reset() override;
virtual void AddCommand( EVulkanCommandType eType, CVkCommand *pCommand ) override; virtual void Submit( int iFrameIndex ) override;
virtual void Submit() override; virtual void Render() override;
private: private:
CUtlSelfReferencingVector<CVkCommand*> g_commands; CUtlSelfReferencingVector<CVkCommand*> g_commands;
CUtlVector<VkCommandBuffer> m_hBuffers = NULL;
}; };
void CVkCommandBuffer::AddCommand( EVulkanCommandType eType, CVkCommand *pCommand ) void CVkCommandBuffer::Reset()
{
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
int i = 0;
for ( auto pool: g_vkCommandPools)
{
commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
commandBufferAllocInfo.commandPool = pool;
commandBufferAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
commandBufferAllocInfo.commandBufferCount = 1;
vkAllocateCommandBuffers(g_vkDevice, &commandBufferAllocInfo, &m_hBuffers[i]);
i++;
}
g_commands = {};
}
void CVkCommandBuffer::AddCommand( CVkCommand *pCommand )
{ {
g_commands.AppendTail(pCommand); g_commands.AppendTail(pCommand);
} }
void CVkCommandBuffer::Submit() void CVkCommandBuffer::Submit( int iFrameIndex )
{
g_vkCommandBuffers.AppendTail(m_hBuffers[iFrameIndex]);
};
void CVkCommandBuffer::Render()
{
uint32_t nNumDependencies;
nNumDependencies = 0;
for (auto pCommand: g_commands)
{
nNumDependencies += pCommand->m_depedencies.GetSize();
}
// issue vkCmdPipelineBarrier if there are any
if (nNumDependencies)
{
}
for (auto hBuffer: m_hBuffers)
{ {
for (auto &pCommand: g_commands) for (auto &pCommand: g_commands)
{ {
pCommand->Execute(); pCommand->Execute(hBuffer);
delete pCommand;
}; };
}
}
void CVkCommand::SetUIntParam( const char *szName, uint32_t uintParam )
{
for ( auto p: m_parameters )
{
if (!V_strcmp(p.m_szName, szName))
p.uint32_Data = uintParam;
}
}
uint32_t CVkCommand::GetUIntParam( const char *szName )
{
for ( auto p: m_parameters )
{
if (!V_strcmp(p.m_szName, szName))
return p.uint32_Data;
}
return 0;
}
void CVkCommand::SetImageParam( const char *szName, IImage *pImageParam )
{
for ( auto p: m_parameters )
{
if (!V_strcmp(p.m_szName, szName))
p.pImageData = pImageParam;
}
}
IImage *CVkCommand::GetImageParam( const char *szName )
{
for ( auto p: m_parameters )
{
if (!V_strcmp(p.m_szName, szName))
return p.pImageData;
}
return 0;
}
class CVkCommandBufferManager: public IVkCommandBufferManager
{
public:
virtual void Init() override;
virtual void Shutdown() override;
virtual IVkCommandBuffer *CreateCommandBuffer() override;
virtual CVkCommand *CreateCommand( const char *szName ) override;
}; };
static CVkCommandBuffer s_vkCommandBuffer; EXPOSE_INTERFACE(CVkCommandBufferManager, IVkCommandBufferManager, VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME);
IVkCommandBuffer *VulkanCommandBuffer()
void CVkCommandBufferManager::Init()
{ {
return &s_vkCommandBuffer;
} }
void CVkCommandBufferManager::Shutdown()
{
}
IVkCommandBuffer *CVkCommandBufferManager::CreateCommandBuffer()
{
return new CVkCommandBuffer;
}
struct VulkanCommandRegistry_t
{
const char *m_szName;
fnCreateVulkanCommand_t m_pfnCreate;
struct VulkanCommandRegistry_t *m_pNext;
} *s_pVulkanCommands = NULL;
CVkCommand *CVkCommandBufferManager::CreateCommand( const char *szName )
{
VulkanCommandRegistry_t *pCommand;
for ( pCommand = s_pVulkanCommands; pCommand; pCommand = pCommand->m_pNext )
{
if (!V_strcmp(pCommand->m_szName, szName))
return pCommand->m_pfnCreate();
}
Plat_FatalErrorFunc("Command %s not found\n", szName);
return NULL;
}
CVkCommandRegistry::CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate )
{
VulkanCommandRegistry_t *pCommand = new VulkanCommandRegistry_t;
pCommand->m_szName = szName;
pCommand->m_pfnCreate = pfnCreate;
pCommand->m_pNext = s_pVulkanCommands;
s_pVulkanCommands = pCommand;
}

View File

@@ -0,0 +1,32 @@
#include "../vulkan_state.h"
DECLARE_VULKAN_COMMAND(Draw)
{
}
BEGIN_VULKAN_COMMAND_DATA(Draw)
{"", VULKAN_PARAMETER_TYPE_UINT32},
END_VULKAN_COMMAND_DATA()
DECLARE_VULKAN_COMMAND(ClearColor)
{
CVkImage *pImage = (CVkImage*)GetImageParam("Image");
VkClearColorValue color = {.float32 = {1,0,1,0}};
VkImageSubresourceRange range = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.levelCount = 1,
.layerCount = 1,
};
vkCmdClearColorImage(hCommandBuffer, pImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &range);
}
BEGIN_VULKAN_COMMAND_DATA(ClearColor)
{"R", VULKAN_PARAMETER_TYPE_FLOAT},
{"G", VULKAN_PARAMETER_TYPE_FLOAT},
{"B", VULKAN_PARAMETER_TYPE_FLOAT},
{"A", VULKAN_PARAMETER_TYPE_FLOAT},
{"Image", VULKAN_PARAMETER_TYPE_IMAGE},
END_VULKAN_COMMAND_DATA()

View File

@@ -2,6 +2,7 @@
#include "materialsystem/imaterialsystem.h" #include "materialsystem/imaterialsystem.h"
#include "tier0/lib.h" #include "tier0/lib.h"
#include "tier0/platform.h" #include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier1/utlstring.h" #include "tier1/utlstring.h"
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#define VK_NO_PROTOTYPES #define VK_NO_PROTOTYPES
@@ -36,41 +37,11 @@ CUtlVector<VkFence> g_vkFences;
CUtlVector<VkSemaphore> g_vkGraphicsSemaphores; CUtlVector<VkSemaphore> g_vkGraphicsSemaphores;
CUtlVector<VkSemaphore> g_vkPresentSemaphores; CUtlVector<VkSemaphore> g_vkPresentSemaphores;
VkCommandPool g_vkCommandPool; CUtlVector<VkCommandPool> g_vkCommandPools;
CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
CUtlVector<IImage*> g_vkSwapchainImages; CUtlVector<IImage*> g_vkSwapchainImages;
VkFormat g_vkWindowImageFormat; VkFormat g_vkWindowImageFormat;
class CVkImage: public IImage
{
public:
CVkImage();
CVkImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
~CVkImage();
virtual void SetDebugName( const char *szName ) override;
virtual uint32_t GetImageWidth() override;
virtual uint32_t GetImageHeight() override;
virtual EImageFormat GetImageFormat() override;
virtual EMultisampleType GetMultisampleType() override;
void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
void CreateImageView();
static VkImageViewType GetImageViewType( enum EImageType eImageType );
static VkFormat GetImageFormat( enum EImageFormat eImageFormat );
uint32_t m_nWidth;
uint32_t m_nHeight;
EImageFormat m_eFormat;
EMultisampleType m_eMultisampleType;
EImageType m_eImageType;
VkImage m_image;
VkImageView m_imageView;
VmaAllocation m_allocation;
};
CVkImage::CVkImage() CVkImage::CVkImage()
{ {
@@ -343,6 +314,51 @@ void CVkRenderContext::DestroyImage( IImage *pImage )
} }
IShader *CVkRenderContext::CreateShader( const char *szName )
{
}
void CVkRenderContext::DestroyShader( IShader *pMaterial )
{
}
IMaterial *CVkRenderContext::CreateMaterial( IShader *pShader )
{
}
void CVkRenderContext::DestroyMaterial( IMaterial *pMaterial )
{
}
void CVkRenderContext::SetMaterial( IMaterial *pMaterial )
{
}
void CVkRenderContext::SetVertexBuffer( IVertexBuffer *pBuffer )
{
}
void CVkRenderContext::SetIndexBuffer( IVertexBuffer *pBuffer )
{
}
void CVkRenderContext::DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
}
void CVkRenderContext::DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
}
void CVkRenderContext::Init() void CVkRenderContext::Init()
{ {
VkResult r; VkResult r;
@@ -443,22 +459,27 @@ void CVkRenderContext::Init()
CreateSwapchain(); CreateSwapchain();
g_vkCommandBuffers.Resize(g_vkSwapchainImages.GetSize()); g_vkCommandPools.Resize(g_vkSwapchainImages.GetSize());
for (auto &pool: g_vkCommandPools)
{
VkCommandPoolCreateInfo commandPoolCreateInfo = {}; VkCommandPoolCreateInfo commandPoolCreateInfo = {};
commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
commandPoolCreateInfo.queueFamilyIndex = g_iDrawFamily; commandPoolCreateInfo.queueFamilyIndex = g_iDrawFamily;
commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
vkCreateCommandPool(g_vkDevice, &commandPoolCreateInfo, NULL, &g_vkCommandPool); vkCreateCommandPool(g_vkDevice, &commandPoolCreateInfo, NULL, &pool);
}
VkCommandBufferAllocateInfo commandBufferAllocInfo = {}; g_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL);
commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; g_pCommandBufferManager->Init();
commandBufferAllocInfo.commandPool = g_vkCommandPool;
commandBufferAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
commandBufferAllocInfo.commandBufferCount = g_vkSwapchainImages.GetSize();
vkAllocateCommandBuffers(g_vkDevice, &commandBufferAllocInfo, g_vkCommandBuffers.GetData());
IVkCommandBuffer *pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
CVkCommand *pCommand = g_pCommandBufferManager->CreateCommand("Draw");
pCommand->AddDependency(g_vkSwapchainImages[0], DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION);
pCommand->SetImageParam("Image", g_vkSwapchainImages[0]);
pCommandBuffer->AddCommand(pCommand);
pCommandBuffer->Render();
} }
void CVkRenderContext::Frame( float fDeltaTime ) void CVkRenderContext::Frame( float fDeltaTime )
@@ -466,25 +487,21 @@ void CVkRenderContext::Frame( float fDeltaTime )
static uint32_t s_nImageIndex = 0; static uint32_t s_nImageIndex = 0;
uint32_t nImageIndex = 0; uint32_t nImageIndex = 0;
vkWaitForFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex], UINT64_MAX, VK_TRUE); vkWaitForFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex], VK_TRUE, UINT64_MAX);
VkResult r = vkAcquireNextImageKHR(g_vkDevice, g_vkSwapchain, UINT64_MAX, g_vkGraphicsSemaphores[s_nImageIndex], NULL, &nImageIndex); VkResult r = vkAcquireNextImageKHR(g_vkDevice, g_vkSwapchain, UINT64_MAX, g_vkGraphicsSemaphores[s_nImageIndex], NULL, &nImageIndex);
VkCommandBufferBeginInfo commandBufferBeginInfo = {};
commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
vkBeginCommandBuffer(GetCommandBuffer(), &commandBufferBeginInfo);
vkEndCommandBuffer(GetCommandBuffer());
vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]); vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]);
VkCommandBuffer currentCommandBuffer = GetCommandBuffer();
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
VkSubmitInfo stSubmitInfo = {}; VkSubmitInfo stSubmitInfo = {};
stSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; stSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
stSubmitInfo.waitSemaphoreCount = 1; stSubmitInfo.waitSemaphoreCount = 1;
stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex]; stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex];
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags; stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
stSubmitInfo.commandBufferCount = 1;
stSubmitInfo.pCommandBuffers = &currentCommandBuffer; stSubmitInfo.commandBufferCount = g_vkCommandBuffers.GetSize();
stSubmitInfo.pCommandBuffers = g_vkCommandBuffers.GetData();
stSubmitInfo.signalSemaphoreCount = 1; stSubmitInfo.signalSemaphoreCount = 1;
stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex]; stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex];
@@ -693,7 +710,3 @@ CUtlVector<const char *> CVkRenderContext::GetDeviceExtensions()
return enabledExtensions; return enabledExtensions;
} }
VkCommandBuffer CVkRenderContext::GetCommandBuffer()
{
return g_vkCommandBuffers[0];
}

View File

@@ -8,6 +8,7 @@
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "tier2/iappsystem.h" #include "tier2/iappsystem.h"
#include "materialsystem/imaterialsystem.h" #include "materialsystem/imaterialsystem.h"
#include "vulkan/vulkan_core.h"
#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext; #define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext;
#define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext; #define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext;
@@ -18,6 +19,16 @@ extern struct SupportedVulkanExtensions_t
#undef REQUIRED_EXTENSION #undef REQUIRED_EXTENSION
#undef OPTIONAL_EXTENSION #undef OPTIONAL_EXTENSION
extern CUtlVector<IImage*> g_vkSwapchainImages;
extern CUtlVector<VkCommandPool> g_vkCommandPools;
extern CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
extern VkInstance g_vkInstance;
extern VkPhysicalDevice g_vkPhysicalDevice;
extern VkDevice g_vkDevice;
enum EVulkanCommandType enum EVulkanCommandType
{ {
COMMAND_TYPE_GENERAL, COMMAND_TYPE_GENERAL,
@@ -27,6 +38,14 @@ enum EVulkanCommandType
COMMAND_TYPE_END, COMMAND_TYPE_END,
}; };
enum EVulkanCommandParameterType
{
VULKAN_PARAMETER_TYPE_UINT32,
VULKAN_PARAMETER_TYPE_FLOAT,
VULKAN_PARAMETER_TYPE_BUFFER,
VULKAN_PARAMETER_TYPE_IMAGE,
};
enum EDependencyMode enum EDependencyMode
{ {
DEPENDENCY_MODE_SHADER_IMAGE_READ, DEPENDENCY_MODE_SHADER_IMAGE_READ,
@@ -41,46 +60,92 @@ enum EDependencyMode
DEPENDENCY_MODE_IMAGE_SOURCE, DEPENDENCY_MODE_IMAGE_SOURCE,
DEPENDENCY_MODE_IMAGE_DESTINATION, DEPENDENCY_MODE_IMAGE_DESTINATION,
DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION,
}; };
#define EXPOSE_VULKAN_COMMAND( name ) \
class CVulkanCommand_##name; \
CVulkanCommand_##name *name(); \
#define DECLARE_VULKAN_COMMAND( name ) \
class CVulkanCommand_##name \
{ \
public: \
virtual void Execute() override; \
}; \
CVulkanCommand_##name *name(); \
{ \
return new CVulkanCommand_##name \
} \
void CVulkanCommand_##name::Execute() \
abstract_class CVkCommand
{
public:
void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode );
virtual void Execute();
struct VulkanCommandDepenency_t { struct VulkanCommandDepenency_t {
IRenderingObject *m_pObject; IRenderingObject *m_pObject;
EDependencyMode m_eDependencyMode; EDependencyMode m_eDependencyMode;
}; };
CUtlVector<VulkanCommandDepenency_t> m_depedencies;
struct VulkanCommandParameter_t
{
const char *m_szName;
const EVulkanCommandParameterType m_eParameterType;
union {
uint32_t uint32_Data;
IImage *pImageData;
};
}; };
abstract_class IVkCommandBuffer: public IAppSystem abstract_class CVkCommand
{ {
public: public:
virtual void AddCommand( EVulkanCommandType eType, CVkCommand * ) = 0; void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode );
virtual void Execute( VkCommandBuffer hCommandBuffer ) = 0;
//virtual const char *GetName();
virtual void Submit() = 0; CUtlVector<VulkanCommandDepenency_t> m_depedencies;
EVulkanCommandType m_eType;
void SetUIntParam( const char *szName, uint32_t uintParam );
uint32_t GetUIntParam( const char *szName );
void SetImageParam( const char *szName, IImage *pImageParam );
IImage *GetImageParam( const char *szName );
virtual CUtlVector<VulkanCommandParameter_t> GetDataTemplate() = 0;
CUtlVector<VulkanCommandParameter_t> m_parameters;
};
abstract_class IVkCommandBuffer
{
public:
virtual void AddCommand( CVkCommand *pCommand ) = 0;
virtual void Reset() = 0;
virtual void Submit( int iFrameIndex ) = 0;
virtual void Render() = 0;
};
typedef CVkCommand *(*fnCreateVulkanCommand_t)();
abstract_class IVkCommandBufferManager: public IAppSystem
{
public:
virtual IVkCommandBuffer *CreateCommandBuffer() = 0;
virtual CVkCommand *CreateCommand( const char *szName ) = 0;
};
#define VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME "VulkanCommandBufferManager"
extern IVkCommandBufferManager *g_pCommandBufferManager;
class CVkCommandRegistry
{
public:
CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate );
};
#define DECLARE_VULKAN_COMMAND( name ) \
class VulkanCommand_##name : public CVkCommand \
{ \
public: \
virtual void Execute( VkCommandBuffer hCommandBuffer ) override; \
virtual CUtlVector<VulkanCommandParameter_t> GetDataTemplate() override; \
}; \
CVkCommand *_VulkanCommandCreate_##name() { return new VulkanCommand_##name; } \
CVkCommandRegistry _VulkanCommandRegistry_##name( #name, _VulkanCommandCreate_##name ); \
void VulkanCommand_##name::Execute( VkCommandBuffer hCommandBuffer ) \
#define BEGIN_VULKAN_COMMAND_DATA(name) \
CUtlVector<VulkanCommandParameter_t> VulkanCommand_##name::GetDataTemplate() \
{ \
CUtlVector<VulkanCommandParameter_t> parameters = {
#define END_VULKAN_COMMAND_DATA() \
}; \
return parameters; \
}; };
IVkCommandBuffer *VulkanCommandBuffer();
#undef __cplusplus #undef __cplusplus
#include "vulkan/vk_enum_string_helper.h" #include "vulkan/vk_enum_string_helper.h"
@@ -90,4 +155,34 @@ IVkCommandBuffer *VulkanCommandBuffer();
if (r != VK_SUCCESS) \ if (r != VK_SUCCESS) \
Plat_FatalErrorFunc(#func " failed: %s\n", string_VkResult(r)) Plat_FatalErrorFunc(#func " failed: %s\n", string_VkResult(r))
class CVkImage: public IImage
{
public:
CVkImage();
CVkImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
~CVkImage();
virtual void SetDebugName( const char *szName ) override;
virtual uint32_t GetImageWidth() override;
virtual uint32_t GetImageHeight() override;
virtual EImageFormat GetImageFormat() override;
virtual EMultisampleType GetMultisampleType() override;
void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
void CreateImageView();
static VkImageViewType GetImageViewType( enum EImageType eImageType );
static VkFormat GetImageFormat( enum EImageFormat eImageFormat );
uint32_t m_nWidth;
uint32_t m_nHeight;
EImageFormat m_eFormat;
EMultisampleType m_eMultisampleType;
EImageType m_eImageType;
VkImage m_image;
VkImageView m_imageView;
VmaAllocation m_allocation;
};
#endif #endif

0
public/cl_entity.h Normal file
View File

15
public/gamesystem.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef GAME_SYSTEM_H
#define GAME_SYSTEM_H
#include "tier1/interface.h"
abstract_class IGameSystem
{
public:
virtual void Init() = 0;
virtual void Tick( float fDelta ) = 0;
virtual void Frame( float fDelta ) = 0;
virtual void Shutdown() = 0;
};
#endif

20
public/iassetmgr.h Normal file
View File

@@ -0,0 +1,20 @@
#ifndef ASSET_MGR_H
#define ASSET_MGR_H
#include "tier0/platform.h"
#include "tier2/iappsystem.h"
abstract_class IModel;
abstract_class ITexture;
abstract_class ISound;
abstract_class IAssetManager: public IAppSystem
{
public:
virtual void Preload( const char *szName ) = 0;
virtual ITexture *LoadTexture( const char *szName ) = 0;
virtual IModel *LoadModel( const char *szName ) = 0;
virtual ISound *LoadSound( const char *szName ) = 0;
};
#endif

39
public/igamemgr.h Normal file
View File

@@ -0,0 +1,39 @@
#ifndef GAME_MGR_H
#define GAME_MGR_H
#include "tier2/iappsystem.h"
abstract_class IGameBase: public IAppSystem {
public:
virtual void Load() = 0;
virtual void GameFrame() = 0;
virtual const char *GetAssetDirectory();
};
abstract_class IGameMod: public IGameBase
{
};
abstract_class IGame: public IGameBase
{
public:
virtual IGameMod *LoadLocalMod( const char *szModName ) = 0;
private:
void *m_pLibrary;
};
abstract_class IGameManager: public IAppSystem
{
public:
virtual IGame *LoadGame( const char *szGameName ) = 0;
virtual IGameMod *LoadGlobalMod( const char *szModName ) = 0;
};
IGameManager *GameManager();
#endif

0
public/igamepadinput.h Normal file
View File

0
public/ikeyboardinput.h Normal file
View File

0
public/ilevelmgr.h Normal file
View File

0
public/imouseinput.h Normal file
View File

0
public/sv_entity.h Normal file
View File

View File

@@ -7,6 +7,8 @@
CUtlString rapier_lib; CUtlString rapier_lib;
DECLARE_BUILD_STAGE(rapier) DECLARE_BUILD_STAGE(rapier)
{ {
if (CommandLine()->CheckParam("-norust"))
return 0;
rapier_lib = CUtlString("rapier/target/%s/release/librapier_rtt.a",szTarget.GetString()); rapier_lib = CUtlString("rapier/target/%s/release/librapier_rtt.a",szTarget.GetString());
V_printf("%s\n",rapier_lib.GetString()); V_printf("%s\n",rapier_lib.GetString());
CUtlVector<CUtlString> cargo_args = { CUtlVector<CUtlString> cargo_args = {