trying to make it work without -rdynamic
This commit is contained in:
@@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
CUtlVector<CUtlString> g_CompiledFiles = {
|
ADD_DEPENDENCY_BUILD_FILE("../tier0/__build.cpp")
|
||||||
|
ADD_DEPENDENCY_BUILD_FILE("../tier1/__build.cpp")
|
||||||
|
ADD_DEPENDENCY_BUILD_FILE("../tier2/__build.cpp")
|
||||||
|
|
||||||
"../tier0/lib.cpp",
|
|
||||||
"../tier0/mem.cpp",
|
CUtlVector<CUtlString> g_CompiledFiles = {
|
||||||
"../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");
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
@@ -192,6 +195,8 @@ public:
|
|||||||
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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -210,18 +213,20 @@ public:
|
|||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user