textures
This commit is contained in:
@@ -6,11 +6,13 @@
|
||||
#include "tier1/interface.h"
|
||||
#include "tier1/utlstring.h"
|
||||
#include "tier1/utlvector.h"
|
||||
#include "tier2/ifilesystem.h"
|
||||
#define VK_NO_PROTOTYPES
|
||||
#include "vulkan/vulkan_core.h"
|
||||
#include "vulkan_state.h"
|
||||
#include "materialsystem/igamewindow.h"
|
||||
#include "libraries.h"
|
||||
#include "stb/stb_image.h"
|
||||
|
||||
|
||||
#define REQUIRED_EXTENSION(ext) ext##_EXTENSION_NAME,
|
||||
@@ -103,21 +105,64 @@ VkFormat CVkImage::GetImageFormat( enum EImageFormat eImageFormat )
|
||||
{
|
||||
case IMAGE_FORMAT_R8_UINT:
|
||||
return VK_FORMAT_R8_UINT;
|
||||
case IMAGE_FORMAT_RGB8_UINT:
|
||||
return VK_FORMAT_R8G8B8_UINT;
|
||||
case IMAGE_FORMAT_RGB8_SINT:
|
||||
return VK_FORMAT_R8G8B8_SINT;
|
||||
case IMAGE_FORMAT_RGB8_UNORM:
|
||||
return VK_FORMAT_R8G8B8_UNORM;
|
||||
case IMAGE_FORMAT_RGB8_SNORM:
|
||||
return VK_FORMAT_R8G8B8_SNORM;
|
||||
|
||||
case IMAGE_FORMAT_RGB16_UINT:
|
||||
return VK_FORMAT_R16G16B16_UINT;
|
||||
case IMAGE_FORMAT_RGB16_SINT:
|
||||
return VK_FORMAT_R16G16B16_SINT;
|
||||
case IMAGE_FORMAT_RGB16_UNORM:
|
||||
return VK_FORMAT_R16G16B16_UNORM;
|
||||
case IMAGE_FORMAT_RGB16_SNORM:
|
||||
return VK_FORMAT_R16G16B16_SNORM;
|
||||
case IMAGE_FORMAT_RGB16_SFLOAT:
|
||||
return VK_FORMAT_R16G16B16_SFLOAT;
|
||||
|
||||
case IMAGE_FORMAT_RGB32_SFLOAT:
|
||||
return VK_FORMAT_R32G32B32_SFLOAT;
|
||||
|
||||
case IMAGE_FORMAT_RGBA8_UNORM:
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
case IMAGE_FORMAT_BGRA8_UNORM:
|
||||
return VK_FORMAT_B8G8R8A8_UNORM;
|
||||
|
||||
case IMAGE_FORMAT_RGBA8_UINT:
|
||||
return VK_FORMAT_R8G8B8A8_UINT;
|
||||
case IMAGE_FORMAT_RGBA8_SINT:
|
||||
return VK_FORMAT_R8G8B8A8_SINT;
|
||||
|
||||
case IMAGE_FORMAT_RGBA16_UINT:
|
||||
return VK_FORMAT_R16G16B16A16_UINT;
|
||||
case IMAGE_FORMAT_RGBA16_SINT:
|
||||
return VK_FORMAT_R16G16B16A16_SINT;
|
||||
case IMAGE_FORMAT_RGBA16_UNORM:
|
||||
return VK_FORMAT_R16G16B16A16_UNORM;
|
||||
case IMAGE_FORMAT_RGBA16_SNORM:
|
||||
return VK_FORMAT_R16G16B16A16_SNORM;
|
||||
case IMAGE_FORMAT_RGBA16_SFLOAT:
|
||||
return VK_FORMAT_R16G16B16A16_SFLOAT;
|
||||
|
||||
case IMAGE_FORMAT_RGBA32_SFLOAT:
|
||||
return VK_FORMAT_R32G32B32A32_SFLOAT;
|
||||
|
||||
case IMAGE_FORMAT_BC1:
|
||||
return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
|
||||
case IMAGE_FORMAT_BC3:
|
||||
return VK_FORMAT_BC3_UNORM_BLOCK;
|
||||
case IMAGE_FORMAT_BC7:
|
||||
return VK_FORMAT_BC7_UNORM_BLOCK;
|
||||
|
||||
case IMAGE_FORMAT_D32_SFLOAT:
|
||||
return VK_FORMAT_D32_SFLOAT;
|
||||
}
|
||||
return VK_FORMAT_UNDEFINED;
|
||||
}
|
||||
|
||||
VkSampleCountFlagBits CVkImage::GetMultisampling( enum EMultisampleType eImageFormat )
|
||||
@@ -211,6 +256,14 @@ CVkBuffer::CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlig
|
||||
|
||||
stUsage.sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO;
|
||||
stUsage.usage = eUsage | VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT;
|
||||
if (eUsage & VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT)
|
||||
{
|
||||
m_eDescriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
}
|
||||
if (eUsage & VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT)
|
||||
{
|
||||
m_eDescriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
}
|
||||
|
||||
stBufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||
stBufferInfo.size = nSize;
|
||||
@@ -219,7 +272,8 @@ CVkBuffer::CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlig
|
||||
stAllocInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;
|
||||
stAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;
|
||||
|
||||
vmaCreateBuffer(s_vkAllocator, &stBufferInfo, &stAllocInfo, &m_buffer, &m_allocation, NULL);
|
||||
VkResult r = vmaCreateBuffer(s_vkAllocator, &stBufferInfo, &stAllocInfo, &m_buffer, &m_allocation, NULL);
|
||||
|
||||
|
||||
stAddress.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
|
||||
stAddress.buffer = m_buffer;
|
||||
@@ -267,6 +321,118 @@ uint32_t CVkBuffer::GetSize()
|
||||
{
|
||||
return m_nSize;
|
||||
}
|
||||
|
||||
CVkTextureArray::~CVkTextureArray()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CVkTextureArray::CVkTextureArray()
|
||||
{
|
||||
for (uint32_t i = 0; i < 128; i++ )
|
||||
m_pImages[i] = NULL;
|
||||
|
||||
}
|
||||
|
||||
void CVkTextureArray::Build()
|
||||
{
|
||||
for (uint32_t i = 0; i < 128; i++ )
|
||||
m_pImages[i] = NULL;
|
||||
|
||||
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(m_hDevice, &samplerInfo, nullptr, &m_hSampler);
|
||||
|
||||
LoadTexture("game/core/textures/error.png");
|
||||
}
|
||||
|
||||
void CVkTextureArray::SetDebugName( const char *szPath )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint32_t CVkTextureArray::LoadTexture( const char *szPath )
|
||||
{
|
||||
for (uint32_t i = 0; i < 128; i++ )
|
||||
{
|
||||
if (m_pImages[i] == NULL)
|
||||
return CreateTexture(i, szPath);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern IFileSystem *filesystem;
|
||||
uint32_t CVkTextureArray::CreateTexture( uint32_t i, const char *szPath )
|
||||
{
|
||||
if ( filesystem == NULL )
|
||||
{
|
||||
CreateInterfaceFn pFilesystemFactory = Sys_GetFactory("filesystem_std");
|
||||
filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL);
|
||||
}
|
||||
IFileHandle *pHandle = filesystem->Open(szPath, FILEMODE_READ);
|
||||
CUtlBuffer<unsigned char> data = filesystem->Size(pHandle);
|
||||
filesystem->Read(pHandle, data.GetMemory(), data.GetSize());
|
||||
filesystem->Close(pHandle);
|
||||
int uWidth = 0;
|
||||
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);
|
||||
pBuffer->Lock();
|
||||
void *pData = pBuffer->Map();
|
||||
V_memcpy(pData, pImg, uWidth*uHeight*uChannels);
|
||||
pBuffer->Unmap();
|
||||
pBuffer->Unlock();
|
||||
IImage *pImage = m_pRenderContext->CreateTexture(uWidth, uHeight, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_NONE);
|
||||
IImage *pCompressedImage = m_pRenderContext->CreateTexture(uWidth, uHeight, IMAGE_FORMAT_BC1, MULTISAMPLE_TYPE_NONE);
|
||||
m_pImages[i] = (CVkImage*)pImage;
|
||||
stbi_image_free(pImg);
|
||||
|
||||
|
||||
CVkCopyBufferToImageCommand *pCopyCommand = NULL;
|
||||
IVkCommandBuffer *pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
|
||||
pCommandBuffer->Reset();
|
||||
pCopyCommand = CREATE_COMMAND(m_pCommandBufferManager, CopyBufferToImage);
|
||||
pCopyCommand->AddDependency((IRenderingObject*)pBuffer, DEPENDENCY_MODE_BUFFER_SOURCE);
|
||||
pCopyCommand->AddDependency((IRenderingObject*)pImage, DEPENDENCY_MODE_IMAGE_DESTINATION);
|
||||
pCopyCommand->pBuffer = pBuffer;
|
||||
pCopyCommand->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
|
||||
pCopyCommand->stOutputImage.m_pSingle = pImage;
|
||||
pCopyCommand->iImageX = uWidth;
|
||||
pCopyCommand->iImageY = uWidth;
|
||||
pCommandBuffer->AddCommand(pCopyCommand);
|
||||
pCommandBuffer->Render();
|
||||
pCommandBuffer->Submit();
|
||||
return i;
|
||||
}
|
||||
|
||||
uint32_t CVkTextureArray::GetTextureID( const char *szPath )
|
||||
{
|
||||
}
|
||||
|
||||
void CVkTextureArray::UnloadTexture( uint32_t uTextureID )
|
||||
{
|
||||
|
||||
}
|
||||
void CVkTextureArray::Frame()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
class CVkRenderContext: public IRenderContext
|
||||
{
|
||||
public:
|
||||
@@ -281,6 +447,7 @@ public:
|
||||
virtual void DestroyBuffer( IBuffer *pBuffer ) override;
|
||||
|
||||
virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
|
||||
virtual IImage *CreateTexture( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
|
||||
virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
|
||||
virtual void DestroyImage( IImage *pImage ) override;
|
||||
|
||||
@@ -302,6 +469,9 @@ public:
|
||||
virtual void RenderGameWindow( IGameWindow *pWindow ) override;
|
||||
virtual void RegisterGameWindow( IGameWindow *pWindow ) override;
|
||||
virtual void UnregisterGameWindow( IGameWindow *pWindow ) override;
|
||||
|
||||
virtual ITextureArray *CreateTextureArray() override;
|
||||
virtual void DestroyTextureArray() override;
|
||||
private:
|
||||
VkPhysicalDevice SelectPhysicalDevice( CUtlVector<VkPhysicalDevice> physicalDevices );
|
||||
CUtlVector<const char *> GetDeviceExtensions();
|
||||
@@ -313,11 +483,14 @@ private:
|
||||
|
||||
IGameWindowManager *m_pWindowManager;
|
||||
IVkCommandBufferManager *m_pCommandBufferManager;
|
||||
IVkCommandBufferManager *m_pAssetsCommandBufferManager;
|
||||
|
||||
CUtlVector<VulkanWindow_t> m_renderWindows;
|
||||
CUtlVector<CVkMaterial*> m_pMaterials;
|
||||
CUtlVector<CVkTextureArray*> m_pTextureArrays;
|
||||
|
||||
CUtlVector<CVkRenderCommandList*> m_scheduledRemovalLists;
|
||||
CUtlVector<CVkTextureArray*> m_scheduledRemovalTextureArrays;
|
||||
CUtlVector<CVkBuffer*> m_scheduledRemovalBuffers;
|
||||
CUtlVector<CVkImage*> m_scheduledRemovalImages;
|
||||
};
|
||||
@@ -382,6 +555,10 @@ IImage *CVkRenderContext::CreateRenderTarget( uint32_t x, uint32_t y, EImageForm
|
||||
else
|
||||
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
IImage *CVkRenderContext::CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType )
|
||||
{
|
||||
@@ -447,7 +624,6 @@ void CVkRenderContext::SubmitCommandList(IRenderCommandList *pList)
|
||||
}
|
||||
void CVkRenderContext::RenderGameWindow( IGameWindow *pWindow )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CVkRenderContext::SetMainWindowManager( IGameWindowManager *pWindowManager )
|
||||
@@ -463,9 +639,24 @@ void CVkRenderContext::RegisterGameWindow( IGameWindow *pWindow )
|
||||
|
||||
void CVkRenderContext::UnregisterGameWindow( IGameWindow *pWindow )
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
ITextureArray *CVkRenderContext::CreateTextureArray()
|
||||
{
|
||||
CVkTextureArray *pArray = new CVkTextureArray();
|
||||
pArray->m_hDevice = s_vkDevice;
|
||||
pArray->m_pRenderContext = this;
|
||||
pArray->m_pCommandBufferManager = m_pCommandBufferManager;
|
||||
pArray->Build();
|
||||
return pArray;
|
||||
}
|
||||
|
||||
void CVkRenderContext::DestroyTextureArray()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
VkPipelineLayout g_pLibraryEmptyLayout;
|
||||
static IVkCommandBuffer *s_pPresentCommandBuffer;
|
||||
@@ -576,13 +767,21 @@ void CVkRenderContext::Init()
|
||||
vk12Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
|
||||
vk12Features.pNext = &vk13Features;
|
||||
vk12Features.bufferDeviceAddress = VK_TRUE;
|
||||
vk12Features.runtimeDescriptorArray = VK_TRUE;
|
||||
vk12Features.descriptorBindingPartiallyBound = VK_TRUE;
|
||||
vk12Features.descriptorBindingVariableDescriptorCount = VK_TRUE;
|
||||
VkPhysicalDeviceVulkan11Features vk11Features = {};
|
||||
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
|
||||
vk11Features.pNext = &vk12Features;
|
||||
vk11Features.shaderDrawParameters = VK_TRUE;
|
||||
|
||||
|
||||
stDeviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||
stDeviceCreateInfo.queueCreateInfoCount = 1;
|
||||
stDeviceCreateInfo.pQueueCreateInfos = &stDeviceQueueCreateInfo;
|
||||
stDeviceCreateInfo.enabledExtensionCount = enabledDeviceExtensions.GetSize();
|
||||
stDeviceCreateInfo.ppEnabledExtensionNames = enabledDeviceExtensions.GetData();
|
||||
stDeviceCreateInfo.pNext = &vk12Features;
|
||||
stDeviceCreateInfo.pNext = &vk11Features;
|
||||
r = vkCreateDevice(s_vkPhysicalDevice, &stDeviceCreateInfo, NULL, &s_vkDevice);
|
||||
VULKAN_RESULT_PRINT(r, vkEnumeratePhysicalDevices);
|
||||
for (auto &extension: enabledDeviceExtensions)
|
||||
@@ -631,6 +830,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
|
||||
for ( auto &m: m_pMaterials)
|
||||
{
|
||||
m->Frame();
|
||||
}
|
||||
|
||||
i = 0;
|
||||
@@ -679,10 +879,11 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
for ( auto &s: m_renderWindows )
|
||||
{
|
||||
|
||||
|
||||
CVkBlitCommand *pBlitCommand = NULL;
|
||||
if (s.m_pWindow->GetOutputImage())
|
||||
{
|
||||
pBlitCommand = CREATE_COMMAND(Blit);
|
||||
pBlitCommand = CREATE_COMMAND(m_pCommandBufferManager, Blit);
|
||||
pBlitCommand->AddDependency(s.m_pWindow->GetOutputImage(), DEPENDENCY_MODE_BLIT_IMAGE_SOURCE);
|
||||
pBlitCommand->AddDependency((IRenderingObject*)s.m_images[uSwapchainImageIndexes[i]], DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION);
|
||||
pBlitCommand->stInputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
|
||||
|
||||
Reference in New Issue
Block a user