From 352b3b1fc884a08251f462426549d99b303ba5f8 Mon Sep 17 00:00:00 2001 From: kotofyt Date: Thu, 25 Dec 2025 16:54:27 +0200 Subject: [PATCH] trying to make it work without -rdynamic --- engine/engine.cpp | 1 + engine/gamewindow_sdl.cpp | 37 +++- fpc/Makefile | 1 - fpc/build.cpp | 30 +-- fpc/library/helper.cpp | 6 +- fpc/public/helper.h | 13 +- materialsystem/__build.cpp | 5 +- materialsystem/materialsystem.cpp | 17 +- materialsystem/vulkan/commandbuffer.cpp | 78 +++++++- materialsystem/vulkan/commands.h | 8 +- materialsystem/vulkan/commands/transfer.cpp | 9 +- materialsystem/vulkan/libraries/raster.cpp | 20 +- materialsystem/vulkan/rendercontext.cpp | 36 +++- materialsystem/vulkan/shader.cpp | 4 + materialsystem/vulkan/utils.cpp | 9 +- materialsystem/vulkan/vulkan_state.h | 7 +- public/igamewindow.h | 18 +- public/materialsystem/imaterialsystem.h | 13 +- public/tier1/utlstring.h | 207 ++++++++++++++++++++ tier0/platform.cpp | 2 +- tier1/utlstring.cpp | 196 ------------------ tier2/filesystem_libc.cpp | 1 - 22 files changed, 452 insertions(+), 266 deletions(-) diff --git a/engine/engine.cpp b/engine/engine.cpp index e42f603..73e80ed 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -58,6 +58,7 @@ extern "C" void FunnyMain( int argc, char **argv ) pCommandList->EndRecording(); for (;;) { + gamewindow->UpdateWindow(); /* if (g_pRenderContext->BIsOutputImageOutdated()) { diff --git a/engine/gamewindow_sdl.cpp b/engine/gamewindow_sdl.cpp index 3c909a5..5370e44 100644 --- a/engine/gamewindow_sdl.cpp +++ b/engine/gamewindow_sdl.cpp @@ -1,8 +1,9 @@ #include "SDL3/SDL_error.h" #include "igamewindow.h" -#include "tier1/interface.h" #include "tier0/lib.h" #include "tier0/platform.h" +#include "tier1/interface.h" +#include "tier1/utlvector.h" #define SDL_MAIN_HANDLED #include "SDL3/SDL.h" @@ -11,7 +12,6 @@ #include "SDL3/SDL_vulkan.h" #include "SDL3/SDL_events.h" - class CSDLGameWindow: public IGameWindow { public: @@ -19,19 +19,36 @@ public: virtual void Shutdown() 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 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: SDL_Window *m_pWindow; EGraphicsAPI m_ePreferredGraphicsAPI; + uint32_t m_uRenderWidth; + uint32_t m_uRenderHeight; + bool m_bIsRenderResolutionUpdated; + void *m_pVulkanSurface; + CUtlVector m_vulkanImages; + void *m_pVulkanFences[VULKAN_FRAMES_IN_FLIGHT]; + void *m_pVulkanPresentSemaphores[VULKAN_FRAMES_IN_FLIGHT]; }; CSDLGameWindow g_sdlGameWindow; @@ -58,11 +75,15 @@ void CSDLGameWindow::Shutdown() void CSDLGameWindow::UpdateWindow() { SDL_Event event; + m_bIsRenderResolutionUpdated = false; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + m_bIsRenderResolutionUpdated = true; + m_uRenderWidth = event.window.data1; + m_uRenderWidth = event.window.data2; break; case SDL_EVENT_QUIT: SDL_Quit(); @@ -113,10 +134,6 @@ void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) void *CSDLGameWindow::GetVulkanSurface() { - if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) - return 0; - - return m_pVulkanSurface; } diff --git a/fpc/Makefile b/fpc/Makefile index c3c8e41..97f7ad1 100644 --- a/fpc/Makefile +++ b/fpc/Makefile @@ -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 endif ifeq ($(UNAME_S),Linux) -CCFLAGS += -rdynamic endif recompile: ../build/tools diff --git a/fpc/build.cpp b/fpc/build.cpp index 9281a41..c03c43a 100644 --- a/fpc/build.cpp +++ b/fpc/build.cpp @@ -2,22 +2,15 @@ #include "ld.h" #include "helper.h" #include "tier0/platform.h" +#include "tier1/interface.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 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", "library/runner.cpp", @@ -39,6 +32,11 @@ CUtlVector g_CompiledFiles = { }; +CreateInterfaceFn fpcFactory; +ILinker *linker; +ICCompiler *ccompiler; +IFileSystem2 *filesystem2; + CUtlVector g_IncludeDirectories = { "public", "../public", @@ -47,6 +45,10 @@ CUtlVector g_IncludeDirectories = { DECLARE_BUILD_STAGE(fpc) { + DEPEND_ON_PROJECT("tier0"); + DEPEND_ON_PROJECT("tier1"); + DEPEND_ON_PROJECT("tier2"); + if (linker->IsLibraryExists("clang")) g_CompiledFiles.AppendTail("library/clang/c_libclang.cpp"); else @@ -58,6 +60,8 @@ DECLARE_BUILD_STAGE(fpc) compileProject.files = g_CompiledFiles; compileProject.includeDirectories = g_IncludeDirectories; ldProject = ccompiler->Compile(&compileProject); + ldProject.libraryObjects = GET_PROJECT_LIBRARY("tier0", "tier0"); + if (linker->IsLibraryExists("clang")) ldProject.libraries.AppendTail("clang"); diff --git a/fpc/library/helper.cpp b/fpc/library/helper.cpp index f2fe73f..b016ff3 100644 --- a/fpc/library/helper.cpp +++ b/fpc/library/helper.cpp @@ -46,9 +46,11 @@ public: virtual void CopyFile( 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 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); int i = 0; @@ -62,7 +64,7 @@ char *GetWindowsPath( const char *szPath ) return szNewPath; } -char *GetPOSIXPath( const char *szPath ) +char *CPOSIXFileSystem2::GetPOSIXPath( const char *szPath ) { char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1); int i = 0; diff --git a/fpc/public/helper.h b/fpc/public/helper.h index 807ecd8..1ea0986 100644 --- a/fpc/public/helper.h +++ b/fpc/public/helper.h @@ -67,11 +67,12 @@ public: // Compares timestamps of 2 files 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; -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); \ 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 // Used internally CUtlVector& BuildStages(); diff --git a/materialsystem/__build.cpp b/materialsystem/__build.cpp index ccdb228..9c05fd6 100644 --- a/materialsystem/__build.cpp +++ b/materialsystem/__build.cpp @@ -7,6 +7,8 @@ CUtlVector MaterialSystem_CompiledFiles = { "materialsystem/materialsystem.cpp", "materialsystem/compiledshader.cpp", +}; +CUtlVector RenderContextVulkan_CompiledFiles = { "materialsystem/vulkan/shaderparser.cpp", "materialsystem/vulkan/rendercontext.cpp", "materialsystem/vulkan/commandbuffer.cpp", @@ -16,10 +18,11 @@ CUtlVector MaterialSystem_CompiledFiles = { "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) diff --git a/materialsystem/materialsystem.cpp b/materialsystem/materialsystem.cpp index ac93844..6f700de 100644 --- a/materialsystem/materialsystem.cpp +++ b/materialsystem/materialsystem.cpp @@ -1,4 +1,5 @@ #include "materialsystem/imaterialsystem.h" +#include "igamewindow.h" class CMaterialSystem: public IMaterialSystem { @@ -6,8 +7,12 @@ public: virtual void Init() override; virtual void Frame( float fTime ) override; virtual void Shutdown() override; + + virtual void RenderGameWindow( IGameWindow *pWindow ) override; }; +EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_NAME) + extern IRenderContext *g_pVkRenderContext; IRenderContext *g_pRenderContext; @@ -22,14 +27,14 @@ 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 *Materials( void ) -{ - static CMaterialSystem s_materialSystem; - return &s_materialSystem; -} +IMaterialSystem *g_pMaterialSystem; diff --git a/materialsystem/vulkan/commandbuffer.cpp b/materialsystem/vulkan/commandbuffer.cpp index 280ed55..8d8cd0f 100644 --- a/materialsystem/vulkan/commandbuffer.cpp +++ b/materialsystem/vulkan/commandbuffer.cpp @@ -99,6 +99,7 @@ void CVkCommandBuffer::Render() pCommand->Execute(hBuffer, i); y++; }; + TryBarrier(y, i); vkEndCommandBuffer(hBuffer); i++; @@ -116,8 +117,8 @@ void CVkCommandBuffer::SortDependencies() { m_dependencies = {}; m_swapchainDependencies = {}; - m_dependencies.Resize(m_commands.GetSize()); - m_swapchainDependencies.Resize(m_commands.GetSize()); + m_dependencies.Resize(m_commands.GetSize()+1); + m_swapchainDependencies.Resize(m_commands.GetSize()+1); m_usedDependencies = {}; m_usedSwapchainDependencies = {}; @@ -142,7 +143,7 @@ void CVkCommandBuffer::SortDependencies() VulkanCommandLastUsage_t stLastUsage = {}; stLastUsage.m_nLastUsedCommand = i; stLastUsage.m_dependency = dependency; - stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS; + stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE; if (pLastUsage) stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; @@ -167,7 +168,7 @@ void CVkCommandBuffer::SortDependencies() VulkanSwapchainCommandLastUsage_t stLastUsage = {}; stLastUsage.m_nLastUsedCommand = i; stLastUsage.m_dependency = dependency; - stLastUsage.m_eLastUsage = DEPENDENCY_MODE_FROM_PREVIOUS; + stLastUsage.m_eLastUsage = DEPENDENCY_MODE_NEXT_STAGE; if (pLastUsage) stLastUsage.m_eLastUsage = pLastUsage->m_dependency.m_eDependencyMode; @@ -181,6 +182,62 @@ void CVkCommandBuffer::SortDependencies() } 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.dstQueueFamilyIndex = 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.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.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_ALL_COMMANDS); - imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_ALL_COMMANDS); + imageMemoryBarrier.oldLayout = pImage->m_ePreferredLayout; + imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(DEPENDENCY_MODE_NEXT_STAGE); + imageMemoryBarrier.srcAccessMask = VulkanGetAccessFlags(DEPENDENCY_MODE_NEXT_STAGE); } else { imageMemoryBarrier.oldLayout = VulkanGetImageLayout(barrier.m_eOldDependency); imageMemoryBarrier.srcStageMask = VulkanGetStageFlags(barrier.m_eOldDependency); diff --git a/materialsystem/vulkan/commands.h b/materialsystem/vulkan/commands.h index f33f777..7da7d04 100644 --- a/materialsystem/vulkan/commands.h +++ b/materialsystem/vulkan/commands.h @@ -10,10 +10,10 @@ END_VULKAN_COMMAND(Empty) BEGIN_VULKAN_COMMAND(Blit) VkFrameObject_t stInputImage; VkFrameObject_t stOutputImage; - int32_t iSrcMin[3]; - int32_t iSrcMax[3]; - int32_t iDstMin[3]; - int32_t iDstMax[3]; + int32_t iSrcMin[3] = {}; + int32_t iSrcMax[3] = {}; + int32_t iDstMin[3] = {}; + int32_t iDstMax[3] = {}; END_VULKAN_COMMAND(Blit) BEGIN_VULKAN_COMMAND(ClearColor) diff --git a/materialsystem/vulkan/commands/transfer.cpp b/materialsystem/vulkan/commands/transfer.cpp index cfff568..d719b9f 100644 --- a/materialsystem/vulkan/commands/transfer.cpp +++ b/materialsystem/vulkan/commands/transfer.cpp @@ -24,5 +24,12 @@ DECLARE_VULKAN_COMMAND(Blit) stBlit.srcOffsets[1].x = iSrcMax[0]; stBlit.srcOffsets[1].y = iSrcMax[1]; 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); } diff --git a/materialsystem/vulkan/libraries/raster.cpp b/materialsystem/vulkan/libraries/raster.cpp index 1e1da83..1dccd69 100644 --- a/materialsystem/vulkan/libraries/raster.cpp +++ b/materialsystem/vulkan/libraries/raster.cpp @@ -120,8 +120,10 @@ BEGIN_BUILD_PIPELINE_LIBRARY(VertexTransform) VkPipelineLayoutCreateInfo stPipelineLayout = {}; stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + /* stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT; stPipelineLayout.pSetLayouts = m_setLayouts; + */ stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ; vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout); @@ -156,6 +158,7 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader) printf("--- PixelShader ---\n"); VkPipelineDepthStencilStateCreateInfo depthStencil = {}; + VkPipelineRenderingCreateInfo render = {}; int i = 0; CUtlVector vertexDescriptors = ShaderParser()->GetDescriptors(m_pShader, SHADER_STAGE_PIXEL); VulkanDescriptorInit_t inits[SHADER_STAGE_COUNT] = {}; @@ -178,8 +181,10 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader) VkPipelineLayoutCreateInfo stPipelineLayout = {}; stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + /* stPipelineLayout.setLayoutCount = SHADER_STAGE_COUNT; stPipelineLayout.pSetLayouts = m_setLayouts; + */ stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ; vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &m_layout); @@ -220,10 +225,14 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelShader) pipeline.stageCount = 1; pipeline.pStages = &shader; +skipshader: + depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; 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; pipeline.layout = m_layout; @@ -248,7 +257,6 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelOutput) render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; render.colorAttachmentCount = m_eFormats.GetSize(); render.pColorAttachmentFormats = m_eFormats.GetData(); - render.depthAttachmentFormat = VK_FORMAT_D32_SFLOAT;; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; @@ -256,7 +264,13 @@ BEGIN_BUILD_PIPELINE_LIBRARY(PixelOutput) { 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.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); } blend.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index c211e3d..30508ec 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -58,6 +58,7 @@ CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFo m_eMultisampleType = eMultisampleType; m_eImageType = eImageType; m_eFormat = eFormat; + m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage); CreateImageView(); } @@ -124,7 +125,7 @@ void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFor stCreateInfo.extent.depth = 1; stCreateInfo.mipLevels = 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.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; stCreateInfo.format = GetImageFormat(eFormat); @@ -613,18 +614,34 @@ void CVkRenderContext::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 ) { + 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); m_bOutputImageOutdated = false; @@ -752,6 +769,9 @@ formatPicked: pImage->m_eImageType = IMAGE_TYPE_2D; pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE; 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(); g_vkSwapchainImages[i] = pImage; diff --git a/materialsystem/vulkan/shader.cpp b/materialsystem/vulkan/shader.cpp index c43a23a..eb264af 100644 --- a/materialsystem/vulkan/shader.cpp +++ b/materialsystem/vulkan/shader.cpp @@ -9,6 +9,7 @@ void CVkShader::Build() CUtlVector libs = {}; VkGraphicsPipelineCreateInfo createInfo = {}; VkPipelineLibraryCreateInfoKHR libInfo = {}; + VkPipelineRenderingCreateInfo render = {}; createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; for ( auto l: m_libraries ) @@ -23,6 +24,9 @@ void CVkShader::Build() createInfo.flags = VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT; createInfo.layout = g_pLibraryEmptyLayout; + render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; + render.pNext = createInfo.pNext; + createInfo.pNext = &render; // Possibly schedule it? vkCreateGraphicsPipelines(g_vkDevice, NULL, 1, &createInfo, NULL, &m_hPipeline); } diff --git a/materialsystem/vulkan/utils.cpp b/materialsystem/vulkan/utils.cpp index 0e91c6f..0970881 100644 --- a/materialsystem/vulkan/utils.cpp +++ b/materialsystem/vulkan/utils.cpp @@ -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_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT; 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: - 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_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_BLIT_IMAGE_DESTINATION: + case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: + return VK_PIPELINE_STAGE_2_BLIT_BIT; default: 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_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_BLIT_IMAGE_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; default: return VK_IMAGE_LAYOUT_UNDEFINED; } diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index b6343fe..6858a65 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -66,13 +66,16 @@ enum EDependencyMode DEPENDENCY_MODE_IMAGE_SOURCE, DEPENDENCY_MODE_IMAGE_DESTINATION, + DEPENDENCY_MODE_BLIT_IMAGE_SOURCE, + DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION, + DEPENDENCY_MODE_COLOR_CLEAR_SOURCE, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION, DEPENDENCY_MODE_ALL_COMMANDS, DEPENDENCY_MODE_IMAGE_PRESENT, - DEPENDENCY_MODE_FROM_PREVIOUS, + DEPENDENCY_MODE_NEXT_STAGE, DEPENDENCY_MODE_COUNT, }; @@ -191,6 +194,8 @@ public: VkImageView m_imageView; VmaAllocation m_allocation; VkImageSubresourceRange m_range; + + VkImageLayout m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; EDependencyMode m_eLastUsage; diff --git a/public/igamewindow.h b/public/igamewindow.h index 9c16b85..7117eed 100644 --- a/public/igamewindow.h +++ b/public/igamewindow.h @@ -3,6 +3,7 @@ #include "tier2/iappsystem.h" #include "tier0/platform.h" +#include "materialsystem/imaterialsystem.h" enum EGraphicsAPI { @@ -15,13 +16,26 @@ abstract_class IGameWindow: public IAppSystem public: 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; + // Vulkan stuff virtual int GetVulkanInstanceExtensionCount() = 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 *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; diff --git a/public/materialsystem/imaterialsystem.h b/public/materialsystem/imaterialsystem.h index aa37207..00ef1ea 100644 --- a/public/materialsystem/imaterialsystem.h +++ b/public/materialsystem/imaterialsystem.h @@ -1,8 +1,11 @@ #ifndef MATERIAL_SYSTEM_H #define MATERIAL_SYSTEM_H -#include "tier2/iappsystem.h" #include "tier0/platform.h" +#include "tier2/iappsystem.h" +class IGameWindow; + +#define VULKAN_FRAMES_IN_FLIGHT 2 enum EImageFormat { @@ -209,19 +212,21 @@ public: virtual IRenderCommandList *CreateCommandList() = 0; virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0; virtual void SubmitCommandList(IRenderCommandList *pList) = 0; - + + virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; }; #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 { public: virtual void Frame( float fTime ) = 0; + virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; }; extern IRenderContext *g_pRenderContext; -IMaterialSystem *Materials( void ); +extern IMaterialSystem *g_pMaterialSystem; #endif diff --git a/public/tier1/utlstring.h b/public/tier1/utlstring.h index 5054d9e..320c9b1 100644 --- a/public/tier1/utlstring.h +++ b/public/tier1/utlstring.h @@ -6,6 +6,8 @@ #define TIER1_UTL_STRING_H #include "tier1/utlvector.h" +#include "tier0/lib.h" +#include "stdarg.h" class CUtlString { public: @@ -39,5 +41,210 @@ public: private: CUtlVector 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&( 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 diff --git a/tier0/platform.cpp b/tier0/platform.cpp index 823946f..fd0abf9 100644 --- a/tier0/platform.cpp +++ b/tier0/platform.cpp @@ -173,7 +173,7 @@ PLATFORM_INTERFACE void Plat_Backtrace( void ) PLATFORM_INTERFACE void *Plat_LoadLibrary( const char *psz ) { #ifdef __linux__ - void *lib = dlopen(psz, RTLD_GLOBAL | RTLD_NOW); + void *lib = dlopen(psz, RTLD_NOW); if (!lib) V_printf("Failed to open %s\n\t%s\n", psz, dlerror()); return lib; diff --git a/tier1/utlstring.cpp b/tier1/utlstring.cpp index 25f1991..18a3f95 100644 --- a/tier1/utlstring.cpp +++ b/tier1/utlstring.cpp @@ -1,198 +1,2 @@ #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&( 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; -} diff --git a/tier2/filesystem_libc.cpp b/tier2/filesystem_libc.cpp index 9ef0282..83144b3 100644 --- a/tier2/filesystem_libc.cpp +++ b/tier2/filesystem_libc.cpp @@ -41,7 +41,6 @@ public: pFile = V_fopen(szFileName, szOperation); if (!pFile) { - Plat_FatalErrorFunc("Failed to open %s: %s\n",strerror(errno)); return NULL; }