@@ -40,7 +40,7 @@ ndBrainGpuCommand::~ndBrainGpuCommand()
40
40
}
41
41
}
42
42
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 )
44
44
{
45
45
VkDevice const device = m_context->GetDevice ();
46
46
ndVulkanShader shader = (ndVulkanShader)shaderHandle;
@@ -56,12 +56,12 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
56
56
m_context->CheckResultVulkan (vkAllocateCommandBuffers (device, &commandBufferAllocateInfo, &m_commandBuffer));
57
57
58
58
ndFixSizeArray<VkDescriptorSetLayoutBinding, 32 > layoutBinding;
59
- for (ndInt32 i = 0 ; i < paramCount ; ++i)
59
+ for (ndInt32 i = 0 ; i < buffersCount ; ++i)
60
60
{
61
61
VkDescriptorSetLayoutBinding binding = {};
62
62
63
63
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;
65
65
binding.descriptorCount = 1 ;
66
66
binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
67
67
layoutBinding.PushBack (binding);
@@ -81,12 +81,12 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
81
81
82
82
ndFixSizeArray<VkWriteDescriptorSet, 32 > descriptorSet;
83
83
ndFixSizeArray<VkDescriptorBufferInfo, 32 > bufferInfo;
84
- for (ndInt32 i = 0 ; i < paramCount ; ++i)
84
+ for (ndInt32 i = 0 ; i < buffersCount ; ++i)
85
85
{
86
86
VkDescriptorBufferInfo descriptorBufferInfo = {};
87
- descriptorBufferInfo.buffer = params [i]->GetBuffer ();
87
+ descriptorBufferInfo.buffer = buffers [i]->GetBuffer ();
88
88
descriptorBufferInfo.offset = 0 ;
89
- descriptorBufferInfo.range = (VkDeviceSize)params [i]->SizeInBytes ();
89
+ descriptorBufferInfo.range = (VkDeviceSize)buffers [i]->SizeInBytes ();
90
90
bufferInfo.PushBack (descriptorBufferInfo);
91
91
92
92
VkWriteDescriptorSet set = {};
@@ -95,7 +95,7 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
95
95
set.dstBinding = uint32_t (i);
96
96
set.descriptorCount = 1 ;
97
97
// 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;
99
99
set.pBufferInfo = &bufferInfo[i];
100
100
descriptorSet.PushBack (set);
101
101
}
@@ -124,23 +124,70 @@ void ndBrainGpuCommand::Assembly(void* const shaderHandle, ndInt32 workGroups, n
124
124
// beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
125
125
// beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
126
126
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
+ // }
127
157
128
158
vkCmdBindPipeline (m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline);
129
159
vkCmdBindDescriptorSets (m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipelineLayout, 0 , 1 , &m_descriptorSet, 0 , nullptr );
130
160
vkCmdDispatch (m_commandBuffer, uint32_t (workGroups), 1 , 1 );
131
161
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);
144
191
145
192
m_context->CheckResultVulkan (vkEndCommandBuffer (m_commandBuffer));
146
193
}
0 commit comments