a bit of stuff, time to add spirv-link into this project

This commit is contained in:
2026-02-23 01:42:17 +02:00
parent c00ecf4081
commit 003106a4d7
48 changed files with 626 additions and 752 deletions

View File

@@ -5,6 +5,7 @@
#define EXTERNAL "../external/"
#define FUNNYSTDLIB EXTERNAL"funnystdlib/"
ADD_DEPENDENCY_BUILD_FILE(cfg, "../buildcfg.cpp");
ADD_DEPENDENCY_BUILD_FILE(tier0, FUNNYSTDLIB"tier0/build.cpp");
ADD_DEPENDENCY_BUILD_FILE(tier1, FUNNYSTDLIB"tier1/build.cpp");
ADD_DEPENDENCY_BUILD_FILE(tier2, FUNNYSTDLIB"tier2/build.cpp");
@@ -46,15 +47,23 @@ DECLARE_BUILD_STAGE(MaterialSystem)
};
compileProject.bFPIC = true;
ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
if ( GET_PROJECT_VALUE(config, "static") == "true" )
{
ldProject.linkType = ELINK_STATIC_LIBRARY;
}
else
{
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
}
if (ldProject.m_target.kernel == TARGET_KERNEL_WINDOWS)
{
ldProject.libraryDirectories.AppendTail(EXTERNAL"windows");
ldProject.libraries.AppendTail("winpthread-1");
};
CUtlString outputProject = linker->Link(&ldProject);
@@ -79,16 +88,25 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
EXTERNAL"Vulkan-Headers/include",
EXTERNAL"Vulkan-Utility-Libraries/include",
EXTERNAL"VulkanMemoryAllocator/include",
EXTERNAL"volk"
EXTERNAL"volk",
EXTERNAL,
};
compileProject.bFPIC = true;
ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
ldProject.libraries.AppendTail("SDL3");
if ( GET_PROJECT_VALUE(config, "static") == "true" )
{
ldProject.linkType = ELINK_STATIC_LIBRARY;
}
else
{
ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"),
};
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
ldProject.libraries.AppendTail("SDL3");
}
if (ldProject.m_target.kernel == TARGET_KERNEL_WINDOWS)
{
ldProject.libraryDirectories.AppendTail(EXTERNAL"windows");

View File

@@ -1,2 +1,3 @@
#define STB_IMAGE_IMPLEMENTATION
#define STBI_NO_THREAD_LOCALS
#include "stb/stb_image.h"

View File

@@ -208,6 +208,7 @@ void CVkCommandBuffer::SortDependencies()
}
/*
for (auto &pCommand: m_commands)
{
for ( auto dependency: pCommand->m_dependencies)
@@ -262,6 +263,7 @@ void CVkCommandBuffer::SortDependencies()
}
}
}
*/
}

View File

@@ -74,6 +74,11 @@ BEGIN_VULKAN_COMMAND(SetViewport)
float fDepthMax = 1;
END_VULKAN_COMMAND(SetViewport)
BEGIN_VULKAN_COMMAND(ResolveImage)
VkFrameObject_t stInputImage;
VkFrameObject_t stOutputImage;
END_VULKAN_COMMAND(ResolveImage)
BEGIN_VULKAN_COMMAND(CopyBufferToImage)
IBuffer *pBuffer;
VkFrameObject_t stOutputImage;

View File

@@ -122,6 +122,35 @@ DECLARE_VULKAN_COMMAND(SetViewport)
};
vkCmdSetViewportWithCount(hCommandBuffer, 1, &v);
}
DECLARE_VULKAN_COMMAND(ResolveImage)
{
CVkImage *pInput = (CVkImage*)VulkanGetObject(stInputImage, iCurrentFrame);
CVkImage *pOutput = (CVkImage*)VulkanGetObject(stOutputImage, iCurrentFrame);
VkImageResolve2 r = {
.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2,
.srcSubresource = {
.aspectMask = pInput->m_range.aspectMask,
.layerCount = 1,
},
.srcOffset = {0,0,0},
.dstSubresource = {
.aspectMask = pOutput->m_range.aspectMask,
.layerCount = 1,
},
.dstOffset = {0,0,0},
.extent = {pInput->m_nWidth, pInput->m_nHeight, 1}
};
VkResolveImageInfo2 i = {
.sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2,
.srcImage = pInput->m_image,
.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
.dstImage = pOutput->m_image,
.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.regionCount = 1,
.pRegions = &r,
};
vkCmdResolveImage2(hCommandBuffer, &i);
}
DECLARE_VULKAN_COMMAND(CopyBufferToImage)
{
VkBufferImageCopy2 r = {

View File

@@ -9,11 +9,13 @@ CVkRenderCommandList::~CVkRenderCommandList()
void CVkRenderCommandList::ResetRendering()
{
for ( auto m: m_materials )
for ( auto m: m_pCommandBuffers )
{
m_pCommandBufferManager->FreeCommandBufferWithCommands(m.m_pCommandBuffer);
m_pCommandBufferManager->FreeCommandBufferWithCommands(m);
}
m_pPostRaster = NULL;
m_materials = {};
m_pCommandBuffers = {};
}
void CVkRenderCommandList::SetRenderTarget( uint32_t uIndex, IImage *pImage )
@@ -162,6 +164,14 @@ void CVkRenderCommandList::ResolveImage( IImage *pOriginal, IImage *pResolved )
{
SwitchRenderingStage(RENDERING_STAGE_POST_RASTER);
CVkResolveImageCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, ResolveImage);
pCmd->stInputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stInputImage.m_pSingle = pOriginal;
pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stOutputImage.m_pSingle = pResolved;
pCmd->AddDependency(pOriginal, DEPENDENCY_MODE_IMAGE_SOURCE);
pCmd->AddDependency(pResolved, DEPENDENCY_MODE_IMAGE_DESTINATION);
m_pPostRaster->AddCommand(pCmd);
}
@@ -172,25 +182,43 @@ void CVkRenderCommandList::StartRecording()
void CVkRenderCommandList::EndRecording()
{
for ( auto m: m_materials)
{
CVkEndCommand *pEndCommand = CREATE_COMMAND(m_pCommandBufferManager, End);
m.m_pCommandBuffer->AddCommand(pEndCommand);
m.m_pCommandBuffer->Render();
}
SwitchRenderingStage(RENDERING_STAGE_FINISHED);
}
void CVkRenderCommandList::Submit()
{
for ( auto m: m_materials)
for ( auto m: m_pCommandBuffers)
{
m.m_pCommandBuffer->Submit();
m->Submit();
}
}
void CVkRenderCommandList::SwitchRenderingStage( EVulkanRenderingStage eStage )
{
if (eStage != RENDERING_STAGE_RASTER)
{
for ( auto m: m_materials)
{
CVkEndCommand *pEndCommand = CREATE_COMMAND(m_pCommandBufferManager, End);
m.m_pCommandBuffer->AddCommand(pEndCommand);
m.m_pCommandBuffer->Render();
m_pCommandBuffers.AppendTail(m.m_pCommandBuffer);
}
m_materials = {};
};
if (eStage == RENDERING_STAGE_POST_RASTER)
{
m_pPostRaster = m_pCommandBufferManager->CreateCommandBuffer();
m_pPostRaster->Reset();
}
else
{
if (m_pPostRaster)
{
m_pPostRaster->Render();
m_pCommandBuffers.AppendTail(m_pPostRaster);
}
}
}
VulkanRenderOutput_t *CVkRenderCommandList::FindOrCreateRenderOutput( uint32_t uIndex )

View File

@@ -255,7 +255,10 @@ CVkBuffer::CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlig
VkBufferDeviceAddressInfo stAddress = {};
stUsage.sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO;
stUsage.usage = eUsage | VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT;
stUsage.usage = eUsage
| VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT
| VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT
| VK_BUFFER_USAGE_2_TRANSFER_DST_BIT;
if (eUsage & VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT)
{
m_eDescriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
@@ -391,7 +394,7 @@ uint32_t CVkTextureArray::CreateTexture( uint32_t i, const char *szPath )
int uHeight = 0;
int uChannels = 0;
unsigned char *pImg = stbi_load_from_memory(data.GetMemory(), data.GetSize(), &uWidth, &uHeight, &uChannels, 4);
IBuffer *pBuffer = m_pRenderContext->CreateStorageBuffer(uWidth*uHeight*uChannels);
IBuffer *pBuffer = m_pRenderContext->CreateStorageBuffer(uWidth*uHeight*4);
pBuffer->Lock();
void *pData = pBuffer->Map();
V_memcpy(pData, pImg, uWidth*uHeight*uChannels);
@@ -557,7 +560,9 @@ IImage *CVkRenderContext::CreateRenderTarget( uint32_t x, uint32_t y, EImageForm
}
IImage *CVkRenderContext::CreateTexture( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType )
{
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT);
CVkImage *pImage = new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT);
pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_GENERAL;
return pImage;
}
IImage *CVkRenderContext::CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType )
@@ -826,7 +831,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
CUtlVector<uint32_t> uImageIndexes = {};
CUtlVector<uint32_t> uSwapchainImageIndexes = {};
CUtlVector<VulkanWindow_t> recreatedWindows = {};
vkDeviceWaitIdle(s_vkDevice);
for ( auto &m: m_pMaterials)
{
@@ -849,7 +853,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
{
m_renderWindows.AppendTail(s);
}
vkDeviceWaitIdle(s_vkDevice);
for ( auto &s: m_renderWindows)
{
@@ -875,6 +878,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
s_pPresentCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
s_pPresentCommandBuffer->Reset();
double a = Plat_GetTime();
i = 0;
for ( auto &s: m_renderWindows )
{
@@ -937,7 +941,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
s.m_uCurrentFrame = (s.m_uCurrentFrame + 1) % FRAMES_IN_FLIGHT;
}
m_pCommandBufferManager->RenderingFinished();
vkDeviceWaitIdle(s_vkDevice);
for (auto &a: m_scheduledRemovalBuffers)
{
@@ -950,7 +953,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
m_scheduledRemovalLists = {};
m_scheduledRemovalBuffers = {};
m_pCommandBufferManager->FreeCommandBufferWithCommands(s_pPresentCommandBuffer);
vkDeviceWaitIdle(s_vkDevice);
}

View File

@@ -422,12 +422,14 @@ private:
CUtlVector<VulkanRenderOutput_t> m_pOutput = {};
CUtlVector<VulkanMaterialCommandBuffer_t> m_materials = {};
IVkCommandBuffer *m_pPostRaster;
IVkCommandBuffer *m_pPostRaster = NULL;
IVkCommandBuffer *m_pCurrentMaterialBuffer = NULL;
uint32_t m_uWidth;
uint32_t m_uHeight;
CUtlVector<IVkCommandBuffer*> m_pCommandBuffers = {};
CUtlVector<IVkCommandBuffer*> m_pScheduledDestroyPostRaster = {};
};