void vkeGameRendererDynamic::generateDrawCommands(){ //Start generating draw commands. VulkanDC *dc = VulkanDC::Get(); VulkanDC::Device *device = dc->getDefaultDevice(); VkClearValue clearValues[3]; colorClearValues(&clearValues[0], 1.0, 1.0, 1.0); depthStencilClearValues(&clearValues[1]);//default# colorClearValues(&clearValues[2], 0.0, 0.0, 0.0); /* Dispatch threads to create the secondary command buffers. */ m_calls_generated = 0; for (uint32_t i = 0; i < m_max_draw_calls; ++i){ m_draw_calls[i]->initDrawCommands(m_node_data->count(), m_current_buffer_index); } /* Begin setting up the primary command buffer. */ VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; VKA_CHECK_ERROR(vkResetCommandBuffer(m_primary_commands[m_current_buffer_index], 0),"Could not reset primary command buffer"); VKA_CHECK_ERROR(vkBeginCommandBuffer(m_primary_commands[m_current_buffer_index], &cmdBeginInfo), "Could not begin primary command buffer.\n"); uint32_t cnt = m_node_data->count(); VkDeviceSize sz = (sizeof(VkeNodeUniform) * cnt) + (m_instance_count * 64); vkCmdUpdateBuffer(m_primary_commands[m_current_buffer_index], m_uniforms_buffer, 0, sz, (const uint32_t *)m_uniforms_local); m_camera->updateCameraCmd(m_primary_commands[m_current_buffer_index]); renderPassBegin(&m_primary_commands[m_current_buffer_index], m_render_pass, m_framebuffers[m_current_buffer_index], 0, 0, m_width, m_height, clearValues, 3, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); VkViewport vp; VkRect2D sc; vp.x = 0; vp.y = 0; vp.height = (float)(m_height); vp.width = (float)(m_width); vp.minDepth = 0.0f; vp.maxDepth = 1.0f; sc.offset.x = 0; sc.offset.y = 0; sc.extent.width = vp.width; sc.extent.height = vp.height; vkCmdSetViewport(m_primary_commands[m_current_buffer_index], 0, 1, &vp); vkCmdSetScissor(m_primary_commands[m_current_buffer_index], 0, 1, &sc); /* Wait here until the secondary commands are ready. */ VkCommandBuffer secondaryCommands[11]; secondaryCommands[0] = m_terrain_command[m_current_buffer_index]; for (uint32_t i = 0; i < m_max_draw_calls; ++i){ secondaryCommands[i+1] = m_draw_calls[i]->getDrawCommand(m_current_buffer_index); } vkCmdExecuteCommands(m_primary_commands[m_current_buffer_index], 1+m_max_draw_calls, secondaryCommands); vkCmdEndRenderPass(m_primary_commands[m_current_buffer_index]); VkImageResolve blitInfo; blitInfo.srcOffset.x = 0; blitInfo.srcOffset.y = 0; blitInfo.srcOffset.z = 0; blitInfo.dstOffset.x = 0; blitInfo.dstOffset.y = 0; blitInfo.dstOffset.z = 0; blitInfo.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blitInfo.srcSubresource.mipLevel = 0; blitInfo.srcSubresource.baseArrayLayer = 0; blitInfo.srcSubresource.layerCount = 1; blitInfo.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blitInfo.dstSubresource.mipLevel = 0; blitInfo.dstSubresource.baseArrayLayer = 0; blitInfo.dstSubresource.layerCount = 1; blitInfo.extent.width = m_width; blitInfo.extent.height = m_height; blitInfo.extent.depth = 1; vkCmdResolveImage( m_primary_commands[m_current_buffer_index], m_color_attachment.image, VK_IMAGE_LAYOUT_GENERAL, m_resolve_attachment[m_current_buffer_index].image, VK_IMAGE_LAYOUT_GENERAL, 1, &blitInfo); VKA_CHECK_ERROR(vkEndCommandBuffer(m_primary_commands[m_current_buffer_index]), "Could not end command buffer for draw command.\n"); }
void vkeGameRendererDynamic::generateDrawCommands(){ //Start generating draw commands. VulkanDC *dc = VulkanDC::Get(); VulkanDC::Device *device = dc->getDefaultDevice(); VkClearValue clearValues[3]; /* Dispatch threads to create the secondary command buffers. */ m_calls_generated = 0; for (uint32_t i = 0; i < m_max_draw_calls; ++i){ m_draw_calls[i]->initDrawCommands(m_node_data->count(), m_current_buffer_index); } /* Begin setting up the primary command buffer. */ VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; vkResetCommandBuffer(m_primary_commands[m_current_buffer_index], 0); vkResetCommandBuffer(m_update_commands[m_current_buffer_index], 0); VKA_CHECK_ERROR(vkBeginCommandBuffer(m_update_commands[m_current_buffer_index], &cmdBeginInfo), "Could not begin primary command buffer.\n"); VkBufferMemoryBarrier bufBarrier = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER }; bufBarrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT; bufBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; bufBarrier.dstQueueFamilyIndex = 0; bufBarrier.offset = 0; bufBarrier.buffer = m_uniforms_buffer; bufBarrier.srcQueueFamilyIndex = 0; colorClearValues(&clearValues[0], 1.0, 1.0, 1.0); depthStencilClearValues(&clearValues[1]);//default# colorClearValues(&clearValues[2], 0.0, 0.0, 0.0); uint32_t sz = (sizeof(VkeNodeUniform) * 100) + (64 * 64); VkBufferCopy bufCopy; bufCopy.dstOffset = 0; bufCopy.srcOffset = 0; bufCopy.size = sz; vkCmdCopyBuffer(m_update_commands[m_current_buffer_index], m_uniforms_buffer_staging, m_uniforms_buffer, 1, &bufCopy); vkCmdPipelineBarrier( m_update_commands[m_current_buffer_index], VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, NULL, 1, &bufBarrier, 0, NULL); VKA_CHECK_ERROR(vkEndCommandBuffer(m_update_commands[m_current_buffer_index]), "Could not end command buffer for draw command.\n"); VKA_CHECK_ERROR(vkBeginCommandBuffer(m_primary_commands[m_current_buffer_index], &cmdBeginInfo), "Could not begin primary command buffer.\n"); renderPassBegin(&m_primary_commands[m_current_buffer_index], m_render_pass, m_framebuffers[m_current_buffer_index], 0, 0, m_width, m_height, clearValues, 3, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); VkViewport vp; VkRect2D sc; vp.x = 0; vp.y = 0; vp.height = (float)(m_height); vp.width = (float)(m_width); vp.minDepth = 0.0f; vp.maxDepth = 1.0f; sc.offset.x = 0; sc.offset.y = 0; sc.extent.width = vp.width; sc.extent.height = vp.height; vkCmdSetViewport(m_primary_commands[m_current_buffer_index], 0, 1, &vp); vkCmdSetScissor(m_primary_commands[m_current_buffer_index], 0, 1, &sc); /* Wait here until the secondary commands are ready. */ VkCommandBuffer secondaryCommands[11]; secondaryCommands[0] = m_terrain_command[m_current_buffer_index]; for (uint32_t i = 0; i < m_max_draw_calls; ++i){ secondaryCommands[i + 1] = m_draw_calls[i]->getDrawCommand(m_current_buffer_index); } vkCmdExecuteCommands(m_primary_commands[m_current_buffer_index], 1 + m_max_draw_calls, secondaryCommands); vkCmdEndRenderPass(m_primary_commands[m_current_buffer_index]); VkImageResolve blitInfo; blitInfo.srcOffset.x = 0; blitInfo.srcOffset.y = 0; blitInfo.srcOffset.z = 0; blitInfo.dstOffset.x = 0; blitInfo.dstOffset.y = 0; blitInfo.dstOffset.z = 0; blitInfo.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blitInfo.srcSubresource.mipLevel = 0; blitInfo.srcSubresource.baseArrayLayer = 0; blitInfo.srcSubresource.layerCount = 1; blitInfo.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blitInfo.dstSubresource.mipLevel = 0; blitInfo.dstSubresource.baseArrayLayer = 0; blitInfo.dstSubresource.layerCount = 1; blitInfo.extent.width = m_width; blitInfo.extent.height = m_height; blitInfo.extent.depth = 1; vkCmdResolveImage( m_primary_commands[m_current_buffer_index], m_color_attachment.image, VK_IMAGE_LAYOUT_GENERAL, m_resolve_attachment[m_current_buffer_index].image, VK_IMAGE_LAYOUT_GENERAL, 1, &blitInfo); VKA_CHECK_ERROR(vkEndCommandBuffer(m_primary_commands[m_current_buffer_index]), "Could not end command buffer for draw command.\n"); }