trying to make it work without -rdynamic

This commit is contained in:
2025-12-25 16:54:27 +02:00
parent fb5e607f88
commit 352b3b1fc8
22 changed files with 452 additions and 266 deletions

View File

@@ -58,6 +58,7 @@ extern "C" void FunnyMain( int argc, char **argv )
pCommandList->EndRecording(); pCommandList->EndRecording();
for (;;) { for (;;) {
gamewindow->UpdateWindow();
/* /*
if (g_pRenderContext->BIsOutputImageOutdated()) if (g_pRenderContext->BIsOutputImageOutdated())
{ {

View File

@@ -1,8 +1,9 @@
#include "SDL3/SDL_error.h" #include "SDL3/SDL_error.h"
#include "igamewindow.h" #include "igamewindow.h"
#include "tier1/interface.h"
#include "tier0/lib.h" #include "tier0/lib.h"
#include "tier0/platform.h" #include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier1/utlvector.h"
#define SDL_MAIN_HANDLED #define SDL_MAIN_HANDLED
#include "SDL3/SDL.h" #include "SDL3/SDL.h"
@@ -11,7 +12,6 @@
#include "SDL3/SDL_vulkan.h" #include "SDL3/SDL_vulkan.h"
#include "SDL3/SDL_events.h" #include "SDL3/SDL_events.h"
class CSDLGameWindow: public IGameWindow class CSDLGameWindow: public IGameWindow
{ {
public: public:
@@ -19,19 +19,36 @@ public:
virtual void Shutdown() override; virtual void Shutdown() override;
virtual void UpdateWindow() override; virtual void UpdateWindow() override;
virtual EGraphicsAPI GetGraphicsAPI() override; // Rendering info
virtual void SetRenderImage( IImage *pImage ) override;
virtual bool BIsRenderResolutionUpdated() override;
virtual void GetRenderWidth() override;
virtual void GetRenderHeight() override;
// Vulkan stuff
virtual int GetVulkanInstanceExtensionCount() override; virtual int GetVulkanInstanceExtensionCount() override;
virtual const char **GetVulkanInstanceExtensions() override; virtual const char **GetVulkanInstanceExtensions() override;
virtual void CreateVulkanSurface( void *pInstance ) override;
virtual void DestroyVulkanSurface( void *pInstance ) override;
virtual void *GetVulkanSurface() override;
virtual void CreateVulkanSurface( void *pInstance, void *pDevice ) override;
virtual void DestroyVulkanSurface( void *pInstance, void *pDevice ) override;
virtual void *GetVulkanSurface() override;
virtual void *GetVulkanFence( int iFrame ) override;
virtual void *GetVulkanDrawSemaphore( int iFrame ) override;
virtual void *GetVulkanPresentSemaphore( int iFrame ) override;
virtual IImage *GetVulkanSwapchainImage( int iFrame ) override;
private: private:
SDL_Window *m_pWindow; SDL_Window *m_pWindow;
EGraphicsAPI m_ePreferredGraphicsAPI; EGraphicsAPI m_ePreferredGraphicsAPI;
uint32_t m_uRenderWidth;
uint32_t m_uRenderHeight;
bool m_bIsRenderResolutionUpdated;
void *m_pVulkanSurface; void *m_pVulkanSurface;
CUtlVector<IImage*> m_vulkanImages;
void *m_pVulkanFences[VULKAN_FRAMES_IN_FLIGHT];
void *m_pVulkanPresentSemaphores[VULKAN_FRAMES_IN_FLIGHT];
}; };
CSDLGameWindow g_sdlGameWindow; CSDLGameWindow g_sdlGameWindow;
@@ -58,11 +75,15 @@ void CSDLGameWindow::Shutdown()
void CSDLGameWindow::UpdateWindow() void CSDLGameWindow::UpdateWindow()
{ {
SDL_Event event; SDL_Event event;
m_bIsRenderResolutionUpdated = false;
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event))
{ {
switch (event.type) switch (event.type)
{ {
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
m_bIsRenderResolutionUpdated = true;
m_uRenderWidth = event.window.data1;
m_uRenderWidth = event.window.data2;
break; break;
case SDL_EVENT_QUIT: case SDL_EVENT_QUIT:
SDL_Quit(); SDL_Quit();
@@ -113,10 +134,6 @@ void CSDLGameWindow::DestroyVulkanSurface( void *pInstance )
void *CSDLGameWindow::GetVulkanSurface() void *CSDLGameWindow::GetVulkanSurface()
{ {
if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN )
return 0;
return m_pVulkanSurface; return m_pVulkanSurface;
} }

View File

@@ -11,7 +11,6 @@ ifeq ($(UNAME_S),Darwin)
CCFLAGS += -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -std=c++11 -Wl,-export_dynamic CCFLAGS += -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -std=c++11 -Wl,-export_dynamic
endif endif
ifeq ($(UNAME_S),Linux) ifeq ($(UNAME_S),Linux)
CCFLAGS += -rdynamic
endif endif
recompile: ../build/tools recompile: ../build/tools

View File

@@ -2,22 +2,15 @@
#include "ld.h" #include "ld.h"
#include "helper.h" #include "helper.h"
#include "tier0/platform.h" #include "tier0/platform.h"
#include "tier1/interface.h"
#include "signal.h" #include "signal.h"
ADD_DEPENDENCY_BUILD_FILE("../tier0/__build.cpp")
ADD_DEPENDENCY_BUILD_FILE("../tier1/__build.cpp")
ADD_DEPENDENCY_BUILD_FILE("../tier2/__build.cpp")
CUtlVector<CUtlString> g_CompiledFiles = { CUtlVector<CUtlString> g_CompiledFiles = {
"../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/filesystem.cpp",
"../tier2/filesystem_libc.cpp",
"../tier2/fileformats/ini.cpp",
"main.cpp", "main.cpp",
"library/runner.cpp", "library/runner.cpp",
@@ -39,6 +32,11 @@ CUtlVector<CUtlString> g_CompiledFiles = {
}; };
CreateInterfaceFn fpcFactory;
ILinker *linker;
ICCompiler *ccompiler;
IFileSystem2 *filesystem2;
CUtlVector<CUtlString> g_IncludeDirectories = { CUtlVector<CUtlString> g_IncludeDirectories = {
"public", "public",
"../public", "../public",
@@ -47,6 +45,10 @@ CUtlVector<CUtlString> g_IncludeDirectories = {
DECLARE_BUILD_STAGE(fpc) DECLARE_BUILD_STAGE(fpc)
{ {
DEPEND_ON_PROJECT("tier0");
DEPEND_ON_PROJECT("tier1");
DEPEND_ON_PROJECT("tier2");
if (linker->IsLibraryExists("clang")) if (linker->IsLibraryExists("clang"))
g_CompiledFiles.AppendTail("library/clang/c_libclang.cpp"); g_CompiledFiles.AppendTail("library/clang/c_libclang.cpp");
else else
@@ -58,6 +60,8 @@ DECLARE_BUILD_STAGE(fpc)
compileProject.files = g_CompiledFiles; compileProject.files = g_CompiledFiles;
compileProject.includeDirectories = g_IncludeDirectories; compileProject.includeDirectories = g_IncludeDirectories;
ldProject = ccompiler->Compile(&compileProject); ldProject = ccompiler->Compile(&compileProject);
ldProject.libraryObjects = GET_PROJECT_LIBRARY("tier0", "tier0");
if (linker->IsLibraryExists("clang")) if (linker->IsLibraryExists("clang"))
ldProject.libraries.AppendTail("clang"); ldProject.libraries.AppendTail("clang");

View File

@@ -46,9 +46,11 @@ public:
virtual void CopyFile( const char *szDestination, const char *szOrigin ) override; virtual void CopyFile( const char *szDestination, const char *szOrigin ) override;
virtual void CopyDirectory( const char *szDestination, const char *szOrigin ) override; virtual void CopyDirectory( const char *szDestination, const char *szOrigin ) override;
virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) override; virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) override;
virtual char *GetWindowsPath( const char *szPath ) override;
virtual char *GetPOSIXPath( const char *szPath ) override;
}; };
char *GetWindowsPath( const char *szPath ) char *CPOSIXFileSystem2::GetWindowsPath( const char *szPath )
{ {
char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1); char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1);
int i = 0; int i = 0;
@@ -62,7 +64,7 @@ char *GetWindowsPath( const char *szPath )
return szNewPath; return szNewPath;
} }
char *GetPOSIXPath( const char *szPath ) char *CPOSIXFileSystem2::GetPOSIXPath( const char *szPath )
{ {
char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1); char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1);
int i = 0; int i = 0;

View File

@@ -67,11 +67,12 @@ public:
// Compares timestamps of 2 files // Compares timestamps of 2 files
virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) = 0; virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) = 0;
virtual char *GetWindowsPath( const char *szPath ) = 0;
virtual char *GetPOSIXPath( const char *szPath ) = 0;
}; };
extern IFileSystem2 *filesystem2; extern IFileSystem2 *filesystem2;
char *GetWindowsPath( const char *szPath );
char *GetPOSIXPath( const char *szPath );
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -98,6 +99,14 @@ int __build_stage_##sz(); \
CBuildStage __##sz##_build_stage(#sz, __build_stage_##sz); \ CBuildStage __##sz##_build_stage(#sz, __build_stage_##sz); \
int __build_stage_##sz() int __build_stage_##sz()
#define ADD_DEPENDENCY_BUILD_FILE(sz) \
#define ADD_OUTPUT_LIBRARY(sz) \
#define DEPEND_ON_PROJECT(sz) \
#define GET_PROJECT_LIBRARY(sz, szLib) \
// Returns all available build stages // Returns all available build stages
// Used internally // Used internally
CUtlVector<CBuildStage*>& BuildStages(); CUtlVector<CBuildStage*>& BuildStages();

View File

@@ -7,6 +7,8 @@
CUtlVector<CUtlString> MaterialSystem_CompiledFiles = { CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
"materialsystem/materialsystem.cpp", "materialsystem/materialsystem.cpp",
"materialsystem/compiledshader.cpp", "materialsystem/compiledshader.cpp",
};
CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
"materialsystem/vulkan/shaderparser.cpp", "materialsystem/vulkan/shaderparser.cpp",
"materialsystem/vulkan/rendercontext.cpp", "materialsystem/vulkan/rendercontext.cpp",
"materialsystem/vulkan/commandbuffer.cpp", "materialsystem/vulkan/commandbuffer.cpp",
@@ -16,10 +18,11 @@ CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
"materialsystem/vulkan/utils.cpp", "materialsystem/vulkan/utils.cpp",
"materialsystem/vulkan/vma.cpp", "materialsystem/vulkan/vma.cpp",
"materialsystem/vulkan/commands/draw.cpp", "materialsystem/vulkan/commands/draw.cpp",
"materialsystem/vulkan/commands/transfer.cpp",
"materialsystem/vulkan/commands/base.cpp", "materialsystem/vulkan/commands/base.cpp",
"materialsystem/vulkan/libraries/raster.cpp", "materialsystem/vulkan/libraries/raster.cpp",
"external/volk/volk.c", "external/volk/volk.c",
}; }
CUtlString material_lib; CUtlString material_lib;
DECLARE_BUILD_STAGE(MaterialSystem) DECLARE_BUILD_STAGE(MaterialSystem)

View File

@@ -1,4 +1,5 @@
#include "materialsystem/imaterialsystem.h" #include "materialsystem/imaterialsystem.h"
#include "igamewindow.h"
class CMaterialSystem: public IMaterialSystem class CMaterialSystem: public IMaterialSystem
{ {
@@ -6,8 +7,12 @@ public:
virtual void Init() override; virtual void Init() override;
virtual void Frame( float fTime ) override; virtual void Frame( float fTime ) override;
virtual void Shutdown() override; virtual void Shutdown() override;
virtual void RenderGameWindow( IGameWindow *pWindow ) override;
}; };
EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_NAME)
extern IRenderContext *g_pVkRenderContext; extern IRenderContext *g_pVkRenderContext;
IRenderContext *g_pRenderContext; IRenderContext *g_pRenderContext;
@@ -22,14 +27,14 @@ void CMaterialSystem::Frame( float fTime )
g_pRenderContext->Frame(fTime); g_pRenderContext->Frame(fTime);
} }
void CMaterialSystem::RenderGameWindow( IGameWindow *pWindow )
{
g_pRenderContext->RenderGameWindow( pWindow );
}
void CMaterialSystem::Shutdown() void CMaterialSystem::Shutdown()
{ {
g_pRenderContext->Shutdown(); g_pRenderContext->Shutdown();
} }
IMaterialSystem *g_pMaterialSystem;
IMaterialSystem *Materials( void )
{
static CMaterialSystem s_materialSystem;
return &s_materialSystem;
}

View File

@@ -99,6 +99,7 @@ void CVkCommandBuffer::Render()
pCommand->Execute(hBuffer, i); pCommand->Execute(hBuffer, i);
y++; y++;
}; };
TryBarrier(y, i);
vkEndCommandBuffer(hBuffer); vkEndCommandBuffer(hBuffer);
i++; i++;
@@ -116,8 +117,8 @@ void CVkCommandBuffer::SortDependencies()
{ {
m_dependencies = {}; m_dependencies = {};
m_swapchainDependencies = {}; m_swapchainDependencies = {};
m_dependencies.Resize(m_commands.GetSize()); m_dependencies.Resize(m_commands.GetSize()+1);
m_swapchainDependencies.Resize(m_commands.GetSize()); m_swapchainDependencies.Resize(m_commands.GetSize()+1);
m_usedDependencies = {}; m_usedDependencies = {};
m_usedSwapchainDependencies = {}; m_usedSwapchainDependencies = {};
@@ -142,7 +143,7 @@ void CVkCommandBuffer::SortDependencies()
VulkanCommandLastUsage_t stLastUsage = {}; VulkanCommandLastUsage_t stLastUsage = {};
stLastUsage.m_nLastUsedCommand = i; stLastUsage.m_nLastUsedCommand = i;
stLastUsage.m_dependency = dependency; stLastUsage.m_dependency = dependency;
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS; stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE;
if (pLastUsage) if (pLastUsage)
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
@@ -167,7 +168,7 @@ void CVkCommandBuffer::SortDependencies()
VulkanSwapchainCommandLastUsage_t stLastUsage = {}; VulkanSwapchainCommandLastUsage_t stLastUsage = {};
stLastUsage.m_nLastUsedCommand = i; stLastUsage.m_nLastUsedCommand = i;
stLastUsage.m_dependency = dependency; stLastUsage.m_dependency = dependency;
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS; stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE;
if (pLastUsage) if (pLastUsage)
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
@@ -181,6 +182,62 @@ void CVkCommandBuffer::SortDependencies()
} }
i++; i++;
} }
for (auto &pCommand: m_commands)
{
for ( auto dependency: pCommand->m_dependencies)
{
VulkanCommandLastUsage_t *pLastUsage = NULL;
for ( auto &dep: m_usedDependencies )
{
if (dep.m_dependency.m_pObject == dependency.m_pObject)
pLastUsage = &dep;
}
VulkanCommandLastUsage_t stLastUsage = {};
stLastUsage.m_nLastUsedCommand = i;
stLastUsage.m_dependency = dependency;
stLastUsage.m_dependency.m_eDependencyMode = DEPENDENCY_MODE_NEXT_STAGE;
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE;
if (pLastUsage)
{
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
if (pLastUsage->m_nLastUsedCommand == i)
continue;
m_dependencies[i].AppendTail(stLastUsage);
m_usedDependencies.AppendTail(stLastUsage);
}
}
for ( auto dependency: pCommand->m_swapchainDependencies)
{
VulkanSwapchainCommandLastUsage_t *pLastUsage = NULL;
for ( auto &dep: m_usedSwapchainDependencies )
{
if (dep.m_dependency.m_ppObjects == dependency.m_ppObjects)
pLastUsage = &dep;
}
VulkanSwapchainCommandLastUsage_t stLastUsage = {};
stLastUsage.m_nLastUsedCommand = i;
stLastUsage.m_dependency = dependency;
stLastUsage.m_dependency.m_eDependencyMode = DEPENDENCY_MODE_NEXT_STAGE;
stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE;
if (pLastUsage)
{
stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode;
if (pLastUsage->m_nLastUsedCommand == i)
continue;
m_swapchainDependencies[i].AppendTail(stLastUsage);
m_usedSwapchainDependencies.AppendTail(stLastUsage);
}
}
}
} }
@@ -235,14 +292,17 @@ void CVkCommandBuffer::TryBarrier( int iCurrent, int iCurrentBuffer )
imageMemoryBarrier.subresourceRange = pImage->m_range; imageMemoryBarrier.subresourceRange = pImage->m_range;
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
imageMemoryBarrier.newLayout = VulkanGetImageLayout(barrier.m_eNewDependency); if (barrier.m_eNewDependency == DEPENDENCY_MODE_NEXT_STAGE)
imageMemoryBarrier.newLayout = pImage->m_ePreferredLayout;
else
imageMemoryBarrier.newLayout = VulkanGetImageLayout(barrier.m_eNewDependency);
imageMemoryBarrier.dstStageMask = VulkanGetStageFlags(barrier.m_eNewDependency); imageMemoryBarrier.dstStageMask = VulkanGetStageFlags(barrier.m_eNewDependency);
imageMemoryBarrier.dstAccessMask = VulkanGetAccessFlags(barrier.m_eNewDependency); imageMemoryBarrier.dstAccessMask = VulkanGetAccessFlags(barrier.m_eNewDependency);
if (barrier.m_eOldDependency == DEPENDENCY_MODE_FROM_PREVIOUS) if (barrier.m_eOldDependency == DEPENDENCY_MODE_NEXT_STAGE)
{ {
imageMemoryBarrier.oldLayout = VulkanGetImageLayout(DEPENDENCY_MODE_ALL_COMMANDS); imageMemoryBarrier.oldLayout = pImage->m_ePreferredLayout;
imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_ALL_COMMANDS); imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_NEXT_STAGE);
imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_ALL_COMMANDS); imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_NEXT_STAGE);
} else { } else {
imageMemoryBarrier.oldLayout = VulkanGetImageLayout(barrier.m_eOldDependency); imageMemoryBarrier.oldLayout = VulkanGetImageLayout(barrier.m_eOldDependency);
imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(barrier.m_eOldDependency); imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(barrier.m_eOldDependency);

View File

@@ -10,10 +10,10 @@ END_VULKAN_COMMAND(Empty)
BEGIN_VULKAN_COMMAND(Blit) BEGIN_VULKAN_COMMAND(Blit)
VkFrameObject_t stInputImage; VkFrameObject_t stInputImage;
VkFrameObject_t stOutputImage; VkFrameObject_t stOutputImage;
int32_t iSrcMin[3]; int32_t iSrcMin[3] = {};
int32_t iSrcMax[3]; int32_t iSrcMax[3] = {};
int32_t iDstMin[3]; int32_t iDstMin[3] = {};
int32_t iDstMax[3]; int32_t iDstMax[3] = {};
END_VULKAN_COMMAND(Blit) END_VULKAN_COMMAND(Blit)
BEGIN_VULKAN_COMMAND(ClearColor) BEGIN_VULKAN_COMMAND(ClearColor)

View File

@@ -24,5 +24,12 @@ DECLARE_VULKAN_COMMAND(Blit)
stBlit.srcOffsets[1].x = iSrcMax[0]; stBlit.srcOffsets[1].x = iSrcMax[0];
stBlit.srcOffsets[1].y = iSrcMax[1]; stBlit.srcOffsets[1].y = iSrcMax[1];
stBlit.srcOffsets[1].z = iSrcMax[2]; stBlit.srcOffsets[1].z = iSrcMax[2];
vkCmdBlitImage(hCommandBuffer, pVkInputImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, pVkOutputImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &stBlit, VK_FILTER_NEAREST) stBlit.dstOffsets[0].x = iDstMin[0];
stBlit.dstOffsets[0].y = iDstMin[1];
stBlit.dstOffsets[0].z = iDstMin[2];
stBlit.dstOffsets[1].x = iDstMax[0];
stBlit.dstOffsets[1].y = iDstMax[1];
stBlit.dstOffsets[1].z = iDstMax[2];
vkCmdBlitImage(hCommandBuffer, pVkInputImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, pVkOutputImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &stBlit, VK_FILTER_NEAREST);
} }

View File

@@ -120,8 +120,10 @@ BEGIN_BUILD_PIPELINE_LIBRARY(VertexTransform)
VkPipelineLayoutCreateInfo stPipelineLayout = {}; VkPipelineLayoutCreateInfo stPipelineLayout = {};
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
/*
stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT; stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT;
stPipelineLayout.pSetLayouts = m_setLayouts; stPipelineLayout.pSetLayouts = m_setLayouts;
*/
stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ; stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ;
vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout); vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout);
@@ -156,6 +158,7 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader)
printf("--- PixelShader ---\n"); printf("--- PixelShader ---\n");
VkPipelineDepthStencilStateCreateInfo depthStencil = {}; VkPipelineDepthStencilStateCreateInfo depthStencil = {};
VkPipelineRenderingCreateInfo render = {};
int i = 0; int i = 0;
CUtlVector<VulkanDescriptor_t> vertexDescriptors = ShaderParser()->GetDescriptors(m_pShader, SHADER_STAGE_PIXEL); CUtlVector<VulkanDescriptor_t> vertexDescriptors = ShaderParser()->GetDescriptors(m_pShader, SHADER_STAGE_PIXEL);
VulkanDescriptorInit_t inits[SHADER_STAGE_COUNT] = {}; VulkanDescriptorInit_t inits[SHADER_STAGE_COUNT] = {};
@@ -178,8 +181,10 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader)
VkPipelineLayoutCreateInfo stPipelineLayout = {}; VkPipelineLayoutCreateInfo stPipelineLayout = {};
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
/*
stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT; stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT;
stPipelineLayout.pSetLayouts = m_setLayouts; stPipelineLayout.pSetLayouts = m_setLayouts;
*/
stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ; stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ;
vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout); vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout);
@@ -220,10 +225,14 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader)
pipeline.stageCount = 1; pipeline.stageCount = 1;
pipeline.pStages = &shader; pipeline.pStages = &shader;
skipshader:
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
pipeline.pDepthStencilState = &depthStencil; pipeline.pDepthStencilState = &depthStencil;
skipshader: render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO;
render.pNext = pipeline.pNext;
pipeline.pNext = &render;
library.flags = VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT; library.flags = VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT;
pipeline.layout = m_layout; pipeline.layout = m_layout;
@@ -248,7 +257,6 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelOutput)
render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO;
render.colorAttachmentCount = m_eFormats.GetSize(); render.colorAttachmentCount = m_eFormats.GetSize();
render.pColorAttachmentFormats = m_eFormats.GetData(); render.pColorAttachmentFormats = m_eFormats.GetData();
render.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;;
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
@@ -256,7 +264,13 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelOutput)
{ {
VkPipelineColorBlendAttachmentState a = {}; VkPipelineColorBlendAttachmentState a = {};
a.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; a.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
a.blendEnable = VK_FALSE; a.blendEnable = VK_TRUE;
a.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
a.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
a.colorBlendOp = VK_BLEND_OP_ADD;
a.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
a.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
a.alphaBlendOp = VK_BLEND_OP_ADD;
attachments.AppendTail(a); attachments.AppendTail(a);
} }
blend.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; blend.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;

View File

@@ -58,6 +58,7 @@ CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFo
m_eMultisampleType = eMultisampleType; m_eMultisampleType = eMultisampleType;
m_eImageType = eImageType; m_eImageType = eImageType;
m_eFormat = eFormat; m_eFormat = eFormat;
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage); CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage);
CreateImageView(); CreateImageView();
} }
@@ -124,7 +125,7 @@ void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFor
stCreateInfo.extent.depth = 1; stCreateInfo.extent.depth = 1;
stCreateInfo.mipLevels = 1; stCreateInfo.mipLevels = 1;
stCreateInfo.arrayLayers = 1; stCreateInfo.arrayLayers = 1;
stCreateInfo.usage = eUsage; stCreateInfo.usage = eUsage | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
stCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL; stCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
stCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; stCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
stCreateInfo.format = GetImageFormat(eFormat); stCreateInfo.format = GetImageFormat(eFormat);
@@ -613,18 +614,34 @@ void CVkRenderContext::Init()
g_pCommandBufferManager->Init(); g_pCommandBufferManager->Init();
CVkEmptyCommand *pPresentCommand = (CVkEmptyCommand*)g_pCommandBufferManager->CreateCommand("Empty");
pPresentCommand->AddSwapchainDependency( (IRenderingObject**)g_vkSwapchainImages.GetData(), DEPENDENCY_MODE_IMAGE_PRESENT );
s_pPresentCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
s_pPresentCommandBuffer->Reset();
s_pPresentCommandBuffer->AddCommand(pPresentCommand);
s_pPresentCommandBuffer->Render();
} }
void CVkRenderContext::Frame( float fDeltaTime ) void CVkRenderContext::Frame( float fDeltaTime )
{ {
CVkBlitCommand *pBlitCommand = NULL;
if (m_pOutputImage)
{
pBlitCommand = CREATE_COMMAND(Blit);
pBlitCommand->AddDependency(m_pOutputImage, DEPENDENCY_MODE_BLIT_IMAGE_SOURCE);
pBlitCommand->AddSwapchainDependency((IRenderingObject**)g_vkSwapchainImages.GetData(), DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION);
pBlitCommand->stInputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pBlitCommand->stInputImage.m_pSingle = m_pOutputImage;
pBlitCommand->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SWAPPED;
pBlitCommand->stOutputImage.m_ppSwapped = (IRenderingObject**)g_vkSwapchainImages.GetData();
pBlitCommand->iSrcMax[0] = 1280;
pBlitCommand->iSrcMax[1] = 720;
pBlitCommand->iSrcMax[2] = 1;
pBlitCommand->iDstMax[0] = 1280;
pBlitCommand->iDstMax[1] = 720;
pBlitCommand->iDstMax[2] = 1;
}
s_pPresentCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
s_pPresentCommandBuffer->Reset();
if (pBlitCommand != NULL)
s_pPresentCommandBuffer->AddCommand(pBlitCommand);
s_pPresentCommandBuffer->Render();
vkDeviceWaitIdle(g_vkDevice); vkDeviceWaitIdle(g_vkDevice);
m_bOutputImageOutdated = false; m_bOutputImageOutdated = false;
@@ -752,6 +769,9 @@ formatPicked:
pImage->m_eImageType = IMAGE_TYPE_2D; pImage->m_eImageType = IMAGE_TYPE_2D;
pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE; pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE;
pImage->m_eFormat = IMAGE_FORMAT_WINDOW; pImage->m_eFormat = IMAGE_FORMAT_WINDOW;
pImage->m_nHeight = 1280;
pImage->m_nWidth = 720;
pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
pImage->CreateImageView(); pImage->CreateImageView();
g_vkSwapchainImages[i] = pImage; g_vkSwapchainImages[i] = pImage;

View File

@@ -9,6 +9,7 @@ void CVkShader::Build()
CUtlVector<VkPipeline> libs = {}; CUtlVector<VkPipeline> libs = {};
VkGraphicsPipelineCreateInfo createInfo = {}; VkGraphicsPipelineCreateInfo createInfo = {};
VkPipelineLibraryCreateInfoKHR libInfo = {}; VkPipelineLibraryCreateInfoKHR libInfo = {};
VkPipelineRenderingCreateInfo render = {};
createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
for ( auto l: m_libraries ) for ( auto l: m_libraries )
@@ -23,6 +24,9 @@ void CVkShader::Build()
createInfo.flags = VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT; createInfo.flags = VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT;
createInfo.layout = g_pLibraryEmptyLayout; createInfo.layout = g_pLibraryEmptyLayout;
render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO;
render.pNext = createInfo.pNext;
createInfo.pNext = &render;
// Possibly schedule it? // Possibly schedule it?
vkCreateGraphicsPipelines(g_vkDevice, NULL, 1, &createInfo, NULL, &m_hPipeline); vkCreateGraphicsPipelines(g_vkDevice, NULL, 1, &createInfo, NULL, &m_hPipeline);
} }

View File

@@ -21,8 +21,10 @@ VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode )
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT; case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_ACCESS_2_NONE; case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_ACCESS_2_NONE;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: return VK_ACCESS_2_TRANSFER_READ_BIT;
default: default:
return VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT; return VK_ACCESS_2_NONE;
} }
} }
@@ -33,6 +35,9 @@ VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode )
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_PIPELINE_STAGE_2_TRANSFER_BIT; case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_PIPELINE_STAGE_2_TRANSFER_BIT;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE:
return VK_PIPELINE_STAGE_2_BLIT_BIT;
default: default:
return VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; return VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
} }
@@ -45,6 +50,8 @@ VkImageLayout VulkanGetImageLayout( EDependencyMode eMode )
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
default: default:
return VK_IMAGE_LAYOUT_UNDEFINED; return VK_IMAGE_LAYOUT_UNDEFINED;
} }

View File

@@ -66,13 +66,16 @@ enum EDependencyMode
DEPENDENCY_MODE_IMAGE_SOURCE, DEPENDENCY_MODE_IMAGE_SOURCE,
DEPENDENCY_MODE_IMAGE_DESTINATION, DEPENDENCY_MODE_IMAGE_DESTINATION,
DEPENDENCY_MODE_BLIT_IMAGE_SOURCE,
DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION,
DEPENDENCY_MODE_COLOR_CLEAR_SOURCE, DEPENDENCY_MODE_COLOR_CLEAR_SOURCE,
DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION,
DEPENDENCY_MODE_ALL_COMMANDS, DEPENDENCY_MODE_ALL_COMMANDS,
DEPENDENCY_MODE_IMAGE_PRESENT, DEPENDENCY_MODE_IMAGE_PRESENT,
DEPENDENCY_MODE_FROM_PREVIOUS, DEPENDENCY_MODE_NEXT_STAGE,
DEPENDENCY_MODE_COUNT, DEPENDENCY_MODE_COUNT,
}; };
@@ -191,6 +194,8 @@ public:
VkImageView m_imageView; VkImageView m_imageView;
VmaAllocation m_allocation; VmaAllocation m_allocation;
VkImageSubresourceRange m_range; VkImageSubresourceRange m_range;
VkImageLayout m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
EDependencyMode m_eLastUsage; EDependencyMode m_eLastUsage;

View File

@@ -3,6 +3,7 @@
#include "tier2/iappsystem.h" #include "tier2/iappsystem.h"
#include "tier0/platform.h" #include "tier0/platform.h"
#include "materialsystem/imaterialsystem.h"
enum EGraphicsAPI enum EGraphicsAPI
{ {
@@ -15,13 +16,26 @@ abstract_class IGameWindow: public IAppSystem
public: public:
virtual void UpdateWindow() = 0; virtual void UpdateWindow() = 0;
// Rendering info
virtual void SetRenderImage( IImage *pImage ) = 0;
virtual bool BIsRenderResolutionUpdated() = 0;
virtual void GetRenderWidth() = 0;
virtual void GetRenderHeight() = 0;
virtual EGraphicsAPI GetGraphicsAPI() = 0; virtual EGraphicsAPI GetGraphicsAPI() = 0;
// Vulkan stuff
virtual int GetVulkanInstanceExtensionCount() = 0; virtual int GetVulkanInstanceExtensionCount() = 0;
virtual const char **GetVulkanInstanceExtensions() = 0; virtual const char **GetVulkanInstanceExtensions() = 0;
virtual void CreateVulkanSurface( void *pInstance ) = 0;
virtual void DestroyVulkanSurface( void *pInstance ) = 0; virtual void CreateVulkanSurface( void *pInstance, void *pDevice ) = 0;
virtual void DestroyVulkanSurface( void *pInstance, void *pDevice ) = 0;
virtual void *GetVulkanSurface() = 0; virtual void *GetVulkanSurface() = 0;
virtual void *GetVulkanFence( int iFrame ) = 0;
virtual void *GetVulkanDrawSemaphore( int iFrame ) = 0;
virtual void *GetVulkanPresentSemaphore( int iFrame ) = 0;
virtual IImage *GetVulkanSwapchainImage( int iFrame ) = 0;
}; };
extern IGameWindow *gamewindow; extern IGameWindow *gamewindow;

View File

@@ -1,8 +1,11 @@
#ifndef MATERIAL_SYSTEM_H #ifndef MATERIAL_SYSTEM_H
#define MATERIAL_SYSTEM_H #define MATERIAL_SYSTEM_H
#include "tier2/iappsystem.h"
#include "tier0/platform.h" #include "tier0/platform.h"
#include "tier2/iappsystem.h"
class IGameWindow;
#define VULKAN_FRAMES_IN_FLIGHT 2
enum EImageFormat enum EImageFormat
{ {
@@ -209,19 +212,21 @@ public:
virtual IRenderCommandList *CreateCommandList() = 0; virtual IRenderCommandList *CreateCommandList() = 0;
virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0; virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0;
virtual void SubmitCommandList(IRenderCommandList *pList) = 0; virtual void SubmitCommandList(IRenderCommandList *pList) = 0;
virtual void RenderGameWindow( IGameWindow *pWindow ) = 0;
}; };
#define RENDER_CONTEXT_INTERFACE_NAME "RenderContext001" #define RENDER_CONTEXT_INTERFACE_NAME "RenderContext001"
#define RENDER_CONTEXT_VULKAN_INTERFACE_NAME RENDER_CONTEXT_INTERFACE_NAME #define MATERIAL_SYSTEM_INTERFACE_NAME "MaterialSystem001"
abstract_class IMaterialSystem: public IAppSystem abstract_class IMaterialSystem: public IAppSystem
{ {
public: public:
virtual void Frame( float fTime ) = 0; virtual void Frame( float fTime ) = 0;
virtual void RenderGameWindow( IGameWindow *pWindow ) = 0;
}; };
extern IRenderContext *g_pRenderContext; extern IRenderContext *g_pRenderContext;
IMaterialSystem *Materials( void ); extern IMaterialSystem *g_pMaterialSystem;
#endif #endif

View File

@@ -6,6 +6,8 @@
#define TIER1_UTL_STRING_H #define TIER1_UTL_STRING_H
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "tier0/lib.h"
#include "stdarg.h"
class CUtlString { class CUtlString {
public: public:
@@ -39,5 +41,210 @@ public:
private: private:
CUtlVector<char> m_data = 0; CUtlVector<char> m_data = 0;
}; };
inline CUtlString::CUtlString( void )
{
m_data.Reserve(1);
m_data[0]=0;
}
inline CUtlString::CUtlString( const char *szFormat, ... )
{
if (szFormat == 0)
{
m_data.Reserve(1);
m_data[0]=0;
return;
}
va_list vlArgs;
va_start(vlArgs, szFormat);
va_list vlArgs2;
va_copy(vlArgs2, vlArgs);
size_t nSize = V_vsnprintf(NULL, 0, szFormat, vlArgs2);
m_data.Reserve(nSize + 1);
va_end(vlArgs2);
V_vsnprintf(m_data.GetData(), nSize + 1, szFormat, vlArgs);
m_data.Resize(nSize + 1);
va_end(vlArgs);
}
inline CUtlString::CUtlString( const CUtlString &sz )
{
m_data = sz.m_data;
};
inline void CUtlString::AppendTail( const char *psz )
{
m_data.Resize(V_strlen(m_data.GetData()));
m_data.AppendTail(psz,V_strlen(psz));
m_data.Reserve(m_data.GetSize()+1);
m_data[m_data.GetSize()] = 0;
}
inline void CUtlString::AppendHead( const char *psz )
{
m_data.AppendHead(psz,V_strlen(psz));
}
inline void CUtlString::AppendTail( char ch )
{
m_data.Resize(V_strlen(m_data.GetData()));
m_data.AppendTail(ch);
m_data.Reserve(m_data.GetSize()+1);
m_data[m_data.GetSize()] = 0;
}
inline void CUtlString::AppendHead( char ch )
{
m_data.AppendHead(ch);
}
inline void CUtlString::AppendAt( size_t nPosition, const char *psz )
{
}
inline void CUtlString::RemoveTail( size_t nCount )
{
m_data.RemoveTail(nCount);
m_data[m_data.GetSize()-1] = 0;
}
inline void CUtlString::RemoveHead( size_t nCount )
{
m_data.RemoveHead(nCount);
}
inline void CUtlString::RemoveAt( size_t nPosition, size_t nCount )
{
}
inline CUtlString CUtlString::GetFileName()
{
CUtlString szFileName = GetString();
char *pLast = &m_data[GetLenght()-1];
while (pLast != m_data.GetData())
{
if (*pLast=='/')
break;
pLast--;
}
return pLast;
}
inline CUtlString CUtlString::GetDirectory()
{
if (GetLenght() == 0)
return NULL;
size_t iNumDeleted = 0;
char *pLast = &m_data[GetLenght()-1];
CUtlString szDirectory = GetString();
while (pLast != m_data.GetData())
{
if (*pLast=='/')
{
iNumDeleted++;
break;
}
pLast--;
iNumDeleted++;
}
szDirectory.RemoveTail(iNumDeleted);
return szDirectory;
}
inline CUtlString CUtlString::RemoveHeadFile()
{
size_t iLenght = GetLenght();
size_t iNumDeleted = 0;
char *pc = GetString();
CUtlString szDirectory = pc;
if (GetLenght() == 0)
return NULL;
while ( iNumDeleted < iLenght )
{
if (*pc == '/')
goto remove_slashes;
pc++;
iNumDeleted++;
}
return NULL;
remove_slashes:
while ( iNumDeleted < iLenght )
{
if (*pc != '/')
{
szDirectory.RemoveHead(iNumDeleted);
return szDirectory;
}
pc++;
iNumDeleted++;
}
return NULL;
}
inline char *CUtlString::GetString( void )
{
return m_data.GetData();
}
inline size_t CUtlString::GetLenght( void )
{
return V_strlen(GetString());
}
inline CUtlString::operator char*( void )
{
return GetString();
}
inline CUtlString::operator CUtlVector<char>&( void )
{
return m_data;
}
inline CUtlString &CUtlString::operator=(const CUtlString &sz)
{
if (this != &sz)
{
m_data = sz.m_data;
}
return *this;
}
inline bool CUtlString::operator==(const char *psz)
{
if (psz==0)
psz = "";
if (!V_strcmp(GetString(), psz))
return true;
return false;
}
inline bool CUtlString::operator!=(const char *psz)
{
if (psz==0)
psz = "";
if (!V_strcmp(GetString(), psz))
return false;
return true;
}
inline bool CUtlString::operator==(CUtlString &string)
{
if (!V_strcmp(GetString(), string.GetString()))
return true;
return false;
}
inline bool CUtlString::operator!=(CUtlString &string)
{
if (!V_strcmp(GetString(), string.GetString()))
return false;
return true;
}
#endif #endif

View File

@@ -173,7 +173,7 @@ PLATFORM_INTERFACE void Plat_Backtrace( void )
PLATFORM_INTERFACE void *Plat_LoadLibrary( const char *psz ) PLATFORM_INTERFACE void *Plat_LoadLibrary( const char *psz )
{ {
#ifdef __linux__ #ifdef __linux__
void *lib = dlopen(psz, RTLD_GLOBAL | RTLD_NOW); void *lib = dlopen(psz, RTLD_NOW);
if (!lib) if (!lib)
V_printf("Failed to open %s\n\t%s\n", psz, dlerror()); V_printf("Failed to open %s\n\t%s\n", psz, dlerror());
return lib; return lib;

View File

@@ -1,198 +1,2 @@
#include "tier1/utlstring.h" #include "tier1/utlstring.h"
#include "tier0/lib.h"
#include "stdarg.h"
CUtlString::CUtlString( void )
{
m_data.Reserve(1);
m_data[0]=0;
}
CUtlString::CUtlString( const char *szFormat, ... )
{
if (szFormat == 0)
{
m_data.Reserve(1);
m_data[0]=0;
return;
}
va_list vlArgs;
va_start(vlArgs, szFormat);
va_list vlArgs2;
va_copy(vlArgs2, vlArgs);
size_t nSize = V_vsnprintf(NULL, 0, szFormat, vlArgs2);
m_data.Reserve(nSize + 1);
va_end(vlArgs2);
V_vsnprintf(m_data.GetData(), nSize + 1, szFormat, vlArgs);
m_data.Resize(nSize + 1);
va_end(vlArgs);
}
CUtlString::CUtlString( const CUtlString &sz )
{
m_data = sz.m_data;
};
void CUtlString::AppendTail( const char *psz )
{
m_data.Resize(V_strlen(m_data.GetData()));
m_data.AppendTail(psz,V_strlen(psz));
m_data.Reserve(m_data.GetSize()+1);
m_data[m_data.GetSize()] = 0;
}
void CUtlString::AppendHead( const char *psz )
{
m_data.AppendHead(psz,V_strlen(psz));
}
void CUtlString::AppendTail( char ch )
{
m_data.Resize(V_strlen(m_data.GetData()));
m_data.AppendTail(ch);
m_data.Reserve(m_data.GetSize()+1);
m_data[m_data.GetSize()] = 0;
}
void CUtlString::AppendHead( char ch )
{
m_data.AppendHead(ch);
}
void CUtlString::AppendAt( size_t nPosition, const char *psz )
{
}
void CUtlString::RemoveTail( size_t nCount )
{
m_data.RemoveTail(nCount);
m_data[m_data.GetSize()-1] = 0;
}
void CUtlString::RemoveHead( size_t nCount )
{
m_data.RemoveHead(nCount);
}
void CUtlString::RemoveAt( size_t nPosition, size_t nCount )
{
}
CUtlString CUtlString::GetFileName()
{
CUtlString szFileName = GetString();
char *pLast = &m_data[GetLenght()-1];
while (pLast != m_data.GetData())
{
if (*pLast=='/')
break;
pLast--;
}
return pLast;
}
CUtlString CUtlString::GetDirectory()
{
if (GetLenght() == 0)
return NULL;
size_t iNumDeleted = 0;
char *pLast = &m_data[GetLenght()-1];
CUtlString szDirectory = GetString();
while (pLast != m_data.GetData())
{
if (*pLast=='/')
{
iNumDeleted++;
break;
}
pLast--;
iNumDeleted++;
}
szDirectory.RemoveTail(iNumDeleted);
return szDirectory;
}
CUtlString CUtlString::RemoveHeadFile()
{
size_t iLenght = GetLenght();
size_t iNumDeleted = 0;
char *pc = GetString();
CUtlString szDirectory = pc;
if (GetLenght() == 0)
return NULL;
while ( iNumDeleted < iLenght )
{
if (*pc == '/')
goto remove_slashes;
pc++;
iNumDeleted++;
}
return NULL;
remove_slashes:
while ( iNumDeleted < iLenght )
{
if (*pc != '/')
{
szDirectory.RemoveHead(iNumDeleted);
return szDirectory;
}
pc++;
iNumDeleted++;
}
return NULL;
}
char *CUtlString::GetString( void )
{
return m_data.GetData();
}
size_t CUtlString::GetLenght( void )
{
return V_strlen(GetString());
}
CUtlString::operator char*( void )
{
return GetString();
}
CUtlString::operator CUtlVector<char>&( void )
{
return m_data;
}
CUtlString &CUtlString::operator=(const CUtlString &sz)
{
if (this != &sz)
{
m_data = sz.m_data;
}
return *this;
}
bool CUtlString::operator==(const char *psz)
{
if (psz==0)
psz = "";
if (!V_strcmp(GetString(), psz))
return true;
return false;
}
bool CUtlString::operator!=(const char *psz)
{
if (psz==0)
psz = "";
if (!V_strcmp(GetString(), psz))
return false;
return true;
}
bool CUtlString::operator==(CUtlString &string)
{
if (!V_strcmp(GetString(), string.GetString()))
return true;
return false;
}
bool CUtlString::operator!=(CUtlString &string)
{
if (!V_strcmp(GetString(), string.GetString()))
return false;
return true;
}

View File

@@ -41,7 +41,6 @@ public:
pFile = V_fopen(szFileName, szOperation); pFile = V_fopen(szFileName, szOperation);
if (!pFile) if (!pFile)
{ {
Plat_FatalErrorFunc("Failed to open %s: %s\n",strerror(errno));
return NULL; return NULL;
} }