10 #include "fml/logging.h"
22 CommandBufferVK::CommandBufferVK(
23 std::weak_ptr<const Context> context,
24 std::weak_ptr<const DeviceHolderVK> device_holder,
25 std::shared_ptr<TrackedObjectsVK> tracked_objects)
26 : CommandBuffer(
std::move(context)),
27 device_holder_(
std::move(device_holder)),
28 tracked_objects_(
std::move(tracked_objects)) {}
30 CommandBufferVK::~CommandBufferVK() =
default;
32 void CommandBufferVK::SetLabel(std::string_view label)
const {
34 auto context = context_.lock();
38 ContextVK::Cast(*context).SetDebugName(GetCommandBuffer(), label);
42 bool CommandBufferVK::IsValid()
const {
46 bool CommandBufferVK::OnSubmitCommands(CompletionCallback callback) {
50 void CommandBufferVK::OnWaitUntilCompleted() {}
52 void CommandBufferVK::OnWaitUntilScheduled() {}
54 std::shared_ptr<RenderPass> CommandBufferVK::OnCreateRenderPass(
55 RenderTarget target) {
56 auto context = context_.lock();
61 std::shared_ptr<RenderPassVK>(
new RenderPassVK(context,
65 if (!pass->IsValid()) {
71 std::shared_ptr<BlitPass> CommandBufferVK::OnCreateBlitPass() {
75 auto context = context_.lock();
79 auto pass = std::shared_ptr<BlitPassVK>(
new BlitPassVK(
80 shared_from_this(), ContextVK::Cast(*context).GetWorkarounds()));
81 if (!pass->IsValid()) {
87 std::shared_ptr<ComputePass> CommandBufferVK::OnCreateComputePass() {
91 auto context = context_.lock();
96 std::shared_ptr<ComputePassVK>(
new ComputePassVK(context,
99 if (!pass->IsValid()) {
105 bool CommandBufferVK::EndCommandBuffer()
const {
106 InsertDebugMarker(
"QueueSubmit");
108 auto command_buffer = GetCommandBuffer();
109 tracked_objects_->GetGPUProbe().RecordCmdBufferEnd(command_buffer);
111 auto status = command_buffer.end();
112 if (status != vk::Result::eSuccess) {
113 VALIDATION_LOG <<
"Failed to end command buffer: " << vk::to_string(status);
119 vk::CommandBuffer CommandBufferVK::GetCommandBuffer()
const {
120 if (tracked_objects_) {
121 return tracked_objects_->GetCommandBuffer();
126 bool CommandBufferVK::Track(
const std::shared_ptr<SharedObjectVK>&
object) {
130 tracked_objects_->Track(
object);
134 bool CommandBufferVK::Track(
const std::shared_ptr<const DeviceBuffer>& buffer) {
138 tracked_objects_->Track(buffer);
142 bool CommandBufferVK::Track(
143 const std::shared_ptr<const TextureSourceVK>& texture) {
147 tracked_objects_->Track(texture);
151 bool CommandBufferVK::Track(
const std::shared_ptr<const Texture>& texture) {
158 return Track(TextureVK::Cast(*texture).GetTextureSource());
161 fml::StatusOr<vk::DescriptorSet> CommandBufferVK::AllocateDescriptorSets(
162 const vk::DescriptorSetLayout& layout,
166 return fml::Status(fml::StatusCode::kUnknown,
"command encoder invalid");
169 return tracked_objects_->GetDescriptorPool().AllocateDescriptorSets(
170 layout, pipeline_key, context);
173 void CommandBufferVK::PushDebugGroup(std::string_view label)
const {
177 vk::DebugUtilsLabelEXT label_info;
178 label_info.pLabelName = label.data();
179 if (
auto command_buffer = GetCommandBuffer()) {
180 command_buffer.beginDebugUtilsLabelEXT(label_info);
184 void CommandBufferVK::PopDebugGroup()
const {
188 if (
auto command_buffer = GetCommandBuffer()) {
189 command_buffer.endDebugUtilsLabelEXT();
193 void CommandBufferVK::InsertDebugMarker(std::string_view label)
const {
197 vk::DebugUtilsLabelEXT label_info;
198 label_info.pLabelName = label.data();
199 if (
auto command_buffer = GetCommandBuffer()) {
200 command_buffer.insertDebugUtilsLabelEXT(label_info);
205 return tracked_objects_->GetDescriptorPool();
A per-frame descriptor pool. Descriptors from this pool don't need to be freed individually....
bool HasValidationLayers()