work on basic VR

This commit is contained in:
2026-05-30 20:43:02 +03:00
parent 4811ad0820
commit 3b128315e7
18 changed files with 716 additions and 29 deletions

View File

@@ -13,6 +13,7 @@
#include "materialsystem/igamewindow.h"
#include "libraries.h"
#include "stb/stb_image.h"
#include "ixr.h"
#define REQUIRED_EXTENSION(ext) ext##_EXTENSION_NAME,
@@ -137,6 +138,8 @@ VkFormat CVkImage::GetImageFormat( enum EImageFormat eImageFormat )
return VK_FORMAT_R8G8B8A8_UINT;
case IMAGE_FORMAT_RGBA8_SINT:
return VK_FORMAT_R8G8B8A8_SINT;
case IMAGE_FORMAT_RGBA8_SRGB:
return VK_FORMAT_R8G8B8A8_SRGB;
case IMAGE_FORMAT_RGBA16_UINT:
return VK_FORMAT_R16G16B16A16_UINT;
@@ -451,6 +454,7 @@ public:
virtual void Init() override;
virtual void Frame( float fDeltaTime ) override;
virtual void Shutdown() override;
virtual void ConnectInterface( void *pIface, const char *szName ) override;
virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) override;
virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) override;
@@ -478,8 +482,6 @@ public:
virtual void DestroyCommandList( IRenderCommandList *pCommandList ) override;
virtual void SubmitCommandList(IRenderCommandList *pList) override;
virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) override;
virtual void RenderGameWindow( IGameWindow *pWindow ) override;
virtual void RegisterGameWindow( IGameWindow *pWindow ) override;
virtual void UnregisterGameWindow( IGameWindow *pWindow ) override;
@@ -488,6 +490,11 @@ public:
virtual void DestroyTextureArray() override;
virtual ISampler *GetDefaultSampler() override;
virtual void *GetVulkanInstance() override;
virtual void *GetVulkanPhysicalDevice() override;
virtual void *GetVulkanDevice() override;
virtual IImage *CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
private:
VkPhysicalDevice SelectPhysicalDevice( CUtlVector<VkPhysicalDevice> physicalDevices );
CUtlVector<const char *> GetDeviceExtensions();
@@ -497,7 +504,8 @@ private:
VulkanWindow_t CreateSwapchain( IGameWindow *pWindow );
void DestroySwapchain( uint32_t uIndex );
IGameWindowManager *m_pWindowManager;
IGameWindowManager *m_pWindowManager = NULL;
IXRManager *m_pXRManager = NULL;
IVkCommandBufferManager *m_pCommandBufferManager;
IVkCommandBufferManager *m_pAssetsCommandBufferManager;
@@ -515,6 +523,14 @@ private:
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
void CVkRenderContext::ConnectInterface( void *pIface, const char *szName )
{
if (!V_strcmp(szName, GAME_WINDOW_MANAGER_INTERFACE_VERSION))
m_pWindowManager = (IGameWindowManager*)pIface;
if (!V_strcmp(szName, XR_INTERFACE_VERSION))
m_pXRManager = (IXRManager*)pIface;
}
//-----------------------------------------------------------------------------
// Creates vertex buffer. Wrapper over CreateBuffer
//-----------------------------------------------------------------------------
@@ -660,11 +676,6 @@ void CVkRenderContext::RenderGameWindow( IGameWindow *pWindow )
{
}
void CVkRenderContext::SetMainWindowManager( IGameWindowManager *pWindowManager )
{
m_pWindowManager = pWindowManager;
}
void CVkRenderContext::RegisterGameWindow( IGameWindow *pWindow )
{
VulkanWindow_t window = CreateSwapchain(pWindow);
@@ -696,6 +707,35 @@ ISampler *CVkRenderContext::GetDefaultSampler()
}
void *CVkRenderContext::GetVulkanInstance()
{
return s_vkInstance;
}
void *CVkRenderContext::GetVulkanPhysicalDevice()
{
return s_vkPhysicalDevice;
}
void *CVkRenderContext::GetVulkanDevice()
{
return s_vkDevice;
}
IImage *CVkRenderContext::CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType )
{
CVkImage *pImage;
pImage = new CVkImage;
pImage->m_image = (VkImage)pVkImage;
pImage->m_eImageType = IMAGE_TYPE_2D;
pImage->m_eMultisampleType = eMultisampleType;
pImage->m_eFormat = eFormat;
pImage->m_nHeight = x;
pImage->m_nWidth = y;
pImage->m_ePreferredLayout = (VkImageLayout)optimalLayout;
pImage->CreateImageView();
return pImage;
}
VkPipelineLayout g_pLibraryEmptyLayout;
static IVkCommandBuffer *s_pPresentCommandBuffer;
@@ -746,6 +786,7 @@ void CVkRenderContext::Init()
stInstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
stInstanceCreateInfo.pApplicationInfo = &stApplicationInfo;
enabledInstanceExtensions.AppendTail(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
stInstanceCreateInfo.enabledExtensionCount = enabledInstanceExtensions.GetSize();
stInstanceCreateInfo.ppEnabledExtensionNames = enabledInstanceExtensions.GetData();
@@ -814,6 +855,7 @@ void CVkRenderContext::Init()
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
vk11Features.pNext = &vk12Features;
vk11Features.shaderDrawParameters = VK_TRUE;
vk11Features.multiview = VK_TRUE;
stDeviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
@@ -915,6 +957,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
uImageIndexes.AppendTail(s.m_uCurrentFrame);
}
uSwapchainImageIndexes.Resize(m_renderWindows.GetSize());
vkWaitForFences(s_vkDevice, fences.GetSize(), fences.GetData(), VK_TRUE, UINT64_MAX);
vkResetFences(s_vkDevice, fences.GetSize(), fences.GetData());
@@ -925,6 +968,9 @@ void CVkRenderContext::Frame( float fDeltaTime )
VkResult r = vkAcquireNextImageKHR(s_vkDevice, s.m_swapchain, UINT64_MAX, s.m_imageAvailable[s.m_uCurrentFrame], NULL, &uSwapchainImageIndexes[i]);
i++;
}
if (m_pXRManager)
m_pXRManager->PreRender();
s_pPresentCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
@@ -965,6 +1011,9 @@ void CVkRenderContext::Frame( float fDeltaTime )
s_pPresentCommandBuffer->Render();
s_pPresentCommandBuffer->Submit(0);
if (m_pXRManager)
m_pXRManager->CopySwapchain();
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
VkSubmitInfo stSubmitInfo = {};
@@ -992,6 +1041,8 @@ void CVkRenderContext::Frame( float fDeltaTime )
vkQueuePresentKHR(s_vkPresentQueue, &stPresentInfo);
vkDeviceWaitIdle(s_vkDevice);
if (m_pXRManager)
m_pXRManager->PostRender();
for ( auto &s: m_renderWindows )
{