somewhat working material system
This commit is contained in:
@@ -46,6 +46,10 @@ BEGIN_VULKAN_COMMAND(SetShader)
|
||||
IShader *pShader;
|
||||
END_VULKAN_COMMAND(SetShader)
|
||||
|
||||
BEGIN_VULKAN_COMMAND(SetShaderData)
|
||||
IMaterial *pShaderData;
|
||||
END_VULKAN_COMMAND(SetShaderData)
|
||||
|
||||
BEGIN_VULKAN_COMMAND(DrawPrimitives)
|
||||
uint32_t nVertexCount;
|
||||
uint32_t nFirstVertex;
|
||||
|
||||
@@ -66,6 +66,11 @@ DECLARE_VULKAN_COMMAND(SetShader)
|
||||
CVkShader *pVkShader = (CVkShader*)pShader;
|
||||
vkCmdBindPipeline(hCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pVkShader->m_hPipeline);
|
||||
}
|
||||
DECLARE_VULKAN_COMMAND(SetShaderData)
|
||||
{
|
||||
CVkMaterial *pMat = (CVkMaterial*)pShaderData;
|
||||
vkCmdBindDescriptorSets(hCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pMat->m_pVkShader->m_hPipelineLayout, 0, 1, &pMat->m_hSet, 0, 0 );
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(SetVertexBuffer)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,48 @@
|
||||
CVkMaterial::CVkMaterial( IShader *pShader )
|
||||
{
|
||||
m_pVkShader = (CVkShader*)pShader;
|
||||
|
||||
VkDescriptorPoolSize pools[1] =
|
||||
{
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
128,
|
||||
}
|
||||
};
|
||||
VkDescriptorPoolCreateInfo stPool = {};
|
||||
stPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
stPool.poolSizeCount = 1;
|
||||
stPool.pPoolSizes = pools;
|
||||
stPool.maxSets = 1;
|
||||
stPool.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
|
||||
vkCreateDescriptorPool(m_pVkShader->m_hDevice, &stPool, NULL, &m_hPool);
|
||||
|
||||
VkDescriptorSetAllocateInfo stInfo = {};
|
||||
stInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
stInfo.descriptorSetCount = 1;
|
||||
stInfo.descriptorPool = m_hPool;
|
||||
stInfo.pSetLayouts = m_pVkShader->m_setLayouts.GetData();
|
||||
vkAllocateDescriptorSets(m_pVkShader->m_hDevice, &stInfo, &m_hSet);
|
||||
|
||||
for ( auto b: m_pVkShader->m_bindings )
|
||||
{
|
||||
VkWriteDescriptorSet write = {};
|
||||
write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write.dstSet = m_hSet;
|
||||
write.dstBinding = b.uBinding;
|
||||
write.dstArrayElement = 0;
|
||||
write.descriptorType = b.eDescriptorType;
|
||||
write.descriptorCount = 1;
|
||||
switch (b.eDescriptorType)
|
||||
{
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
write.pBufferInfo = new VkDescriptorBufferInfo;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
m_writes.AppendTail(write);
|
||||
}
|
||||
}
|
||||
|
||||
CVkMaterial::~CVkMaterial()
|
||||
@@ -9,6 +51,11 @@ CVkMaterial::~CVkMaterial()
|
||||
|
||||
}
|
||||
|
||||
void CVkMaterial::Frame()
|
||||
{
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, m_writes.GetSize(), m_writes.GetData(), 0, 0);
|
||||
};
|
||||
|
||||
void CVkMaterial::VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource )
|
||||
{
|
||||
SetShaderResource(uRegister, SHADER_STAGE_VERTEX, pResource);
|
||||
@@ -31,6 +78,16 @@ void CVkMaterial::PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants
|
||||
|
||||
void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject)
|
||||
{
|
||||
|
||||
union {
|
||||
IRenderingObject *pVkObject;
|
||||
CVkBuffer *pBuffer;
|
||||
};
|
||||
pVkObject = pObject;
|
||||
if (dynamic_cast<IBuffer*>(pObject))
|
||||
{
|
||||
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->buffer = pBuffer->m_buffer;
|
||||
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->range = pBuffer->m_nSize;
|
||||
}
|
||||
Frame();
|
||||
}
|
||||
|
||||
|
||||
@@ -87,6 +87,10 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
|
||||
pSetShader->pShader = ((CVkMaterial*)pMaterial)->m_pVkShader;
|
||||
m_pCurrentMaterialBuffer->AddCommand(pSetShader);
|
||||
|
||||
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(SetShaderData);
|
||||
pSetShaderData->pShaderData = pMaterial;
|
||||
m_pCurrentMaterialBuffer->AddCommand(pSetShaderData);
|
||||
|
||||
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(SetScissors);
|
||||
pScissorsCommand->uWidth = m_uWidth;
|
||||
pScissorsCommand->uHeight = m_uHeight;
|
||||
|
||||
@@ -294,6 +294,7 @@ private:
|
||||
IVkCommandBufferManager *m_pCommandBufferManager;
|
||||
|
||||
CUtlVector<VulkanWindow_t> m_renderWindows;
|
||||
CUtlVector<CVkMaterial*> m_pMaterials;
|
||||
};
|
||||
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
|
||||
@@ -392,7 +393,9 @@ void CVkRenderContext::DestroyShader( IShader *pShader )
|
||||
|
||||
IMaterial *CVkRenderContext::CreateMaterial( IShader *pShader )
|
||||
{
|
||||
return new CVkMaterial(pShader);
|
||||
CVkMaterial *pMaterial = new CVkMaterial(pShader);
|
||||
m_pMaterials.AppendTail(pMaterial);
|
||||
return pMaterial;
|
||||
}
|
||||
|
||||
void CVkRenderContext::DestroyMaterial( IMaterial *pMaterial )
|
||||
@@ -601,6 +604,10 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
CUtlVector<VulkanWindow_t> recreatedWindows = {};
|
||||
vkDeviceWaitIdle(s_vkDevice);
|
||||
|
||||
for ( auto &m: m_pMaterials)
|
||||
{
|
||||
}
|
||||
|
||||
i = 0;
|
||||
for ( auto &s: m_renderWindows)
|
||||
{
|
||||
|
||||
@@ -61,17 +61,36 @@ void CVkShader::Build()
|
||||
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
|
||||
};
|
||||
VkPipelineLayoutCreateInfo stPipelineLayout = {};
|
||||
|
||||
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||
vkCreatePipelineLayout(m_hDevice, &stPipelineLayout, NULL, &m_hPipelineLayout);
|
||||
CUtlVector<VkDescriptorSetLayoutBinding> bindings = {};
|
||||
|
||||
// TODO: Filter by vulkan shaders at some points
|
||||
stages.Resize(m_shader.m_objects.GetSize());
|
||||
modules.Resize(m_shader.m_objects.GetSize());
|
||||
for ( int i = 0; i < m_shader.m_objects.GetSize(); i++ )
|
||||
{
|
||||
V_printf("a: %p\n", m_shader.m_lumps[i].m_pAddress);
|
||||
|
||||
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nMetadataLump);
|
||||
for ( int u = 0; u < pMetaData->nDescriptorsCount; u++ )
|
||||
{
|
||||
VulkanDescriptor_t *pDescriptor = (VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets);
|
||||
V_printf("%s\n" ,pDescriptor->szName);
|
||||
bool bFound = false;
|
||||
for ( auto &b: bindings )
|
||||
{
|
||||
if (b.binding != pDescriptor->uBinding)
|
||||
continue;
|
||||
bFound = true;
|
||||
break;
|
||||
}
|
||||
if (bFound)
|
||||
break;
|
||||
VkDescriptorSetLayoutBinding bind = {};
|
||||
bind.binding = pDescriptor->uBinding;
|
||||
bind.descriptorCount = 1;
|
||||
bind.descriptorType = pDescriptor->eDescriptorType;
|
||||
bind.stageFlags = VK_SHADER_STAGE_ALL;
|
||||
bindings.AppendTail(bind);
|
||||
m_bindings.AppendTail(*pDescriptor);
|
||||
}
|
||||
modules[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
modules[i].pCode = (uint32_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nDataLump);
|
||||
modules[i].codeSize = m_shader.GetLumpSize(m_shader.m_objects[i].m_nDataLump);
|
||||
@@ -81,6 +100,22 @@ void CVkShader::Build()
|
||||
stages[i].stage = VulkanGetShaderStage(m_shader.m_objects[i].m_eStage);
|
||||
}
|
||||
|
||||
if ( bindings.GetSize() >= 0 )
|
||||
{
|
||||
m_setLayouts.Resize(1);
|
||||
VkDescriptorSetLayoutCreateInfo stSetLayoutCreateInfo = {};
|
||||
stSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||
stSetLayoutCreateInfo.pBindings = bindings.GetData();
|
||||
stSetLayoutCreateInfo.bindingCount = bindings.GetSize();
|
||||
stSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
|
||||
vkCreateDescriptorSetLayout(m_hDevice, &stSetLayoutCreateInfo, NULL, m_setLayouts.GetData());
|
||||
stPipelineLayout.setLayoutCount = 1;
|
||||
stPipelineLayout.pSetLayouts = m_setLayouts.GetData();
|
||||
}
|
||||
|
||||
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||
vkCreatePipelineLayout(m_hDevice, &stPipelineLayout, NULL, &m_hPipelineLayout);
|
||||
|
||||
vertexInput.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||
vertexInput.vertexBindingDescriptionCount = m_layouts.GetSize();
|
||||
vertexInput.pVertexBindingDescriptions = m_layouts.GetData();
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "tier2/iappsystem.h"
|
||||
#include "materialsystem/imaterialsystem.h"
|
||||
#include "materialsystem/shaderinternals.h"
|
||||
#include "vulkan/vulkan_core.h"
|
||||
#include "materialsystem/vulkan_shadermeta.h"
|
||||
|
||||
#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext;
|
||||
#define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext;
|
||||
@@ -268,9 +268,11 @@ public:
|
||||
CUtlVector<CVkPipelineLibrary*> m_libraries;
|
||||
VkDevice m_hDevice;
|
||||
CCompiledShader m_shader;
|
||||
CUtlVector<VkDescriptorSetLayout> m_setLayouts;
|
||||
CUtlVector<VulkanDescriptor_t> m_bindings;
|
||||
private:
|
||||
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
|
||||
CUtlVector<VkVertexInputBindingDescription> m_layouts;
|
||||
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
|
||||
CUtlVector<VkFormat> m_eFormats;
|
||||
|
||||
};
|
||||
@@ -281,7 +283,7 @@ public:
|
||||
CVkMaterial( IShader *pShader );
|
||||
virtual ~CVkMaterial() override;
|
||||
|
||||
virtual uint32_t GetResourceByName( const char *szString );
|
||||
void Frame();
|
||||
|
||||
virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
|
||||
virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||
@@ -290,7 +292,10 @@ public:
|
||||
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||
|
||||
CVkShader *m_pVkShader;
|
||||
VkDescriptorSet m_hSet;
|
||||
private:
|
||||
VkDescriptorPool m_hPool;
|
||||
CUtlVector<VkWriteDescriptorSet> m_writes = {};
|
||||
void SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user