somewhat working material system

This commit is contained in:
2026-02-06 15:43:22 +02:00
parent 7ac98cf9ba
commit 898bf90504
9 changed files with 140 additions and 17 deletions

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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();

View File

@@ -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);
};