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

Method create_encoder

compute/vulkan/vulkan_kernel.cpp:157–216  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

155}
156
157shared_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;

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