MCPcopy Create free account
hub / github.com/a2flo/floor / create_encoder

Method create_encoder

src/device/vulkan/vulkan_function.cpp:178–237  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

176}
177
178std::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;

Callers

nothing calls this directly

Calls 4

make_command_bufferMethod · 0.80
get_deviceMethod · 0.80
emptyMethod · 0.45

Tested by

no test coverage detected