Advertisement
pusheax

Untitled

Mar 4th, 2018
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.45 KB | None | 0 0
  1. s32 vkcmd_create_secondary_command_buffer(
  2.     VkCommandBuffer *cmdBuf,
  3.     u32 drawStart, u32 drawCount, r32 *m, r32 *diffuseColorRGBA,
  4.     VkCommandPool commandPool,
  5.     VgPipelineDescr *pipelineDescr,
  6.     VkBuffer vertexBuffer,
  7.     VkBuffer normalBuffer,
  8.     VkBuffer uvBuffer,
  9.     VkBuffer indexBuffer,
  10.     VgVertShaderDescr vert,
  11.     VgFragShaderDescr frag,
  12.     u8 isForQuery,
  13.     VkQueryPool queryPool,
  14.     u32 queryId) {
  15.  
  16.     VkDevice device = vgmain_get_device();
  17.  
  18.     //VkBuffer vert_ubo_m = vkpipe_cache_get_vert_ubo_m();
  19.     //VkBuffer frag_ubo_diff = vkpipe_cache_get_frag_ubo_diff();
  20.  
  21.     VkCommandBufferAllocateInfo allocInfo = {};
  22.     allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
  23.     allocInfo.commandPool = commandPool;
  24.     allocInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
  25.     allocInfo.commandBufferCount = 1;
  26.  
  27.     if(vkAllocateCommandBuffers(device, &allocInfo, cmdBuf) != VK_SUCCESS) {
  28.         printf("Failed to allocate secondary command buffer!\n");
  29.         return -1;
  30.     }
  31.  
  32.     VkCommandBufferInheritanceInfo inher = {};
  33.     inher.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
  34.     inher.framebuffer = 0;
  35.     inher.occlusionQueryEnable = VK_TRUE;
  36.     inher.pNext = 0;
  37.     inher.pipelineStatistics = 0;
  38.     inher.queryFlags = VK_QUERY_CONTROL_PRECISE_BIT;
  39.     inher.renderPass = vkpipe_cache_get_render_pass();
  40.     inher.subpass = 0;
  41.  
  42.     VkCommandBufferBeginInfo beginInfo = {};
  43.     beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
  44.     //Can be recorded into multiple primary command buffers (for double buffering)
  45.     beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
  46.     beginInfo.pInheritanceInfo = &inher;
  47.  
  48.     vkBeginCommandBuffer(*cmdBuf, &beginInfo);
  49.  
  50.     vkCmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineDescr->graphicsPipeline);
  51.     VkBuffer vertexBuffers[3] = {vertexBuffer, normalBuffer, uvBuffer};
  52.     VkDeviceSize offsets[3] = {0,0,0};
  53.     if(normalBuffer != VK_NULL_HANDLE && uvBuffer != VK_NULL_HANDLE) {
  54.         vkCmdBindVertexBuffers(*cmdBuf, 0, 3, vertexBuffers, offsets);
  55.     }
  56.     else {
  57.         vkCmdBindVertexBuffers(*cmdBuf, 0, 1, vertexBuffers, offsets);
  58.     }
  59.     vkCmdBindIndexBuffer(*cmdBuf, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
  60.     vkCmdBindDescriptorSets(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineDescr->pipelineLayout, 0, 1, &pipelineDescr->descriptorSet, 0, nullptr);
  61.  
  62.     if(vert == VERTBIND_VP_M || frag == FRAGBIND_M_LIGHT_DIFF || frag == FRAGBIND_M_LIGHT_TEX) {
  63.         r32 diffToSend[4];
  64.         memset(diffToSend, 0, sizeof(r32)*4);
  65.         if(diffuseColorRGBA) memcpy(diffToSend, diffuseColorRGBA, sizeof(r32)*4);
  66.  
  67.         u8 pushConstants[80];
  68.         memcpy(pushConstants, m, sizeof(r32)*16);
  69.         memcpy(pushConstants+64, diffToSend, sizeof(r32)*4);
  70.  
  71.         vkCmdPushConstants(*cmdBuf, pipelineDescr->pipelineLayout,
  72.                            VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
  73.                            0, 80, pushConstants);
  74.     }
  75.  
  76.     if(isForQuery) vkCmdBeginQuery(*cmdBuf, queryPool, queryId, VK_QUERY_TYPE_OCCLUSION);
  77.     vkCmdDrawIndexed(*cmdBuf, drawCount, 1, drawStart, 0, 0);
  78.     if(isForQuery) vkCmdEndQuery(*cmdBuf, queryPool, queryId);
  79.  
  80.     if(vkEndCommandBuffer(*cmdBuf) != VK_SUCCESS) {
  81.         printf("Failed to record secondary command buffer!\n");
  82.         return -2;
  83.     }
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement