17ec681f3Smrg/*
27ec681f3Smrg * Copyright © 2021 Intel Corporation
37ec681f3Smrg *
47ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
57ec681f3Smrg * copy of this software and associated documentation files (the "Software"),
67ec681f3Smrg * to deal in the Software without restriction, including without limitation
77ec681f3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87ec681f3Smrg * and/or sell copies of the Software, and to permit persons to whom the
97ec681f3Smrg * Software is furnished to do so, subject to the following conditions:
107ec681f3Smrg *
117ec681f3Smrg * The above copyright notice and this permission notice (including the next
127ec681f3Smrg * paragraph) shall be included in all copies or substantial portions of the
137ec681f3Smrg * Software.
147ec681f3Smrg *
157ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187ec681f3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197ec681f3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
207ec681f3Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
217ec681f3Smrg * IN THE SOFTWARE.
227ec681f3Smrg */
237ec681f3Smrg
247ec681f3Smrg#ifndef VK_COMMAND_BUFFER_H
257ec681f3Smrg#define VK_COMMAND_BUFFER_H
267ec681f3Smrg
277ec681f3Smrg#include "vk_object.h"
287ec681f3Smrg#include "util/u_dynarray.h"
297ec681f3Smrg
307ec681f3Smrg#ifdef __cplusplus
317ec681f3Smrgextern "C" {
327ec681f3Smrg#endif
337ec681f3Smrg
347ec681f3Smrgstruct vk_command_buffer {
357ec681f3Smrg   struct vk_object_base base;
367ec681f3Smrg
377ec681f3Smrg   /**
387ec681f3Smrg    * VK_EXT_debug_utils
397ec681f3Smrg    *
407ec681f3Smrg    * The next two fields represent debug labels storage.
417ec681f3Smrg    *
427ec681f3Smrg    * VK_EXT_debug_utils spec requires that upon triggering a debug message
437ec681f3Smrg    * with a command buffer attached to it, all "active" labels will also be
447ec681f3Smrg    * provided to the callback. The spec describes two distinct ways of
457ec681f3Smrg    * attaching a debug label to the command buffer: opening a label region
467ec681f3Smrg    * and inserting a single label.
477ec681f3Smrg    *
487ec681f3Smrg    * Label region is active between the corresponding `*BeginDebugUtilsLabel`
497ec681f3Smrg    * and `*EndDebugUtilsLabel` calls. The spec doesn't mention any limits on
507ec681f3Smrg    * nestedness of label regions. This implementation assumes that there
517ec681f3Smrg    * aren't any.
527ec681f3Smrg    *
537ec681f3Smrg    * The spec, however, doesn't explain the lifetime of a label submitted by
547ec681f3Smrg    * an `*InsertDebugUtilsLabel` call. The LunarG whitepaper [1] (pp 12-15)
557ec681f3Smrg    * provides a more detailed explanation along with some examples. According
567ec681f3Smrg    * to those, such label remains active until the next `*DebugUtilsLabel`
577ec681f3Smrg    * call. This means that there can be no more than one such label at a
587ec681f3Smrg    * time.
597ec681f3Smrg    *
607ec681f3Smrg    * \c labels contains all active labels at this point in order of submission
617ec681f3Smrg    * \c region_begin denotes whether the most recent label opens a new region
627ec681f3Smrg    * If \t labels is empty \t region_begin must be true.
637ec681f3Smrg    *
647ec681f3Smrg    * Anytime we modify labels, we first check for \c region_begin. If it's
657ec681f3Smrg    * false, it means that the most recent label was submitted by
667ec681f3Smrg    * `*InsertDebugUtilsLabel` and we need to remove it before doing anything
677ec681f3Smrg    * else.
687ec681f3Smrg    *
697ec681f3Smrg    * See the discussion here:
707ec681f3Smrg    * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10318#note_1061317
717ec681f3Smrg    *
727ec681f3Smrg    * [1] https://www.lunarg.com/wp-content/uploads/2018/05/Vulkan-Debug-Utils_05_18_v1.pdf
737ec681f3Smrg    */
747ec681f3Smrg   struct util_dynarray labels;
757ec681f3Smrg   bool region_begin;
767ec681f3Smrg};
777ec681f3Smrg
787ec681f3SmrgVK_DEFINE_HANDLE_CASTS(vk_command_buffer, base, VkCommandBuffer,
797ec681f3Smrg                       VK_OBJECT_TYPE_COMMAND_BUFFER)
807ec681f3Smrg
817ec681f3SmrgVkResult MUST_CHECK
827ec681f3Smrgvk_command_buffer_init(struct vk_command_buffer *command_buffer,
837ec681f3Smrg                       struct vk_device *device);
847ec681f3Smrg
857ec681f3Smrgvoid
867ec681f3Smrgvk_command_buffer_reset(struct vk_command_buffer *command_buffer);
877ec681f3Smrg
887ec681f3Smrgvoid
897ec681f3Smrgvk_command_buffer_finish(struct vk_command_buffer *command_buffer);
907ec681f3Smrg
917ec681f3Smrg#ifdef __cplusplus
927ec681f3Smrg}
937ec681f3Smrg#endif
947ec681f3Smrg
957ec681f3Smrg#endif  /* VK_COMMAND_BUFFER_H */
96