Path: blob/21.2-virgl/src/virtio/vulkan/vn_command_buffer.c
4560 views
/*1* Copyright 2019 Google LLC2* SPDX-License-Identifier: MIT3*4* based in part on anv and radv which are:5* Copyright © 2015 Intel Corporation6* Copyright © 2016 Red Hat.7* Copyright © 2016 Bas Nieuwenhuizen8*/910#include "vn_command_buffer.h"1112#include "venus-protocol/vn_protocol_driver_command_buffer.h"13#include "venus-protocol/vn_protocol_driver_command_pool.h"1415#include "vn_device.h"16#include "vn_image.h"17#include "vn_render_pass.h"1819static bool20vn_image_memory_barrier_has_present_src(21const VkImageMemoryBarrier *img_barriers, uint32_t count)22{23for (uint32_t i = 0; i < count; i++) {24if (img_barriers[i].oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ||25img_barriers[i].newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)26return true;27}28return false;29}3031static VkImageMemoryBarrier *32vn_cmd_get_image_memory_barriers(struct vn_command_buffer *cmd,33uint32_t count)34{35/* avoid shrinking in case of non efficient reallocation implementation */36if (count > cmd->builder.image_barrier_count) {37size_t size = sizeof(VkImageMemoryBarrier) * count;38VkImageMemoryBarrier *img_barriers =39vk_realloc(&cmd->allocator, cmd->builder.image_barriers, size,40VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);41if (!img_barriers)42return NULL;4344/* update upon successful reallocation */45cmd->builder.image_barrier_count = count;46cmd->builder.image_barriers = img_barriers;47}4849return cmd->builder.image_barriers;50}5152/* About VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, the spec says53*54* VK_IMAGE_LAYOUT_PRESENT_SRC_KHR must only be used for presenting a55* presentable image for display. A swapchain's image must be transitioned56* to this layout before calling vkQueuePresentKHR, and must be57* transitioned away from this layout after calling vkAcquireNextImageKHR.58*59* That allows us to treat the layout internally as60*61* - VK_IMAGE_LAYOUT_GENERAL62* - VK_QUEUE_FAMILY_FOREIGN_EXT has the ownership, if the image is not a63* prime blit source64*65* while staying performant.66*67* About queue family ownerships, the spec says68*69* A queue family can take ownership of an image subresource or buffer70* range of a resource created with VK_SHARING_MODE_EXCLUSIVE, without an71* ownership transfer, in the same way as for a resource that was just72* created; however, taking ownership in this way has the effect that the73* contents of the image subresource or buffer range are undefined.74*75* It is unclear if that is applicable to external resources, which supposedly76* have the same semantics77*78* Binding a resource to a memory object shared between multiple Vulkan79* instances or other APIs does not change the ownership of the underlying80* memory. The first entity to access the resource implicitly acquires81* ownership. Accessing a resource backed by memory that is owned by a82* particular instance or API has the same semantics as accessing a83* VK_SHARING_MODE_EXCLUSIVE resource[...]84*85* We should get the spec clarified, or get rid of this completely broken code86* (TODO).87*88* Assuming a queue family can acquire the ownership implicitly when the89* contents are not needed, we do not need to worry about90* VK_IMAGE_LAYOUT_UNDEFINED. We can use VK_IMAGE_LAYOUT_PRESENT_SRC_KHR as91* the sole signal to trigger queue family ownership transfers.92*93* When the image has VK_SHARING_MODE_CONCURRENT, we can, and are required to,94* use VK_QUEUE_FAMILY_IGNORED as the other queue family whether we are95* transitioning to or from VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.96*97* When the image has VK_SHARING_MODE_EXCLUSIVE, we have to work out who the98* other queue family is. It is easier when the barrier does not also define99* a queue family ownership transfer (i.e., srcQueueFamilyIndex equals to100* dstQueueFamilyIndex). The other queue family must be the queue family the101* command buffer was allocated for.102*103* When the barrier also defines a queue family ownership transfer, it is104* submitted both to the source queue family to release the ownership and to105* the destination queue family to acquire the ownership. Depending on106* whether the barrier transitions to or from VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,107* we are only interested in the ownership release or acquire respectively and108* should be careful to avoid double releases/acquires.109*110* I haven't followed all transition paths mentally to verify the correctness.111* I likely also violate some VUs or miss some cases below. They are112* hopefully fixable and are left as TODOs.113*/114static void115vn_cmd_fix_image_memory_barrier(const struct vn_command_buffer *cmd,116const VkImageMemoryBarrier *src_barrier,117VkImageMemoryBarrier *out_barrier)118{119const struct vn_image *img = vn_image_from_handle(src_barrier->image);120121*out_barrier = *src_barrier;122123/* no fix needed */124if (out_barrier->oldLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&125out_barrier->newLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)126return;127128assert(img->is_wsi);129130if (VN_PRESENT_SRC_INTERNAL_LAYOUT == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)131return;132133/* prime blit src or no layout transition */134if (img->prime_blit_buffer != VK_NULL_HANDLE ||135out_barrier->oldLayout == out_barrier->newLayout) {136if (out_barrier->oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)137out_barrier->oldLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;138if (out_barrier->newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)139out_barrier->newLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;140return;141}142143if (out_barrier->oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {144out_barrier->oldLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;145146/* no availability operation needed */147out_barrier->srcAccessMask = 0;148149const uint32_t dst_qfi = out_barrier->dstQueueFamilyIndex;150if (img->sharing_mode == VK_SHARING_MODE_CONCURRENT) {151out_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT;152out_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;153} else if (dst_qfi == out_barrier->srcQueueFamilyIndex ||154dst_qfi == cmd->queue_family_index) {155out_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT;156out_barrier->dstQueueFamilyIndex = cmd->queue_family_index;157} else {158/* The barrier also defines a queue family ownership transfer, and159* this is the one that gets submitted to the source queue family to160* release the ownership. Skip both the transfer and the transition.161*/162out_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;163out_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;164out_barrier->newLayout = out_barrier->oldLayout;165}166} else {167out_barrier->newLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;168169/* no visibility operation needed */170out_barrier->dstAccessMask = 0;171172const uint32_t src_qfi = out_barrier->srcQueueFamilyIndex;173if (img->sharing_mode == VK_SHARING_MODE_CONCURRENT) {174out_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;175out_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT;176} else if (src_qfi == out_barrier->dstQueueFamilyIndex ||177src_qfi == cmd->queue_family_index) {178out_barrier->srcQueueFamilyIndex = cmd->queue_family_index;179out_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT;180} else {181/* The barrier also defines a queue family ownership transfer, and182* this is the one that gets submitted to the destination queue183* family to acquire the ownership. Skip both the transfer and the184* transition.185*/186out_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;187out_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;188out_barrier->oldLayout = out_barrier->newLayout;189}190}191}192193static const VkImageMemoryBarrier *194vn_cmd_wait_events_fix_image_memory_barriers(195struct vn_command_buffer *cmd,196const VkImageMemoryBarrier *src_barriers,197uint32_t count,198uint32_t *out_transfer_count)199{200*out_transfer_count = 0;201202if (cmd->builder.render_pass ||203!vn_image_memory_barrier_has_present_src(src_barriers, count))204return src_barriers;205206VkImageMemoryBarrier *img_barriers =207vn_cmd_get_image_memory_barriers(cmd, count * 2);208if (!img_barriers) {209cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;210return src_barriers;211}212213/* vkCmdWaitEvents cannot be used for queue family ownership transfers.214* Nothing appears to be said about the submission order of image memory215* barriers in the same array. We take the liberty to move queue family216* ownership transfers to the tail.217*/218VkImageMemoryBarrier *transfer_barriers = img_barriers + count;219uint32_t transfer_count = 0;220uint32_t valid_count = 0;221for (uint32_t i = 0; i < count; i++) {222VkImageMemoryBarrier *img_barrier = &img_barriers[valid_count];223vn_cmd_fix_image_memory_barrier(cmd, &src_barriers[i], img_barrier);224225if (VN_PRESENT_SRC_INTERNAL_LAYOUT == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {226valid_count++;227continue;228}229230if (img_barrier->srcQueueFamilyIndex ==231img_barrier->dstQueueFamilyIndex) {232valid_count++;233} else {234transfer_barriers[transfer_count++] = *img_barrier;235}236}237238assert(valid_count + transfer_count == count);239if (transfer_count) {240/* copy back to the tail */241memcpy(&img_barriers[valid_count], transfer_barriers,242sizeof(*transfer_barriers) * transfer_count);243*out_transfer_count = transfer_count;244}245246return img_barriers;247}248249static const VkImageMemoryBarrier *250vn_cmd_pipeline_barrier_fix_image_memory_barriers(251struct vn_command_buffer *cmd,252const VkImageMemoryBarrier *src_barriers,253uint32_t count)254{255if (cmd->builder.render_pass ||256!vn_image_memory_barrier_has_present_src(src_barriers, count))257return src_barriers;258259VkImageMemoryBarrier *img_barriers =260vn_cmd_get_image_memory_barriers(cmd, count);261if (!img_barriers) {262cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;263return src_barriers;264}265266for (uint32_t i = 0; i < count; i++) {267vn_cmd_fix_image_memory_barrier(cmd, &src_barriers[i],268&img_barriers[i]);269}270271return img_barriers;272}273274static void275vn_cmd_encode_memory_barriers(struct vn_command_buffer *cmd,276VkPipelineStageFlags src_stage_mask,277VkPipelineStageFlags dst_stage_mask,278uint32_t buf_barrier_count,279const VkBufferMemoryBarrier *buf_barriers,280uint32_t img_barrier_count,281const VkImageMemoryBarrier *img_barriers)282{283const VkCommandBuffer cmd_handle = vn_command_buffer_to_handle(cmd);284285const size_t cmd_size = vn_sizeof_vkCmdPipelineBarrier(286cmd_handle, src_stage_mask, dst_stage_mask, 0, 0, NULL,287buf_barrier_count, buf_barriers, img_barrier_count, img_barriers);288if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) {289cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;290return;291}292293vn_encode_vkCmdPipelineBarrier(294&cmd->cs, 0, cmd_handle, src_stage_mask, dst_stage_mask, 0, 0, NULL,295buf_barrier_count, buf_barriers, img_barrier_count, img_barriers);296}297298static void299vn_present_src_attachment_to_image_memory_barrier(300const struct vn_image *img,301const struct vn_present_src_attachment *att,302VkImageMemoryBarrier *img_barrier)303{304*img_barrier = (VkImageMemoryBarrier)305{306.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,307.srcAccessMask = att->src_access_mask,308.dstAccessMask = att->dst_access_mask,309.oldLayout = att->acquire ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR310: VN_PRESENT_SRC_INTERNAL_LAYOUT,311.newLayout = att->acquire ? VN_PRESENT_SRC_INTERNAL_LAYOUT312: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,313.image = vn_image_to_handle((struct vn_image *)img),314.subresourceRange = {315.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,316.levelCount = 1,317.layerCount = 1,318},319};320}321322static void323vn_cmd_transfer_present_src_images(324struct vn_command_buffer *cmd,325const struct vn_image *const *images,326const struct vn_present_src_attachment *atts,327uint32_t count)328{329VkImageMemoryBarrier *img_barriers =330vn_cmd_get_image_memory_barriers(cmd, count);331if (!img_barriers) {332cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;333return;334}335336VkPipelineStageFlags src_stage_mask = 0;337VkPipelineStageFlags dst_stage_mask = 0;338for (uint32_t i = 0; i < count; i++) {339src_stage_mask |= atts[i].src_stage_mask;340dst_stage_mask |= atts[i].dst_stage_mask;341342vn_present_src_attachment_to_image_memory_barrier(images[i], &atts[i],343&img_barriers[i]);344vn_cmd_fix_image_memory_barrier(cmd, &img_barriers[i],345&img_barriers[i]);346}347348if (VN_PRESENT_SRC_INTERNAL_LAYOUT == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)349return;350351vn_cmd_encode_memory_barriers(cmd, src_stage_mask, dst_stage_mask, 0, NULL,352count, img_barriers);353}354355static void356vn_cmd_begin_render_pass(struct vn_command_buffer *cmd,357const struct vn_render_pass *pass,358const struct vn_framebuffer *fb,359const VkRenderPassBeginInfo *begin_info)360{361cmd->builder.render_pass = pass;362cmd->builder.framebuffer = fb;363364if (!pass->present_src_count ||365cmd->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)366return;367368/* find fb attachments */369const VkImageView *views;370ASSERTED uint32_t view_count;371if (fb->image_view_count) {372views = fb->image_views;373view_count = fb->image_view_count;374} else {375const VkRenderPassAttachmentBeginInfo *imageless_info =376vk_find_struct_const(begin_info->pNext,377RENDER_PASS_ATTACHMENT_BEGIN_INFO);378assert(imageless_info);379views = imageless_info->pAttachments;380view_count = imageless_info->attachmentCount;381}382383const struct vn_image **images =384vk_alloc(&cmd->allocator, sizeof(*images) * pass->present_src_count,385VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);386if (!images) {387cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;388return;389}390391for (uint32_t i = 0; i < pass->present_src_count; i++) {392const uint32_t index = pass->present_src_attachments[i].index;393assert(index < view_count);394images[i] = vn_image_view_from_handle(views[index])->image;395}396397if (pass->acquire_count) {398vn_cmd_transfer_present_src_images(399cmd, images, pass->present_src_attachments, pass->acquire_count);400}401402cmd->builder.present_src_images = images;403}404405static void406vn_cmd_end_render_pass(struct vn_command_buffer *cmd)407{408const struct vn_render_pass *pass = cmd->builder.render_pass;409410cmd->builder.render_pass = NULL;411cmd->builder.framebuffer = NULL;412413if (!pass->present_src_count || !cmd->builder.present_src_images)414return;415416const struct vn_image **images = cmd->builder.present_src_images;417cmd->builder.present_src_images = NULL;418419if (pass->release_count) {420vn_cmd_transfer_present_src_images(421cmd, images + pass->acquire_count,422pass->present_src_attachments + pass->acquire_count,423pass->release_count);424}425426vk_free(&cmd->allocator, images);427}428429/* command pool commands */430431VkResult432vn_CreateCommandPool(VkDevice device,433const VkCommandPoolCreateInfo *pCreateInfo,434const VkAllocationCallbacks *pAllocator,435VkCommandPool *pCommandPool)436{437struct vn_device *dev = vn_device_from_handle(device);438const VkAllocationCallbacks *alloc =439pAllocator ? pAllocator : &dev->base.base.alloc;440441struct vn_command_pool *pool =442vk_zalloc(alloc, sizeof(*pool), VN_DEFAULT_ALIGN,443VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);444if (!pool)445return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);446447vn_object_base_init(&pool->base, VK_OBJECT_TYPE_COMMAND_POOL, &dev->base);448449pool->allocator = *alloc;450pool->queue_family_index = pCreateInfo->queueFamilyIndex;451list_inithead(&pool->command_buffers);452453VkCommandPool pool_handle = vn_command_pool_to_handle(pool);454vn_async_vkCreateCommandPool(dev->instance, device, pCreateInfo, NULL,455&pool_handle);456457*pCommandPool = pool_handle;458459return VK_SUCCESS;460}461462void463vn_DestroyCommandPool(VkDevice device,464VkCommandPool commandPool,465const VkAllocationCallbacks *pAllocator)466{467struct vn_device *dev = vn_device_from_handle(device);468struct vn_command_pool *pool = vn_command_pool_from_handle(commandPool);469const VkAllocationCallbacks *alloc;470471if (!pool)472return;473474alloc = pAllocator ? pAllocator : &pool->allocator;475476/* We must emit vkDestroyCommandPool before freeing the command buffers in477* pool->command_buffers. Otherwise, another thread might reuse their478* object ids while they still refer to the command buffers in the479* renderer.480*/481vn_async_vkDestroyCommandPool(dev->instance, device, commandPool, NULL);482483list_for_each_entry_safe(struct vn_command_buffer, cmd,484&pool->command_buffers, head) {485vn_cs_encoder_fini(&cmd->cs);486vn_object_base_fini(&cmd->base);487vk_free(alloc, cmd);488}489490vn_object_base_fini(&pool->base);491vk_free(alloc, pool);492}493494VkResult495vn_ResetCommandPool(VkDevice device,496VkCommandPool commandPool,497VkCommandPoolResetFlags flags)498{499struct vn_device *dev = vn_device_from_handle(device);500struct vn_command_pool *pool = vn_command_pool_from_handle(commandPool);501502list_for_each_entry_safe(struct vn_command_buffer, cmd,503&pool->command_buffers, head) {504vn_cs_encoder_reset(&cmd->cs);505cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;506}507508vn_async_vkResetCommandPool(dev->instance, device, commandPool, flags);509510return VK_SUCCESS;511}512513void514vn_TrimCommandPool(VkDevice device,515VkCommandPool commandPool,516VkCommandPoolTrimFlags flags)517{518struct vn_device *dev = vn_device_from_handle(device);519520vn_async_vkTrimCommandPool(dev->instance, device, commandPool, flags);521}522523/* command buffer commands */524525VkResult526vn_AllocateCommandBuffers(VkDevice device,527const VkCommandBufferAllocateInfo *pAllocateInfo,528VkCommandBuffer *pCommandBuffers)529{530struct vn_device *dev = vn_device_from_handle(device);531struct vn_command_pool *pool =532vn_command_pool_from_handle(pAllocateInfo->commandPool);533const VkAllocationCallbacks *alloc = &pool->allocator;534535for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {536struct vn_command_buffer *cmd =537vk_zalloc(alloc, sizeof(*cmd), VN_DEFAULT_ALIGN,538VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);539if (!cmd) {540for (uint32_t j = 0; j < i; j++) {541cmd = vn_command_buffer_from_handle(pCommandBuffers[j]);542vn_cs_encoder_fini(&cmd->cs);543list_del(&cmd->head);544vk_free(alloc, cmd);545}546memset(pCommandBuffers, 0,547sizeof(*pCommandBuffers) * pAllocateInfo->commandBufferCount);548return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);549}550551vn_object_base_init(&cmd->base, VK_OBJECT_TYPE_COMMAND_BUFFER,552&dev->base);553cmd->device = dev;554cmd->allocator = pool->allocator;555cmd->level = pAllocateInfo->level;556cmd->queue_family_index = pool->queue_family_index;557558list_addtail(&cmd->head, &pool->command_buffers);559560cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;561vn_cs_encoder_init_indirect(&cmd->cs, dev->instance, 16 * 1024);562563VkCommandBuffer cmd_handle = vn_command_buffer_to_handle(cmd);564pCommandBuffers[i] = cmd_handle;565}566567vn_async_vkAllocateCommandBuffers(dev->instance, device, pAllocateInfo,568pCommandBuffers);569570return VK_SUCCESS;571}572573void574vn_FreeCommandBuffers(VkDevice device,575VkCommandPool commandPool,576uint32_t commandBufferCount,577const VkCommandBuffer *pCommandBuffers)578{579struct vn_device *dev = vn_device_from_handle(device);580struct vn_command_pool *pool = vn_command_pool_from_handle(commandPool);581const VkAllocationCallbacks *alloc = &pool->allocator;582583vn_async_vkFreeCommandBuffers(dev->instance, device, commandPool,584commandBufferCount, pCommandBuffers);585586for (uint32_t i = 0; i < commandBufferCount; i++) {587struct vn_command_buffer *cmd =588vn_command_buffer_from_handle(pCommandBuffers[i]);589590if (!cmd)591continue;592593if (cmd->builder.image_barriers)594vk_free(alloc, cmd->builder.image_barriers);595596vn_cs_encoder_fini(&cmd->cs);597list_del(&cmd->head);598599vn_object_base_fini(&cmd->base);600vk_free(alloc, cmd);601}602}603604VkResult605vn_ResetCommandBuffer(VkCommandBuffer commandBuffer,606VkCommandBufferResetFlags flags)607{608struct vn_command_buffer *cmd =609vn_command_buffer_from_handle(commandBuffer);610611vn_cs_encoder_reset(&cmd->cs);612cmd->state = VN_COMMAND_BUFFER_STATE_INITIAL;613614vn_async_vkResetCommandBuffer(cmd->device->instance, commandBuffer, flags);615616return VK_SUCCESS;617}618619VkResult620vn_BeginCommandBuffer(VkCommandBuffer commandBuffer,621const VkCommandBufferBeginInfo *pBeginInfo)622{623struct vn_command_buffer *cmd =624vn_command_buffer_from_handle(commandBuffer);625struct vn_instance *instance = cmd->device->instance;626size_t cmd_size;627628vn_cs_encoder_reset(&cmd->cs);629630VkCommandBufferBeginInfo local_begin_info;631if (pBeginInfo->pInheritanceInfo &&632cmd->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {633local_begin_info = *pBeginInfo;634local_begin_info.pInheritanceInfo = NULL;635pBeginInfo = &local_begin_info;636}637638cmd_size = vn_sizeof_vkBeginCommandBuffer(commandBuffer, pBeginInfo);639if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) {640cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;641return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);642}643644vn_encode_vkBeginCommandBuffer(&cmd->cs, 0, commandBuffer, pBeginInfo);645646cmd->state = VN_COMMAND_BUFFER_STATE_RECORDING;647648if (cmd->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY &&649(pBeginInfo->flags &650VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {651const VkCommandBufferInheritanceInfo *inheritance_info =652pBeginInfo->pInheritanceInfo;653vn_cmd_begin_render_pass(654cmd, vn_render_pass_from_handle(inheritance_info->renderPass),655vn_framebuffer_from_handle(inheritance_info->framebuffer), NULL);656}657658return VK_SUCCESS;659}660661VkResult662vn_EndCommandBuffer(VkCommandBuffer commandBuffer)663{664struct vn_command_buffer *cmd =665vn_command_buffer_from_handle(commandBuffer);666struct vn_instance *instance = cmd->device->instance;667size_t cmd_size;668669if (cmd->state != VN_COMMAND_BUFFER_STATE_RECORDING)670return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);671672cmd_size = vn_sizeof_vkEndCommandBuffer(commandBuffer);673if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size)) {674cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;675return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);676}677678vn_encode_vkEndCommandBuffer(&cmd->cs, 0, commandBuffer);679vn_cs_encoder_commit(&cmd->cs);680681if (vn_cs_encoder_get_fatal(&cmd->cs)) {682cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;683return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);684}685686vn_instance_wait_roundtrip(instance, cmd->cs.current_buffer_roundtrip);687VkResult result = vn_instance_ring_submit(instance, &cmd->cs);688if (result != VK_SUCCESS) {689cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;690return vn_error(instance, result);691}692693vn_cs_encoder_reset(&cmd->cs);694695cmd->state = VN_COMMAND_BUFFER_STATE_EXECUTABLE;696697return VK_SUCCESS;698}699700void701vn_CmdBindPipeline(VkCommandBuffer commandBuffer,702VkPipelineBindPoint pipelineBindPoint,703VkPipeline pipeline)704{705struct vn_command_buffer *cmd =706vn_command_buffer_from_handle(commandBuffer);707size_t cmd_size;708709cmd_size =710vn_sizeof_vkCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);711if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))712return;713714vn_encode_vkCmdBindPipeline(&cmd->cs, 0, commandBuffer, pipelineBindPoint,715pipeline);716}717718void719vn_CmdSetViewport(VkCommandBuffer commandBuffer,720uint32_t firstViewport,721uint32_t viewportCount,722const VkViewport *pViewports)723{724struct vn_command_buffer *cmd =725vn_command_buffer_from_handle(commandBuffer);726size_t cmd_size;727728cmd_size = vn_sizeof_vkCmdSetViewport(commandBuffer, firstViewport,729viewportCount, pViewports);730if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))731return;732733vn_encode_vkCmdSetViewport(&cmd->cs, 0, commandBuffer, firstViewport,734viewportCount, pViewports);735}736737void738vn_CmdSetScissor(VkCommandBuffer commandBuffer,739uint32_t firstScissor,740uint32_t scissorCount,741const VkRect2D *pScissors)742{743struct vn_command_buffer *cmd =744vn_command_buffer_from_handle(commandBuffer);745size_t cmd_size;746747cmd_size = vn_sizeof_vkCmdSetScissor(commandBuffer, firstScissor,748scissorCount, pScissors);749if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))750return;751752vn_encode_vkCmdSetScissor(&cmd->cs, 0, commandBuffer, firstScissor,753scissorCount, pScissors);754}755756void757vn_CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)758{759struct vn_command_buffer *cmd =760vn_command_buffer_from_handle(commandBuffer);761size_t cmd_size;762763cmd_size = vn_sizeof_vkCmdSetLineWidth(commandBuffer, lineWidth);764if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))765return;766767vn_encode_vkCmdSetLineWidth(&cmd->cs, 0, commandBuffer, lineWidth);768}769770void771vn_CmdSetDepthBias(VkCommandBuffer commandBuffer,772float depthBiasConstantFactor,773float depthBiasClamp,774float depthBiasSlopeFactor)775{776struct vn_command_buffer *cmd =777vn_command_buffer_from_handle(commandBuffer);778size_t cmd_size;779780cmd_size =781vn_sizeof_vkCmdSetDepthBias(commandBuffer, depthBiasConstantFactor,782depthBiasClamp, depthBiasSlopeFactor);783if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))784return;785786vn_encode_vkCmdSetDepthBias(&cmd->cs, 0, commandBuffer,787depthBiasConstantFactor, depthBiasClamp,788depthBiasSlopeFactor);789}790791void792vn_CmdSetBlendConstants(VkCommandBuffer commandBuffer,793const float blendConstants[4])794{795struct vn_command_buffer *cmd =796vn_command_buffer_from_handle(commandBuffer);797size_t cmd_size;798799cmd_size = vn_sizeof_vkCmdSetBlendConstants(commandBuffer, blendConstants);800if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))801return;802803vn_encode_vkCmdSetBlendConstants(&cmd->cs, 0, commandBuffer,804blendConstants);805}806807void808vn_CmdSetDepthBounds(VkCommandBuffer commandBuffer,809float minDepthBounds,810float maxDepthBounds)811{812struct vn_command_buffer *cmd =813vn_command_buffer_from_handle(commandBuffer);814size_t cmd_size;815816cmd_size = vn_sizeof_vkCmdSetDepthBounds(commandBuffer, minDepthBounds,817maxDepthBounds);818if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))819return;820821vn_encode_vkCmdSetDepthBounds(&cmd->cs, 0, commandBuffer, minDepthBounds,822maxDepthBounds);823}824825void826vn_CmdSetStencilCompareMask(VkCommandBuffer commandBuffer,827VkStencilFaceFlags faceMask,828uint32_t compareMask)829{830struct vn_command_buffer *cmd =831vn_command_buffer_from_handle(commandBuffer);832size_t cmd_size;833834cmd_size = vn_sizeof_vkCmdSetStencilCompareMask(commandBuffer, faceMask,835compareMask);836if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))837return;838839vn_encode_vkCmdSetStencilCompareMask(&cmd->cs, 0, commandBuffer, faceMask,840compareMask);841}842843void844vn_CmdSetStencilWriteMask(VkCommandBuffer commandBuffer,845VkStencilFaceFlags faceMask,846uint32_t writeMask)847{848struct vn_command_buffer *cmd =849vn_command_buffer_from_handle(commandBuffer);850size_t cmd_size;851852cmd_size =853vn_sizeof_vkCmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);854if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))855return;856857vn_encode_vkCmdSetStencilWriteMask(&cmd->cs, 0, commandBuffer, faceMask,858writeMask);859}860861void862vn_CmdSetStencilReference(VkCommandBuffer commandBuffer,863VkStencilFaceFlags faceMask,864uint32_t reference)865{866struct vn_command_buffer *cmd =867vn_command_buffer_from_handle(commandBuffer);868size_t cmd_size;869870cmd_size =871vn_sizeof_vkCmdSetStencilReference(commandBuffer, faceMask, reference);872if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))873return;874875vn_encode_vkCmdSetStencilReference(&cmd->cs, 0, commandBuffer, faceMask,876reference);877}878879void880vn_CmdBindDescriptorSets(VkCommandBuffer commandBuffer,881VkPipelineBindPoint pipelineBindPoint,882VkPipelineLayout layout,883uint32_t firstSet,884uint32_t descriptorSetCount,885const VkDescriptorSet *pDescriptorSets,886uint32_t dynamicOffsetCount,887const uint32_t *pDynamicOffsets)888{889struct vn_command_buffer *cmd =890vn_command_buffer_from_handle(commandBuffer);891size_t cmd_size;892893cmd_size = vn_sizeof_vkCmdBindDescriptorSets(894commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount,895pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);896if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))897return;898899vn_encode_vkCmdBindDescriptorSets(&cmd->cs, 0, commandBuffer,900pipelineBindPoint, layout, firstSet,901descriptorSetCount, pDescriptorSets,902dynamicOffsetCount, pDynamicOffsets);903}904905void906vn_CmdBindIndexBuffer(VkCommandBuffer commandBuffer,907VkBuffer buffer,908VkDeviceSize offset,909VkIndexType indexType)910{911struct vn_command_buffer *cmd =912vn_command_buffer_from_handle(commandBuffer);913size_t cmd_size;914915cmd_size = vn_sizeof_vkCmdBindIndexBuffer(commandBuffer, buffer, offset,916indexType);917if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))918return;919920vn_encode_vkCmdBindIndexBuffer(&cmd->cs, 0, commandBuffer, buffer, offset,921indexType);922}923924void925vn_CmdBindVertexBuffers(VkCommandBuffer commandBuffer,926uint32_t firstBinding,927uint32_t bindingCount,928const VkBuffer *pBuffers,929const VkDeviceSize *pOffsets)930{931struct vn_command_buffer *cmd =932vn_command_buffer_from_handle(commandBuffer);933size_t cmd_size;934935cmd_size = vn_sizeof_vkCmdBindVertexBuffers(936commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);937if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))938return;939940vn_encode_vkCmdBindVertexBuffers(&cmd->cs, 0, commandBuffer, firstBinding,941bindingCount, pBuffers, pOffsets);942}943944void945vn_CmdDraw(VkCommandBuffer commandBuffer,946uint32_t vertexCount,947uint32_t instanceCount,948uint32_t firstVertex,949uint32_t firstInstance)950{951struct vn_command_buffer *cmd =952vn_command_buffer_from_handle(commandBuffer);953size_t cmd_size;954955cmd_size = vn_sizeof_vkCmdDraw(commandBuffer, vertexCount, instanceCount,956firstVertex, firstInstance);957if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))958return;959960vn_encode_vkCmdDraw(&cmd->cs, 0, commandBuffer, vertexCount, instanceCount,961firstVertex, firstInstance);962}963964void965vn_CmdDrawIndexed(VkCommandBuffer commandBuffer,966uint32_t indexCount,967uint32_t instanceCount,968uint32_t firstIndex,969int32_t vertexOffset,970uint32_t firstInstance)971{972struct vn_command_buffer *cmd =973vn_command_buffer_from_handle(commandBuffer);974size_t cmd_size;975976cmd_size =977vn_sizeof_vkCmdDrawIndexed(commandBuffer, indexCount, instanceCount,978firstIndex, vertexOffset, firstInstance);979if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))980return;981982vn_encode_vkCmdDrawIndexed(&cmd->cs, 0, commandBuffer, indexCount,983instanceCount, firstIndex, vertexOffset,984firstInstance);985}986987void988vn_CmdDrawIndirect(VkCommandBuffer commandBuffer,989VkBuffer buffer,990VkDeviceSize offset,991uint32_t drawCount,992uint32_t stride)993{994struct vn_command_buffer *cmd =995vn_command_buffer_from_handle(commandBuffer);996size_t cmd_size;997998cmd_size = vn_sizeof_vkCmdDrawIndirect(commandBuffer, buffer, offset,999drawCount, stride);1000if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1001return;10021003vn_encode_vkCmdDrawIndirect(&cmd->cs, 0, commandBuffer, buffer, offset,1004drawCount, stride);1005}10061007void1008vn_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,1009VkBuffer buffer,1010VkDeviceSize offset,1011uint32_t drawCount,1012uint32_t stride)1013{1014struct vn_command_buffer *cmd =1015vn_command_buffer_from_handle(commandBuffer);1016size_t cmd_size;10171018cmd_size = vn_sizeof_vkCmdDrawIndexedIndirect(commandBuffer, buffer,1019offset, drawCount, stride);1020if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1021return;10221023vn_encode_vkCmdDrawIndexedIndirect(&cmd->cs, 0, commandBuffer, buffer,1024offset, drawCount, stride);1025}10261027void1028vn_CmdDrawIndirectCount(VkCommandBuffer commandBuffer,1029VkBuffer buffer,1030VkDeviceSize offset,1031VkBuffer countBuffer,1032VkDeviceSize countBufferOffset,1033uint32_t maxDrawCount,1034uint32_t stride)1035{1036struct vn_command_buffer *cmd =1037vn_command_buffer_from_handle(commandBuffer);1038size_t cmd_size;10391040cmd_size = vn_sizeof_vkCmdDrawIndirectCount(commandBuffer, buffer, offset,1041countBuffer, countBufferOffset,1042maxDrawCount, stride);1043if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1044return;10451046vn_encode_vkCmdDrawIndirectCount(&cmd->cs, 0, commandBuffer, buffer,1047offset, countBuffer, countBufferOffset,1048maxDrawCount, stride);1049}10501051void1052vn_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,1053VkBuffer buffer,1054VkDeviceSize offset,1055VkBuffer countBuffer,1056VkDeviceSize countBufferOffset,1057uint32_t maxDrawCount,1058uint32_t stride)1059{1060struct vn_command_buffer *cmd =1061vn_command_buffer_from_handle(commandBuffer);1062size_t cmd_size;10631064cmd_size = vn_sizeof_vkCmdDrawIndexedIndirectCount(1065commandBuffer, buffer, offset, countBuffer, countBufferOffset,1066maxDrawCount, stride);1067if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1068return;10691070vn_encode_vkCmdDrawIndexedIndirectCount(1071&cmd->cs, 0, commandBuffer, buffer, offset, countBuffer,1072countBufferOffset, maxDrawCount, stride);1073}10741075void1076vn_CmdDispatch(VkCommandBuffer commandBuffer,1077uint32_t groupCountX,1078uint32_t groupCountY,1079uint32_t groupCountZ)1080{1081struct vn_command_buffer *cmd =1082vn_command_buffer_from_handle(commandBuffer);1083size_t cmd_size;10841085cmd_size = vn_sizeof_vkCmdDispatch(commandBuffer, groupCountX, groupCountY,1086groupCountZ);1087if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1088return;10891090vn_encode_vkCmdDispatch(&cmd->cs, 0, commandBuffer, groupCountX,1091groupCountY, groupCountZ);1092}10931094void1095vn_CmdDispatchIndirect(VkCommandBuffer commandBuffer,1096VkBuffer buffer,1097VkDeviceSize offset)1098{1099struct vn_command_buffer *cmd =1100vn_command_buffer_from_handle(commandBuffer);1101size_t cmd_size;11021103cmd_size = vn_sizeof_vkCmdDispatchIndirect(commandBuffer, buffer, offset);1104if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1105return;11061107vn_encode_vkCmdDispatchIndirect(&cmd->cs, 0, commandBuffer, buffer,1108offset);1109}11101111void1112vn_CmdCopyBuffer(VkCommandBuffer commandBuffer,1113VkBuffer srcBuffer,1114VkBuffer dstBuffer,1115uint32_t regionCount,1116const VkBufferCopy *pRegions)1117{1118struct vn_command_buffer *cmd =1119vn_command_buffer_from_handle(commandBuffer);1120size_t cmd_size;11211122cmd_size = vn_sizeof_vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer,1123regionCount, pRegions);1124if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1125return;11261127vn_encode_vkCmdCopyBuffer(&cmd->cs, 0, commandBuffer, srcBuffer, dstBuffer,1128regionCount, pRegions);1129}11301131void1132vn_CmdCopyImage(VkCommandBuffer commandBuffer,1133VkImage srcImage,1134VkImageLayout srcImageLayout,1135VkImage dstImage,1136VkImageLayout dstImageLayout,1137uint32_t regionCount,1138const VkImageCopy *pRegions)1139{1140struct vn_command_buffer *cmd =1141vn_command_buffer_from_handle(commandBuffer);1142size_t cmd_size;11431144cmd_size = vn_sizeof_vkCmdCopyImage(commandBuffer, srcImage,1145srcImageLayout, dstImage,1146dstImageLayout, regionCount, pRegions);1147if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1148return;11491150vn_encode_vkCmdCopyImage(&cmd->cs, 0, commandBuffer, srcImage,1151srcImageLayout, dstImage, dstImageLayout,1152regionCount, pRegions);1153}11541155void1156vn_CmdBlitImage(VkCommandBuffer commandBuffer,1157VkImage srcImage,1158VkImageLayout srcImageLayout,1159VkImage dstImage,1160VkImageLayout dstImageLayout,1161uint32_t regionCount,1162const VkImageBlit *pRegions,1163VkFilter filter)1164{1165struct vn_command_buffer *cmd =1166vn_command_buffer_from_handle(commandBuffer);1167size_t cmd_size;11681169cmd_size = vn_sizeof_vkCmdBlitImage(1170commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout,1171regionCount, pRegions, filter);1172if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1173return;11741175vn_encode_vkCmdBlitImage(&cmd->cs, 0, commandBuffer, srcImage,1176srcImageLayout, dstImage, dstImageLayout,1177regionCount, pRegions, filter);1178}11791180void1181vn_CmdCopyBufferToImage(VkCommandBuffer commandBuffer,1182VkBuffer srcBuffer,1183VkImage dstImage,1184VkImageLayout dstImageLayout,1185uint32_t regionCount,1186const VkBufferImageCopy *pRegions)1187{1188struct vn_command_buffer *cmd =1189vn_command_buffer_from_handle(commandBuffer);1190size_t cmd_size;11911192cmd_size =1193vn_sizeof_vkCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage,1194dstImageLayout, regionCount, pRegions);1195if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1196return;11971198vn_encode_vkCmdCopyBufferToImage(&cmd->cs, 0, commandBuffer, srcBuffer,1199dstImage, dstImageLayout, regionCount,1200pRegions);1201}12021203void1204vn_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer,1205VkImage srcImage,1206VkImageLayout srcImageLayout,1207VkBuffer dstBuffer,1208uint32_t regionCount,1209const VkBufferImageCopy *pRegions)1210{1211struct vn_command_buffer *cmd =1212vn_command_buffer_from_handle(commandBuffer);1213size_t cmd_size;12141215bool prime_blit = false;1216if (srcImageLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&1217VN_PRESENT_SRC_INTERNAL_LAYOUT != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {1218srcImageLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;12191220const struct vn_image *img = vn_image_from_handle(srcImage);1221prime_blit = img->is_wsi && img->prime_blit_buffer == dstBuffer;1222assert(prime_blit);1223}12241225cmd_size = vn_sizeof_vkCmdCopyImageToBuffer(commandBuffer, srcImage,1226srcImageLayout, dstBuffer,1227regionCount, pRegions);1228if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1229return;12301231vn_encode_vkCmdCopyImageToBuffer(&cmd->cs, 0, commandBuffer, srcImage,1232srcImageLayout, dstBuffer, regionCount,1233pRegions);12341235if (prime_blit) {1236const VkBufferMemoryBarrier buf_barrier = {1237.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,1238.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,1239.srcQueueFamilyIndex = cmd->queue_family_index,1240.dstQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT,1241.buffer = dstBuffer,1242.size = VK_WHOLE_SIZE,1243};1244vn_cmd_encode_memory_barriers(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT,1245VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 1,1246&buf_barrier, 0, NULL);1247}1248}12491250void1251vn_CmdUpdateBuffer(VkCommandBuffer commandBuffer,1252VkBuffer dstBuffer,1253VkDeviceSize dstOffset,1254VkDeviceSize dataSize,1255const void *pData)1256{1257struct vn_command_buffer *cmd =1258vn_command_buffer_from_handle(commandBuffer);1259size_t cmd_size;12601261cmd_size = vn_sizeof_vkCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset,1262dataSize, pData);1263if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1264return;12651266vn_encode_vkCmdUpdateBuffer(&cmd->cs, 0, commandBuffer, dstBuffer,1267dstOffset, dataSize, pData);1268}12691270void1271vn_CmdFillBuffer(VkCommandBuffer commandBuffer,1272VkBuffer dstBuffer,1273VkDeviceSize dstOffset,1274VkDeviceSize size,1275uint32_t data)1276{1277struct vn_command_buffer *cmd =1278vn_command_buffer_from_handle(commandBuffer);1279size_t cmd_size;12801281cmd_size = vn_sizeof_vkCmdFillBuffer(commandBuffer, dstBuffer, dstOffset,1282size, data);1283if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1284return;12851286vn_encode_vkCmdFillBuffer(&cmd->cs, 0, commandBuffer, dstBuffer, dstOffset,1287size, data);1288}12891290void1291vn_CmdClearColorImage(VkCommandBuffer commandBuffer,1292VkImage image,1293VkImageLayout imageLayout,1294const VkClearColorValue *pColor,1295uint32_t rangeCount,1296const VkImageSubresourceRange *pRanges)1297{1298struct vn_command_buffer *cmd =1299vn_command_buffer_from_handle(commandBuffer);1300size_t cmd_size;13011302cmd_size = vn_sizeof_vkCmdClearColorImage(1303commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);1304if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1305return;13061307vn_encode_vkCmdClearColorImage(&cmd->cs, 0, commandBuffer, image,1308imageLayout, pColor, rangeCount, pRanges);1309}13101311void1312vn_CmdClearDepthStencilImage(VkCommandBuffer commandBuffer,1313VkImage image,1314VkImageLayout imageLayout,1315const VkClearDepthStencilValue *pDepthStencil,1316uint32_t rangeCount,1317const VkImageSubresourceRange *pRanges)1318{1319struct vn_command_buffer *cmd =1320vn_command_buffer_from_handle(commandBuffer);1321size_t cmd_size;13221323cmd_size = vn_sizeof_vkCmdClearDepthStencilImage(1324commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);1325if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1326return;13271328vn_encode_vkCmdClearDepthStencilImage(&cmd->cs, 0, commandBuffer, image,1329imageLayout, pDepthStencil,1330rangeCount, pRanges);1331}13321333void1334vn_CmdClearAttachments(VkCommandBuffer commandBuffer,1335uint32_t attachmentCount,1336const VkClearAttachment *pAttachments,1337uint32_t rectCount,1338const VkClearRect *pRects)1339{1340struct vn_command_buffer *cmd =1341vn_command_buffer_from_handle(commandBuffer);1342size_t cmd_size;13431344cmd_size = vn_sizeof_vkCmdClearAttachments(1345commandBuffer, attachmentCount, pAttachments, rectCount, pRects);1346if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1347return;13481349vn_encode_vkCmdClearAttachments(&cmd->cs, 0, commandBuffer,1350attachmentCount, pAttachments, rectCount,1351pRects);1352}13531354void1355vn_CmdResolveImage(VkCommandBuffer commandBuffer,1356VkImage srcImage,1357VkImageLayout srcImageLayout,1358VkImage dstImage,1359VkImageLayout dstImageLayout,1360uint32_t regionCount,1361const VkImageResolve *pRegions)1362{1363struct vn_command_buffer *cmd =1364vn_command_buffer_from_handle(commandBuffer);1365size_t cmd_size;13661367cmd_size = vn_sizeof_vkCmdResolveImage(1368commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout,1369regionCount, pRegions);1370if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1371return;13721373vn_encode_vkCmdResolveImage(&cmd->cs, 0, commandBuffer, srcImage,1374srcImageLayout, dstImage, dstImageLayout,1375regionCount, pRegions);1376}13771378void1379vn_CmdSetEvent(VkCommandBuffer commandBuffer,1380VkEvent event,1381VkPipelineStageFlags stageMask)1382{1383struct vn_command_buffer *cmd =1384vn_command_buffer_from_handle(commandBuffer);1385size_t cmd_size;13861387cmd_size = vn_sizeof_vkCmdSetEvent(commandBuffer, event, stageMask);1388if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1389return;13901391vn_encode_vkCmdSetEvent(&cmd->cs, 0, commandBuffer, event, stageMask);1392}13931394void1395vn_CmdResetEvent(VkCommandBuffer commandBuffer,1396VkEvent event,1397VkPipelineStageFlags stageMask)1398{1399struct vn_command_buffer *cmd =1400vn_command_buffer_from_handle(commandBuffer);1401size_t cmd_size;14021403cmd_size = vn_sizeof_vkCmdResetEvent(commandBuffer, event, stageMask);1404if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1405return;14061407vn_encode_vkCmdResetEvent(&cmd->cs, 0, commandBuffer, event, stageMask);1408}14091410void1411vn_CmdWaitEvents(VkCommandBuffer commandBuffer,1412uint32_t eventCount,1413const VkEvent *pEvents,1414VkPipelineStageFlags srcStageMask,1415VkPipelineStageFlags dstStageMask,1416uint32_t memoryBarrierCount,1417const VkMemoryBarrier *pMemoryBarriers,1418uint32_t bufferMemoryBarrierCount,1419const VkBufferMemoryBarrier *pBufferMemoryBarriers,1420uint32_t imageMemoryBarrierCount,1421const VkImageMemoryBarrier *pImageMemoryBarriers)1422{1423struct vn_command_buffer *cmd =1424vn_command_buffer_from_handle(commandBuffer);1425size_t cmd_size;14261427uint32_t transfer_count;1428pImageMemoryBarriers = vn_cmd_wait_events_fix_image_memory_barriers(1429cmd, pImageMemoryBarriers, imageMemoryBarrierCount, &transfer_count);1430imageMemoryBarrierCount -= transfer_count;14311432cmd_size = vn_sizeof_vkCmdWaitEvents(1433commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask,1434memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,1435pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);1436if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1437return;14381439vn_encode_vkCmdWaitEvents(&cmd->cs, 0, commandBuffer, eventCount, pEvents,1440srcStageMask, dstStageMask, memoryBarrierCount,1441pMemoryBarriers, bufferMemoryBarrierCount,1442pBufferMemoryBarriers, imageMemoryBarrierCount,1443pImageMemoryBarriers);14441445if (transfer_count) {1446pImageMemoryBarriers += imageMemoryBarrierCount;1447vn_cmd_encode_memory_barriers(cmd, srcStageMask, dstStageMask, 0, NULL,1448transfer_count, pImageMemoryBarriers);1449}1450}14511452void1453vn_CmdPipelineBarrier(VkCommandBuffer commandBuffer,1454VkPipelineStageFlags srcStageMask,1455VkPipelineStageFlags dstStageMask,1456VkDependencyFlags dependencyFlags,1457uint32_t memoryBarrierCount,1458const VkMemoryBarrier *pMemoryBarriers,1459uint32_t bufferMemoryBarrierCount,1460const VkBufferMemoryBarrier *pBufferMemoryBarriers,1461uint32_t imageMemoryBarrierCount,1462const VkImageMemoryBarrier *pImageMemoryBarriers)1463{1464struct vn_command_buffer *cmd =1465vn_command_buffer_from_handle(commandBuffer);1466size_t cmd_size;14671468pImageMemoryBarriers = vn_cmd_pipeline_barrier_fix_image_memory_barriers(1469cmd, pImageMemoryBarriers, imageMemoryBarrierCount);14701471cmd_size = vn_sizeof_vkCmdPipelineBarrier(1472commandBuffer, srcStageMask, dstStageMask, dependencyFlags,1473memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,1474pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);1475if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1476return;14771478vn_encode_vkCmdPipelineBarrier(1479&cmd->cs, 0, commandBuffer, srcStageMask, dstStageMask, dependencyFlags,1480memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,1481pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);1482}14831484void1485vn_CmdBeginQuery(VkCommandBuffer commandBuffer,1486VkQueryPool queryPool,1487uint32_t query,1488VkQueryControlFlags flags)1489{1490struct vn_command_buffer *cmd =1491vn_command_buffer_from_handle(commandBuffer);1492size_t cmd_size;14931494cmd_size =1495vn_sizeof_vkCmdBeginQuery(commandBuffer, queryPool, query, flags);1496if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1497return;14981499vn_encode_vkCmdBeginQuery(&cmd->cs, 0, commandBuffer, queryPool, query,1500flags);1501}15021503void1504vn_CmdEndQuery(VkCommandBuffer commandBuffer,1505VkQueryPool queryPool,1506uint32_t query)1507{1508struct vn_command_buffer *cmd =1509vn_command_buffer_from_handle(commandBuffer);1510size_t cmd_size;15111512cmd_size = vn_sizeof_vkCmdEndQuery(commandBuffer, queryPool, query);1513if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1514return;15151516vn_encode_vkCmdEndQuery(&cmd->cs, 0, commandBuffer, queryPool, query);1517}15181519void1520vn_CmdResetQueryPool(VkCommandBuffer commandBuffer,1521VkQueryPool queryPool,1522uint32_t firstQuery,1523uint32_t queryCount)1524{1525struct vn_command_buffer *cmd =1526vn_command_buffer_from_handle(commandBuffer);1527size_t cmd_size;15281529cmd_size = vn_sizeof_vkCmdResetQueryPool(commandBuffer, queryPool,1530firstQuery, queryCount);1531if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1532return;15331534vn_encode_vkCmdResetQueryPool(&cmd->cs, 0, commandBuffer, queryPool,1535firstQuery, queryCount);1536}15371538void1539vn_CmdWriteTimestamp(VkCommandBuffer commandBuffer,1540VkPipelineStageFlagBits pipelineStage,1541VkQueryPool queryPool,1542uint32_t query)1543{1544struct vn_command_buffer *cmd =1545vn_command_buffer_from_handle(commandBuffer);1546size_t cmd_size;15471548cmd_size = vn_sizeof_vkCmdWriteTimestamp(commandBuffer, pipelineStage,1549queryPool, query);1550if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1551return;15521553vn_encode_vkCmdWriteTimestamp(&cmd->cs, 0, commandBuffer, pipelineStage,1554queryPool, query);1555}15561557void1558vn_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,1559VkQueryPool queryPool,1560uint32_t firstQuery,1561uint32_t queryCount,1562VkBuffer dstBuffer,1563VkDeviceSize dstOffset,1564VkDeviceSize stride,1565VkQueryResultFlags flags)1566{1567struct vn_command_buffer *cmd =1568vn_command_buffer_from_handle(commandBuffer);1569size_t cmd_size;15701571cmd_size = vn_sizeof_vkCmdCopyQueryPoolResults(1572commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset,1573stride, flags);1574if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1575return;15761577vn_encode_vkCmdCopyQueryPoolResults(&cmd->cs, 0, commandBuffer, queryPool,1578firstQuery, queryCount, dstBuffer,1579dstOffset, stride, flags);1580}15811582void1583vn_CmdPushConstants(VkCommandBuffer commandBuffer,1584VkPipelineLayout layout,1585VkShaderStageFlags stageFlags,1586uint32_t offset,1587uint32_t size,1588const void *pValues)1589{1590struct vn_command_buffer *cmd =1591vn_command_buffer_from_handle(commandBuffer);1592size_t cmd_size;15931594cmd_size = vn_sizeof_vkCmdPushConstants(commandBuffer, layout, stageFlags,1595offset, size, pValues);1596if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1597return;15981599vn_encode_vkCmdPushConstants(&cmd->cs, 0, commandBuffer, layout,1600stageFlags, offset, size, pValues);1601}16021603void1604vn_CmdBeginRenderPass(VkCommandBuffer commandBuffer,1605const VkRenderPassBeginInfo *pRenderPassBegin,1606VkSubpassContents contents)1607{1608struct vn_command_buffer *cmd =1609vn_command_buffer_from_handle(commandBuffer);1610size_t cmd_size;16111612vn_cmd_begin_render_pass(1613cmd, vn_render_pass_from_handle(pRenderPassBegin->renderPass),1614vn_framebuffer_from_handle(pRenderPassBegin->framebuffer),1615pRenderPassBegin);16161617cmd_size = vn_sizeof_vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin,1618contents);1619if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1620return;16211622vn_encode_vkCmdBeginRenderPass(&cmd->cs, 0, commandBuffer,1623pRenderPassBegin, contents);1624}16251626void1627vn_CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents)1628{1629struct vn_command_buffer *cmd =1630vn_command_buffer_from_handle(commandBuffer);1631size_t cmd_size;16321633cmd_size = vn_sizeof_vkCmdNextSubpass(commandBuffer, contents);1634if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1635return;16361637vn_encode_vkCmdNextSubpass(&cmd->cs, 0, commandBuffer, contents);1638}16391640void1641vn_CmdEndRenderPass(VkCommandBuffer commandBuffer)1642{1643struct vn_command_buffer *cmd =1644vn_command_buffer_from_handle(commandBuffer);1645size_t cmd_size;16461647cmd_size = vn_sizeof_vkCmdEndRenderPass(commandBuffer);1648if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1649return;16501651vn_encode_vkCmdEndRenderPass(&cmd->cs, 0, commandBuffer);16521653vn_cmd_end_render_pass(cmd);1654}16551656void1657vn_CmdBeginRenderPass2(VkCommandBuffer commandBuffer,1658const VkRenderPassBeginInfo *pRenderPassBegin,1659const VkSubpassBeginInfo *pSubpassBeginInfo)1660{1661struct vn_command_buffer *cmd =1662vn_command_buffer_from_handle(commandBuffer);1663size_t cmd_size;16641665vn_cmd_begin_render_pass(1666cmd, vn_render_pass_from_handle(pRenderPassBegin->renderPass),1667vn_framebuffer_from_handle(pRenderPassBegin->framebuffer),1668pRenderPassBegin);16691670cmd_size = vn_sizeof_vkCmdBeginRenderPass2(commandBuffer, pRenderPassBegin,1671pSubpassBeginInfo);1672if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1673return;16741675vn_encode_vkCmdBeginRenderPass2(&cmd->cs, 0, commandBuffer,1676pRenderPassBegin, pSubpassBeginInfo);1677}16781679void1680vn_CmdNextSubpass2(VkCommandBuffer commandBuffer,1681const VkSubpassBeginInfo *pSubpassBeginInfo,1682const VkSubpassEndInfo *pSubpassEndInfo)1683{1684struct vn_command_buffer *cmd =1685vn_command_buffer_from_handle(commandBuffer);1686size_t cmd_size;16871688cmd_size = vn_sizeof_vkCmdNextSubpass2(commandBuffer, pSubpassBeginInfo,1689pSubpassEndInfo);1690if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1691return;16921693vn_encode_vkCmdNextSubpass2(&cmd->cs, 0, commandBuffer, pSubpassBeginInfo,1694pSubpassEndInfo);1695}16961697void1698vn_CmdEndRenderPass2(VkCommandBuffer commandBuffer,1699const VkSubpassEndInfo *pSubpassEndInfo)1700{1701struct vn_command_buffer *cmd =1702vn_command_buffer_from_handle(commandBuffer);1703size_t cmd_size;17041705cmd_size = vn_sizeof_vkCmdEndRenderPass2(commandBuffer, pSubpassEndInfo);1706if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1707return;17081709vn_encode_vkCmdEndRenderPass2(&cmd->cs, 0, commandBuffer, pSubpassEndInfo);17101711vn_cmd_end_render_pass(cmd);1712}17131714void1715vn_CmdExecuteCommands(VkCommandBuffer commandBuffer,1716uint32_t commandBufferCount,1717const VkCommandBuffer *pCommandBuffers)1718{1719struct vn_command_buffer *cmd =1720vn_command_buffer_from_handle(commandBuffer);1721size_t cmd_size;17221723cmd_size = vn_sizeof_vkCmdExecuteCommands(1724commandBuffer, commandBufferCount, pCommandBuffers);1725if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1726return;17271728vn_encode_vkCmdExecuteCommands(&cmd->cs, 0, commandBuffer,1729commandBufferCount, pCommandBuffers);1730}17311732void1733vn_CmdSetDeviceMask(VkCommandBuffer commandBuffer, uint32_t deviceMask)1734{1735struct vn_command_buffer *cmd =1736vn_command_buffer_from_handle(commandBuffer);1737size_t cmd_size;17381739cmd_size = vn_sizeof_vkCmdSetDeviceMask(commandBuffer, deviceMask);1740if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1741return;17421743vn_encode_vkCmdSetDeviceMask(&cmd->cs, 0, commandBuffer, deviceMask);1744}17451746void1747vn_CmdDispatchBase(VkCommandBuffer commandBuffer,1748uint32_t baseGroupX,1749uint32_t baseGroupY,1750uint32_t baseGroupZ,1751uint32_t groupCountX,1752uint32_t groupCountY,1753uint32_t groupCountZ)1754{1755struct vn_command_buffer *cmd =1756vn_command_buffer_from_handle(commandBuffer);1757size_t cmd_size;17581759cmd_size = vn_sizeof_vkCmdDispatchBase(commandBuffer, baseGroupX,1760baseGroupY, baseGroupZ, groupCountX,1761groupCountY, groupCountZ);1762if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1763return;17641765vn_encode_vkCmdDispatchBase(&cmd->cs, 0, commandBuffer, baseGroupX,1766baseGroupY, baseGroupZ, groupCountX,1767groupCountY, groupCountZ);1768}17691770void1771vn_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer,1772VkQueryPool queryPool,1773uint32_t query,1774VkQueryControlFlags flags,1775uint32_t index)1776{1777struct vn_command_buffer *cmd =1778vn_command_buffer_from_handle(commandBuffer);1779size_t cmd_size;17801781cmd_size = vn_sizeof_vkCmdBeginQueryIndexedEXT(commandBuffer, queryPool,1782query, flags, index);1783if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1784return;17851786vn_encode_vkCmdBeginQueryIndexedEXT(&cmd->cs, 0, commandBuffer, queryPool,1787query, flags, index);1788}17891790void1791vn_CmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer,1792VkQueryPool queryPool,1793uint32_t query,1794uint32_t index)1795{1796struct vn_command_buffer *cmd =1797vn_command_buffer_from_handle(commandBuffer);1798size_t cmd_size;17991800cmd_size = vn_sizeof_vkCmdEndQueryIndexedEXT(commandBuffer, queryPool,1801query, index);1802if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1803return;18041805vn_encode_vkCmdEndQueryIndexedEXT(&cmd->cs, 0, commandBuffer, queryPool,1806query, index);1807}18081809void1810vn_CmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,1811uint32_t firstBinding,1812uint32_t bindingCount,1813const VkBuffer *pBuffers,1814const VkDeviceSize *pOffsets,1815const VkDeviceSize *pSizes)1816{1817struct vn_command_buffer *cmd =1818vn_command_buffer_from_handle(commandBuffer);1819size_t cmd_size;18201821cmd_size = vn_sizeof_vkCmdBindTransformFeedbackBuffersEXT(1822commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);1823if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1824return;18251826vn_encode_vkCmdBindTransformFeedbackBuffersEXT(&cmd->cs, 0, commandBuffer,1827firstBinding, bindingCount,1828pBuffers, pOffsets, pSizes);1829}18301831void1832vn_CmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer,1833uint32_t firstCounterBuffer,1834uint32_t counterBufferCount,1835const VkBuffer *pCounterBuffers,1836const VkDeviceSize *pCounterBufferOffsets)1837{1838struct vn_command_buffer *cmd =1839vn_command_buffer_from_handle(commandBuffer);1840size_t cmd_size;18411842cmd_size = vn_sizeof_vkCmdBeginTransformFeedbackEXT(1843commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers,1844pCounterBufferOffsets);1845if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1846return;18471848vn_encode_vkCmdBeginTransformFeedbackEXT(1849&cmd->cs, 0, commandBuffer, firstCounterBuffer, counterBufferCount,1850pCounterBuffers, pCounterBufferOffsets);1851}18521853void1854vn_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer,1855uint32_t firstCounterBuffer,1856uint32_t counterBufferCount,1857const VkBuffer *pCounterBuffers,1858const VkDeviceSize *pCounterBufferOffsets)1859{1860struct vn_command_buffer *cmd =1861vn_command_buffer_from_handle(commandBuffer);1862size_t cmd_size;18631864cmd_size = vn_sizeof_vkCmdEndTransformFeedbackEXT(1865commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers,1866pCounterBufferOffsets);1867if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1868return;18691870vn_encode_vkCmdEndTransformFeedbackEXT(1871&cmd->cs, 0, commandBuffer, firstCounterBuffer, counterBufferCount,1872pCounterBuffers, pCounterBufferOffsets);1873}18741875void1876vn_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,1877uint32_t instanceCount,1878uint32_t firstInstance,1879VkBuffer counterBuffer,1880VkDeviceSize counterBufferOffset,1881uint32_t counterOffset,1882uint32_t vertexStride)1883{1884struct vn_command_buffer *cmd =1885vn_command_buffer_from_handle(commandBuffer);1886size_t cmd_size;18871888cmd_size = vn_sizeof_vkCmdDrawIndirectByteCountEXT(1889commandBuffer, instanceCount, firstInstance, counterBuffer,1890counterBufferOffset, counterOffset, vertexStride);1891if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))1892return;18931894vn_encode_vkCmdDrawIndirectByteCountEXT(1895&cmd->cs, 0, commandBuffer, instanceCount, firstInstance, counterBuffer,1896counterBufferOffset, counterOffset, vertexStride);1897}189818991900