| 176 | } |
| 177 | |
| 178 | std::shared_ptr<vulkan_encoder> vulkan_function::create_encoder(const device_queue& cqueue, |
| 179 | const vulkan_command_buffer* cmd_buffer_, |
| 180 | const VkPipeline pipeline, |
| 181 | const VkPipelineLayout pipeline_layout, |
| 182 | const std::vector<const vulkan_function_entry*>& entries, |
| 183 | const char* debug_label floor_unused_if_release, |
| 184 | bool& success) const { |
| 185 | success = false; |
| 186 | if (entries.empty()) return {}; |
| 187 | |
| 188 | // create a command buffer if none was specified |
| 189 | vulkan_command_buffer cmd_buffer; |
| 190 | if (cmd_buffer_ == nullptr) { |
| 191 | cmd_buffer = ((const vulkan_queue&)cqueue).make_command_buffer("encoder"); |
| 192 | if(cmd_buffer.cmd_buffer == nullptr) return {}; // just abort |
| 193 | |
| 194 | // begin recording |
| 195 | const VkCommandBufferBeginInfo begin_info { |
| 196 | .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, |
| 197 | .pNext = nullptr, |
| 198 | .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, |
| 199 | .pInheritanceInfo = nullptr, |
| 200 | }; |
| 201 | VK_CALL_RET(vkBeginCommandBuffer(cmd_buffer.cmd_buffer, &begin_info), |
| 202 | "failed to begin command buffer", {}) |
| 203 | } else { |
| 204 | cmd_buffer = *(const vulkan_command_buffer*)cmd_buffer_; |
| 205 | } |
| 206 | |
| 207 | const auto& vk_dev = (const vulkan_device&)cqueue.get_device(); |
| 208 | |
| 209 | auto encoder = std::make_shared<vulkan_encoder>(vulkan_encoder { |
| 210 | .cmd_buffer = cmd_buffer, |
| 211 | .cqueue = (const vulkan_queue&)cqueue, |
| 212 | .dev = vk_dev, |
| 213 | .pipeline = pipeline, |
| 214 | .pipeline_layout = pipeline_layout, |
| 215 | .entries = entries, |
| 216 | }); |
| 217 | |
| 218 | #if defined(FLOOR_DEBUG) |
| 219 | encoder->debug_label = "encoder_"s + (entries[0]->stage_info.stage == VK_SHADER_STAGE_COMPUTE_BIT ? "compute" : "graphics"); |
| 220 | if (entries[0]->info) { |
| 221 | encoder->debug_label += "_" + entries[0]->info->name; |
| 222 | } |
| 223 | if (debug_label) { |
| 224 | encoder->debug_label += '#'; |
| 225 | encoder->debug_label += debug_label; |
| 226 | } |
| 227 | vulkan_begin_cmd_debug_label(cmd_buffer.cmd_buffer, encoder->debug_label.c_str()); |
| 228 | #endif |
| 229 | |
| 230 | vkCmdBindPipeline(cmd_buffer.cmd_buffer, |
| 231 | entries[0]->stage_info.stage == VK_SHADER_STAGE_COMPUTE_BIT ? |
| 232 | VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS, |
| 233 | pipeline); |
| 234 | |
| 235 | success = true; |
nothing calls this directly
no test coverage detected