Skip to content

Commit 1e9b938

Browse files
committed
adding the gpu command barrier so that buffer are synchronized even when they are issued from the same queue.
1 parent 9e8d583 commit 1e9b938

File tree

1 file changed

+66
-19
lines changed

1 file changed

+66
-19
lines changed

newton-4.00/sdk/dBrain/gpu/ndBrainGpuCommand.cpp

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ ndBrainGpuCommand::~ndBrainGpuCommand()
4040
}
4141
}
4242

43-
void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, ndInt32 paramCount, ndBrainGpuBuffer** params)
43+
void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, ndInt32 buffersCount, ndBrainGpuBuffer** buffers)
4444
{
4545
VkDevice const device = m_context->GetDevice();
4646
ndVulkanShader shader = (ndVulkanShader)shaderHandle;
@@ -56,12 +56,12 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
5656
m_context->CheckResultVulkan(vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &m_commandBuffer));
5757

5858
ndFixSizeArray<VkDescriptorSetLayoutBinding, 32> layoutBinding;
59-
for (ndInt32 i = 0; i < paramCount; ++i)
59+
for (ndInt32 i = 0; i < buffersCount; ++i)
6060
{
6161
VkDescriptorSetLayoutBinding binding = {};
6262

6363
binding.binding = uint32_t(i);
64-
binding.descriptorType = (params[i]->GetType() == ndUniformData) ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
64+
binding.descriptorType = (buffers[i]->GetType() == ndUniformData) ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
6565
binding.descriptorCount = 1;
6666
binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
6767
layoutBinding.PushBack(binding);
@@ -81,12 +81,12 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
8181

8282
ndFixSizeArray<VkWriteDescriptorSet, 32> descriptorSet;
8383
ndFixSizeArray<VkDescriptorBufferInfo, 32> bufferInfo;
84-
for (ndInt32 i = 0; i < paramCount; ++i)
84+
for (ndInt32 i = 0; i < buffersCount; ++i)
8585
{
8686
VkDescriptorBufferInfo descriptorBufferInfo = {};
87-
descriptorBufferInfo.buffer = params[i]->GetBuffer();
87+
descriptorBufferInfo.buffer = buffers[i]->GetBuffer();
8888
descriptorBufferInfo.offset = 0;
89-
descriptorBufferInfo.range = (VkDeviceSize)params[i]->SizeInBytes();
89+
descriptorBufferInfo.range = (VkDeviceSize)buffers[i]->SizeInBytes();
9090
bufferInfo.PushBack(descriptorBufferInfo);
9191

9292
VkWriteDescriptorSet set = {};
@@ -95,7 +95,7 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
9595
set.dstBinding = uint32_t(i);
9696
set.descriptorCount = 1;
9797
//set.descriptorType = params[i]->GetType();
98-
set.descriptorType = (params[i]->GetType() == ndUniformData) ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
98+
set.descriptorType = (buffers[i]->GetType() == ndUniformData) ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9999
set.pBufferInfo = &bufferInfo[i];
100100
descriptorSet.PushBack(set);
101101
}
@@ -124,23 +124,70 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
124124
//beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
125125
//beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
126126
m_context->CheckResultVulkan(vkBeginCommandBuffer(m_commandBuffer, &beginInfo)); // start recording commands.
127+
128+
//for (ndInt32 i = 0; i < paramCount; ++i)
129+
//{
130+
// if (buffers[i]->GetType() == ndStorageData)
131+
// {
132+
// ndBrainGpuBuffer* const gpuBuffer = buffers[i];
133+
//
134+
// VkBufferMemoryBarrier buffer_barrier =
135+
// {
136+
// VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
137+
// nullptr,
138+
// 0,
139+
// VK_ACCESS_SHADER_WRITE_BIT,
140+
// m_context->m_queueFamilyIndex,
141+
// m_context->m_queueFamilyIndex,
142+
// gpuBuffer->GetBuffer(),
143+
// 0,
144+
// gpuBuffer->SizeInBytes()
145+
// };
146+
//
147+
// vkCmdPipelineBarrier(
148+
// m_commandBuffer,
149+
// VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
150+
// VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
151+
// 0,
152+
// 0, nullptr,
153+
// 1, &buffer_barrier,
154+
// 0, nullptr);
155+
// }
156+
//}
127157

128158
vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline);
129159
vkCmdBindDescriptorSets(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipelineLayout, 0, 1, &m_descriptorSet, 0, nullptr);
130160
vkCmdDispatch(m_commandBuffer, uint32_t(workGroups), 1, 1);
131161

132-
//VkMemoryBarrier memoryBarrier = {};
133-
//memoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
134-
//memoryBarrier.pNext = VK_NULL_HANDLE;
135-
//memoryBarrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
136-
//memoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
137-
//vkCmdPipelineBarrier(m_commandBuffer,
138-
// VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
139-
// VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
140-
// 0,
141-
// 0, &memoryBarrier,
142-
// 0, VK_NULL_HANDLE,
143-
// 0, VK_NULL_HANDLE);
162+
ndFixSizeArray<VkBufferMemoryBarrier, 10> memoryBarriers;
163+
for (ndInt32 i = 0; i < buffersCount; ++i)
164+
{
165+
if (buffers[i]->GetType() == ndStorageData)
166+
{
167+
ndBrainGpuBuffer* const gpuBuffer = buffers[i];
168+
VkBufferMemoryBarrier memoryBarrier{};
169+
memoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
170+
//memoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
171+
//memoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
172+
memoryBarrier.srcQueueFamilyIndex = m_context->m_queueFamilyIndex;
173+
memoryBarrier.dstQueueFamilyIndex = m_context->m_queueFamilyIndex;
174+
memoryBarrier.pNext = VK_NULL_HANDLE;
175+
memoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
176+
memoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
177+
memoryBarrier.buffer = gpuBuffer->GetBuffer();
178+
memoryBarrier.offset = 0;
179+
memoryBarrier.size = gpuBuffer->SizeInBytes();
180+
memoryBarriers.PushBack(memoryBarrier);
181+
}
182+
}
183+
vkCmdPipelineBarrier(
184+
m_commandBuffer,
185+
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
186+
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
187+
0,
188+
0, VK_NULL_HANDLE,
189+
uint32_t(memoryBarriers.GetCount()), &memoryBarriers[0],
190+
0, VK_NULL_HANDLE);
144191

145192
m_context->CheckResultVulkan(vkEndCommandBuffer(m_commandBuffer));
146193
}

0 commit comments

Comments
 (0)