compute shaders
This commit is contained in:
@@ -1,44 +1,78 @@
|
||||
#include "vulkan_state.h"
|
||||
CVkMaterial::CVkMaterial( IShader *pShader )
|
||||
CVkMaterial::CVkMaterial( IBaseShader *pShader )
|
||||
{
|
||||
m_pVkShader = (CVkShader*)pShader;
|
||||
if ( m_pVkShader->m_setLayouts.GetSize() == 0 )
|
||||
return;
|
||||
VkDevice hDevice = NULL;
|
||||
|
||||
VkDescriptorPoolSize pools[4] =
|
||||
CVkShader *pS = dynamic_cast<CVkShader*>(pShader);
|
||||
CVkComputeShader *pCS = dynamic_cast<CVkComputeShader*>(pShader);
|
||||
if ( pS )
|
||||
{
|
||||
if (pS->m_setLayouts.GetSize() == 0 )
|
||||
return;
|
||||
hDevice = pS->m_hDevice;
|
||||
}
|
||||
if (pCS)
|
||||
{
|
||||
hDevice = pCS->m_hDevice;
|
||||
}
|
||||
|
||||
VkDescriptorPoolSize pools[5] =
|
||||
{
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
128,
|
||||
1024,
|
||||
},
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
128,
|
||||
1024,
|
||||
},
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
|
||||
1024,
|
||||
},
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
|
||||
128,
|
||||
1024,
|
||||
},
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_SAMPLER,
|
||||
1,
|
||||
1024,
|
||||
}
|
||||
};
|
||||
VkDescriptorPoolCreateInfo stPool = {};
|
||||
stPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
stPool.poolSizeCount = 4;
|
||||
stPool.poolSizeCount = 5;
|
||||
stPool.pPoolSizes = pools;
|
||||
stPool.maxSets = 16;
|
||||
stPool.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
|
||||
vkCreateDescriptorPool(m_pVkShader->m_hDevice, &stPool, NULL, &m_hPool);
|
||||
vkCreateDescriptorPool(hDevice, &stPool, NULL, &m_hPool);
|
||||
|
||||
VkDescriptorSetAllocateInfo stInfo = {};
|
||||
stInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
stInfo.descriptorPool = m_hPool;
|
||||
stInfo.descriptorSetCount = m_pVkShader->m_setLayouts.GetSize();
|
||||
stInfo.pSetLayouts = m_pVkShader->m_setLayouts.GetData();
|
||||
m_hSets.Resize(m_pVkShader->m_setLayouts.GetSize());
|
||||
vkAllocateDescriptorSets(m_pVkShader->m_hDevice, &stInfo, m_hSets.GetData());
|
||||
|
||||
if ( pS )
|
||||
{
|
||||
VkDescriptorSetAllocateInfo stInfo = {};
|
||||
stInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
stInfo.descriptorPool = m_hPool;
|
||||
stInfo.descriptorSetCount = pS->m_setLayouts.GetSize();
|
||||
stInfo.pSetLayouts = pS->m_setLayouts.GetData();
|
||||
m_hSets.Resize(pS->m_setLayouts.GetSize());
|
||||
VkResult r = vkAllocateDescriptorSets(hDevice, &stInfo, m_hSets.GetData());
|
||||
VULKAN_RESULT_PRINT(r, vkAllocateDescriptorSets);
|
||||
}
|
||||
|
||||
if ( pCS )
|
||||
{
|
||||
VkDescriptorSetAllocateInfo stInfo = {};
|
||||
stInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
stInfo.descriptorPool = m_hPool;
|
||||
stInfo.descriptorSetCount = pCS->m_setLayouts.GetSize();
|
||||
stInfo.pSetLayouts = pCS->m_setLayouts.GetData();
|
||||
m_hSets.Resize(pCS->m_setLayouts.GetSize());
|
||||
VkResult r = vkAllocateDescriptorSets(hDevice, &stInfo, m_hSets.GetData());
|
||||
VULKAN_RESULT_PRINT(r, vkAllocateDescriptorSets);
|
||||
}
|
||||
|
||||
m_pShader = pShader;
|
||||
}
|
||||
|
||||
CVkMaterial::~CVkMaterial()
|
||||
@@ -86,11 +120,49 @@ void CVkMaterial::PSSetSampler( uint32_t uRegister, ISampler *pImage )
|
||||
SetShaderResource(uRegister, 0, pImage);
|
||||
}
|
||||
|
||||
void CVkMaterial::CSSetConstantsBuffer( uint32_t uRegister, uint32_t uSet, IBuffer *pBuffer )
|
||||
{
|
||||
SetShaderResource(uRegister, uSet, pBuffer);
|
||||
|
||||
}
|
||||
|
||||
void CVkMaterial::CSSetTexture( uint32_t uRegister, uint32_t uSet, IImage *pImage )
|
||||
{
|
||||
SetShaderResource(uRegister, uSet, pImage);
|
||||
|
||||
}
|
||||
|
||||
void CVkMaterial::CSSetSampler( uint32_t uRegister, uint32_t uSet, ISampler *pSampler )
|
||||
{
|
||||
SetShaderResource(uRegister, uSet, pSampler);
|
||||
|
||||
}
|
||||
|
||||
void CVkMaterial::CSSetTextureArray( uint32_t uSet, ITextureArray *pArray )
|
||||
{
|
||||
SetShaderResource(0, uSet, pArray);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderingObject *pObject)
|
||||
{
|
||||
if ( m_pVkShader->m_setLayouts.GetSize() == 0 )
|
||||
return;
|
||||
VkDevice hDevice;
|
||||
CVkShader *pShader = dynamic_cast<CVkShader*>(m_pShader);
|
||||
CVkComputeShader *pCS = dynamic_cast<CVkComputeShader*>(m_pShader);
|
||||
if ( pShader )
|
||||
{
|
||||
if (pShader->m_setLayouts.GetSize() == 0 )
|
||||
return;
|
||||
hDevice = pShader->m_hDevice;
|
||||
}
|
||||
if (pCS)
|
||||
{
|
||||
if (pCS->m_setLayouts.GetSize() == 0 )
|
||||
return;
|
||||
hDevice = pCS->m_hDevice;
|
||||
}
|
||||
union {
|
||||
IRenderingObject *pVkObject;
|
||||
CVkBuffer *pBuffer;
|
||||
@@ -112,7 +184,7 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
|
||||
write.pBufferInfo = &stInfo;
|
||||
stInfo.buffer = pBuffer->m_buffer;
|
||||
stInfo.range = pBuffer->m_nSize;
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
|
||||
vkUpdateDescriptorSets(hDevice, 1, &write, 0, 0);
|
||||
}
|
||||
if (dynamic_cast<IImage*>(pObject))
|
||||
{
|
||||
@@ -122,12 +194,12 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
|
||||
write.dstSet = m_hSets[uSet];
|
||||
write.dstBinding = uRegister;
|
||||
write.dstArrayElement = 0;
|
||||
write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
|
||||
write.descriptorType = pImage->m_eDescriptorType;
|
||||
write.descriptorCount = 1;
|
||||
write.pImageInfo = &stInfo;
|
||||
stInfo.imageView = pImage->m_imageView;
|
||||
stInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
|
||||
vkUpdateDescriptorSets(hDevice, 1, &write, 0, 0);
|
||||
|
||||
}
|
||||
if (dynamic_cast<CVkSampler*>(pObject))
|
||||
@@ -142,7 +214,7 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
|
||||
write.descriptorCount = 1;
|
||||
write.pImageInfo = &stInfo;
|
||||
stInfo.sampler = pSampler->m_sampler;
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &write, 0, 0);
|
||||
vkUpdateDescriptorSets(hDevice, 1, &write, 0, 0);
|
||||
}
|
||||
if (dynamic_cast<ITextureArray*>(pObject))
|
||||
{
|
||||
@@ -184,7 +256,7 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
|
||||
writes[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
|
||||
writes[1].descriptorCount = 128;
|
||||
writes[1].pImageInfo = stWrites;
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 2, writes, 0, 0);
|
||||
vkUpdateDescriptorSets(hDevice, 2, writes, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user