| 155 | } |
| 156 | |
| 157 | shared_ptr<vulkan_encoder> vulkan_kernel::create_encoder(const compute_queue& cqueue, |
| 158 | const vulkan_command_buffer* cmd_buffer_, |
| 159 | const VkPipeline pipeline, |
| 160 | const VkPipelineLayout pipeline_layout, |
| 161 | const vector<const vulkan_kernel_entry*>& entries, |
| 162 | const char* debug_label floor_unused_if_release, |
| 163 | bool& success) const { |
| 164 | success = false; |
| 165 | if (entries.empty()) return {}; |
| 166 | |
| 167 | // create a command buffer if none was specified |
| 168 | vulkan_command_buffer cmd_buffer; |
| 169 | if (cmd_buffer_ == nullptr) { |
| 170 | cmd_buffer = ((const vulkan_queue&)cqueue).make_command_buffer("encoder"); |
| 171 | if(cmd_buffer.cmd_buffer == nullptr) return {}; // just abort |
| 172 | |
| 173 | // begin recording |
| 174 | const VkCommandBufferBeginInfo begin_info { |
| 175 | .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, |
| 176 | .pNext = nullptr, |
| 177 | .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, |
| 178 | .pInheritanceInfo = nullptr, |
| 179 | }; |
| 180 | VK_CALL_RET(vkBeginCommandBuffer(cmd_buffer.cmd_buffer, &begin_info), |
| 181 | "failed to begin command buffer", {}) |
| 182 | } else { |
| 183 | cmd_buffer = *(const vulkan_command_buffer*)cmd_buffer_; |
| 184 | } |
| 185 | |
| 186 | const auto& vk_dev = (const vulkan_device&)cqueue.get_device(); |
| 187 | |
| 188 | #if defined(FLOOR_DEBUG) |
| 189 | string encoder_label = "encoder_"s + (entries[0]->stage_info.stage == VK_SHADER_STAGE_COMPUTE_BIT ? "compute" : "graphics"); |
| 190 | if (entries[0]->info) { |
| 191 | encoder_label += "_" + entries[0]->info->name; |
| 192 | } |
| 193 | if (debug_label) { |
| 194 | encoder_label += '#'; |
| 195 | encoder_label += debug_label; |
| 196 | } |
| 197 | ((const vulkan_compute*)vk_dev.context)->vulkan_begin_cmd_debug_label(cmd_buffer.cmd_buffer, encoder_label); |
| 198 | #endif |
| 199 | |
| 200 | vkCmdBindPipeline(cmd_buffer.cmd_buffer, |
| 201 | entries[0]->stage_info.stage == VK_SHADER_STAGE_COMPUTE_BIT ? |
| 202 | VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS, |
| 203 | pipeline); |
| 204 | |
| 205 | auto encoder = make_shared<vulkan_encoder>(vulkan_encoder { |
| 206 | .cmd_buffer = cmd_buffer, |
| 207 | .cqueue = (const vulkan_queue&)cqueue, |
| 208 | .device = vk_dev, |
| 209 | .pipeline = pipeline, |
| 210 | .pipeline_layout = pipeline_layout, |
| 211 | .entries = entries, |
| 212 | }); |
| 213 | |
| 214 | success = true; |
nothing calls this directly
no test coverage detected