Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- s32 vkcmd_create_secondary_command_buffer(
- VkCommandBuffer *cmdBuf,
- u32 drawStart, u32 drawCount, r32 *m, r32 *diffuseColorRGBA,
- VkCommandPool commandPool,
- VgPipelineDescr *pipelineDescr,
- VkBuffer vertexBuffer,
- VkBuffer normalBuffer,
- VkBuffer uvBuffer,
- VkBuffer indexBuffer,
- VgVertShaderDescr vert,
- VgFragShaderDescr frag,
- u8 isForQuery,
- VkQueryPool queryPool,
- u32 queryId) {
- VkDevice device = vgmain_get_device();
- //VkBuffer vert_ubo_m = vkpipe_cache_get_vert_ubo_m();
- //VkBuffer frag_ubo_diff = vkpipe_cache_get_frag_ubo_diff();
- VkCommandBufferAllocateInfo allocInfo = {};
- allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
- allocInfo.commandPool = commandPool;
- allocInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
- allocInfo.commandBufferCount = 1;
- if(vkAllocateCommandBuffers(device, &allocInfo, cmdBuf) != VK_SUCCESS) {
- printf("Failed to allocate secondary command buffer!\n");
- return -1;
- }
- VkCommandBufferInheritanceInfo inher = {};
- inher.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
- inher.framebuffer = 0;
- inher.occlusionQueryEnable = VK_TRUE;
- inher.pNext = 0;
- inher.pipelineStatistics = 0;
- inher.queryFlags = VK_QUERY_CONTROL_PRECISE_BIT;
- inher.renderPass = vkpipe_cache_get_render_pass();
- inher.subpass = 0;
- VkCommandBufferBeginInfo beginInfo = {};
- beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- //Can be recorded into multiple primary command buffers (for double buffering)
- beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
- beginInfo.pInheritanceInfo = &inher;
- vkBeginCommandBuffer(*cmdBuf, &beginInfo);
- vkCmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineDescr->graphicsPipeline);
- VkBuffer vertexBuffers[3] = {vertexBuffer, normalBuffer, uvBuffer};
- VkDeviceSize offsets[3] = {0,0,0};
- if(normalBuffer != VK_NULL_HANDLE && uvBuffer != VK_NULL_HANDLE) {
- vkCmdBindVertexBuffers(*cmdBuf, 0, 3, vertexBuffers, offsets);
- }
- else {
- vkCmdBindVertexBuffers(*cmdBuf, 0, 1, vertexBuffers, offsets);
- }
- vkCmdBindIndexBuffer(*cmdBuf, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
- vkCmdBindDescriptorSets(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineDescr->pipelineLayout, 0, 1, &pipelineDescr->descriptorSet, 0, nullptr);
- if(vert == VERTBIND_VP_M || frag == FRAGBIND_M_LIGHT_DIFF || frag == FRAGBIND_M_LIGHT_TEX) {
- r32 diffToSend[4];
- memset(diffToSend, 0, sizeof(r32)*4);
- if(diffuseColorRGBA) memcpy(diffToSend, diffuseColorRGBA, sizeof(r32)*4);
- u8 pushConstants[80];
- memcpy(pushConstants, m, sizeof(r32)*16);
- memcpy(pushConstants+64, diffToSend, sizeof(r32)*4);
- vkCmdPushConstants(*cmdBuf, pipelineDescr->pipelineLayout,
- VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
- 0, 80, pushConstants);
- }
- if(isForQuery) vkCmdBeginQuery(*cmdBuf, queryPool, queryId, VK_QUERY_TYPE_OCCLUSION);
- vkCmdDrawIndexed(*cmdBuf, drawCount, 1, drawStart, 0, 0);
- if(isForQuery) vkCmdEndQuery(*cmdBuf, queryPool, queryId);
- if(vkEndCommandBuffer(*cmdBuf) != VK_SUCCESS) {
- printf("Failed to record secondary command buffer!\n");
- return -2;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement