work on basic VR
This commit is contained in:
@@ -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 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user