improved font rendering

This commit is contained in:
2026-05-26 01:29:26 +03:00
parent f127ac3801
commit 5fdb17b773
21 changed files with 217 additions and 158 deletions

View File

@@ -57,23 +57,27 @@ extern "C" void FunnyMain( int argc, char **argv )
EngineConsts_t stConstants = {}; EngineConsts_t stConstants = {};
#ifdef STEAM #ifdef STEAM
V_printf("Steam :)\n");
if(SteamAPI_RestartAppIfNecessary(480)) if(SteamAPI_RestartAppIfNecessary(480))
{ {
V_printf("Mshallah we are doing reboot\n"); V_printf("Mshallah we are doing reboot\n");
Plat_Exit(0); Plat_Exit(0);
} }
if (SteamAPI_Init())
{
V_printf("Steam :)\n");
stConstants.m_bIsSteam = true; stConstants.m_bIsSteam = true;
if (!SteamAPI_Init()) stConstants.LaunchServer = LaunchServerAtSteamRelay;
stConstants.ConnectSteamServer = ConnectBySteamID;
SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg, SteamAPIDebug);
}
else
{ {
V_printf("Steam :()\n"); V_printf("Steam :()\n");
stConstants.m_bIsSteam = false; stConstants.m_bIsSteam = false;
}
stConstants.LaunchServer = LaunchServerAtSteamRelay;
stConstants.ConnectSteamServer = ConnectBySteamID;
SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg, SteamAPIDebug); }
#endif #endif
stConstants.m_bIsDedicated = CommandLine()->CheckParam("-dedicated"); stConstants.m_bIsDedicated = CommandLine()->CheckParam("-dedicated");
stConstants.LaunchLocalBridge = LaunchLocalBridge; stConstants.LaunchLocalBridge = LaunchLocalBridge;

View File

@@ -32,6 +32,10 @@ public:
GlyphData_t *m_glyphs; GlyphData_t *m_glyphs;
uint32_t m_uGlyphCount; uint32_t m_uGlyphCount;
IImage *m_pAtlas; IImage *m_pAtlas;
bool m_bIsMono = false;
uint32_t m_uMonoWidth = 0;
uint32_t m_uMonoHeight = 0;
}; };
class CKotUIBuffer: public IKotUIBuffer class CKotUIBuffer: public IKotUIBuffer
@@ -41,8 +45,11 @@ public:
virtual void Move( int iY, int iX ) override; virtual void Move( int iY, int iX ) override;
virtual void SetColor( char c ) override;
virtual void Clear( char c ) override; virtual void SetColor( float fX, float fY, float fZ, float fA ) override;
virtual void SetBackgroundColor( float fX, float fY, float fZ, float fA ) override;
virtual void Clear( float fX, float fY, float fZ, float fA ) override;
virtual void PutChar( char c ) override; virtual void PutChar( char c ) override;
virtual void Printf(const char *szFormat, ...) override; virtual void Printf(const char *szFormat, ...) override;
@@ -64,6 +71,12 @@ public:
IKotRenderFont *m_pFont; IKotRenderFont *m_pFont;
uint32_t m_uCursor = 0; uint32_t m_uCursor = 0;
uint32_t m_uTextWidth = 16;
uint32_t m_uTextHeight = 16;
ColorAlpha m_fgColor = {1,1,1,1};
ColorAlpha m_bgColor = {0,0,0,0};
}; };
class CKotUIManager: public IKotUIManager class CKotUIManager: public IKotUIManager
@@ -155,6 +168,24 @@ float CKotRenderFont::GetHeight( uint32_t letter )
bool CKotRenderFont::IsMono()
{
return m_bIsMono;
}
uint32_t CKotRenderFont::GetLetterWidth()
{
return m_uMonoWidth;
}
uint32_t CKotRenderFont::GetLetterHeight()
{
return m_uMonoHeight;
}
void CKotUIBuffer::SetPosition( int iY, int iX ) void CKotUIBuffer::SetPosition( int iY, int iX )
{ {
@@ -166,19 +197,30 @@ void CKotUIBuffer::Move( int iY, int iX )
m_uCursor = m_uCursor % (m_iWidth * m_iHeight); m_uCursor = m_uCursor % (m_iWidth * m_iHeight);
} }
void CKotUIBuffer::SetColor( char c )
void CKotUIBuffer::SetColor( float fX, float fY, float fZ, float fA )
{
m_fgColor = {fX, fY, fZ, fA};
}
void CKotUIBuffer::SetBackgroundColor( float fX, float fY, float fZ, float fA )
{
m_bgColor = {fX, fY, fZ, fA};
}
void CKotUIBuffer::Clear( float fX, float fY, float fZ, float fA )
{ {
} }
void CKotUIBuffer::Clear( char c )
{
}
void CKotUIBuffer::PutChar( char c ) void CKotUIBuffer::PutChar( char c )
{ {
m_buffer[m_uCursor] = c; m_buffer[m_uCursor] = c;
m_primaryColor[m_uCursor] = m_fgColor;
m_secondaryColor[m_uCursor] = m_bgColor;
Move(0, m_uCursor+1); Move(0, m_uCursor+1);
} }
@@ -199,6 +241,8 @@ void CKotUIBuffer::Printf(const char *szFormat, ...)
for ( size_t u = 0, i = m_uCursor; u < nSize; u++, i = (i + 1 % (m_iWidth * m_iHeight)) ) for ( size_t u = 0, i = m_uCursor; u < nSize; u++, i = (i + 1 % (m_iWidth * m_iHeight)) )
{ {
m_buffer[i] = psz[u]; m_buffer[i] = psz[u];
m_primaryColor[i] = m_fgColor;
m_secondaryColor[i] = m_bgColor;
} }
va_end(vlArgs2); va_end(vlArgs2);
V_free(psz); V_free(psz);
@@ -217,8 +261,8 @@ struct TextDrawData_t
float m_fPosY; float m_fPosY;
float m_fSizeX; float m_fSizeX;
float m_fSizeY; float m_fSizeY;
float m_fColor[4]; ColorAlpha m_fColor1;
float m_fColor2[4]; ColorAlpha m_fColor2;
}; };
struct ScreenData_t struct ScreenData_t
@@ -240,16 +284,16 @@ void CKotUIBuffer::Draw( IImage *pImage )
for ( uint32_t i = 0; i < uGlyphCount; i++ ) for ( uint32_t i = 0; i < uGlyphCount; i++ )
{ {
uint32_t l = m_buffer[i]; uint32_t l = m_buffer[i];
if ( !m_pFont->IsLetterPresent(l) )
continue;
pData[uRealGlyphCount].m_vTexcoordOffsetX = m_pFont->GetLetterX(l); pData[uRealGlyphCount].m_vTexcoordOffsetX = m_pFont->GetLetterX(l);
pData[uRealGlyphCount].m_vTexcoordOffsetY = m_pFont->GetLetterY(l); pData[uRealGlyphCount].m_vTexcoordOffsetY = m_pFont->GetLetterY(l);
pData[uRealGlyphCount].m_vTexcoordSizeX = m_pFont->GetWidth(l); pData[uRealGlyphCount].m_vTexcoordSizeX = m_pFont->GetWidth(l);
pData[uRealGlyphCount].m_vTexcoordSizeY = m_pFont->GetHeight(l); pData[uRealGlyphCount].m_vTexcoordSizeY = m_pFont->GetHeight(l);
pData[uRealGlyphCount].m_fSizeX = 16; pData[uRealGlyphCount].m_fSizeX = m_uTextWidth;
pData[uRealGlyphCount].m_fSizeY = 16; pData[uRealGlyphCount].m_fSizeY = m_uTextHeight;
pData[uRealGlyphCount].m_fPosX = i%m_iWidth*16; pData[uRealGlyphCount].m_fPosX = i%m_iWidth*m_uTextWidth;
pData[uRealGlyphCount].m_fPosY = i/m_iWidth*16; pData[uRealGlyphCount].m_fPosY = i/m_iWidth*m_uTextHeight;
pData[uRealGlyphCount].m_fColor1 = m_primaryColor[i];
pData[uRealGlyphCount].m_fColor2 = m_secondaryColor[i];
uRealGlyphCount++; uRealGlyphCount++;
} }
m_pDataBuffer->Unmap(); m_pDataBuffer->Unmap();
@@ -274,17 +318,24 @@ void CKotUIBuffer::Draw( IImage *pImage )
pList->SetLoadStoreModes(0, LOAD_MODE_LOAD, STORE_MODE_STORE); pList->SetLoadStoreModes(0, LOAD_MODE_LOAD, STORE_MODE_STORE);
pList->SetRenderResolution(pImage->GetImageWidth(), pImage->GetImageHeight()); pList->SetRenderResolution(pImage->GetImageWidth(), pImage->GetImageHeight());
pList->Barrier(m_pDataBuffer, true, false);
pList->Barrier(pScreenBuffer, true, false);
pList->Barrier(m_pFont->GetAtlas(), true, false);
pList->SetMaterial(m_pMaterial); pList->SetMaterial(m_pMaterial);
pList->SetVertexBuffer(0, s_pGlyphBuffer); pList->SetVertexBuffer(0, s_pGlyphBuffer);
pList->DrawPrimitives(6, 0, uRealGlyphCount, 0); pList->DrawPrimitives(6, 0, uRealGlyphCount, 0);
pList->EndRecording(); pList->EndRecording();
m_pRenderContext->SubmitCommandList(pList); m_pRenderContext->SubmitCommandList(pList);
m_pRenderContext->DestroyBuffer(pScreenBuffer);
} }
void CKotUIBuffer::SetTextSize( int iY, int iX ) void CKotUIBuffer::SetTextSize( int iY, int iX )
{ {
m_uTextHeight = iY;
m_uTextWidth = iX;
} }
@@ -301,7 +352,7 @@ void CKotUIManager::Init()
s_pShader = m_pRenderContext->CreateShader("game/core/shaders/kottui.shader_c"); s_pShader = m_pRenderContext->CreateShader("game/core/shaders/kottui.shader_c");
s_pShader->AddLayout(0, 8); s_pShader->AddLayout(0, 8);
s_pShader->AddAttribute(0, 0, VERTEX_FORMAT_XY32_SFLOAT, 0); s_pShader->AddAttribute(0, 0, VERTEX_FORMAT_XY32_SFLOAT, 0);
s_pShader->AddOutputImage(0, IMAGE_FORMAT_RGBA8_UNORM); s_pShader->AddOutputImage(0, IMAGE_FORMAT_RGBA8_UNORM, true);
s_pShader->Build(); s_pShader->Build();
s_pGlyphBuffer = m_pRenderContext->CreateVertexBuffer(sizeof(float)*12); s_pGlyphBuffer = m_pRenderContext->CreateVertexBuffer(sizeof(float)*12);
void *pBuffer = s_pGlyphBuffer->Map(); void *pBuffer = s_pGlyphBuffer->Map();
@@ -349,9 +400,16 @@ IKotRenderFont *CKotUIManager::LoadFont( const char *szPath )
uint32_t uAtlas = m_pFonts->LoadTexture(szAtlas); uint32_t uAtlas = m_pFonts->LoadTexture(szAtlas);
CKotRenderFont *pFont = new CKotRenderFont; CKotRenderFont *pFont = new CKotRenderFont;
IJSONObject *pAtlas = pValue->GetObject()->GetValue("atlas")->GetObject();
pFont->m_pAtlas = pFont->m_pAtlas = m_pFonts->GetTexture(uAtlas); pFont->m_pAtlas = pFont->m_pAtlas = m_pFonts->GetTexture(uAtlas);
uint32_t atlasWidth = pValue->GetObject()->GetValue("atlas")->GetObject()->GetValue("width")->GetNumberValue(); uint32_t atlasWidth = pAtlas->GetValue("width")->GetNumberValue();
uint32_t atlasHeight = pValue->GetObject()->GetValue("atlas")->GetObject()->GetValue("height")->GetNumberValue(); uint32_t atlasHeight = pAtlas->GetValue("height")->GetNumberValue();
pFont->m_bIsMono = pAtlas->GetValue("grid") != NULL;
if (pFont->m_bIsMono)
{
pFont->m_uMonoWidth = pAtlas->GetValue("grid")->GetObject()->GetValue("cellWidth")->GetNumberValue();
pFont->m_uMonoHeight = pAtlas->GetValue("grid")->GetObject()->GetValue("cellHeight")->GetNumberValue();
}
pFont->m_uGlyphCount = 0; pFont->m_uGlyphCount = 0;
pFont->m_glyphs = (GlyphData_t*)V_malloc(sizeof(GlyphData_t)*pGlyphs->GetCount()); pFont->m_glyphs = (GlyphData_t*)V_malloc(sizeof(GlyphData_t)*pGlyphs->GetCount());
@@ -385,6 +443,10 @@ IKotUIBuffer *CKotUIManager::CreateBuffer( int iWidth, int iHeight )
pBuffer->m_pRenderContext = m_pRenderContext; pBuffer->m_pRenderContext = m_pRenderContext;
pBuffer->m_buffer = (uint32_t*)V_malloc(sizeof(uint32_t)*iWidth*iHeight); pBuffer->m_buffer = (uint32_t*)V_malloc(sizeof(uint32_t)*iWidth*iHeight);
V_memset(pBuffer->m_buffer, 0, sizeof(uint32_t)*iWidth*iHeight); V_memset(pBuffer->m_buffer, 0, sizeof(uint32_t)*iWidth*iHeight);
pBuffer->m_primaryColor = (ColorAlpha*)V_malloc(sizeof(ColorAlpha)*iWidth*iHeight);
V_memset(pBuffer->m_primaryColor, 0, sizeof(ColorAlpha)*iWidth*iHeight);
pBuffer->m_secondaryColor = (ColorAlpha*)V_malloc(sizeof(ColorAlpha)*iWidth*iHeight);
V_memset(pBuffer->m_secondaryColor, 0, sizeof(ColorAlpha)*iWidth*iHeight);
pBuffer->m_iWidth = iWidth; pBuffer->m_iWidth = iWidth;
pBuffer->m_iHeight = iHeight; pBuffer->m_iHeight = iHeight;

View File

@@ -5,13 +5,12 @@ COMMON {
{ {
float4 m_vPosition: SV_POSITION; float4 m_vPosition: SV_POSITION;
float2 m_vUV: TEXCOORD0; float2 m_vUV: TEXCOORD0;
uint m_uFont; uint m_uFont: SV_InstanceID;
} }
struct TextDrawData_t struct TextDrawData_t
{ {
float2 m_vTexcoordOffset; float2 m_vTexcoordOffset;
float2 m_vTexcoordSize; float2 m_vTexcoordSize;
float2 m_vPos; float2 m_vPos;
float2 m_vSize; float2 m_vSize;
float4 m_vFGColor; float4 m_vFGColor;
@@ -51,6 +50,7 @@ VS
PS_INPUT output = {}; PS_INPUT output = {};
output.m_vPosition = float4(position, 0, 1); output.m_vPosition = float4(position, 0, 1);
output.m_vUV = uv; output.m_vUV = uv;
output.m_uFont = uInstance;
return output; return output;
} }
@@ -79,7 +79,11 @@ PS
float fSd = median3(vMsd.x, vMsd.y, vMsd.z); float fSd = median3(vMsd.x, vMsd.y, vMsd.z);
float fScreenPixelDistance = ScreenPixelRange(input.m_vUV)*(fSd-0.5); float fScreenPixelDistance = ScreenPixelRange(input.m_vUV)*(fSd-0.5);
float fOpacity = clamp(fScreenPixelDistance+0.5, 0.0, 1.0); float fOpacity = clamp(fScreenPixelDistance+0.5, 0.0, 1.0);
output.m_vAlbedo = fOpacity; float4 vColor1 = g_textData[input.m_uFont].m_vFGColor;
float4 vColor2 = g_textData[input.m_uFont].m_vBGColor;
vColor1.xyz*=vColor1.w;
vColor2.xyz*=vColor2.w;
output.m_vAlbedo = lerp(vColor2, vColor1, fOpacity);
return output; return output;
} }
} }

View File

@@ -38,8 +38,6 @@ IEngineBridge *EngineBridge()
EXPOSE_INTERFACE_FN(EngineBridge, IEngineBridge, ENGINE_BRIDGE_INTERFACE_VERSION) EXPOSE_INTERFACE_FN(EngineBridge, IEngineBridge, ENGINE_BRIDGE_INTERFACE_VERSION)
static IKotUIBuffer *s_pUIBuffer;
void CFunnyGameBridge::Init() void CFunnyGameBridge::Init()
{ {
Console()->AddCommand("exec game/core/default.cfg\n"); Console()->AddCommand("exec game/core/default.cfg\n");
@@ -77,16 +75,6 @@ void CFunnyGameBridge::Init()
g_pKotUI->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); g_pKotUI->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
g_pKotUI->Init(); g_pKotUI->Init();
IKotRenderFont *pFont = g_pKotUI->LoadFont("game/core/fonts/IBMPlexMono-Regular");
s_pUIBuffer = g_pKotUI->CreateBuffer(40, 30);
s_pUIBuffer->SetTextFont(pFont);
s_pUIBuffer->SetTextSize(, int iX)
s_pUIBuffer->Move(0, 0);
s_pUIBuffer->Printf("hello %f", 20.0);
s_pUIBuffer->Move(1, 0);
s_pUIBuffer->Printf("hello %f", 40.0);
s_pUIBuffer->Move(2, 0);
s_pUIBuffer->Printf("hello %f", 40.0);
} }
void CFunnyGameBridge::Tick( float fDelta ) void CFunnyGameBridge::Tick( float fDelta )
@@ -183,7 +171,6 @@ void CFunnyGameBridge::Frame( float fDelta )
EntitySystem()->NetSendThink(pCurrentServer); EntitySystem()->NetSendThink(pCurrentServer);
} }
g_pWorldRenderer->Frame(fDelta); g_pWorldRenderer->Frame(fDelta);
s_pUIBuffer->Draw(g_pMainWindow->GetOutputImage());
} }
void CFunnyGameBridge::Shutdown() void CFunnyGameBridge::Shutdown()

View File

@@ -1,90 +0,0 @@
#include "mainmenu.h"
#include "fgui/label.h"
#include "fgui/rect.h"
#include "fgui/widget.h"
#include "tier1/interface.h"
class CMOBAMainMenuGUI: public CFGUI_Widget
{
public:
CMOBAMainMenuGUI();
virtual void Event( FGUI_Event_t event ) override;
virtual void Draw() override;
virtual void Frame() override;
private:
CFGUI_Rect *m_pBackground;
CFGUI_Label *m_pGameName;
};
CMOBAMainMenuGUI::CMOBAMainMenuGUI()
{
SetPosition(0, 0);
m_pBackground = new CFGUI_Rect;
m_pBackground->SetParent(this);
m_pBackground->SetPosition(90,90);
m_pBackground->SetSize(300, 400);
m_pBackground->SetBoxColor(0.1, 0.1, 0.1, 1);
m_pGameName = new CFGUI_Label;
m_pGameName->SetParent(this);
m_pGameName->SetFont("fonts/IBMPlexMono-Regular");
m_pGameName->SetLabel("funnygame");
m_pGameName->SetGlyphSize(24);
m_pGameName->SetPosition(100, 100);
};
void CMOBAMainMenuGUI::Event( FGUI_Event_t event )
{
}
void CMOBAMainMenuGUI::Draw()
{
}
void CMOBAMainMenuGUI::Frame()
{
}
class CMOBAMainMenu: public IMainMenu
{
public:
virtual void Init() override;
virtual void Frame() override;
virtual void Deinit() override;
virtual void SetVisibility( bool bIsVisible ) override;
private:
CMOBAMainMenuGUI *m_pMainMenu;
};
void CMOBAMainMenu::Init()
{
m_pMainMenu = new CMOBAMainMenuGUI;
m_pMainMenu->SetVisibility(true);
}
void CMOBAMainMenu::Frame()
{
}
void CMOBAMainMenu::SetVisibility( bool bIsVisible )
{
m_pMainMenu->SetVisibility(bIsVisible);
}
void CMOBAMainMenu::Deinit()
{
}
DECLARE_ENGINE_INTERFACE(MainMenu, CMOBAMainMenu);

View File

@@ -32,7 +32,7 @@ void C_MOBAPlayer::Think( float fDelta )
g_pWorldRenderer->SetCameraPosition(vCameraPos); g_pWorldRenderer->SetCameraPosition(vCameraPos);
Quat vCameraRot; Quat vCameraRot;
glm_euler_yxz_quat((vec3){m_fPitch, m_fYaw, 0}, *(versor*)&vCameraRot); glm_euler_yxz_quat((vec3){m_fPitch, m_fYaw, 0}, *(versor*)&vCameraRot);
//g_pWorldRenderer->SetCameraRotation(vCameraRot); g_pWorldRenderer->SetCameraRotation(vCameraRot);
} }
BaseClass::Think(fDelta); BaseClass::Think(fDelta);
}; };

View File

View File

View File

View File

View File

@@ -208,7 +208,6 @@ void CVkCommandBuffer::SortDependencies()
} }
/*
for (auto &pCommand: m_commands) for (auto &pCommand: m_commands)
{ {
for ( auto dependency: pCommand->m_dependencies) for ( auto dependency: pCommand->m_dependencies)
@@ -263,7 +262,6 @@ void CVkCommandBuffer::SortDependencies()
} }
} }
} }
*/
} }
@@ -311,7 +309,6 @@ void CVkCommandBuffer::TryBarrier( int iCurrent, int iCurrentBuffer )
if (dynamic_cast<CVkImage*>(pObject)) if (dynamic_cast<CVkImage*>(pObject))
{ {
VkImageMemoryBarrier2 imageMemoryBarrier = {}; VkImageMemoryBarrier2 imageMemoryBarrier = {};
imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2; imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
imageMemoryBarrier.image = pImage->m_image; imageMemoryBarrier.image = pImage->m_image;

View File

@@ -48,7 +48,7 @@ CVkMaterial::~CVkMaterial()
void CVkMaterial::Frame() void CVkMaterial::Frame()
{ {
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, m_writes.GetSize(), m_writes.GetData(), 0, 0); //vkUpdateDescriptorSets(m_pVkShader->m_hDevice, m_writes.GetSize(), m_writes.GetData(), 0, 0);
}; };
void CVkMaterial::VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) void CVkMaterial::VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource )
@@ -185,7 +185,6 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
writes[1].descriptorCount = 128; writes[1].descriptorCount = 128;
writes[1].pImageInfo = stWrites; writes[1].pImageInfo = stWrites;
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 2, writes, 0, 0); vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 2, writes, 0, 0);
m_pTextureArray = pArray;
} }
} }

View File

@@ -101,7 +101,7 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
pBeginCommand->nResolutionY = m_uHeight; pBeginCommand->nResolutionY = m_uHeight;
for ( auto &i: pBeginCommand->images) for ( auto &i: pBeginCommand->images)
{ {
pBeginCommand->AddDependency(i.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE); pBeginCommand->AddDependency(i.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE);
} }
if ( m_bDepthEnabled ) if ( m_bDepthEnabled )
{ {
@@ -118,10 +118,6 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData); CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData);
pSetShaderData->pShaderData = pMaterial; pSetShaderData->pShaderData = pMaterial;
{
CVkTextureArray *pArray = (CVkTextureArray*)((CVkMaterial*)pMaterial)->m_pTextureArray;
}
m_pCurrentMaterialBuffer->AddCommand(pSetShaderData); m_pCurrentMaterialBuffer->AddCommand(pSetShaderData);
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(m_pCommandBufferManager, SetScissors); CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(m_pCommandBufferManager, SetScissors);
@@ -146,6 +142,7 @@ void CVkRenderCommandList::SetVertexBuffer( uint32_t uBinding, IVertexBuffer *pB
CVkSetVertexBufferCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, SetVertexBuffer); CVkSetVertexBufferCommand *pCmd = CREATE_COMMAND(m_pCommandBufferManager, SetVertexBuffer);
pCmd->uBinding = uBinding; pCmd->uBinding = uBinding;
pCmd->pBuffer = pBuffer; pCmd->pBuffer = pBuffer;
pCmd->AddDependency(pBuffer, DEPENDENCY_MODE_BUFFER_SOURCE);
m_pCurrentMaterialBuffer->AddCommand(pCmd); m_pCurrentMaterialBuffer->AddCommand(pCmd);
} }
@@ -163,6 +160,34 @@ void CVkRenderCommandList::DrawPrimitives( uint32_t nVertexCount, uint32_t nFirs
pCmd->nFirstVertex = nFirstVertex; pCmd->nFirstVertex = nFirstVertex;
pCmd->nInstanceCount = nInstanceCount; pCmd->nInstanceCount = nInstanceCount;
pCmd->nFirstInstance = nFirstInstance; pCmd->nFirstInstance = nFirstInstance;
for ( auto &b: m_barriers )
{
if (dynamic_cast<CVkBuffer*>(b.pObject))
{
if (b.m_bIsRead)
if (b.m_bIsWrite)
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE);
else
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_READ);
else
if (b.m_bIsWrite)
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_BUFFER_WRITE);
}
if (dynamic_cast<CVkImage*>(b.pObject))
{
if (b.m_bIsRead)
if (b.m_bIsWrite)
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE);
else
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_READ);
else
if (b.m_bIsWrite)
pCmd->AddDependency(b.pObject, DEPENDENCY_MODE_SHADER_IMAGE_WRITE);
}
}
m_barriers = {};
m_pCurrentMaterialBuffer->AddCommand(pCmd); m_pCurrentMaterialBuffer->AddCommand(pCmd);
} }
@@ -182,8 +207,8 @@ void CVkRenderCommandList::ResolveImage( IImage *pOriginal, IImage *pResolved )
pCmd->stInputImage.m_pSingle = pOriginal; pCmd->stInputImage.m_pSingle = pOriginal;
pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE; pCmd->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
pCmd->stOutputImage.m_pSingle = pResolved; pCmd->stOutputImage.m_pSingle = pResolved;
pCmd->AddDependency(pOriginal, DEPENDENCY_MODE_IMAGE_SOURCE); pCmd->AddDependency(pOriginal, DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE);
pCmd->AddDependency(pResolved, DEPENDENCY_MODE_IMAGE_DESTINATION); pCmd->AddDependency(pResolved, DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION);
m_pPostRaster->AddCommand(pCmd); m_pPostRaster->AddCommand(pCmd);
} }
@@ -198,6 +223,11 @@ void CVkRenderCommandList::EndRecording()
SwitchRenderingStage(RENDERING_STAGE_FINISHED); SwitchRenderingStage(RENDERING_STAGE_FINISHED);
} }
void CVkRenderCommandList::Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite )
{
m_barriers.AppendTail({pObject, bIsRead, bIsWrite});
}
void CVkRenderCommandList::Submit() void CVkRenderCommandList::Submit()
{ {
for ( auto m: m_pCommandBuffers) for ( auto m: m_pCommandBuffers)

View File

@@ -932,6 +932,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
double a = Plat_GetTime(); double a = Plat_GetTime();
i = 0; i = 0;
CVkEmptyCommand *pEmptyCommand = CREATE_COMMAND(m_pCommandBufferManager, Empty);
for ( auto &s: m_renderWindows ) for ( auto &s: m_renderWindows )
{ {
@@ -952,11 +953,14 @@ void CVkRenderContext::Frame( float fDeltaTime )
pBlitCommand->iDstMax[0] = s.m_pWindow->GetRenderWidth(); pBlitCommand->iDstMax[0] = s.m_pWindow->GetRenderWidth();
pBlitCommand->iDstMax[1] = s.m_pWindow->GetRenderHeight(); pBlitCommand->iDstMax[1] = s.m_pWindow->GetRenderHeight();
pBlitCommand->iDstMax[2] = 1; pBlitCommand->iDstMax[2] = 1;
pEmptyCommand->AddDependency((IRenderingObject*)s.m_images[uSwapchainImageIndexes[i]], DEPENDENCY_MODE_IMAGE_PRESENT);
} }
if (pBlitCommand != NULL) if (pBlitCommand != NULL)
s_pPresentCommandBuffer->AddCommand(pBlitCommand); s_pPresentCommandBuffer->AddCommand(pBlitCommand);
i++; i++;
} }
s_pPresentCommandBuffer->AddCommand(pEmptyCommand);
s_pPresentCommandBuffer->Render(); s_pPresentCommandBuffer->Render();
s_pPresentCommandBuffer->Submit(0); s_pPresentCommandBuffer->Submit(0);

View File

@@ -27,9 +27,9 @@ void CVkShader::SetTopology( ETopologyMode eTopology )
} }
void CVkShader::AddOutputImage( int iImageIndex, EImageFormat eFormat ) void CVkShader::AddOutputImage( int iImageIndex, EImageFormat eFormat, bool bBlendingEnabled )
{ {
m_eFormats.AppendTail(CVkImage::GetImageFormat(eFormat)); m_formats.AppendTail({CVkImage::GetImageFormat(eFormat), bBlendingEnabled});
} }
void CVkShader::SetDepthImage( EImageFormat eFormat ) void CVkShader::SetDepthImage( EImageFormat eFormat )
@@ -68,6 +68,7 @@ void CVkShader::Build()
}; };
VkPipelineLayoutCreateInfo stPipelineLayout = {}; VkPipelineLayoutCreateInfo stPipelineLayout = {};
CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {}; CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {};
CUtlVector<VkFormat> formats = {};
// TODO: Filter by vulkan shaders at some points // TODO: Filter by vulkan shaders at some points
stages.Resize(m_shader.m_objects.GetSize()); stages.Resize(m_shader.m_objects.GetSize());
@@ -163,10 +164,13 @@ void CVkShader::Build()
msaa.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; msaa.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
msaa.rasterizationSamples = CVkImage::GetMultisampling(m_eMultiSampling); msaa.rasterizationSamples = CVkImage::GetMultisampling(m_eMultiSampling);
formats.Resize(m_formats.GetSize());
for ( uint32_t i = 0; i < m_formats.GetSize(); i++ )
formats[i] = m_formats[i].m_eFormat;
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 = formats.GetSize();
render.pColorAttachmentFormats = m_eFormats.GetData(); render.pColorAttachmentFormats = formats.GetData();
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
if (m_eDepthFormat == VK_FORMAT_D32_SFLOAT) if (m_eDepthFormat == VK_FORMAT_D32_SFLOAT)
@@ -177,10 +181,22 @@ void CVkShader::Build()
render.depthAttachmentFormat = m_eDepthFormat; render.depthAttachmentFormat = m_eDepthFormat;
} }
for ( auto e: m_eFormats ) for ( auto e: m_formats )
{ {
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;
if (e.m_bIsBlendingEnabled)
{
a.blendEnable = VK_TRUE;
a.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
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_ONE_MINUS_SRC_ALPHA;
a.alphaBlendOp = VK_BLEND_OP_ADD;
}
else
a.blendEnable = VK_FALSE; a.blendEnable = VK_FALSE;
attachments.AppendTail(a); attachments.AppendTail(a);
} }

View File

@@ -21,17 +21,26 @@ VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode )
case DEPENDENCY_MODE_JUST_CREATED: return VK_ACCESS_2_NONE; case DEPENDENCY_MODE_JUST_CREATED: return VK_ACCESS_2_NONE;
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_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
case DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR | 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_SHADER_BUFFER_READ: return VK_ACCESS_2_SHADER_READ_BIT;
case DEPENDENCY_MODE_SHADER_BUFFER_WRITE: return VK_ACCESS_2_SHADER_READ_BIT;
case DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE: return VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_SHADER_WRITE_BIT;
case DEPENDENCY_MODE_SHADER_IMAGE_READ: return VK_ACCESS_2_SHADER_READ_BIT;
case DEPENDENCY_MODE_SHADER_IMAGE_WRITE: return VK_ACCESS_2_SHADER_READ_BIT;
case DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE: return VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_SHADER_WRITE_BIT;
case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE: case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE:
case DEPENDENCY_MODE_IMAGE_SOURCE: case DEPENDENCY_MODE_IMAGE_SOURCE:
case DEPENDENCY_MODE_BUFFER_SOURCE: case DEPENDENCY_MODE_BUFFER_SOURCE:
case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE:
return VK_ACCESS_2_TRANSFER_READ_BIT; return VK_ACCESS_2_TRANSFER_READ_BIT;
case DEPENDENCY_MODE_IMAGE_DESTINATION: case DEPENDENCY_MODE_IMAGE_DESTINATION:
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
case DEPENDENCY_MODE_BUFFER_DESTINATION: case DEPENDENCY_MODE_BUFFER_DESTINATION:
case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION:
return VK_ACCESS_2_TRANSFER_WRITE_BIT; return VK_ACCESS_2_TRANSFER_WRITE_BIT;
default: default:
@@ -46,19 +55,24 @@ VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode )
case DEPENDENCY_MODE_JUST_CREATED: return VK_PIPELINE_STAGE_2_NONE; case DEPENDENCY_MODE_JUST_CREATED: return VK_PIPELINE_STAGE_2_NONE;
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_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT;
case DEPENDENCY_MODE_DRAWCALL_MIXED_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: case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE:
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
return VK_PIPELINE_STAGE_2_BLIT_BIT; return VK_PIPELINE_STAGE_2_BLIT_BIT;
case DEPENDENCY_MODE_BUFFER_SOURCE: case DEPENDENCY_MODE_BUFFER_SOURCE:
case DEPENDENCY_MODE_BUFFER_DESTINATION:
case DEPENDENCY_MODE_IMAGE_SOURCE: case DEPENDENCY_MODE_IMAGE_SOURCE:
case DEPENDENCY_MODE_BUFFER_DESTINATION:
case DEPENDENCY_MODE_IMAGE_DESTINATION: case DEPENDENCY_MODE_IMAGE_DESTINATION:
return VK_PIPELINE_STAGE_2_COPY_BIT; return VK_PIPELINE_STAGE_2_COPY_BIT;
case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE:
case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION:
return VK_PIPELINE_STAGE_2_RESOLVE_BIT;
default: default:
return VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; return VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
} }
@@ -71,16 +85,25 @@ VkImageLayout VulkanGetImageLayout( EDependencyMode eMode )
case DEPENDENCY_MODE_JUST_CREATED: return VK_IMAGE_LAYOUT_UNDEFINED; case DEPENDENCY_MODE_JUST_CREATED: return VK_IMAGE_LAYOUT_UNDEFINED;
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_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL; case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
case DEPENDENCY_MODE_DRAWCALL_MIXED_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_SOURCE: case DEPENDENCY_MODE_BLIT_IMAGE_SOURCE:
case DEPENDENCY_MODE_IMAGE_SOURCE: case DEPENDENCY_MODE_IMAGE_SOURCE:
case DEPENDENCY_MODE_BUFFER_SOURCE: case DEPENDENCY_MODE_BUFFER_SOURCE:
case DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE:
return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
case DEPENDENCY_MODE_IMAGE_DESTINATION: case DEPENDENCY_MODE_IMAGE_DESTINATION:
case DEPENDENCY_MODE_BUFFER_DESTINATION: case DEPENDENCY_MODE_BUFFER_DESTINATION:
case DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION:
return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
case DEPENDENCY_MODE_SHADER_IMAGE_READ:
case DEPENDENCY_MODE_SHADER_IMAGE_WRITE:
case DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE:
return VK_IMAGE_LAYOUT_GENERAL;
default: default:
return VK_IMAGE_LAYOUT_UNDEFINED; return VK_IMAGE_LAYOUT_UNDEFINED;
} }

View File

@@ -49,6 +49,8 @@ enum EDependencyMode
DEPENDENCY_MODE_SHADER_BUFFER_READ, DEPENDENCY_MODE_SHADER_BUFFER_READ,
DEPENDENCY_MODE_SHADER_IMAGE_WRITE, DEPENDENCY_MODE_SHADER_IMAGE_WRITE,
DEPENDENCY_MODE_SHADER_BUFFER_WRITE, DEPENDENCY_MODE_SHADER_BUFFER_WRITE,
DEPENDENCY_MODE_SHADER_BUFFER_READ_WRITE,
DEPENDENCY_MODE_SHADER_IMAGE_READ_WRITE,
DEPENDENCY_MODE_SHADER_ACCELERATION_STRUCTURE, DEPENDENCY_MODE_SHADER_ACCELERATION_STRUCTURE,
DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER, DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER,
@@ -63,6 +65,9 @@ enum EDependencyMode
DEPENDENCY_MODE_IMAGE_DESTINATION, DEPENDENCY_MODE_IMAGE_DESTINATION,
DEPENDENCY_MODE_BUFFER_DESTINATION, DEPENDENCY_MODE_BUFFER_DESTINATION,
DEPENDENCY_MODE_IMAGE_RESOLVE_SOURCE,
DEPENDENCY_MODE_IMAGE_RESOLVE_DESTINATION,
DEPENDENCY_MODE_BLIT_IMAGE_SOURCE, DEPENDENCY_MODE_BLIT_IMAGE_SOURCE,
DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION, DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION,
@@ -97,7 +102,7 @@ struct VulkanCommandParameter_t
}; };
}; };
abstract_class CVkCommand class CVkCommand
{ {
public: public:
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0; virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0;
@@ -266,6 +271,12 @@ void CVk##name##PipelineLibrary::Build() \
vkCreateGraphicsPipelines(m_hDevice, NULL, 1, &pipeline, NULL, &m_hPipeline); \ vkCreateGraphicsPipelines(m_hDevice, NULL, 1, &pipeline, NULL, &m_hPipeline); \
} }
struct VkOutputImageConfig_t
{
VkFormat m_eFormat;
bool m_bIsBlendingEnabled;
};
class CVkShader : public IShader class CVkShader : public IShader
{ {
public: public:
@@ -273,7 +284,7 @@ public:
virtual void AddLayout( int iIndex, int iStride ) override; virtual void AddLayout( int iIndex, int iStride ) override;
virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) override; virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) override;
virtual void SetTopology( ETopologyMode eTopology ) override; virtual void SetTopology( ETopologyMode eTopology ) override;
virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) override; virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat, bool bBlendingEnabled ) override;
virtual void SetDepthImage( EImageFormat eFormat ) override; virtual void SetDepthImage( EImageFormat eFormat ) override;
virtual void SetMultisampling( EMultisampleType eFormat ) override; virtual void SetMultisampling( EMultisampleType eFormat ) override;
virtual void DisablePixelShader( bool bDisable ) override; virtual void DisablePixelShader( bool bDisable ) override;
@@ -289,7 +300,7 @@ public:
private: private:
CUtlVector<VkVertexInputBindingDescription> m_layouts; CUtlVector<VkVertexInputBindingDescription> m_layouts;
CUtlVector<VkVertexInputAttributeDescription> m_attributes; CUtlVector<VkVertexInputAttributeDescription> m_attributes;
CUtlVector<VkFormat> m_eFormats; CUtlVector<VkOutputImageConfig_t> m_formats;
EMultisampleType m_eMultiSampling; EMultisampleType m_eMultiSampling;
VkFormat m_eDepthFormat; VkFormat m_eDepthFormat;
bool m_bIsFragmentEnabled; bool m_bIsFragmentEnabled;
@@ -389,7 +400,6 @@ public:
CVkShader *m_pVkShader; CVkShader *m_pVkShader;
CUtlVector<VkDescriptorSet> m_hSets; CUtlVector<VkDescriptorSet> m_hSets;
ITextureArray *m_pTextureArray;
private: private:
VkDescriptorPool m_hPool; VkDescriptorPool m_hPool;
CUtlVector<VkWriteDescriptorSet> m_writes = {}; CUtlVector<VkWriteDescriptorSet> m_writes = {};
@@ -442,6 +452,13 @@ struct VulkanRenderOutput_t {
EStoreMode m_eStoreMode; EStoreMode m_eStoreMode;
}; };
struct VkRenderBarrier_t
{
IRenderingObject *pObject;
bool m_bIsRead;
bool m_bIsWrite;
};
class CVkRenderCommandList: public IRenderCommandList class CVkRenderCommandList: public IRenderCommandList
{ {
public: public:
@@ -472,6 +489,8 @@ public:
virtual void StartRecording() override; virtual void StartRecording() override;
virtual void EndRecording() override; virtual void EndRecording() override;
virtual void Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite ) override;
void Submit(); void Submit();
IVkCommandBufferManager *m_pCommandBufferManager; IVkCommandBufferManager *m_pCommandBufferManager;
@@ -494,6 +513,7 @@ private:
uint32_t m_uHeight; uint32_t m_uHeight;
CUtlVector<IVkCommandBuffer*> m_pCommandBuffers = {}; CUtlVector<IVkCommandBuffer*> m_pCommandBuffers = {};
CUtlVector<IVkCommandBuffer*> m_pScheduledDestroyPostRaster = {}; CUtlVector<IVkCommandBuffer*> m_pScheduledDestroyPostRaster = {};
CUtlVector<VkRenderBarrier_t> m_barriers = {};
}; };

View File

@@ -27,8 +27,9 @@ public:
virtual void Move( int iY, int iX ) = 0; virtual void Move( int iY, int iX ) = 0;
virtual void SetColor( char c ) = 0; virtual void SetColor( float fX, float fY, float fZ, float fA ) = 0;
virtual void Clear( char c ) = 0; virtual void SetBackgroundColor( float fX, float fY, float fZ, float fA ) = 0;
virtual void Clear( float fX, float fY, float fZ, float fA ) = 0;
virtual void PutChar( char c ) = 0; virtual void PutChar( char c ) = 0;
virtual void Printf(const char *szFormat, ...) = 0; virtual void Printf(const char *szFormat, ...) = 0;

View File

@@ -220,7 +220,7 @@ public:
virtual void AddLayout( int iIndex, int iStride ) = 0; virtual void AddLayout( int iIndex, int iStride ) = 0;
virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) = 0; virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) = 0;
virtual void SetTopology( ETopologyMode eTopology ) = 0; virtual void SetTopology( ETopologyMode eTopology ) = 0;
virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) = 0; virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat, bool bBlendingEnabled = false ) = 0;
virtual void SetDepthImage( EImageFormat eFormat ) = 0; virtual void SetDepthImage( EImageFormat eFormat ) = 0;
virtual void SetMultisampling( EMultisampleType eFormat ) = 0; virtual void SetMultisampling( EMultisampleType eFormat ) = 0;
virtual void DisablePixelShader( bool bDisable) = 0; virtual void DisablePixelShader( bool bDisable) = 0;
@@ -287,6 +287,8 @@ public:
virtual void StartRecording() = 0; virtual void StartRecording() = 0;
virtual void EndRecording() = 0; virtual void EndRecording() = 0;
virtual void Barrier( IRenderingObject *pObject, bool bIsRead, bool bIsWrite ) = 0;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------