Path: blob/21.2-virgl/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
4565 views
/*1* Copyright © 2019 Red Hat.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "lvp_private.h"24#include "pipe/p_context.h"25#include "vk_util.h"2627static VkResult lvp_create_cmd_buffer(28struct lvp_device * device,29struct lvp_cmd_pool * pool,30VkCommandBufferLevel level,31VkCommandBuffer* pCommandBuffer)32{33struct lvp_cmd_buffer *cmd_buffer;3435cmd_buffer = vk_alloc(&pool->alloc, sizeof(*cmd_buffer), 8,36VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);37if (cmd_buffer == NULL)38return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);3940vk_object_base_init(&device->vk, &cmd_buffer->base,41VK_OBJECT_TYPE_COMMAND_BUFFER);42cmd_buffer->device = device;43cmd_buffer->pool = pool;44list_inithead(&cmd_buffer->cmds);45cmd_buffer->last_emit = &cmd_buffer->cmds;46cmd_buffer->status = LVP_CMD_BUFFER_STATUS_INITIAL;47if (pool) {48list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers);49} else {50/* Init the pool_link so we can safefly call list_del when we destroy51* the command buffer52*/53list_inithead(&cmd_buffer->pool_link);54}55*pCommandBuffer = lvp_cmd_buffer_to_handle(cmd_buffer);5657return VK_SUCCESS;58}5960static void61lvp_cmd_buffer_free_all_cmds(struct lvp_cmd_buffer *cmd_buffer)62{63struct lvp_cmd_buffer_entry *tmp, *cmd;64LIST_FOR_EACH_ENTRY_SAFE(cmd, tmp, &cmd_buffer->cmds, cmd_link) {65list_del(&cmd->cmd_link);66vk_free(&cmd_buffer->pool->alloc, cmd);67}68}6970static VkResult lvp_reset_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer)71{72lvp_cmd_buffer_free_all_cmds(cmd_buffer);73list_inithead(&cmd_buffer->cmds);74cmd_buffer->last_emit = &cmd_buffer->cmds;75cmd_buffer->status = LVP_CMD_BUFFER_STATUS_INITIAL;76return VK_SUCCESS;77}7879VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateCommandBuffers(80VkDevice _device,81const VkCommandBufferAllocateInfo* pAllocateInfo,82VkCommandBuffer* pCommandBuffers)83{84LVP_FROM_HANDLE(lvp_device, device, _device);85LVP_FROM_HANDLE(lvp_cmd_pool, pool, pAllocateInfo->commandPool);8687VkResult result = VK_SUCCESS;88uint32_t i;8990for (i = 0; i < pAllocateInfo->commandBufferCount; i++) {9192if (!list_is_empty(&pool->free_cmd_buffers)) {93struct lvp_cmd_buffer *cmd_buffer = list_first_entry(&pool->free_cmd_buffers, struct lvp_cmd_buffer, pool_link);9495list_del(&cmd_buffer->pool_link);96list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers);9798result = lvp_reset_cmd_buffer(cmd_buffer);99cmd_buffer->level = pAllocateInfo->level;100vk_object_base_reset(&cmd_buffer->base);101102pCommandBuffers[i] = lvp_cmd_buffer_to_handle(cmd_buffer);103} else {104result = lvp_create_cmd_buffer(device, pool, pAllocateInfo->level,105&pCommandBuffers[i]);106if (result != VK_SUCCESS)107break;108}109}110111if (result != VK_SUCCESS) {112lvp_FreeCommandBuffers(_device, pAllocateInfo->commandPool,113i, pCommandBuffers);114memset(pCommandBuffers, 0,115sizeof(*pCommandBuffers) * pAllocateInfo->commandBufferCount);116}117118return result;119}120121static void122lvp_cmd_buffer_destroy(struct lvp_cmd_buffer *cmd_buffer)123{124lvp_cmd_buffer_free_all_cmds(cmd_buffer);125list_del(&cmd_buffer->pool_link);126vk_object_base_finish(&cmd_buffer->base);127vk_free(&cmd_buffer->pool->alloc, cmd_buffer);128}129130VKAPI_ATTR void VKAPI_CALL lvp_FreeCommandBuffers(131VkDevice device,132VkCommandPool commandPool,133uint32_t commandBufferCount,134const VkCommandBuffer* pCommandBuffers)135{136for (uint32_t i = 0; i < commandBufferCount; i++) {137LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, pCommandBuffers[i]);138139if (cmd_buffer) {140if (cmd_buffer->pool) {141list_del(&cmd_buffer->pool_link);142list_addtail(&cmd_buffer->pool_link, &cmd_buffer->pool->free_cmd_buffers);143} else144lvp_cmd_buffer_destroy(cmd_buffer);145}146}147}148149VKAPI_ATTR VkResult VKAPI_CALL lvp_ResetCommandBuffer(150VkCommandBuffer commandBuffer,151VkCommandBufferResetFlags flags)152{153LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);154155return lvp_reset_cmd_buffer(cmd_buffer);156}157158VKAPI_ATTR VkResult VKAPI_CALL lvp_BeginCommandBuffer(159VkCommandBuffer commandBuffer,160const VkCommandBufferBeginInfo* pBeginInfo)161{162LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);163VkResult result;164if (cmd_buffer->status != LVP_CMD_BUFFER_STATUS_INITIAL) {165result = lvp_reset_cmd_buffer(cmd_buffer);166if (result != VK_SUCCESS)167return result;168}169cmd_buffer->status = LVP_CMD_BUFFER_STATUS_RECORDING;170return VK_SUCCESS;171}172173VKAPI_ATTR VkResult VKAPI_CALL lvp_EndCommandBuffer(174VkCommandBuffer commandBuffer)175{176LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);177cmd_buffer->status = LVP_CMD_BUFFER_STATUS_EXECUTABLE;178return VK_SUCCESS;179}180181VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateCommandPool(182VkDevice _device,183const VkCommandPoolCreateInfo* pCreateInfo,184const VkAllocationCallbacks* pAllocator,185VkCommandPool* pCmdPool)186{187LVP_FROM_HANDLE(lvp_device, device, _device);188struct lvp_cmd_pool *pool;189190pool = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*pool), 8,191VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);192if (pool == NULL)193return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);194195vk_object_base_init(&device->vk, &pool->base,196VK_OBJECT_TYPE_COMMAND_POOL);197if (pAllocator)198pool->alloc = *pAllocator;199else200pool->alloc = device->vk.alloc;201202list_inithead(&pool->cmd_buffers);203list_inithead(&pool->free_cmd_buffers);204205*pCmdPool = lvp_cmd_pool_to_handle(pool);206207return VK_SUCCESS;208}209210VKAPI_ATTR void VKAPI_CALL lvp_DestroyCommandPool(211VkDevice _device,212VkCommandPool commandPool,213const VkAllocationCallbacks* pAllocator)214{215LVP_FROM_HANDLE(lvp_device, device, _device);216LVP_FROM_HANDLE(lvp_cmd_pool, pool, commandPool);217218if (!pool)219return;220221list_for_each_entry_safe(struct lvp_cmd_buffer, cmd_buffer,222&pool->cmd_buffers, pool_link) {223lvp_cmd_buffer_destroy(cmd_buffer);224}225226list_for_each_entry_safe(struct lvp_cmd_buffer, cmd_buffer,227&pool->free_cmd_buffers, pool_link) {228lvp_cmd_buffer_destroy(cmd_buffer);229}230231vk_object_base_finish(&pool->base);232vk_free2(&device->vk.alloc, pAllocator, pool);233}234235VKAPI_ATTR VkResult VKAPI_CALL lvp_ResetCommandPool(236VkDevice device,237VkCommandPool commandPool,238VkCommandPoolResetFlags flags)239{240LVP_FROM_HANDLE(lvp_cmd_pool, pool, commandPool);241VkResult result;242243list_for_each_entry(struct lvp_cmd_buffer, cmd_buffer,244&pool->cmd_buffers, pool_link) {245result = lvp_reset_cmd_buffer(cmd_buffer);246if (result != VK_SUCCESS)247return result;248}249return VK_SUCCESS;250}251252VKAPI_ATTR void VKAPI_CALL lvp_TrimCommandPool(253VkDevice device,254VkCommandPool commandPool,255VkCommandPoolTrimFlags flags)256{257LVP_FROM_HANDLE(lvp_cmd_pool, pool, commandPool);258259if (!pool)260return;261262list_for_each_entry_safe(struct lvp_cmd_buffer, cmd_buffer,263&pool->free_cmd_buffers, pool_link) {264lvp_cmd_buffer_destroy(cmd_buffer);265}266}267268static struct lvp_cmd_buffer_entry *cmd_buf_entry_alloc_size(struct lvp_cmd_buffer *cmd_buffer,269uint32_t extra_size,270enum lvp_cmds type)271{272struct lvp_cmd_buffer_entry *cmd;273uint32_t cmd_size = sizeof(*cmd) + extra_size;274cmd = vk_alloc(&cmd_buffer->pool->alloc,275cmd_size,2768, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);277if (!cmd)278return NULL;279280cmd->cmd_type = type;281return cmd;282}283284static struct lvp_cmd_buffer_entry *cmd_buf_entry_alloc(struct lvp_cmd_buffer *cmd_buffer,285enum lvp_cmds type)286{287return cmd_buf_entry_alloc_size(cmd_buffer, 0, type);288}289290static void cmd_buf_queue(struct lvp_cmd_buffer *cmd_buffer,291struct lvp_cmd_buffer_entry *cmd)292{293switch (cmd->cmd_type) {294case LVP_CMD_BIND_DESCRIPTOR_SETS:295case LVP_CMD_PUSH_DESCRIPTOR_SET:296list_add(&cmd->cmd_link, cmd_buffer->last_emit);297cmd_buffer->last_emit = &cmd->cmd_link;298break;299case LVP_CMD_NEXT_SUBPASS:300case LVP_CMD_DRAW:301case LVP_CMD_DRAW_INDEXED:302case LVP_CMD_DRAW_INDIRECT:303case LVP_CMD_DRAW_INDEXED_INDIRECT:304case LVP_CMD_DISPATCH:305case LVP_CMD_DISPATCH_INDIRECT:306cmd_buffer->last_emit = &cmd->cmd_link;307FALLTHROUGH;308default:309list_addtail(&cmd->cmd_link, &cmd_buffer->cmds);310}311}312313static void314state_setup_attachments(struct lvp_attachment_state *attachments,315struct lvp_render_pass *pass,316const VkClearValue *clear_values)317{318for (uint32_t i = 0; i < pass->attachment_count; ++i) {319struct lvp_render_pass_attachment *att = &pass->attachments[i];320VkImageAspectFlags att_aspects = vk_format_aspects(att->format);321VkImageAspectFlags clear_aspects = 0;322if (att_aspects == VK_IMAGE_ASPECT_COLOR_BIT) {323/* color attachment */324if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {325clear_aspects |= VK_IMAGE_ASPECT_COLOR_BIT;326}327} else {328/* depthstencil attachment */329if ((att_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) &&330att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {331clear_aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;332if ((att_aspects & VK_IMAGE_ASPECT_STENCIL_BIT) &&333att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE)334clear_aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;335}336if ((att_aspects & VK_IMAGE_ASPECT_STENCIL_BIT) &&337att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {338clear_aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;339}340}341attachments[i].pending_clear_aspects = clear_aspects;342if (clear_aspects)343attachments[i].clear_value = clear_values[i];344}345}346347VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginRenderPass2(348VkCommandBuffer commandBuffer,349const VkRenderPassBeginInfo* pRenderPassBeginInfo,350const VkSubpassBeginInfo* pSubpassBeginInfo)351{352LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);353LVP_FROM_HANDLE(lvp_render_pass, pass, pRenderPassBeginInfo->renderPass);354LVP_FROM_HANDLE(lvp_framebuffer, framebuffer, pRenderPassBeginInfo->framebuffer);355const struct VkRenderPassAttachmentBeginInfo *attachment_info =356vk_find_struct_const(pRenderPassBeginInfo->pNext,357RENDER_PASS_ATTACHMENT_BEGIN_INFO);358struct lvp_cmd_buffer_entry *cmd;359uint32_t cmd_size = pass->attachment_count * sizeof(struct lvp_attachment_state);360361if (attachment_info)362cmd_size += attachment_info->attachmentCount * sizeof(struct lvp_image_view *);363364cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BEGIN_RENDER_PASS);365if (!cmd)366return;367368cmd->u.begin_render_pass.render_pass = pass;369cmd->u.begin_render_pass.framebuffer = framebuffer;370cmd->u.begin_render_pass.render_area = pRenderPassBeginInfo->renderArea;371372cmd->u.begin_render_pass.attachments = (struct lvp_attachment_state *)(cmd + 1);373cmd->u.begin_render_pass.imageless_views = NULL;374if (attachment_info) {375cmd->u.begin_render_pass.imageless_views = (struct lvp_image_view **)(cmd->u.begin_render_pass.attachments + pass->attachment_count);376for (unsigned i = 0; i < attachment_info->attachmentCount; i++)377cmd->u.begin_render_pass.imageless_views[i] = lvp_image_view_from_handle(attachment_info->pAttachments[i]);378}379380state_setup_attachments(cmd->u.begin_render_pass.attachments, pass, pRenderPassBeginInfo->pClearValues);381382cmd_buf_queue(cmd_buffer, cmd);383}384385VKAPI_ATTR void VKAPI_CALL lvp_CmdNextSubpass2(386VkCommandBuffer commandBuffer,387const VkSubpassBeginInfo* pSubpassBeginInfo,388const VkSubpassEndInfo* pSubpassEndInfo)389{390LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);391struct lvp_cmd_buffer_entry *cmd;392393cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_NEXT_SUBPASS);394if (!cmd)395return;396397cmd->u.next_subpass.contents = pSubpassBeginInfo->contents;398399cmd_buf_queue(cmd_buffer, cmd);400}401402VKAPI_ATTR void VKAPI_CALL lvp_CmdBindVertexBuffers(403VkCommandBuffer commandBuffer,404uint32_t firstBinding,405uint32_t bindingCount,406const VkBuffer* pBuffers,407const VkDeviceSize* pOffsets)408{409lvp_CmdBindVertexBuffers2EXT(commandBuffer, firstBinding,410bindingCount, pBuffers, pOffsets, NULL, NULL);411}412413VKAPI_ATTR void VKAPI_CALL lvp_CmdBindPipeline(414VkCommandBuffer commandBuffer,415VkPipelineBindPoint pipelineBindPoint,416VkPipeline _pipeline)417{418LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);419LVP_FROM_HANDLE(lvp_pipeline, pipeline, _pipeline);420struct lvp_cmd_buffer_entry *cmd;421422cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_BIND_PIPELINE);423if (!cmd)424return;425426cmd->u.pipeline.bind_point = pipelineBindPoint;427cmd->u.pipeline.pipeline = pipeline;428429cmd_buf_queue(cmd_buffer, cmd);430}431432VKAPI_ATTR void VKAPI_CALL lvp_CmdBindDescriptorSets(433VkCommandBuffer commandBuffer,434VkPipelineBindPoint pipelineBindPoint,435VkPipelineLayout _layout,436uint32_t firstSet,437uint32_t descriptorSetCount,438const VkDescriptorSet* pDescriptorSets,439uint32_t dynamicOffsetCount,440const uint32_t* pDynamicOffsets)441{442LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);443LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);444struct lvp_cmd_buffer_entry *cmd;445struct lvp_descriptor_set **sets;446uint32_t *offsets;447int i;448uint32_t cmd_size = descriptorSetCount * sizeof(struct lvp_descriptor_set *) + dynamicOffsetCount * sizeof(uint32_t);449450cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BIND_DESCRIPTOR_SETS);451if (!cmd)452return;453454cmd->u.descriptor_sets.bind_point = pipelineBindPoint;455cmd->u.descriptor_sets.first = firstSet;456cmd->u.descriptor_sets.count = descriptorSetCount;457458for (i = 0; i < layout->num_sets; i++)459cmd->u.descriptor_sets.set_layout[i] = layout->set[i].layout;460sets = (struct lvp_descriptor_set **)(cmd + 1);461for (i = 0; i < descriptorSetCount; i++) {462463sets[i] = lvp_descriptor_set_from_handle(pDescriptorSets[i]);464}465cmd->u.descriptor_sets.sets = sets;466467cmd->u.descriptor_sets.dynamic_offset_count = dynamicOffsetCount;468offsets = (uint32_t *)(sets + descriptorSetCount);469for (i = 0; i < dynamicOffsetCount; i++)470offsets[i] = pDynamicOffsets[i];471cmd->u.descriptor_sets.dynamic_offsets = offsets;472473cmd_buf_queue(cmd_buffer, cmd);474}475476VKAPI_ATTR void VKAPI_CALL lvp_CmdDraw(477VkCommandBuffer commandBuffer,478uint32_t vertexCount,479uint32_t instanceCount,480uint32_t firstVertex,481uint32_t firstInstance)482{483LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);484struct lvp_cmd_buffer_entry *cmd;485486uint32_t cmd_size = sizeof(struct pipe_draw_start_count_bias);487cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_DRAW);488if (!cmd)489return;490491cmd->u.draw.instance_count = instanceCount;492cmd->u.draw.first_instance = firstInstance;493cmd->u.draw.draw_count = 1;494cmd->u.draw.draws[0].start = firstVertex;495cmd->u.draw.draws[0].count = vertexCount;496497cmd_buf_queue(cmd_buffer, cmd);498}499500VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawMultiEXT(501VkCommandBuffer commandBuffer,502uint32_t drawCount,503const VkMultiDrawInfoEXT *pVertexInfo,504uint32_t instanceCount,505uint32_t firstInstance,506uint32_t stride)507{508LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);509struct lvp_cmd_buffer_entry *cmd;510511uint32_t cmd_size = drawCount * sizeof(struct pipe_draw_start_count_bias);512cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_DRAW);513if (!cmd)514return;515516cmd->u.draw.instance_count = instanceCount;517cmd->u.draw.first_instance = firstInstance;518cmd->u.draw.draw_count = drawCount;519if (stride == sizeof(struct pipe_draw_start_count_bias))520memcpy(cmd->u.draw.draws, pVertexInfo, cmd_size);521else {522unsigned i = 0;523vk_foreach_multi_draw(draw, i, pVertexInfo, drawCount, stride)524memcpy(&cmd->u.draw.draws[i], draw, sizeof(struct VkMultiDrawInfoEXT));525}526527cmd_buf_queue(cmd_buffer, cmd);528}529530VKAPI_ATTR void VKAPI_CALL lvp_CmdEndRenderPass2(531VkCommandBuffer commandBuffer,532const VkSubpassEndInfo* pSubpassEndInfo)533{534LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);535struct lvp_cmd_buffer_entry *cmd;536537cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_END_RENDER_PASS);538if (!cmd)539return;540541cmd_buf_queue(cmd_buffer, cmd);542}543544VKAPI_ATTR void VKAPI_CALL lvp_CmdSetViewport(545VkCommandBuffer commandBuffer,546uint32_t firstViewport,547uint32_t viewportCount,548const VkViewport* pViewports)549{550LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);551struct lvp_cmd_buffer_entry *cmd;552int i;553554cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_VIEWPORT);555if (!cmd)556return;557558cmd->u.set_viewport.first_viewport = firstViewport;559cmd->u.set_viewport.viewport_count = viewportCount;560for (i = 0; i < viewportCount; i++)561cmd->u.set_viewport.viewports[i] = pViewports[i];562563cmd_buf_queue(cmd_buffer, cmd);564}565566VKAPI_ATTR void VKAPI_CALL lvp_CmdSetScissor(567VkCommandBuffer commandBuffer,568uint32_t firstScissor,569uint32_t scissorCount,570const VkRect2D* pScissors)571{572LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);573struct lvp_cmd_buffer_entry *cmd;574int i;575576cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_SCISSOR);577if (!cmd)578return;579580cmd->u.set_scissor.first_scissor = firstScissor;581cmd->u.set_scissor.scissor_count = scissorCount;582for (i = 0; i < scissorCount; i++)583cmd->u.set_scissor.scissors[i] = pScissors[i];584585cmd_buf_queue(cmd_buffer, cmd);586}587588VKAPI_ATTR void VKAPI_CALL lvp_CmdSetLineWidth(589VkCommandBuffer commandBuffer,590float lineWidth)591{592LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);593struct lvp_cmd_buffer_entry *cmd;594595cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_LINE_WIDTH);596if (!cmd)597return;598599cmd->u.set_line_width.line_width = lineWidth;600601cmd_buf_queue(cmd_buffer, cmd);602}603604VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthBias(605VkCommandBuffer commandBuffer,606float depthBiasConstantFactor,607float depthBiasClamp,608float depthBiasSlopeFactor)609{610LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);611struct lvp_cmd_buffer_entry *cmd;612613cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_BIAS);614if (!cmd)615return;616617cmd->u.set_depth_bias.constant_factor = depthBiasConstantFactor;618cmd->u.set_depth_bias.clamp = depthBiasClamp;619cmd->u.set_depth_bias.slope_factor = depthBiasSlopeFactor;620621cmd_buf_queue(cmd_buffer, cmd);622}623624VKAPI_ATTR void VKAPI_CALL lvp_CmdSetBlendConstants(625VkCommandBuffer commandBuffer,626const float blendConstants[4])627{628LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);629struct lvp_cmd_buffer_entry *cmd;630631cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_BLEND_CONSTANTS);632if (!cmd)633return;634635memcpy(cmd->u.set_blend_constants.blend_constants, blendConstants, 4 * sizeof(float));636637cmd_buf_queue(cmd_buffer, cmd);638}639640VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthBounds(641VkCommandBuffer commandBuffer,642float minDepthBounds,643float maxDepthBounds)644{645LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);646struct lvp_cmd_buffer_entry *cmd;647648cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_BOUNDS);649if (!cmd)650return;651652cmd->u.set_depth_bounds.min_depth = minDepthBounds;653cmd->u.set_depth_bounds.max_depth = maxDepthBounds;654655cmd_buf_queue(cmd_buffer, cmd);656}657658VKAPI_ATTR void VKAPI_CALL lvp_CmdSetStencilCompareMask(659VkCommandBuffer commandBuffer,660VkStencilFaceFlags faceMask,661uint32_t compareMask)662{663LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);664struct lvp_cmd_buffer_entry *cmd;665666cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_STENCIL_COMPARE_MASK);667if (!cmd)668return;669670cmd->u.stencil_vals.face_mask = faceMask;671cmd->u.stencil_vals.value = compareMask;672673cmd_buf_queue(cmd_buffer, cmd);674}675676VKAPI_ATTR void VKAPI_CALL lvp_CmdSetStencilWriteMask(677VkCommandBuffer commandBuffer,678VkStencilFaceFlags faceMask,679uint32_t writeMask)680{681LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);682struct lvp_cmd_buffer_entry *cmd;683684cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_STENCIL_WRITE_MASK);685if (!cmd)686return;687688cmd->u.stencil_vals.face_mask = faceMask;689cmd->u.stencil_vals.value = writeMask;690691cmd_buf_queue(cmd_buffer, cmd);692}693694695VKAPI_ATTR void VKAPI_CALL lvp_CmdSetStencilReference(696VkCommandBuffer commandBuffer,697VkStencilFaceFlags faceMask,698uint32_t reference)699{700LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);701struct lvp_cmd_buffer_entry *cmd;702703cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_STENCIL_REFERENCE);704if (!cmd)705return;706707cmd->u.stencil_vals.face_mask = faceMask;708cmd->u.stencil_vals.value = reference;709710cmd_buf_queue(cmd_buffer, cmd);711}712713VKAPI_ATTR void VKAPI_CALL lvp_CmdPushConstants(714VkCommandBuffer commandBuffer,715VkPipelineLayout layout,716VkShaderStageFlags stageFlags,717uint32_t offset,718uint32_t size,719const void* pValues)720{721LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);722struct lvp_cmd_buffer_entry *cmd;723724cmd = cmd_buf_entry_alloc_size(cmd_buffer, (size - 4), LVP_CMD_PUSH_CONSTANTS);725if (!cmd)726return;727728cmd->u.push_constants.stage = stageFlags;729cmd->u.push_constants.offset = offset;730cmd->u.push_constants.size = size;731memcpy(cmd->u.push_constants.val, pValues, size);732733cmd_buf_queue(cmd_buffer, cmd);734}735736VKAPI_ATTR void VKAPI_CALL lvp_CmdBindIndexBuffer(737VkCommandBuffer commandBuffer,738VkBuffer _buffer,739VkDeviceSize offset,740VkIndexType indexType)741{742LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);743LVP_FROM_HANDLE(lvp_buffer, buffer, _buffer);744struct lvp_cmd_buffer_entry *cmd;745746cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_BIND_INDEX_BUFFER);747if (!cmd)748return;749750cmd->u.index_buffer.buffer = buffer;751cmd->u.index_buffer.offset = offset;752cmd->u.index_buffer.index_type = indexType;753754cmd_buf_queue(cmd_buffer, cmd);755}756757VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndexed(758VkCommandBuffer commandBuffer,759uint32_t indexCount,760uint32_t instanceCount,761uint32_t firstIndex,762int32_t vertexOffset,763uint32_t firstInstance)764{765LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);766struct lvp_cmd_buffer_entry *cmd;767768uint32_t cmd_size = sizeof(struct pipe_draw_start_count_bias);769cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_DRAW_INDEXED);770if (!cmd)771return;772773cmd->u.draw_indexed.instance_count = instanceCount;774cmd->u.draw_indexed.first_instance = firstInstance;775cmd->u.draw_indexed.draw_count = 1;776cmd->u.draw_indexed.draws[0].start = firstIndex;777cmd->u.draw_indexed.draws[0].count = indexCount;778cmd->u.draw_indexed.draws[0].index_bias = vertexOffset;779cmd->u.draw_indexed.calc_start = true;780781cmd_buf_queue(cmd_buffer, cmd);782}783784VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawMultiIndexedEXT(785VkCommandBuffer commandBuffer,786uint32_t drawCount,787const VkMultiDrawIndexedInfoEXT *pIndexInfo,788uint32_t instanceCount,789uint32_t firstInstance,790uint32_t stride,791const int32_t *pVertexOffset)792{793LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);794struct lvp_cmd_buffer_entry *cmd;795796uint32_t cmd_size = drawCount * sizeof(struct pipe_draw_start_count_bias);797cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_DRAW_INDEXED);798if (!cmd)799return;800801cmd->u.draw_indexed.instance_count = instanceCount;802cmd->u.draw_indexed.first_instance = firstInstance;803cmd->u.draw_indexed.draw_count = drawCount;804cmd->u.draw_indexed.vertex_offset_changes = !pVertexOffset;805if (stride == sizeof(struct pipe_draw_start_count_bias))806memcpy(cmd->u.draw_indexed.draws, pIndexInfo, cmd_size);807else {808unsigned i = 0;809vk_foreach_multi_draw_indexed(draw, i, pIndexInfo, drawCount, stride)810memcpy(&cmd->u.draw_indexed.draws[i], draw, sizeof(struct pipe_draw_start_count_bias));811}812/* only the first member is read if vertex_offset_changes is true */813if (pVertexOffset)814cmd->u.draw_indexed.draws[0].index_bias = *pVertexOffset;815cmd->u.draw_indexed.calc_start = true;816817cmd_buf_queue(cmd_buffer, cmd);818}819820VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndirect(821VkCommandBuffer commandBuffer,822VkBuffer _buffer,823VkDeviceSize offset,824uint32_t drawCount,825uint32_t stride)826{827LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);828LVP_FROM_HANDLE(lvp_buffer, buf, _buffer);829struct lvp_cmd_buffer_entry *cmd;830831cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDIRECT);832if (!cmd)833return;834835cmd->u.draw_indirect.offset = offset;836cmd->u.draw_indirect.buffer = buf;837cmd->u.draw_indirect.draw_count = drawCount;838cmd->u.draw_indirect.stride = stride;839840cmd_buf_queue(cmd_buffer, cmd);841}842843VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndexedIndirect(844VkCommandBuffer commandBuffer,845VkBuffer _buffer,846VkDeviceSize offset,847uint32_t drawCount,848uint32_t stride)849{850LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);851LVP_FROM_HANDLE(lvp_buffer, buf, _buffer);852struct lvp_cmd_buffer_entry *cmd;853854cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDEXED_INDIRECT);855if (!cmd)856return;857858cmd->u.draw_indirect.offset = offset;859cmd->u.draw_indirect.buffer = buf;860cmd->u.draw_indirect.draw_count = drawCount;861cmd->u.draw_indirect.stride = stride;862863cmd_buf_queue(cmd_buffer, cmd);864}865866VKAPI_ATTR void VKAPI_CALL lvp_CmdDispatch(867VkCommandBuffer commandBuffer,868uint32_t x,869uint32_t y,870uint32_t z)871{872LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);873struct lvp_cmd_buffer_entry *cmd;874875cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DISPATCH);876if (!cmd)877return;878879cmd->u.dispatch.x = x;880cmd->u.dispatch.y = y;881cmd->u.dispatch.z = z;882cmd->u.dispatch.base_x = 0;883cmd->u.dispatch.base_y = 0;884cmd->u.dispatch.base_z = 0;885886cmd_buf_queue(cmd_buffer, cmd);887}888889VKAPI_ATTR void VKAPI_CALL lvp_CmdDispatchIndirect(890VkCommandBuffer commandBuffer,891VkBuffer _buffer,892VkDeviceSize offset)893{894LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);895struct lvp_cmd_buffer_entry *cmd;896897cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DISPATCH_INDIRECT);898if (!cmd)899return;900901cmd->u.dispatch_indirect.buffer = lvp_buffer_from_handle(_buffer);902cmd->u.dispatch_indirect.offset = offset;903904cmd_buf_queue(cmd_buffer, cmd);905}906907VKAPI_ATTR void VKAPI_CALL lvp_CmdExecuteCommands(908VkCommandBuffer commandBuffer,909uint32_t commandBufferCount,910const VkCommandBuffer* pCmdBuffers)911{912LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);913struct lvp_cmd_buffer_entry *cmd;914uint32_t cmd_size = commandBufferCount * sizeof(struct lvp_cmd_buffer *);915916cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_EXECUTE_COMMANDS);917if (!cmd)918return;919920cmd->u.execute_commands.command_buffer_count = commandBufferCount;921for (unsigned i = 0; i < commandBufferCount; i++)922cmd->u.execute_commands.cmd_buffers[i] = lvp_cmd_buffer_from_handle(pCmdBuffers[i]);923924cmd_buf_queue(cmd_buffer, cmd);925}926927VKAPI_ATTR void VKAPI_CALL lvp_CmdSetEvent(VkCommandBuffer commandBuffer,928VkEvent _event,929VkPipelineStageFlags stageMask)930{931LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);932LVP_FROM_HANDLE(lvp_event, event, _event);933struct lvp_cmd_buffer_entry *cmd;934935cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_EVENT);936if (!cmd)937return;938939cmd->u.event_set.event = event;940cmd->u.event_set.value = true;941cmd->u.event_set.flush = !!(stageMask == VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);942943cmd_buf_queue(cmd_buffer, cmd);944}945946VKAPI_ATTR void VKAPI_CALL lvp_CmdResetEvent(VkCommandBuffer commandBuffer,947VkEvent _event,948VkPipelineStageFlags stageMask)949{950LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);951LVP_FROM_HANDLE(lvp_event, event, _event);952struct lvp_cmd_buffer_entry *cmd;953954cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_EVENT);955if (!cmd)956return;957958cmd->u.event_set.event = event;959cmd->u.event_set.value = false;960cmd->u.event_set.flush = !!(stageMask == VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);961962cmd_buf_queue(cmd_buffer, cmd);963964}965966VKAPI_ATTR void VKAPI_CALL lvp_CmdWaitEvents(VkCommandBuffer commandBuffer,967uint32_t eventCount,968const VkEvent* pEvents,969VkPipelineStageFlags srcStageMask,970VkPipelineStageFlags dstStageMask,971uint32_t memoryBarrierCount,972const VkMemoryBarrier* pMemoryBarriers,973uint32_t bufferMemoryBarrierCount,974const VkBufferMemoryBarrier* pBufferMemoryBarriers,975uint32_t imageMemoryBarrierCount,976const VkImageMemoryBarrier* pImageMemoryBarriers)977{978LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);979struct lvp_cmd_buffer_entry *cmd;980uint32_t cmd_size = 0;981982cmd_size += eventCount * sizeof(struct lvp_event *);983cmd_size += memoryBarrierCount * sizeof(VkMemoryBarrier);984cmd_size += bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);985cmd_size += imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);986987cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_WAIT_EVENTS);988if (!cmd)989return;990991cmd->u.wait_events.src_stage_mask = srcStageMask;992cmd->u.wait_events.dst_stage_mask = dstStageMask;993cmd->u.wait_events.event_count = eventCount;994cmd->u.wait_events.events = (struct lvp_event **)(cmd + 1);995for (unsigned i = 0; i < eventCount; i++)996cmd->u.wait_events.events[i] = lvp_event_from_handle(pEvents[i]);997cmd->u.wait_events.memory_barrier_count = memoryBarrierCount;998cmd->u.wait_events.buffer_memory_barrier_count = bufferMemoryBarrierCount;999cmd->u.wait_events.image_memory_barrier_count = imageMemoryBarrierCount;10001001/* TODO finish off this */1002cmd_buf_queue(cmd_buffer, cmd);1003}10041005/* copy a 2KHR struct to the base struct */1006static inline void1007copy_2_struct_to_base(void *base, const void *struct2, size_t struct_size)1008{1009size_t offset = align(sizeof(VkStructureType) + sizeof(void*), 8);1010memcpy(base, ((uint8_t*)struct2) + offset, struct_size);1011}10121013/* copy an array of 2KHR structs to an array of base structs */1014#define COPY_STRUCT2_ARRAY(count, base, struct2, struct_type) \1015do { \1016for (unsigned _i = 0; _i < (count); _i++) \1017copy_2_struct_to_base(&base[_i], &struct2[_i], sizeof(struct_type)); \1018} while (0)10191020VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBufferToImage2KHR(1021VkCommandBuffer commandBuffer,1022const VkCopyBufferToImageInfo2KHR *info)1023{1024LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1025LVP_FROM_HANDLE(lvp_buffer, src_buffer, info->srcBuffer);1026LVP_FROM_HANDLE(lvp_image, dst_image, info->dstImage);1027struct lvp_cmd_buffer_entry *cmd;1028uint32_t cmd_size = info->regionCount * sizeof(VkBufferImageCopy);10291030cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_BUFFER_TO_IMAGE);1031if (!cmd)1032return;10331034cmd->u.buffer_to_img.src = src_buffer;1035cmd->u.buffer_to_img.dst = dst_image;1036cmd->u.buffer_to_img.dst_layout = info->dstImageLayout;1037cmd->u.buffer_to_img.region_count = info->regionCount;10381039{1040VkBufferImageCopy *regions;10411042regions = (VkBufferImageCopy *)(cmd + 1);1043COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferImageCopy);1044cmd->u.buffer_to_img.regions = regions;1045}10461047cmd_buf_queue(cmd_buffer, cmd);1048}10491050VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImageToBuffer2KHR(1051VkCommandBuffer commandBuffer,1052const VkCopyImageToBufferInfo2KHR *info)1053{1054LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1055LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);1056LVP_FROM_HANDLE(lvp_buffer, dst_buffer, info->dstBuffer);1057struct lvp_cmd_buffer_entry *cmd;1058uint32_t cmd_size = info->regionCount * sizeof(VkBufferImageCopy);10591060cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_IMAGE_TO_BUFFER);1061if (!cmd)1062return;10631064cmd->u.img_to_buffer.src = src_image;1065cmd->u.img_to_buffer.dst = dst_buffer;1066cmd->u.img_to_buffer.src_layout = info->srcImageLayout;1067cmd->u.img_to_buffer.region_count = info->regionCount;10681069{1070VkBufferImageCopy *regions;10711072regions = (VkBufferImageCopy *)(cmd + 1);1073COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferImageCopy);1074cmd->u.img_to_buffer.regions = regions;1075}10761077cmd_buf_queue(cmd_buffer, cmd);1078}10791080VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImage2KHR(1081VkCommandBuffer commandBuffer,1082const VkCopyImageInfo2KHR *info)1083{1084LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1085LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);1086LVP_FROM_HANDLE(lvp_image, dest_image, info->dstImage);1087struct lvp_cmd_buffer_entry *cmd;1088uint32_t cmd_size = info->regionCount * sizeof(VkImageCopy);10891090cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_IMAGE);1091if (!cmd)1092return;10931094cmd->u.copy_image.src = src_image;1095cmd->u.copy_image.dst = dest_image;1096cmd->u.copy_image.src_layout = info->srcImageLayout;1097cmd->u.copy_image.dst_layout = info->dstImageLayout;1098cmd->u.copy_image.region_count = info->regionCount;10991100{1101VkImageCopy *regions;11021103regions = (VkImageCopy *)(cmd + 1);1104COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkImageCopy);1105cmd->u.copy_image.regions = regions;1106}11071108cmd_buf_queue(cmd_buffer, cmd);1109}111011111112VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBuffer2KHR(1113VkCommandBuffer commandBuffer,1114const VkCopyBufferInfo2KHR *info)1115{1116LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1117LVP_FROM_HANDLE(lvp_buffer, src_buffer, info->srcBuffer);1118LVP_FROM_HANDLE(lvp_buffer, dest_buffer, info->dstBuffer);1119struct lvp_cmd_buffer_entry *cmd;1120uint32_t cmd_size = info->regionCount * sizeof(VkBufferCopy);11211122cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_BUFFER);1123if (!cmd)1124return;11251126cmd->u.copy_buffer.src = src_buffer;1127cmd->u.copy_buffer.dst = dest_buffer;1128cmd->u.copy_buffer.region_count = info->regionCount;11291130{1131VkBufferCopy *regions;11321133regions = (VkBufferCopy *)(cmd + 1);1134COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferCopy);1135cmd->u.copy_buffer.regions = regions;1136}11371138cmd_buf_queue(cmd_buffer, cmd);1139}11401141VKAPI_ATTR void VKAPI_CALL lvp_CmdBlitImage2KHR(1142VkCommandBuffer commandBuffer,1143const VkBlitImageInfo2KHR *info)1144{11451146LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1147LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);1148LVP_FROM_HANDLE(lvp_image, dest_image, info->dstImage);1149struct lvp_cmd_buffer_entry *cmd;1150uint32_t cmd_size = info->regionCount * sizeof(VkImageBlit);11511152cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BLIT_IMAGE);1153if (!cmd)1154return;11551156cmd->u.blit_image.src = src_image;1157cmd->u.blit_image.dst = dest_image;1158cmd->u.blit_image.src_layout = info->srcImageLayout;1159cmd->u.blit_image.dst_layout = info->dstImageLayout;1160cmd->u.blit_image.filter = info->filter;1161cmd->u.blit_image.region_count = info->regionCount;11621163{1164VkImageBlit *regions;11651166regions = (VkImageBlit *)(cmd + 1);1167COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkImageBlit);1168cmd->u.blit_image.regions = regions;1169}11701171cmd_buf_queue(cmd_buffer, cmd);1172}11731174VKAPI_ATTR void VKAPI_CALL lvp_CmdClearAttachments(1175VkCommandBuffer commandBuffer,1176uint32_t attachmentCount,1177const VkClearAttachment* pAttachments,1178uint32_t rectCount,1179const VkClearRect* pRects)1180{1181LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1182struct lvp_cmd_buffer_entry *cmd;1183uint32_t cmd_size = attachmentCount * sizeof(VkClearAttachment) + rectCount * sizeof(VkClearRect);11841185cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_CLEAR_ATTACHMENTS);1186if (!cmd)1187return;11881189cmd->u.clear_attachments.attachment_count = attachmentCount;1190cmd->u.clear_attachments.attachments = (VkClearAttachment *)(cmd + 1);1191for (unsigned i = 0; i < attachmentCount; i++)1192cmd->u.clear_attachments.attachments[i] = pAttachments[i];1193cmd->u.clear_attachments.rect_count = rectCount;1194cmd->u.clear_attachments.rects = (VkClearRect *)(cmd->u.clear_attachments.attachments + attachmentCount);1195for (unsigned i = 0; i < rectCount; i++)1196cmd->u.clear_attachments.rects[i] = pRects[i];11971198cmd_buf_queue(cmd_buffer, cmd);1199}12001201VKAPI_ATTR void VKAPI_CALL lvp_CmdFillBuffer(1202VkCommandBuffer commandBuffer,1203VkBuffer dstBuffer,1204VkDeviceSize dstOffset,1205VkDeviceSize fillSize,1206uint32_t data)1207{1208LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1209LVP_FROM_HANDLE(lvp_buffer, dst_buffer, dstBuffer);1210struct lvp_cmd_buffer_entry *cmd;12111212cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_FILL_BUFFER);1213if (!cmd)1214return;12151216cmd->u.fill_buffer.buffer = dst_buffer;1217cmd->u.fill_buffer.offset = dstOffset;1218cmd->u.fill_buffer.fill_size = fillSize;1219cmd->u.fill_buffer.data = data;12201221cmd_buf_queue(cmd_buffer, cmd);1222}12231224VKAPI_ATTR void VKAPI_CALL lvp_CmdUpdateBuffer(1225VkCommandBuffer commandBuffer,1226VkBuffer dstBuffer,1227VkDeviceSize dstOffset,1228VkDeviceSize dataSize,1229const void* pData)1230{1231LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1232LVP_FROM_HANDLE(lvp_buffer, dst_buffer, dstBuffer);1233struct lvp_cmd_buffer_entry *cmd;12341235cmd = cmd_buf_entry_alloc_size(cmd_buffer, dataSize, LVP_CMD_UPDATE_BUFFER);1236if (!cmd)1237return;12381239cmd->u.update_buffer.buffer = dst_buffer;1240cmd->u.update_buffer.offset = dstOffset;1241cmd->u.update_buffer.data_size = dataSize;1242memcpy(cmd->u.update_buffer.data, pData, dataSize);12431244cmd_buf_queue(cmd_buffer, cmd);1245}12461247VKAPI_ATTR void VKAPI_CALL lvp_CmdClearColorImage(1248VkCommandBuffer commandBuffer,1249VkImage image_h,1250VkImageLayout imageLayout,1251const VkClearColorValue* pColor,1252uint32_t rangeCount,1253const VkImageSubresourceRange* pRanges)1254{1255LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1256LVP_FROM_HANDLE(lvp_image, image, image_h);1257struct lvp_cmd_buffer_entry *cmd;1258uint32_t cmd_size = rangeCount * sizeof(VkImageSubresourceRange);12591260cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_CLEAR_COLOR_IMAGE);1261if (!cmd)1262return;12631264cmd->u.clear_color_image.image = image;1265cmd->u.clear_color_image.layout = imageLayout;1266cmd->u.clear_color_image.clear_val = *pColor;1267cmd->u.clear_color_image.range_count = rangeCount;1268cmd->u.clear_color_image.ranges = (VkImageSubresourceRange *)(cmd + 1);1269for (unsigned i = 0; i < rangeCount; i++)1270cmd->u.clear_color_image.ranges[i] = pRanges[i];12711272cmd_buf_queue(cmd_buffer, cmd);1273}12741275VKAPI_ATTR void VKAPI_CALL lvp_CmdClearDepthStencilImage(1276VkCommandBuffer commandBuffer,1277VkImage image_h,1278VkImageLayout imageLayout,1279const VkClearDepthStencilValue* pDepthStencil,1280uint32_t rangeCount,1281const VkImageSubresourceRange* pRanges)1282{1283LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1284LVP_FROM_HANDLE(lvp_image, image, image_h);1285struct lvp_cmd_buffer_entry *cmd;1286uint32_t cmd_size = rangeCount * sizeof(VkImageSubresourceRange);12871288cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_CLEAR_DEPTH_STENCIL_IMAGE);1289if (!cmd)1290return;12911292cmd->u.clear_ds_image.image = image;1293cmd->u.clear_ds_image.layout = imageLayout;1294cmd->u.clear_ds_image.clear_val = *pDepthStencil;1295cmd->u.clear_ds_image.range_count = rangeCount;1296cmd->u.clear_ds_image.ranges = (VkImageSubresourceRange *)(cmd + 1);1297for (unsigned i = 0; i < rangeCount; i++)1298cmd->u.clear_ds_image.ranges[i] = pRanges[i];12991300cmd_buf_queue(cmd_buffer, cmd);1301}130213031304VKAPI_ATTR void VKAPI_CALL lvp_CmdResolveImage2KHR(1305VkCommandBuffer commandBuffer,1306const VkResolveImageInfo2KHR *info)1307{1308LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1309LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);1310LVP_FROM_HANDLE(lvp_image, dst_image, info->dstImage);1311struct lvp_cmd_buffer_entry *cmd;1312uint32_t cmd_size = info->regionCount * sizeof(VkImageResolve);13131314cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_RESOLVE_IMAGE);1315if (!cmd)1316return;13171318cmd->u.resolve_image.src = src_image;1319cmd->u.resolve_image.dst = dst_image;1320cmd->u.resolve_image.src_layout = info->srcImageLayout;1321cmd->u.resolve_image.dst_layout = info->dstImageLayout;1322cmd->u.resolve_image.region_count = info->regionCount;1323cmd->u.resolve_image.regions = (VkImageResolve *)(cmd + 1);1324COPY_STRUCT2_ARRAY(info->regionCount, cmd->u.resolve_image.regions, info->pRegions, VkImageResolve);13251326cmd_buf_queue(cmd_buffer, cmd);1327}13281329VKAPI_ATTR void VKAPI_CALL lvp_CmdResetQueryPool(1330VkCommandBuffer commandBuffer,1331VkQueryPool queryPool,1332uint32_t firstQuery,1333uint32_t queryCount)1334{1335LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1336LVP_FROM_HANDLE(lvp_query_pool, query_pool, queryPool);1337struct lvp_cmd_buffer_entry *cmd;13381339cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_RESET_QUERY_POOL);1340if (!cmd)1341return;13421343cmd->u.query.pool = query_pool;1344cmd->u.query.query = firstQuery;1345cmd->u.query.index = queryCount;13461347cmd_buf_queue(cmd_buffer, cmd);1348}13491350VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginQueryIndexedEXT(1351VkCommandBuffer commandBuffer,1352VkQueryPool queryPool,1353uint32_t query,1354VkQueryControlFlags flags,1355uint32_t index)1356{1357LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1358LVP_FROM_HANDLE(lvp_query_pool, query_pool, queryPool);1359struct lvp_cmd_buffer_entry *cmd;13601361cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_BEGIN_QUERY);1362if (!cmd)1363return;13641365cmd->u.query.pool = query_pool;1366cmd->u.query.query = query;1367cmd->u.query.index = index;1368cmd->u.query.precise = true;13691370cmd_buf_queue(cmd_buffer, cmd);1371}13721373VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginQuery(1374VkCommandBuffer commandBuffer,1375VkQueryPool queryPool,1376uint32_t query,1377VkQueryControlFlags flags)1378{1379lvp_CmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, 0);1380}13811382VKAPI_ATTR void VKAPI_CALL lvp_CmdEndQueryIndexedEXT(1383VkCommandBuffer commandBuffer,1384VkQueryPool queryPool,1385uint32_t query,1386uint32_t index)1387{1388LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1389LVP_FROM_HANDLE(lvp_query_pool, query_pool, queryPool);1390struct lvp_cmd_buffer_entry *cmd;13911392cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_END_QUERY);1393if (!cmd)1394return;13951396cmd->u.query.pool = query_pool;1397cmd->u.query.query = query;1398cmd->u.query.index = index;13991400cmd_buf_queue(cmd_buffer, cmd);1401}14021403VKAPI_ATTR void VKAPI_CALL lvp_CmdEndQuery(1404VkCommandBuffer commandBuffer,1405VkQueryPool queryPool,1406uint32_t query)1407{1408lvp_CmdEndQueryIndexedEXT(commandBuffer, queryPool, query, 0);1409}14101411VKAPI_ATTR void VKAPI_CALL lvp_CmdWriteTimestamp(1412VkCommandBuffer commandBuffer,1413VkPipelineStageFlagBits pipelineStage,1414VkQueryPool queryPool,1415uint32_t query)1416{1417LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1418LVP_FROM_HANDLE(lvp_query_pool, query_pool, queryPool);1419struct lvp_cmd_buffer_entry *cmd;14201421cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_WRITE_TIMESTAMP);1422if (!cmd)1423return;14241425cmd->u.query.pool = query_pool;1426cmd->u.query.query = query;1427cmd->u.query.flush = !(pipelineStage == VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);14281429cmd_buf_queue(cmd_buffer, cmd);1430}14311432VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyQueryPoolResults(1433VkCommandBuffer commandBuffer,1434VkQueryPool queryPool,1435uint32_t firstQuery,1436uint32_t queryCount,1437VkBuffer dstBuffer,1438VkDeviceSize dstOffset,1439VkDeviceSize stride,1440VkQueryResultFlags flags)1441{1442LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1443LVP_FROM_HANDLE(lvp_query_pool, query_pool, queryPool);1444LVP_FROM_HANDLE(lvp_buffer, buffer, dstBuffer);1445struct lvp_cmd_buffer_entry *cmd;14461447cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_COPY_QUERY_POOL_RESULTS);1448if (!cmd)1449return;14501451cmd->u.copy_query_pool_results.pool = query_pool;1452cmd->u.copy_query_pool_results.first_query = firstQuery;1453cmd->u.copy_query_pool_results.query_count = queryCount;1454cmd->u.copy_query_pool_results.dst = buffer;1455cmd->u.copy_query_pool_results.dst_offset = dstOffset;1456cmd->u.copy_query_pool_results.stride = stride;1457cmd->u.copy_query_pool_results.flags = flags;14581459cmd_buf_queue(cmd_buffer, cmd);1460}14611462VKAPI_ATTR void VKAPI_CALL lvp_CmdPipelineBarrier(1463VkCommandBuffer commandBuffer,1464VkPipelineStageFlags srcStageMask,1465VkPipelineStageFlags destStageMask,1466VkBool32 byRegion,1467uint32_t memoryBarrierCount,1468const VkMemoryBarrier* pMemoryBarriers,1469uint32_t bufferMemoryBarrierCount,1470const VkBufferMemoryBarrier* pBufferMemoryBarriers,1471uint32_t imageMemoryBarrierCount,1472const VkImageMemoryBarrier* pImageMemoryBarriers)1473{1474LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1475struct lvp_cmd_buffer_entry *cmd;1476uint32_t cmd_size = 0;14771478cmd_size += memoryBarrierCount * sizeof(VkMemoryBarrier);1479cmd_size += bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);1480cmd_size += imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);14811482cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_PIPELINE_BARRIER);1483if (!cmd)1484return;14851486cmd->u.pipeline_barrier.src_stage_mask = srcStageMask;1487cmd->u.pipeline_barrier.dst_stage_mask = destStageMask;1488cmd->u.pipeline_barrier.by_region = byRegion;1489cmd->u.pipeline_barrier.memory_barrier_count = memoryBarrierCount;1490cmd->u.pipeline_barrier.buffer_memory_barrier_count = bufferMemoryBarrierCount;1491cmd->u.pipeline_barrier.image_memory_barrier_count = imageMemoryBarrierCount;14921493/* TODO finish off this */1494cmd_buf_queue(cmd_buffer, cmd);1495}14961497VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndirectCount(1498VkCommandBuffer commandBuffer,1499VkBuffer buffer,1500VkDeviceSize offset,1501VkBuffer countBuffer,1502VkDeviceSize countBufferOffset,1503uint32_t maxDrawCount,1504uint32_t stride)1505{1506LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1507LVP_FROM_HANDLE(lvp_buffer, buf, buffer);1508LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);1509struct lvp_cmd_buffer_entry *cmd;15101511cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDIRECT_COUNT);1512if (!cmd)1513return;15141515cmd->u.draw_indirect_count.offset = offset;1516cmd->u.draw_indirect_count.buffer = buf;1517cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;1518cmd->u.draw_indirect_count.count_buffer = count_buf;1519cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;1520cmd->u.draw_indirect_count.stride = stride;15211522cmd_buf_queue(cmd_buffer, cmd);1523}15241525VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndexedIndirectCount(1526VkCommandBuffer commandBuffer,1527VkBuffer buffer,1528VkDeviceSize offset,1529VkBuffer countBuffer,1530VkDeviceSize countBufferOffset,1531uint32_t maxDrawCount,1532uint32_t stride)1533{1534LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1535LVP_FROM_HANDLE(lvp_buffer, buf, buffer);1536LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);1537struct lvp_cmd_buffer_entry *cmd;15381539cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT);1540if (!cmd)1541return;15421543cmd->u.draw_indirect_count.offset = offset;1544cmd->u.draw_indirect_count.buffer = buf;1545cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;1546cmd->u.draw_indirect_count.count_buffer = count_buf;1547cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;1548cmd->u.draw_indirect_count.stride = stride;15491550cmd_buf_queue(cmd_buffer, cmd);1551}15521553VKAPI_ATTR void VKAPI_CALL lvp_CmdPushDescriptorSetKHR(1554VkCommandBuffer commandBuffer,1555VkPipelineBindPoint pipelineBindPoint,1556VkPipelineLayout _layout,1557uint32_t set,1558uint32_t descriptorWriteCount,1559const VkWriteDescriptorSet* pDescriptorWrites)1560{1561LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1562LVP_FROM_HANDLE(lvp_pipeline_layout, layout, _layout);1563struct lvp_cmd_buffer_entry *cmd;1564int cmd_size = 0;15651566cmd_size += descriptorWriteCount * sizeof(struct lvp_write_descriptor);15671568int count_descriptors = 0;15691570for (unsigned i = 0; i < descriptorWriteCount; i++) {1571count_descriptors += pDescriptorWrites[i].descriptorCount;1572}1573cmd_size += count_descriptors * sizeof(union lvp_descriptor_info);1574cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_PUSH_DESCRIPTOR_SET);1575if (!cmd)1576return;15771578cmd->u.push_descriptor_set.bind_point = pipelineBindPoint;1579cmd->u.push_descriptor_set.layout = layout;1580cmd->u.push_descriptor_set.set = set;1581cmd->u.push_descriptor_set.descriptor_write_count = descriptorWriteCount;1582cmd->u.push_descriptor_set.descriptors = (struct lvp_write_descriptor *)(cmd + 1);1583cmd->u.push_descriptor_set.infos = (union lvp_descriptor_info *)(cmd->u.push_descriptor_set.descriptors + descriptorWriteCount);15841585unsigned descriptor_index = 0;15861587for (unsigned i = 0; i < descriptorWriteCount; i++) {1588struct lvp_write_descriptor *desc = &cmd->u.push_descriptor_set.descriptors[i];15891590/* dstSet is ignored */1591desc->dst_binding = pDescriptorWrites[i].dstBinding;1592desc->dst_array_element = pDescriptorWrites[i].dstArrayElement;1593desc->descriptor_count = pDescriptorWrites[i].descriptorCount;1594desc->descriptor_type = pDescriptorWrites[i].descriptorType;15951596for (unsigned j = 0; j < desc->descriptor_count; j++) {1597union lvp_descriptor_info *info = &cmd->u.push_descriptor_set.infos[descriptor_index + j];1598switch (desc->descriptor_type) {1599case VK_DESCRIPTOR_TYPE_SAMPLER:1600info->sampler = lvp_sampler_from_handle(pDescriptorWrites[i].pImageInfo[j].sampler);1601break;1602case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:1603info->sampler = lvp_sampler_from_handle(pDescriptorWrites[i].pImageInfo[j].sampler);1604info->iview = lvp_image_view_from_handle(pDescriptorWrites[i].pImageInfo[j].imageView);1605info->image_layout = pDescriptorWrites[i].pImageInfo[j].imageLayout;1606break;1607case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:1608case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:1609case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:1610info->iview = lvp_image_view_from_handle(pDescriptorWrites[i].pImageInfo[j].imageView);1611info->image_layout = pDescriptorWrites[i].pImageInfo[j].imageLayout;1612break;1613case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:1614case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:1615info->buffer_view = lvp_buffer_view_from_handle(pDescriptorWrites[i].pTexelBufferView[j]);1616break;1617case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:1618case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:1619case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:1620case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:1621default:1622info->buffer = lvp_buffer_from_handle(pDescriptorWrites[i].pBufferInfo[j].buffer);1623info->offset = pDescriptorWrites[i].pBufferInfo[j].offset;1624info->range = pDescriptorWrites[i].pBufferInfo[j].range;1625break;1626}1627}1628descriptor_index += desc->descriptor_count;1629}1630cmd_buf_queue(cmd_buffer, cmd);1631}16321633VKAPI_ATTR void VKAPI_CALL lvp_CmdPushDescriptorSetWithTemplateKHR(1634VkCommandBuffer commandBuffer,1635VkDescriptorUpdateTemplate descriptorUpdateTemplate,1636VkPipelineLayout _layout,1637uint32_t set,1638const void* pData)1639{1640LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1641LVP_FROM_HANDLE(lvp_descriptor_update_template, templ, descriptorUpdateTemplate);1642int cmd_size = 0;1643struct lvp_cmd_buffer_entry *cmd;16441645cmd_size += templ->entry_count * sizeof(struct lvp_write_descriptor);16461647int count_descriptors = 0;1648for (unsigned i = 0; i < templ->entry_count; i++) {1649VkDescriptorUpdateTemplateEntry *entry = &templ->entry[i];1650count_descriptors += entry->descriptorCount;1651}1652cmd_size += count_descriptors * sizeof(union lvp_descriptor_info);16531654cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_PUSH_DESCRIPTOR_SET);1655if (!cmd)1656return;16571658cmd->u.push_descriptor_set.bind_point = templ->bind_point;1659cmd->u.push_descriptor_set.layout = templ->pipeline_layout;1660cmd->u.push_descriptor_set.set = templ->set;1661cmd->u.push_descriptor_set.descriptor_write_count = templ->entry_count;1662cmd->u.push_descriptor_set.descriptors = (struct lvp_write_descriptor *)(cmd + 1);1663cmd->u.push_descriptor_set.infos = (union lvp_descriptor_info *)(cmd->u.push_descriptor_set.descriptors + templ->entry_count);16641665unsigned descriptor_index = 0;16661667for (unsigned i = 0; i < templ->entry_count; i++) {1668struct lvp_write_descriptor *desc = &cmd->u.push_descriptor_set.descriptors[i];1669struct VkDescriptorUpdateTemplateEntry *entry = &templ->entry[i];1670const uint8_t *pSrc = ((const uint8_t *) pData) + entry->offset;16711672/* dstSet is ignored */1673desc->dst_binding = entry->dstBinding;1674desc->dst_array_element = entry->dstArrayElement;1675desc->descriptor_count = entry->descriptorCount;1676desc->descriptor_type = entry->descriptorType;16771678for (unsigned j = 0; j < desc->descriptor_count; j++) {1679union lvp_descriptor_info *info = &cmd->u.push_descriptor_set.infos[descriptor_index + j];1680switch (desc->descriptor_type) {1681case VK_DESCRIPTOR_TYPE_SAMPLER:1682info->sampler = lvp_sampler_from_handle(*(VkSampler *)pSrc);1683break;1684case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {1685VkDescriptorImageInfo *image_info = (VkDescriptorImageInfo *)pSrc;1686info->sampler = lvp_sampler_from_handle(image_info->sampler);1687info->iview = lvp_image_view_from_handle(image_info->imageView);1688info->image_layout = image_info->imageLayout;1689break;1690}1691case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:1692case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:1693case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: {1694VkDescriptorImageInfo *image_info = (VkDescriptorImageInfo *)pSrc;1695info->iview = lvp_image_view_from_handle(image_info->imageView);1696info->image_layout = image_info->imageLayout;1697break;1698}1699case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:1700case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:1701info->buffer_view = lvp_buffer_view_from_handle(*(VkBufferView *)pSrc);1702break;1703case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:1704case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:1705case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:1706case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:1707default: {1708VkDescriptorBufferInfo *buffer_info = (VkDescriptorBufferInfo *)pSrc;1709info->buffer = lvp_buffer_from_handle(buffer_info->buffer);1710info->offset = buffer_info->offset;1711info->range = buffer_info->range;1712break;1713}1714}1715pSrc += entry->stride;1716}1717descriptor_index += desc->descriptor_count;1718}1719cmd_buf_queue(cmd_buffer, cmd);1720}17211722VKAPI_ATTR void VKAPI_CALL lvp_CmdBindTransformFeedbackBuffersEXT(1723VkCommandBuffer commandBuffer,1724uint32_t firstBinding,1725uint32_t bindingCount,1726const VkBuffer* pBuffers,1727const VkDeviceSize* pOffsets,1728const VkDeviceSize* pSizes)1729{1730LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1731struct lvp_cmd_buffer_entry *cmd;1732uint32_t cmd_size = 0;17331734cmd_size += bindingCount * (sizeof(struct lvp_buffer *) + sizeof(VkDeviceSize) * 2);17351736cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BIND_TRANSFORM_FEEDBACK_BUFFERS);1737if (!cmd)1738return;17391740cmd->u.bind_transform_feedback_buffers.first_binding = firstBinding;1741cmd->u.bind_transform_feedback_buffers.binding_count = bindingCount;1742cmd->u.bind_transform_feedback_buffers.buffers = (struct lvp_buffer **)(cmd + 1);1743cmd->u.bind_transform_feedback_buffers.offsets = (VkDeviceSize *)(cmd->u.bind_transform_feedback_buffers.buffers + bindingCount);1744cmd->u.bind_transform_feedback_buffers.sizes = (VkDeviceSize *)(cmd->u.bind_transform_feedback_buffers.offsets + bindingCount);17451746for (unsigned i = 0; i < bindingCount; i++) {1747cmd->u.bind_transform_feedback_buffers.buffers[i] = lvp_buffer_from_handle(pBuffers[i]);1748cmd->u.bind_transform_feedback_buffers.offsets[i] = pOffsets[i];1749if (pSizes && pSizes[i] != VK_WHOLE_SIZE)1750cmd->u.bind_transform_feedback_buffers.sizes[i] = pSizes[i];1751else1752cmd->u.bind_transform_feedback_buffers.sizes[i] = cmd->u.bind_transform_feedback_buffers.buffers[i]->size - pOffsets[i];1753}1754cmd_buf_queue(cmd_buffer, cmd);1755}17561757VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginTransformFeedbackEXT(1758VkCommandBuffer commandBuffer,1759uint32_t firstCounterBuffer,1760uint32_t counterBufferCount,1761const VkBuffer* pCounterBuffers,1762const VkDeviceSize* pCounterBufferOffsets)1763{1764LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1765struct lvp_cmd_buffer_entry *cmd;1766uint32_t cmd_size = 0;17671768cmd_size += counterBufferCount * (sizeof(struct lvp_buffer *) + sizeof(VkDeviceSize));17691770cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BEGIN_TRANSFORM_FEEDBACK);1771if (!cmd)1772return;17731774cmd->u.begin_transform_feedback.first_counter_buffer = firstCounterBuffer;1775cmd->u.begin_transform_feedback.counter_buffer_count = counterBufferCount;1776cmd->u.begin_transform_feedback.counter_buffers = (struct lvp_buffer **)(cmd + 1);1777cmd->u.begin_transform_feedback.counter_buffer_offsets = (VkDeviceSize *)(cmd->u.begin_transform_feedback.counter_buffers + counterBufferCount);17781779for (unsigned i = 0; i < counterBufferCount; i++) {1780if (pCounterBuffers)1781cmd->u.begin_transform_feedback.counter_buffers[i] = lvp_buffer_from_handle(pCounterBuffers[i]);1782else1783cmd->u.begin_transform_feedback.counter_buffers[i] = NULL;1784if (pCounterBufferOffsets)1785cmd->u.begin_transform_feedback.counter_buffer_offsets[i] = pCounterBufferOffsets[i];1786else1787cmd->u.begin_transform_feedback.counter_buffer_offsets[i] = 0;1788}1789cmd_buf_queue(cmd_buffer, cmd);1790}17911792VKAPI_ATTR void VKAPI_CALL lvp_CmdEndTransformFeedbackEXT(1793VkCommandBuffer commandBuffer,1794uint32_t firstCounterBuffer,1795uint32_t counterBufferCount,1796const VkBuffer* pCounterBuffers,1797const VkDeviceSize* pCounterBufferOffsets)1798{1799LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1800struct lvp_cmd_buffer_entry *cmd;1801uint32_t cmd_size = 0;18021803cmd_size += counterBufferCount * (sizeof(struct lvp_buffer *) + sizeof(VkDeviceSize));18041805cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_END_TRANSFORM_FEEDBACK);1806if (!cmd)1807return;18081809cmd->u.begin_transform_feedback.first_counter_buffer = firstCounterBuffer;1810cmd->u.begin_transform_feedback.counter_buffer_count = counterBufferCount;1811cmd->u.begin_transform_feedback.counter_buffers = (struct lvp_buffer **)(cmd + 1);1812cmd->u.begin_transform_feedback.counter_buffer_offsets = (VkDeviceSize *)(cmd->u.begin_transform_feedback.counter_buffers + counterBufferCount);18131814for (unsigned i = 0; i < counterBufferCount; i++) {1815if (pCounterBuffers)1816cmd->u.begin_transform_feedback.counter_buffers[i] = lvp_buffer_from_handle(pCounterBuffers[i]);1817else1818cmd->u.begin_transform_feedback.counter_buffers[i] = NULL;1819if (pCounterBufferOffsets)1820cmd->u.begin_transform_feedback.counter_buffer_offsets[i] = pCounterBufferOffsets[i];1821else1822cmd->u.begin_transform_feedback.counter_buffer_offsets[i] = 0;1823}1824cmd_buf_queue(cmd_buffer, cmd);1825}18261827VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndirectByteCountEXT(1828VkCommandBuffer commandBuffer,1829uint32_t instanceCount,1830uint32_t firstInstance,1831VkBuffer counterBuffer,1832VkDeviceSize counterBufferOffset,1833uint32_t counterOffset,1834uint32_t vertexStride)1835{1836LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1837struct lvp_cmd_buffer_entry *cmd;18381839cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDIRECT_BYTE_COUNT);1840if (!cmd)1841return;18421843cmd->u.draw_indirect_byte_count.instance_count = instanceCount;1844cmd->u.draw_indirect_byte_count.first_instance = firstInstance;1845cmd->u.draw_indirect_byte_count.counter_buffer = lvp_buffer_from_handle(counterBuffer);1846cmd->u.draw_indirect_byte_count.counter_buffer_offset = counterBufferOffset;1847cmd->u.draw_indirect_byte_count.counter_offset = counterOffset;1848cmd->u.draw_indirect_byte_count.vertex_stride = vertexStride;18491850cmd_buf_queue(cmd_buffer, cmd);1851}18521853VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDeviceMask(1854VkCommandBuffer commandBuffer,1855uint32_t deviceMask)1856{1857/* No-op */1858}18591860VKAPI_ATTR void VKAPI_CALL lvp_CmdDispatchBase(1861VkCommandBuffer commandBuffer,1862uint32_t base_x,1863uint32_t base_y,1864uint32_t base_z,1865uint32_t x,1866uint32_t y,1867uint32_t z)1868{1869LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1870struct lvp_cmd_buffer_entry *cmd;18711872cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DISPATCH);1873if (!cmd)1874return;18751876cmd->u.dispatch.x = x;1877cmd->u.dispatch.y = y;1878cmd->u.dispatch.z = z;1879cmd->u.dispatch.base_x = base_x;1880cmd->u.dispatch.base_y = base_y;1881cmd->u.dispatch.base_z = base_z;1882cmd_buf_queue(cmd_buffer, cmd);1883}18841885VKAPI_ATTR void VKAPI_CALL lvp_CmdBeginConditionalRenderingEXT(1886VkCommandBuffer commandBuffer,1887const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin)1888{1889LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1890struct lvp_cmd_buffer_entry *cmd;1891cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_BEGIN_CONDITIONAL_RENDERING);1892if (!cmd)1893return;18941895cmd->u.begin_conditional_rendering.buffer = lvp_buffer_from_handle(pConditionalRenderingBegin->buffer);1896cmd->u.begin_conditional_rendering.offset = pConditionalRenderingBegin->offset;1897cmd->u.begin_conditional_rendering.inverted = pConditionalRenderingBegin->flags & VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT;1898cmd_buf_queue(cmd_buffer, cmd);1899}19001901VKAPI_ATTR void VKAPI_CALL lvp_CmdEndConditionalRenderingEXT(1902VkCommandBuffer commandBuffer)1903{1904LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1905struct lvp_cmd_buffer_entry *cmd;1906cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_END_CONDITIONAL_RENDERING);1907if (!cmd)1908return;1909cmd_buf_queue(cmd_buffer, cmd);1910}19111912VKAPI_ATTR void VKAPI_CALL lvp_CmdSetCullModeEXT(1913VkCommandBuffer commandBuffer,1914VkCullModeFlags cullMode)1915{1916LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1917struct lvp_cmd_buffer_entry *cmd;19181919cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_CULL_MODE);1920if (!cmd)1921return;19221923cmd->u.set_cull_mode.cull_mode = cullMode;1924cmd_buf_queue(cmd_buffer, cmd);1925}19261927VKAPI_ATTR void VKAPI_CALL lvp_CmdSetVertexInputEXT(1928VkCommandBuffer commandBuffer,1929uint32_t vertexBindingDescriptionCount,1930const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,1931uint32_t vertexAttributeDescriptionCount,1932const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions)1933{1934LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1935struct lvp_cmd_buffer_entry *cmd;19361937size_t binding_size = vertexBindingDescriptionCount * sizeof(VkVertexInputBindingDescription2EXT);1938size_t attr_size = vertexAttributeDescriptionCount * sizeof(VkVertexInputAttributeDescription2EXT);1939cmd = cmd_buf_entry_alloc_size(cmd_buffer, binding_size + attr_size, LVP_CMD_SET_VERTEX_INPUT);1940if (!cmd)1941return;19421943cmd->u.set_vertex_input.binding_count = vertexBindingDescriptionCount;1944cmd->u.set_vertex_input.attr_count = vertexAttributeDescriptionCount;1945memcpy(cmd->u.set_vertex_input.data, pVertexBindingDescriptions, binding_size);1946memcpy(cmd->u.set_vertex_input.data + binding_size, pVertexAttributeDescriptions, attr_size);1947cmd_buf_queue(cmd_buffer, cmd);1948}19491950VKAPI_ATTR void VKAPI_CALL lvp_CmdSetFrontFaceEXT(1951VkCommandBuffer commandBuffer,1952VkFrontFace frontFace)1953{1954LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1955struct lvp_cmd_buffer_entry *cmd;19561957cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_FRONT_FACE);1958if (!cmd)1959return;19601961cmd->u.set_front_face.front_face = frontFace;1962cmd_buf_queue(cmd_buffer, cmd);1963}19641965VKAPI_ATTR void VKAPI_CALL lvp_CmdSetLineStippleEXT(1966VkCommandBuffer commandBuffer,1967uint32_t lineStippleFactor,1968uint16_t lineStipplePattern)1969{1970LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1971struct lvp_cmd_buffer_entry *cmd;19721973cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_LINE_STIPPLE);1974if (!cmd)1975return;19761977cmd->u.set_line_stipple.line_stipple_factor = lineStippleFactor;1978cmd->u.set_line_stipple.line_stipple_pattern = lineStipplePattern;1979cmd_buf_queue(cmd_buffer, cmd);1980}19811982VKAPI_ATTR void VKAPI_CALL lvp_CmdSetPrimitiveTopologyEXT(1983VkCommandBuffer commandBuffer,1984VkPrimitiveTopology primitiveTopology)1985{1986LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);1987struct lvp_cmd_buffer_entry *cmd;19881989cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_PRIMITIVE_TOPOLOGY);1990if (!cmd)1991return;19921993cmd->u.set_primitive_topology.prim = primitiveTopology;1994cmd_buf_queue(cmd_buffer, cmd);1995}19961997VKAPI_ATTR void VKAPI_CALL lvp_CmdSetViewportWithCountEXT(1998VkCommandBuffer commandBuffer,1999uint32_t viewportCount,2000const VkViewport* pViewports)2001{2002LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2003struct lvp_cmd_buffer_entry *cmd;2004int i;20052006cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_VIEWPORT);2007if (!cmd)2008return;20092010cmd->u.set_viewport.first_viewport = UINT32_MAX;2011cmd->u.set_viewport.viewport_count = viewportCount;2012for (i = 0; i < viewportCount; i++)2013cmd->u.set_viewport.viewports[i] = pViewports[i];20142015cmd_buf_queue(cmd_buffer, cmd);2016}20172018VKAPI_ATTR void VKAPI_CALL lvp_CmdSetScissorWithCountEXT(2019VkCommandBuffer commandBuffer,2020uint32_t scissorCount,2021const VkRect2D* pScissors)2022{2023LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2024struct lvp_cmd_buffer_entry *cmd;2025int i;20262027cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_SCISSOR);2028if (!cmd)2029return;20302031cmd->u.set_scissor.first_scissor = UINT32_MAX;2032cmd->u.set_scissor.scissor_count = scissorCount;2033for (i = 0; i < scissorCount; i++)2034cmd->u.set_scissor.scissors[i] = pScissors[i];20352036cmd_buf_queue(cmd_buffer, cmd);2037}20382039VKAPI_ATTR void VKAPI_CALL lvp_CmdBindVertexBuffers2EXT(2040VkCommandBuffer commandBuffer,2041uint32_t firstBinding,2042uint32_t bindingCount,2043const VkBuffer* pBuffers,2044const VkDeviceSize* pOffsets,2045const VkDeviceSize* pSizes,2046const VkDeviceSize* pStrides)2047{2048LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2049struct lvp_cmd_buffer_entry *cmd;2050struct lvp_buffer **buffers;2051VkDeviceSize *offsets;2052VkDeviceSize *sizes;2053VkDeviceSize *strides;2054int i;2055uint32_t array_count = pStrides ? 3 : 2;2056uint32_t cmd_size = bindingCount * sizeof(struct lvp_buffer *) + bindingCount * array_count * sizeof(VkDeviceSize);20572058cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BIND_VERTEX_BUFFERS);2059if (!cmd)2060return;20612062cmd->u.vertex_buffers.first = firstBinding;2063cmd->u.vertex_buffers.binding_count = bindingCount;20642065buffers = (struct lvp_buffer **)(cmd + 1);2066offsets = (VkDeviceSize *)(buffers + bindingCount);2067sizes = (VkDeviceSize *)(offsets + bindingCount);2068strides = (VkDeviceSize *)(sizes + bindingCount);2069for (i = 0; i < bindingCount; i++) {2070buffers[i] = lvp_buffer_from_handle(pBuffers[i]);2071offsets[i] = pOffsets[i];2072if (pSizes)2073sizes[i] = pSizes[i];2074else2075sizes[i] = 0;20762077if (pStrides)2078strides[i] = pStrides[i];2079}2080cmd->u.vertex_buffers.buffers = buffers;2081cmd->u.vertex_buffers.offsets = offsets;2082cmd->u.vertex_buffers.sizes = sizes;2083cmd->u.vertex_buffers.strides = pStrides ? strides : NULL;20842085cmd_buf_queue(cmd_buffer, cmd);2086}20872088VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthTestEnableEXT(2089VkCommandBuffer commandBuffer,2090VkBool32 depthTestEnable)2091{2092LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2093struct lvp_cmd_buffer_entry *cmd;20942095cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_TEST_ENABLE);2096if (!cmd)2097return;20982099cmd->u.set_depth_test_enable.depth_test_enable = depthTestEnable;2100cmd_buf_queue(cmd_buffer, cmd);2101}21022103VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthWriteEnableEXT(2104VkCommandBuffer commandBuffer,2105VkBool32 depthWriteEnable)2106{2107LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2108struct lvp_cmd_buffer_entry *cmd;21092110cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_WRITE_ENABLE);2111if (!cmd)2112return;21132114cmd->u.set_depth_write_enable.depth_write_enable = depthWriteEnable;2115cmd_buf_queue(cmd_buffer, cmd);2116}21172118VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthCompareOpEXT(2119VkCommandBuffer commandBuffer,2120VkCompareOp depthCompareOp)2121{2122LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2123struct lvp_cmd_buffer_entry *cmd;21242125cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_COMPARE_OP);2126if (!cmd)2127return;21282129cmd->u.set_depth_compare_op.depth_op = depthCompareOp;2130cmd_buf_queue(cmd_buffer, cmd);2131}21322133VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthBoundsTestEnableEXT(2134VkCommandBuffer commandBuffer,2135VkBool32 depthBoundsTestEnable)2136{2137LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2138struct lvp_cmd_buffer_entry *cmd;21392140cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_BOUNDS_TEST_ENABLE);2141if (!cmd)2142return;21432144cmd->u.set_depth_bounds_test_enable.depth_bounds_test_enable = depthBoundsTestEnable;2145cmd_buf_queue(cmd_buffer, cmd);2146}21472148VKAPI_ATTR void VKAPI_CALL lvp_CmdSetStencilTestEnableEXT(2149VkCommandBuffer commandBuffer,2150VkBool32 stencilTestEnable)2151{2152LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2153struct lvp_cmd_buffer_entry *cmd;21542155cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_STENCIL_TEST_ENABLE);2156if (!cmd)2157return;21582159cmd->u.set_stencil_test_enable.stencil_test_enable = stencilTestEnable;2160cmd_buf_queue(cmd_buffer, cmd);2161}21622163VKAPI_ATTR void VKAPI_CALL lvp_CmdSetStencilOpEXT(2164VkCommandBuffer commandBuffer,2165VkStencilFaceFlags faceMask,2166VkStencilOp failOp,2167VkStencilOp passOp,2168VkStencilOp depthFailOp,2169VkCompareOp compareOp)2170{2171LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2172struct lvp_cmd_buffer_entry *cmd;21732174cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_STENCIL_OP);2175if (!cmd)2176return;21772178cmd->u.set_stencil_op.face_mask = faceMask;2179cmd->u.set_stencil_op.fail_op = failOp;2180cmd->u.set_stencil_op.pass_op = passOp;2181cmd->u.set_stencil_op.depth_fail_op = depthFailOp;2182cmd->u.set_stencil_op.compare_op = compareOp;2183cmd_buf_queue(cmd_buffer, cmd);2184}21852186VKAPI_ATTR void VKAPI_CALL lvp_CmdSetDepthBiasEnableEXT(2187VkCommandBuffer commandBuffer,2188VkBool32 depthBiasEnable)2189{2190LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2191struct lvp_cmd_buffer_entry *cmd;21922193cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_DEPTH_BIAS_ENABLE);2194if (!cmd)2195return;21962197cmd->u.set_depth_bias_enable.enable = depthBiasEnable == VK_TRUE;2198cmd_buf_queue(cmd_buffer, cmd);2199}22002201VKAPI_ATTR void VKAPI_CALL lvp_CmdSetLogicOpEXT(2202VkCommandBuffer commandBuffer,2203VkLogicOp logicOp)2204{2205LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2206struct lvp_cmd_buffer_entry *cmd;22072208cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_LOGIC_OP);2209if (!cmd)2210return;22112212cmd->u.set_logic_op.op = logicOp;2213cmd_buf_queue(cmd_buffer, cmd);2214}22152216VKAPI_ATTR void VKAPI_CALL lvp_CmdSetPatchControlPointsEXT(2217VkCommandBuffer commandBuffer,2218uint32_t patchControlPoints)2219{2220LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2221struct lvp_cmd_buffer_entry *cmd;22222223cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_PATCH_CONTROL_POINTS);2224if (!cmd)2225return;22262227cmd->u.set_patch_control_points.vertices_per_patch = patchControlPoints;2228cmd_buf_queue(cmd_buffer, cmd);2229}22302231VKAPI_ATTR void VKAPI_CALL lvp_CmdSetPrimitiveRestartEnableEXT(2232VkCommandBuffer commandBuffer,2233VkBool32 primitiveRestartEnable)2234{2235LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2236struct lvp_cmd_buffer_entry *cmd;22372238cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_PRIMITIVE_RESTART_ENABLE);2239if (!cmd)2240return;22412242cmd->u.set_primitive_restart_enable.enable = primitiveRestartEnable == VK_TRUE;2243cmd_buf_queue(cmd_buffer, cmd);2244}22452246VKAPI_ATTR void VKAPI_CALL lvp_CmdSetRasterizerDiscardEnableEXT(2247VkCommandBuffer commandBuffer,2248VkBool32 rasterizerDiscardEnable)2249{2250LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);2251struct lvp_cmd_buffer_entry *cmd;22522253cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_SET_RASTERIZER_DISCARD_ENABLE);2254if (!cmd)2255return;22562257cmd->u.set_rasterizer_discard_enable.enable = rasterizerDiscardEnable == VK_TRUE;2258cmd_buf_queue(cmd_buffer, cmd);2259}226022612262