somewhat working material system
This commit is contained in:
@@ -26,6 +26,7 @@ DECLARE_BUILD_STAGE(engine)
|
|||||||
compileProject.includeDirectories = {
|
compileProject.includeDirectories = {
|
||||||
"../public",
|
"../public",
|
||||||
"../external/SDL/include",
|
"../external/SDL/include",
|
||||||
|
"../external/cglm/include",
|
||||||
FUNNYSTDLIB"public",
|
FUNNYSTDLIB"public",
|
||||||
};
|
};
|
||||||
compileProject.bFPIC = true;
|
compileProject.bFPIC = true;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "tier0/commandline.h"
|
#include "tier0/commandline.h"
|
||||||
#include "tier0/mem.h"
|
#include "tier0/mem.h"
|
||||||
#include "sv_dll.h"
|
#include "sv_dll.h"
|
||||||
|
#include "cglm/cglm.h"
|
||||||
|
|
||||||
IRenderContext *g_pRenderContext;
|
IRenderContext *g_pRenderContext;
|
||||||
IFileSystem *filesystem;
|
IFileSystem *filesystem;
|
||||||
@@ -47,14 +48,15 @@ extern "C" void FunnyMain( int argc, char **argv )
|
|||||||
IVertexBuffer *pVertices = NULL;
|
IVertexBuffer *pVertices = NULL;
|
||||||
|
|
||||||
float vertices[18] = {
|
float vertices[18] = {
|
||||||
-0.5, -0.5, 0,
|
-0.5, -0.5, 0.5,
|
||||||
0.5, -0.5, 0,
|
0.5, -0.5, 0.5,
|
||||||
-0.5, 0.5, 0,
|
-0.5, 0.5, 0.5,
|
||||||
-0.5, 0.5, 0,
|
-0.5, 0.5, 0.5,
|
||||||
0.5, -0.5, 0,
|
0.5, -0.5, 0.5,
|
||||||
0.5, 0.5, 0
|
0.5, 0.5, 0.5
|
||||||
|
|
||||||
};
|
};
|
||||||
|
mat4 mat;
|
||||||
|
glm_mat4_identity(mat);
|
||||||
|
|
||||||
pVertices = g_pRenderContext->CreateVertexBuffer(72);
|
pVertices = g_pRenderContext->CreateVertexBuffer(72);
|
||||||
|
|
||||||
@@ -63,6 +65,9 @@ extern "C" void FunnyMain( int argc, char **argv )
|
|||||||
pVertices->Unmap();
|
pVertices->Unmap();
|
||||||
|
|
||||||
pCameraInfoBuffer = g_pRenderContext->CreateConstantBuffer(64);
|
pCameraInfoBuffer = g_pRenderContext->CreateConstantBuffer(64);
|
||||||
|
pMapped = pCameraInfoBuffer->Map();
|
||||||
|
V_memcpy(pMapped, mat, 64);
|
||||||
|
pCameraInfoBuffer->Unmap();
|
||||||
|
|
||||||
pShader = g_pRenderContext->CreateShader("game/core/shaders/flat.shader_c");
|
pShader = g_pRenderContext->CreateShader("game/core/shaders/flat.shader_c");
|
||||||
pShader->AddLayout(0, 12);
|
pShader->AddLayout(0, 12);
|
||||||
|
|||||||
@@ -46,6 +46,10 @@ BEGIN_VULKAN_COMMAND(SetShader)
|
|||||||
IShader *pShader;
|
IShader *pShader;
|
||||||
END_VULKAN_COMMAND(SetShader)
|
END_VULKAN_COMMAND(SetShader)
|
||||||
|
|
||||||
|
BEGIN_VULKAN_COMMAND(SetShaderData)
|
||||||
|
IMaterial *pShaderData;
|
||||||
|
END_VULKAN_COMMAND(SetShaderData)
|
||||||
|
|
||||||
BEGIN_VULKAN_COMMAND(DrawPrimitives)
|
BEGIN_VULKAN_COMMAND(DrawPrimitives)
|
||||||
uint32_t nVertexCount;
|
uint32_t nVertexCount;
|
||||||
uint32_t nFirstVertex;
|
uint32_t nFirstVertex;
|
||||||
|
|||||||
@@ -66,6 +66,11 @@ DECLARE_VULKAN_COMMAND(SetShader)
|
|||||||
CVkShader *pVkShader = (CVkShader*)pShader;
|
CVkShader *pVkShader = (CVkShader*)pShader;
|
||||||
vkCmdBindPipeline(hCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pVkShader->m_hPipeline);
|
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)
|
DECLARE_VULKAN_COMMAND(SetVertexBuffer)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,48 @@
|
|||||||
CVkMaterial::CVkMaterial( IShader *pShader )
|
CVkMaterial::CVkMaterial( IShader *pShader )
|
||||||
{
|
{
|
||||||
m_pVkShader = (CVkShader*)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()
|
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 )
|
void CVkMaterial::VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource )
|
||||||
{
|
{
|
||||||
SetShaderResource(uRegister, SHADER_STAGE_VERTEX, 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)
|
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;
|
pSetShader->pShader = ((CVkMaterial*)pMaterial)->m_pVkShader;
|
||||||
m_pCurrentMaterialBuffer->AddCommand(pSetShader);
|
m_pCurrentMaterialBuffer->AddCommand(pSetShader);
|
||||||
|
|
||||||
|
CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(SetShaderData);
|
||||||
|
pSetShaderData->pShaderData = pMaterial;
|
||||||
|
m_pCurrentMaterialBuffer->AddCommand(pSetShaderData);
|
||||||
|
|
||||||
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(SetScissors);
|
CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(SetScissors);
|
||||||
pScissorsCommand->uWidth = m_uWidth;
|
pScissorsCommand->uWidth = m_uWidth;
|
||||||
pScissorsCommand->uHeight = m_uHeight;
|
pScissorsCommand->uHeight = m_uHeight;
|
||||||
|
|||||||
@@ -294,6 +294,7 @@ private:
|
|||||||
IVkCommandBufferManager *m_pCommandBufferManager;
|
IVkCommandBufferManager *m_pCommandBufferManager;
|
||||||
|
|
||||||
CUtlVector<VulkanWindow_t> m_renderWindows;
|
CUtlVector<VulkanWindow_t> m_renderWindows;
|
||||||
|
CUtlVector<CVkMaterial*> m_pMaterials;
|
||||||
};
|
};
|
||||||
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||||
|
|
||||||
@@ -392,7 +393,9 @@ void CVkRenderContext::DestroyShader( IShader *pShader )
|
|||||||
|
|
||||||
IMaterial *CVkRenderContext::CreateMaterial( 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 )
|
void CVkRenderContext::DestroyMaterial( IMaterial *pMaterial )
|
||||||
@@ -601,6 +604,10 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
|||||||
CUtlVector<VulkanWindow_t> recreatedWindows = {};
|
CUtlVector<VulkanWindow_t> recreatedWindows = {};
|
||||||
vkDeviceWaitIdle(s_vkDevice);
|
vkDeviceWaitIdle(s_vkDevice);
|
||||||
|
|
||||||
|
for ( auto &m: m_pMaterials)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for ( auto &s: m_renderWindows)
|
for ( auto &s: m_renderWindows)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,17 +61,36 @@ void CVkShader::Build()
|
|||||||
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
|
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
|
||||||
};
|
};
|
||||||
VkPipelineLayoutCreateInfo stPipelineLayout = {};
|
VkPipelineLayoutCreateInfo stPipelineLayout = {};
|
||||||
|
CUtlVector<VkDescriptorSetLayoutBinding> bindings = {};
|
||||||
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
||||||
vkCreatePipelineLayout(m_hDevice, &stPipelineLayout, NULL, &m_hPipelineLayout);
|
|
||||||
|
|
||||||
// TODO: Filter by vulkan shaders at some points
|
// TODO: Filter by vulkan shaders at some points
|
||||||
stages.Resize(m_shader.m_objects.GetSize());
|
stages.Resize(m_shader.m_objects.GetSize());
|
||||||
modules.Resize(m_shader.m_objects.GetSize());
|
modules.Resize(m_shader.m_objects.GetSize());
|
||||||
for ( int i = 0; i < m_shader.m_objects.GetSize(); i++ )
|
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].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].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);
|
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);
|
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.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
vertexInput.vertexBindingDescriptionCount = m_layouts.GetSize();
|
vertexInput.vertexBindingDescriptionCount = m_layouts.GetSize();
|
||||||
vertexInput.pVertexBindingDescriptions = m_layouts.GetData();
|
vertexInput.pVertexBindingDescriptions = m_layouts.GetData();
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "tier2/iappsystem.h"
|
#include "tier2/iappsystem.h"
|
||||||
#include "materialsystem/imaterialsystem.h"
|
#include "materialsystem/imaterialsystem.h"
|
||||||
#include "materialsystem/shaderinternals.h"
|
#include "materialsystem/shaderinternals.h"
|
||||||
#include "vulkan/vulkan_core.h"
|
#include "materialsystem/vulkan_shadermeta.h"
|
||||||
|
|
||||||
#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext;
|
#define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext;
|
||||||
#define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext;
|
#define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext;
|
||||||
@@ -268,9 +268,11 @@ public:
|
|||||||
CUtlVector<CVkPipelineLibrary*> m_libraries;
|
CUtlVector<CVkPipelineLibrary*> m_libraries;
|
||||||
VkDevice m_hDevice;
|
VkDevice m_hDevice;
|
||||||
CCompiledShader m_shader;
|
CCompiledShader m_shader;
|
||||||
|
CUtlVector<VkDescriptorSetLayout> m_setLayouts;
|
||||||
|
CUtlVector<VulkanDescriptor_t> m_bindings;
|
||||||
private:
|
private:
|
||||||
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
|
|
||||||
CUtlVector<VkVertexInputBindingDescription> m_layouts;
|
CUtlVector<VkVertexInputBindingDescription> m_layouts;
|
||||||
|
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
|
||||||
CUtlVector<VkFormat> m_eFormats;
|
CUtlVector<VkFormat> m_eFormats;
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -281,7 +283,7 @@ public:
|
|||||||
CVkMaterial( IShader *pShader );
|
CVkMaterial( IShader *pShader );
|
||||||
virtual ~CVkMaterial() override;
|
virtual ~CVkMaterial() override;
|
||||||
|
|
||||||
virtual uint32_t GetResourceByName( const char *szString );
|
void Frame();
|
||||||
|
|
||||||
virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
|
virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) override;
|
||||||
virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||||
@@ -290,7 +292,10 @@ public:
|
|||||||
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pConstants ) override;
|
||||||
|
|
||||||
CVkShader *m_pVkShader;
|
CVkShader *m_pVkShader;
|
||||||
|
VkDescriptorSet m_hSet;
|
||||||
private:
|
private:
|
||||||
|
VkDescriptorPool m_hPool;
|
||||||
|
CUtlVector<VkWriteDescriptorSet> m_writes = {};
|
||||||
void SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject);
|
void SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user