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();
|
||||
|
||||
for (;;) {
|
||||
gamewindow->UpdateWindow();
|
||||
/*
|
||||
if (g_pRenderContext->BIsOutputImageOutdated())
|
||||
{
|
||||
|
||||
@@ -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<IImage*> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<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",
|
||||
"library/runner.cpp",
|
||||
@@ -39,6 +32,11 @@ CUtlVector<CUtlString> g_CompiledFiles = {
|
||||
|
||||
};
|
||||
|
||||
CreateInterfaceFn fpcFactory;
|
||||
ILinker *linker;
|
||||
ICCompiler *ccompiler;
|
||||
IFileSystem2 *filesystem2;
|
||||
|
||||
CUtlVector<CUtlString> g_IncludeDirectories = {
|
||||
"public",
|
||||
"../public",
|
||||
@@ -47,6 +45,10 @@ CUtlVector<CUtlString> 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");
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<CBuildStage*>& BuildStages();
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
CUtlVector<CUtlString> MaterialSystem_CompiledFiles = {
|
||||
"materialsystem/materialsystem.cpp",
|
||||
"materialsystem/compiledshader.cpp",
|
||||
};
|
||||
CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
|
||||
"materialsystem/vulkan/shaderparser.cpp",
|
||||
"materialsystem/vulkan/rendercontext.cpp",
|
||||
"materialsystem/vulkan/commandbuffer.cpp",
|
||||
@@ -16,10 +18,11 @@ CUtlVector<CUtlString> 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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<VulkanDescriptor_t> 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ void CVkShader::Build()
|
||||
CUtlVector<VkPipeline> 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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<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);
|
||||
if (!pFile)
|
||||
{
|
||||
Plat_FatalErrorFunc("Failed to open %s: %s\n",strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user