added font rendering

This commit is contained in:
2026-05-25 01:35:19 +03:00
parent a9766d6dd6
commit f127ac3801
27 changed files with 657 additions and 43 deletions

View File

@@ -38,11 +38,22 @@ DECLARE_VULKAN_COMMAND(Begin)
VkRenderingAttachmentInfo a = {};
a.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
a.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
a.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
a.clearValue.color.float32[0] = i.m_fClearColor[0];
a.clearValue.color.float32[1] = i.m_fClearColor[1];
a.clearValue.color.float32[2] = i.m_fClearColor[2];
a.clearValue.color.float32[3] = i.m_fClearColor[3];
switch( i.m_eLoadMode )
{
case LOAD_MODE_DONT_CARE:
a.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
break;
case LOAD_MODE_LOAD:
a.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
break;
case LOAD_MODE_CLEAR:
a.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
a.clearValue.color.float32[0] = i.m_fClearColor[0];
a.clearValue.color.float32[1] = i.m_fClearColor[1];
a.clearValue.color.float32[2] = i.m_fClearColor[2];
a.clearValue.color.float32[3] = i.m_fClearColor[3];
break;
}
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
a.imageView = ((CVkImage*)VulkanGetObject(i.m_stImage, iCurrentFrame))->m_imageView;
attachments.AppendTail(a);

View File

@@ -76,6 +76,17 @@ void CVkMaterial::PSSetTextureArray( uint32_t uSet, ITextureArray *pArray )
SetShaderResource(0, uSet, pArray);
}
void CVkMaterial::PSSetTexture( uint32_t uRegister, IImage *pImage )
{
SetShaderResource(uRegister, 0, pImage);
}
void CVkMaterial::PSSetSampler( uint32_t uRegister, ISampler *pImage )
{
SetShaderResource(uRegister, 0, pImage);
}
void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject)
{
if ( m_pVkShader->m_setLayouts.GetSize() == 0 )
@@ -84,6 +95,8 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
IRenderingObject *pVkObject;
CVkBuffer *pBuffer;
CVkTextureArray *pArray;
CVkImage *pImage;
CVkSampler *pSampler;
};
pVkObject = pObject;
if (dynamic_cast<IBuffer*>(pObject))
@@ -101,6 +114,36 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
stInfo.range = pBuffer->m_nSize;
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
}
if (dynamic_cast<IImage*>(pObject))
{
VkWriteDescriptorSet write = {};
VkDescriptorImageInfo stInfo = {};
write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write.dstSet = m_hSets[uSet];
write.dstBinding = uRegister;
write.dstArrayElement = 0;
write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
write.descriptorCount = 1;
write.pImageInfo = &stInfo;
stInfo.imageView = pImage->m_imageView;
stInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
}
if (dynamic_cast<CVkSampler*>(pObject))
{
VkWriteDescriptorSet write = {};
VkDescriptorImageInfo stInfo = {};
write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write.dstSet = m_hSets[uSet];
write.dstBinding = uRegister;
write.dstArrayElement = 0;
write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
write.descriptorCount = 1;
write.pImageInfo = &stInfo;
stInfo.sampler = pSampler->m_sampler;
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
}
if (dynamic_cast<ITextureArray*>(pObject))
{
VkWriteDescriptorSet writes[2] = {};

View File

@@ -36,6 +36,15 @@ void CVkRenderCommandList::SetClearColor( uint32_t uIndex, float r, float g, flo
pOutput->m_fClearColor[3] = a;
}
void CVkRenderCommandList::SetLoadStoreModes( uint32_t uIndex, ELoadMode eLoadMode, EStoreMode eStoreMode )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
VulkanRenderOutput_t *pOutput = FindOrCreateRenderOutput(uIndex);
pOutput->m_eLoadMode = eLoadMode;
pOutput->m_eStoreMode = eStoreMode;
}
void CVkRenderCommandList::SetDepthTarget( IImage *pDepth )
{
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);

View File

@@ -325,6 +325,11 @@ uint32_t CVkBuffer::GetSize()
return m_nSize;
}
void CVkSampler::SetDebugName( const char *szName )
{
};
CVkTextureArray::~CVkTextureArray()
{
@@ -357,7 +362,6 @@ void CVkTextureArray::Build()
samplerInfo.mipLodBias = 0.0f;
samplerInfo.minLod = 0.0f;
samplerInfo.maxLod = VK_LOD_CLAMP_NONE;
vkCreateSampler(m_hDevice, &samplerInfo, nullptr, &m_hSampler);
LoadTexture("game/core/textures/error.png");
@@ -427,6 +431,11 @@ uint32_t CVkTextureArray::GetTextureID( const char *szPath )
{
}
IImage *CVkTextureArray::GetTexture( uint32_t uTextureID )
{
return m_pImages[uTextureID];
}
void CVkTextureArray::UnloadTexture( uint32_t uTextureID )
{
@@ -477,6 +486,8 @@ public:
virtual ITextureArray *CreateTextureArray() override;
virtual void DestroyTextureArray() override;
virtual ISampler *GetDefaultSampler() override;
private:
VkPhysicalDevice SelectPhysicalDevice( CUtlVector<VkPhysicalDevice> physicalDevices );
CUtlVector<const char *> GetDeviceExtensions();
@@ -498,6 +509,8 @@ private:
CUtlVector<CVkTextureArray*> m_scheduledRemovalTextureArrays;
CUtlVector<CVkBuffer*> m_scheduledRemovalBuffers;
CUtlVector<CVkImage*> m_scheduledRemovalImages;
CVkSampler m_defaultSampler;
};
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
@@ -677,12 +690,18 @@ void CVkRenderContext::DestroyTextureArray()
{
}
ISampler *CVkRenderContext::GetDefaultSampler()
{
return &m_defaultSampler;
}
VkPipelineLayout g_pLibraryEmptyLayout;
static IVkCommandBuffer *s_pPresentCommandBuffer;
void CVkRenderContext::Init()
{
VkResult r;
int nExtensionCount;
@@ -834,6 +853,23 @@ void CVkRenderContext::Init()
m_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL);
m_pCommandBufferManager->SetVulkanHandlers(s_vkInstance, s_vkDevice);
m_pCommandBufferManager->Init();
VkSamplerCreateInfo samplerInfo = {};
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
samplerInfo.magFilter = VK_FILTER_LINEAR;
samplerInfo.minFilter = VK_FILTER_LINEAR;
samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
samplerInfo.unnormalizedCoordinates = VK_FALSE;
samplerInfo.compareEnable = VK_FALSE;
samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
samplerInfo.mipLodBias = 0.0f;
samplerInfo.minLod = 0.0f;
samplerInfo.maxLod = VK_LOD_CLAMP_NONE;
vkCreateSampler(s_vkDevice, &samplerInfo, nullptr, &m_defaultSampler.m_sampler);
}
void CVkRenderContext::Frame( float fDeltaTime )
@@ -1059,8 +1095,8 @@ formatPicked:
pImage->m_eImageType = IMAGE_TYPE_2D;
pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE;
pImage->m_eFormat = IMAGE_FORMAT_BGRA8_UNORM;
pImage->m_nHeight = 1280;
pImage->m_nWidth = 720;
pImage->m_nHeight = pWindow->GetRenderWidth();
pImage->m_nWidth = pWindow->GetRenderHeight();
pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
pImage->CreateImageView();
window.m_images[i] = pImage;

View File

@@ -225,6 +225,13 @@ public:
uint32_t m_nSize;
};
class CVkSampler: public ISampler
{
public:
virtual void SetDebugName( const char *szName ) override;
VkSampler m_sampler;
};
class CVkPipelineLibrary
{
public:
@@ -349,6 +356,7 @@ public:
virtual void SetDebugName( const char *szName ) override;
virtual uint32_t LoadTexture( const char *szPath ) override;
virtual uint32_t GetTextureID( const char *szPath ) override;
virtual IImage *GetTexture( uint32_t uTextureID ) override;
virtual void UnloadTexture( uint32_t uTextureID ) override;
void Frame();
@@ -374,7 +382,10 @@ public:
virtual void PSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
virtual void PSSetTextureArray( uint32_t uSet, ITextureArray *pArray ) override;
virtual void PSSetTexture( uint32_t uRegister, IImage *pImage ) override;
virtual void PSSetSampler( uint32_t uRegister, ISampler *pImage ) override;
CVkShader *m_pVkShader;
CUtlVector<VkDescriptorSet> m_hSets;
@@ -402,6 +413,7 @@ struct VulkanMaterialCommandBuffer_t
};
enum EVkFrameObjectType_t
{
FRAME_OBJECT_TYPE_SINGLE,
@@ -438,6 +450,7 @@ public:
virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) override;
virtual void SetClearColor( uint32_t uIndex, float r, float g, float b, float a ) override;
virtual void SetLoadStoreModes( uint32_t uIndex, ELoadMode eLoadMode, EStoreMode eStoreMode ) override;
virtual void SetDepthTarget( IImage *pDepth ) override;
virtual void SetClearDepth( float fVal ) override;