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