made it work with new fpc

This commit is contained in:
2026-02-01 17:47:49 +02:00
parent fe1273e539
commit faae0bdcc7
199 changed files with 355 additions and 14541 deletions

View File

@@ -1,45 +0,0 @@
#include "helper.h"
#include "c.h"
#include "ld.h"
#include "tier1/utlstring.h"
#include "tier1/commandline.h"
CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
"materialsystem/materialsystem.cpp",
"materialsystem/compiledshader.cpp",
};
CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
"materialsystem/vulkan/shaderparser.cpp",
"materialsystem/vulkan/rendercontext.cpp",
"materialsystem/vulkan/commandbuffer.cpp",
"materialsystem/vulkan/rendercommandlist.cpp",
"materialsystem/vulkan/material.cpp",
"materialsystem/vulkan/shader.cpp",
"materialsystem/vulkan/utils.cpp",
"materialsystem/vulkan/vma.cpp",
"materialsystem/vulkan/commands/draw.cpp",
"materialsystem/vulkan/commands/transfer.cpp",
"materialsystem/vulkan/commands/base.cpp",
"materialsystem/vulkan/libraries/raster.cpp",
"external/volk/volk.c",
};
CUtlString material_lib;
DECLARE_BUILD_STAGE(MaterialSystem)
{
CProject_t compileProject = {};
LinkProject_t ldProject = {};
compileProject.m_szName = "MaterialSystem";
compileProject.files = MaterialSystem_CompiledFiles;
compileProject.includeDirectories = all_IncludeDirectories;
compileProject.bFPIC = true;
ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_STATIC_LIBRARY;
ldProject.libraries = { "vulkan" };
CUtlString outputProject = linker->Link(&ldProject);
material_lib = outputProject;
return 0;
}

View File

@@ -2,13 +2,18 @@
#include "c.h"
#include "ld.h"
#include "tier1/utlstring.h"
#include "tier1/commandline.h"
#define FUNNYSTDLIB "../external/funnystdlib/"
ADD_DEPENDENCY_BUILD_FILE(tier0, FUNNYSTDLIB"tier0/build.cpp");
ADD_DEPENDENCY_BUILD_FILE(tier1, FUNNYSTDLIB"tier1/build.cpp");
ADD_DEPENDENCY_BUILD_FILE(tier2, FUNNYSTDLIB"tier2/build.cpp");
CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
"materialsystem.cpp",
"compiledshader.cpp",
};
CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
"compiledshader.cpp",
"vulkan/shaderparser.cpp",
"vulkan/rendercontext.cpp",
"vulkan/commandbuffer.cpp",
@@ -23,7 +28,6 @@ CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
"vulkan/libraries/raster.cpp",
"../external/volk/volk.c",
};
CUtlString material_lib;
DECLARE_BUILD_STAGE(MaterialSystem)
{
@@ -32,19 +36,33 @@ DECLARE_BUILD_STAGE(MaterialSystem)
compileProject.m_szName = "MaterialSystem";
compileProject.files = MaterialSystem_CompiledFiles;
compileProject.includeDirectories = { "../public" };
compileProject.includeDirectories = {
"../public",
FUNNYSTDLIB"public",
};
compileProject.bFPIC = true;
ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES)
{
ldProject.libraries.AppendTail("pthread");
};
CUtlString outputProject = linker->Link(&ldProject);
material_lib = outputProject;
ADD_OUTPUT_OBJECT("MaterialSystem", outputProject);
return 0;
}
DECLARE_BUILD_STAGE(RenderSystemVulkan)
{
if (Target_t::DefaultTarget().cpu == TARGET_CPU_WASM32)
return 0;
CProject_t compileProject = {};
LinkProject_t ldProject = {};
@@ -52,6 +70,7 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
compileProject.files = RenderContextVulkan_CompiledFiles;
compileProject.includeDirectories = {
"../public",
FUNNYSTDLIB"public",
"../external/Vulkan-Headers/include",
"../external/Vulkan-Utility-Libraries/include",
"../external/VulkanMemoryAllocator/include",
@@ -60,10 +79,17 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
compileProject.bFPIC = true;
ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraries = { "vulkan" };
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES)
{
ldProject.libraries.AppendTail("pthread");
};
CUtlString outputProject = linker->Link(&ldProject);
material_lib = outputProject;
ADD_OUTPUT_OBJECT("RenderSystemVulkan", outputProject);
return 0;
}

View File

@@ -55,6 +55,7 @@ public:
virtual void ReadFromFile( CCompiledShader *pShader, const char *szFile ) override;
};
IFileSystem *filesystem = NULL;
void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char *szFile )
{
IFileHandle *pFile;
@@ -68,8 +69,14 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char *
stHeader.m_nNumLumps = pShader->m_lumps.GetSize();
stHeader.m_nNumShaders = pShader->m_objects.GetSize();
if ( filesystem == NULL )
{
CreateInterfaceFn pFilesystemFactory = Sys_GetFactory("filesystem_std");
filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL);
}
pFile = filesystem->Open(szFile, FILEMODE_WRITE);
pFile->Write(&stHeader, sizeof(ShaderHeader_t));
filesystem->Write(pFile, &stHeader, sizeof(ShaderHeader_t));
// We want to get offset for the lump data
nTotalSize += sizeof(ShaderLump_t) * pShader->m_lumps.GetSize();
@@ -82,7 +89,7 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char *
ShaderLump_t stLump = {};
stLump.m_nOffset = nTotalSize;
stLump.m_nSize = l.m_nSize;
pFile->Write(&stLump, sizeof(ShaderLump_t));
filesystem->Write(pFile, &stLump, sizeof(ShaderLump_t));
nTotalSize += l.m_nSize;
}
@@ -97,11 +104,11 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char *
// Lump Data
for ( auto l: pShader->m_lumps )
{
pFile->Write(l.m_pAddress, l.m_nSize);
filesystem->Write(pFile, l.m_pAddress, l.m_nSize);
}
pFile->Close();
filesystem->Close(pFile);
}
void CCompiledShaderManager::ReadFromFile( CCompiledShader *pShader, const char *szFile )
@@ -114,27 +121,27 @@ void CCompiledShaderManager::ReadFromFile( CCompiledShader *pShader, const char
CUtlVector<HostShaderLump_t> lumpsData = {};
pFile = filesystem->Open(szFile, FILEMODE_READ);
pFile->Read(&stHeader, sizeof(ShaderHeader_t));
filesystem->Read(pFile, &stHeader, sizeof(ShaderHeader_t));
objects.Resize(stHeader.m_nNumShaders);
lumps.Resize(stHeader.m_nNumLumps);
lumpsData.Resize(stHeader.m_nNumLumps);
pFile->Read(lumps.GetData(), stHeader.m_nNumLumps * sizeof(ShaderLump_t));
pFile->Read(objects.GetData(), stHeader.m_nNumShaders * sizeof(ShaderObject_t));
filesystem->Read(pFile, lumps.GetData(), stHeader.m_nNumLumps * sizeof(ShaderLump_t));
filesystem->Read(pFile, objects.GetData(), stHeader.m_nNumShaders * sizeof(ShaderObject_t));
for ( i = 0; i < stHeader.m_nNumLumps; i++ )
{
lumpsData[i].m_pAddress = V_malloc(lumps[i].m_nSize);
pFile->Seek(SEEKMODE_RELATIVE_START, lumps[i].m_nOffset);
pFile->Read(lumpsData[i].m_pAddress, lumps[i].m_nSize);
filesystem->Seek(pFile, SEEKMODE_RELATIVE_START, lumps[i].m_nOffset);
filesystem->Read(pFile, lumpsData[i].m_pAddress, lumps[i].m_nSize);
lumpsData[i].m_nSize = lumps[i].m_nSize;
};
pShader->m_objects = objects;
pShader->m_lumps = lumpsData;
pFile->Close();
filesystem->Close(pFile);
}

View File

@@ -11,30 +11,20 @@ public:
virtual void RenderGameWindow( IGameWindow *pWindow ) override;
};
EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_NAME)
extern IRenderContext *g_pVkRenderContext;
IRenderContext *g_pRenderContext;
EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_VERSION)
void CMaterialSystem::Init()
{
g_pRenderContext = (IRenderContext*)CreateInterface(RENDER_CONTEXT_INTERFACE_NAME, NULL);
g_pRenderContext->Init();
}
void CMaterialSystem::Frame( float fTime )
{
g_pRenderContext->Frame(fTime);
}
void CMaterialSystem::RenderGameWindow( IGameWindow *pWindow )
{
g_pRenderContext->RenderGameWindow( pWindow );
}
void CMaterialSystem::Shutdown()
{
g_pRenderContext->Shutdown();
}
IMaterialSystem *g_pMaterialSystem;

View File

@@ -1,4 +1,3 @@
#include "SDL3/SDL_vulkan.h"
#include "commands.h"
#include "materialsystem/imaterialsystem.h"
#include "tier0/lib.h"
@@ -250,14 +249,7 @@ public:
virtual void Init() override;
virtual void Frame( float fDeltaTime ) override;
virtual void Shutdown() override;
virtual void SetOutputImage( IImage *pImage ) override;
virtual bool BIsOutputImageOutdated() override;
virtual uint32_t GetNewOutputImageWidth() override;
virtual uint32_t GetNewOutputImageHeight() override;
virtual EImageFormat GetNewOutputImageFormat() override;
virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) override;
virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) override;
virtual IBuffer *CreateConstantBuffer( uint32_t nSize ) override;
@@ -280,45 +272,24 @@ public:
virtual IRenderCommandList *CreateCommandList() override;
virtual void DestroyCommandList( IRenderCommandList *pCommandList ) override;
virtual void SubmitCommandList(IRenderCommandList *pList) override;
virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) override;
virtual void RenderGameWindow( IGameWindow *pWindow ) override;
virtual void RegisterGameWindow( IGameWindow *pWindow ) override;
virtual void UnregisterGameWindow( IGameWindow *pWindow ) override;
private:
VkPhysicalDevice SelectPhysicalDevice( CUtlVector<VkPhysicalDevice> physicalDevices );
CUtlVector<const char *> GetDeviceExtensions();
VkCommandBuffer GetCommandBuffer();
void CreateSwapchain();
void DestroySwapchain();
void CreateSwapchain( IGameWindow *pWindow );
void DestroySwapchain( IGameWindow *pWindow );
IImage *m_pOutputImage = NULL;
bool m_bOutputImageOutdated = true;
IGameWindowManager *m_pWindowManager;
};
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_VULKAN_INTERFACE_NAME);
void CVkRenderContext::SetOutputImage( IImage *pImage )
{
m_pOutputImage = pImage;
}
bool CVkRenderContext::BIsOutputImageOutdated( )
{
return m_bOutputImageOutdated;
}
uint32_t CVkRenderContext::GetNewOutputImageWidth()
{
return 1280;
}
uint32_t CVkRenderContext::GetNewOutputImageHeight()
{
return 720;
}
EImageFormat CVkRenderContext::GetNewOutputImageFormat()
{
}
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
//-----------------------------------------------------------------------------
@@ -424,7 +395,6 @@ IShader *CVkRenderContext::CreateShader( const char *szName )
pShader->AddShaderLibrary(&vertexTransform);
pShader->AddShaderLibrary(&pixelShader);
pShader->AddShaderLibrary(&pixelOutput);
printf("--- general pipeline ---\n");
pShader->Build();
return pShader;
}
@@ -459,6 +429,26 @@ void CVkRenderContext::SubmitCommandList(IRenderCommandList *pList)
CVkRenderCommandList *pVkList = (CVkRenderCommandList*)pList;
pVkList->Submit();
}
void CVkRenderContext::RenderGameWindow( IGameWindow *pWindow )
{
}
void CVkRenderContext::SetMainWindowManager( IGameWindowManager *pWindowManager )
{
m_pWindowManager = pWindowManager;
}
void CVkRenderContext::RegisterGameWindow( IGameWindow *pWindow )
{
}
void CVkRenderContext::UnregisterGameWindow( IGameWindow *pWindow )
{
}
VkPipelineLayout g_pLibraryEmptyLayout;
static IVkCommandBuffer *s_pPresentCommandBuffer;
@@ -488,10 +478,17 @@ void CVkRenderContext::Init()
r = volkInitialize();
VULKAN_RESULT_PRINT(r, volkInitialize);
// Get extensions required by game window
nExtensionCount = gamewindow->GetVulkanInstanceExtensionCount();
enabledInstanceExtensions.Resize(nExtensionCount);
V_memcpy(enabledInstanceExtensions.GetData(), gamewindow->GetVulkanInstanceExtensions(), enabledInstanceExtensions.GetSize()*sizeof(const char*));
if (m_pWindowManager)
{
nExtensionCount = m_pWindowManager->GetVulkanInstanceExtensionCount();
enabledInstanceExtensions.Resize(nExtensionCount);
V_memcpy(
enabledInstanceExtensions.GetData(),
m_pWindowManager->GetVulkanInstanceExtensions(),
nExtensionCount*sizeof(const char*)
);
}
// Create instance
stApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
@@ -596,8 +593,6 @@ void CVkRenderContext::Init()
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT;
vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &g_pLibraryEmptyLayout);
CreateSwapchain();
g_vkCommandPools.Resize(g_vkSwapchainImages.GetSize());
@@ -619,6 +614,7 @@ void CVkRenderContext::Init()
void CVkRenderContext::Frame( float fDeltaTime )
{
/*
CVkBlitCommand *pBlitCommand = NULL;
if (m_pOutputImage)
{
@@ -643,7 +639,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
s_pPresentCommandBuffer->Render();
vkDeviceWaitIdle(g_vkDevice);
m_bOutputImageOutdated = false;
static uint32_t s_nImageIndex = 0;
uint32_t nImageIndex = 0;
@@ -684,9 +679,10 @@ void CVkRenderContext::Frame( float fDeltaTime )
s_nImageIndex = (s_nImageIndex + 1) % g_vkSwapchainImages.GetSize();
g_vkCommandBuffers = {};
*/
}
void CVkRenderContext::CreateSwapchain()
void CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )
{
uint32_t numSurfaceFormats = 0;
CUtlVector<VkSurfaceFormatKHR> surfaceFormats;
@@ -708,16 +704,17 @@ void CVkRenderContext::CreateSwapchain()
uint32_t nSwapchainImages;
CUtlVector<VkImage> swapchainImages;
VkSurfaceKHR hSurface;
gamewindow->CreateVulkanSurface(g_vkInstance);
hSurface = (VkSurfaceKHR)pWindow->CreateVulkanSurface(g_vkInstance);
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &surfaceCapatibilities);
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &surfaceCapatibilities);
vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &numSurfaceFormats, NULL);
vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &numSurfaceFormats, NULL);
surfaceFormats.Resize(numSurfaceFormats);
vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &numSurfaceFormats, surfaceFormats.GetData());
vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &numSurfaceFormats, surfaceFormats.GetData());
stSelectedFormat = surfaceFormats[0];
@@ -734,12 +731,12 @@ void CVkRenderContext::CreateSwapchain()
}
formatPicked:
vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &nSurfacePresentModes, NULL);
vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, hSurface, &nSurfacePresentModes, NULL);
surfacePresentModes.Resize(nSurfacePresentModes);
vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &nSurfacePresentModes, surfacePresentModes.GetData());
vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, hSurface, &nSurfacePresentModes, surfacePresentModes.GetData());
stSwapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
stSwapchainCreateInfo.surface = (VkSurfaceKHR)gamewindow->GetVulkanSurface();
stSwapchainCreateInfo.surface = hSurface;
stSwapchainCreateInfo.imageFormat = stSelectedFormat.format;
stSwapchainCreateInfo.imageColorSpace = stSelectedFormat.colorSpace;
stSwapchainCreateInfo.presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;
@@ -786,10 +783,10 @@ formatPicked:
}
void CVkRenderContext::DestroySwapchain()
void CVkRenderContext::DestroySwapchain( IGameWindow *pWindow )
{
vkDestroySwapchainKHR(g_vkDevice, g_vkSwapchain, NULL);
gamewindow->DestroyVulkanSurface(g_vkInstance);
pWindow->DestroyVulkanSurface(g_vkInstance);
}
//-----------------------------------------------------------------------------

View File

@@ -1,4 +1,8 @@
#include "vulkan_state.h"
CVkShader::~CVkShader()
{
}
void CVkShader::AddShaderLibrary( CVkPipelineLibrary *pLibrary )
{
m_libraries.AppendTail(pLibrary);

View File

@@ -256,6 +256,7 @@ void CVk##name##PipelineLibrary::Build() \
class CVkShader : public IShader
{
public:
~CVkShader();
void AddShaderLibrary( CVkPipelineLibrary *pLibrary );
void Build();
virtual uint32_t PSGetResourceByName( const char *szName ) override;