From 6cd89f37ac6e16d881e19fcef56f74f650dea657 Mon Sep 17 00:00:00 2001 From: Artem Kharytoniuk Date: Tue, 28 Mar 2017 16:50:16 +0300 Subject: [PATCH] Working on UI drawing. --- src/engine/renderer/tr_backend.c | 11 +-- src/engine/renderer/tr_shade.c | 6 ++ src/engine/renderer/vk_demo.cpp | 161 ++++++++++++++++++++++--------- src/engine/renderer/vk_demo.h | 11 ++- 4 files changed, 139 insertions(+), 50 deletions(-) diff --git a/src/engine/renderer/tr_backend.c b/src/engine/renderer/tr_backend.c index 8f4b4d2..80c3a1f 100644 --- a/src/engine/renderer/tr_backend.c +++ b/src/engine/renderer/tr_backend.c @@ -619,9 +619,6 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { // add light flares on lights that aren't obscured RB_RenderFlares(); - - // VULKAN - vulkan_demo->render_view(); } @@ -936,6 +933,7 @@ const void *RB_DrawBuffer( const void *data ) { result = vkBeginCommandBuffer(vulkan_demo->command_buffer, &begin_info); check_vk_result(result, "vkBeginCommandBuffer"); + vulkan_demo->begin_frame(); return (const void *)(cmd + 1); } @@ -1053,14 +1051,15 @@ const void *RB_SwapBuffers( const void *data ) { // VULKAN extern FILE* logfile; - fprintf(logfile, "present\n"); - fflush(logfile); + vulkan_demo->end_frame(); VkResult result = vkEndCommandBuffer(vulkan_demo->command_buffer); check_vk_result(result, "vkEndCommandBuffer"); - VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + fprintf(logfile, "present\n"); + fflush(logfile); + VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo submit_info; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.pNext = nullptr; diff --git a/src/engine/renderer/tr_shade.c b/src/engine/renderer/tr_shade.c index f4e9f86..8d34070 100644 --- a/src/engine/renderer/tr_shade.c +++ b/src/engine/renderer/tr_shade.c @@ -23,6 +23,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "tr_local.h" +// VULKAN +#include "vk_demo.h" + /* THIS ENTIRE FILE IS BACK END @@ -1186,6 +1189,9 @@ void RB_EndSurface( void ) { // tess.currentStageIteratorFunc(); + // VULKAN + vulkan_demo->render_tess(); + // // draw debugging stuff // diff --git a/src/engine/renderer/vk_demo.cpp b/src/engine/renderer/vk_demo.cpp index 484cd9b..cfe73d3 100644 --- a/src/engine/renderer/vk_demo.cpp +++ b/src/engine/renderer/vk_demo.cpp @@ -514,7 +514,7 @@ void Vulkan_Demo::create_pipeline() { depth_stencil_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; depth_stencil_state.pNext = nullptr; depth_stencil_state.flags = 0; - depth_stencil_state.depthTestEnable = VK_TRUE; + depth_stencil_state.depthTestEnable = VK_FALSE /*VK_TRUE*/; depth_stencil_state.depthWriteEnable = VK_TRUE; depth_stencil_state.depthCompareOp = VK_COMPARE_OP_LESS; depth_stencil_state.depthBoundsTestEnable = VK_FALSE; @@ -607,53 +607,49 @@ void Vulkan_Demo::upload_geometry() { vkCmdCopyBuffer(command_buffer, staging_buffer, index_buffer, 1, ®ion); }); } + + { + VkBufferCreateInfo desc; + desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + desc.pNext = nullptr; + desc.flags = 0; + desc.size = 16 * 1024 * 1024; + desc.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + desc.queueFamilyIndexCount = 0; + desc.pQueueFamilyIndices = nullptr; + + tess_vertex_buffer = get_resource_manager()->create_buffer(desc); + tess_vertex_buffer_memory = get_allocator()->allocate_staging_memory(tess_vertex_buffer); + VkResult result = vkBindBufferMemory(get_device(), tess_vertex_buffer, tess_vertex_buffer_memory, 0); + check_vk_result(result, "vkBindBufferMemory"); + } + + { + VkBufferCreateInfo desc; + desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + desc.pNext = nullptr; + desc.flags = 0; + desc.size = 16 * 1024 * 1024; + desc.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; + desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + desc.queueFamilyIndexCount = 0; + desc.pQueueFamilyIndices = nullptr; + + tess_index_buffer = get_resource_manager()->create_buffer(desc); + tess_index_buffer_memory = get_allocator()->allocate_staging_memory(tess_index_buffer); + VkResult result = vkBindBufferMemory(get_device(), tess_index_buffer, tess_index_buffer_memory, 0); + check_vk_result(result, "vkBindBufferMemory"); + } } void Vulkan_Demo::record_render_frame() { - VkBufferCopy region; - region.srcOffset = 0; - region.dstOffset = 0; - region.size = sizeof(Uniform_Buffer_Object); - vkCmdCopyBuffer(command_buffer, uniform_staging_buffer, uniform_buffer, 1, ®ion); - - VkBufferMemoryBarrier barrier; - barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - barrier.pNext = nullptr; - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.buffer = uniform_buffer; - barrier.offset = 0; - barrier.size = sizeof(Uniform_Buffer_Object); - - vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, - 0, nullptr, 1, &barrier, 0, nullptr); - - std::array clear_values; - clear_values[0].color = {0.3f, 0.2f, 0.1f, 0.0f}; - clear_values[1].depthStencil = {1.0, 0}; - - VkRenderPassBeginInfo render_pass_begin_info; - render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - render_pass_begin_info.pNext = nullptr; - render_pass_begin_info.renderPass = render_pass; - render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index]; - render_pass_begin_info.renderArea.offset = {0, 0}; - render_pass_begin_info.renderArea.extent = {(uint32_t)window_width, (uint32_t)window_height}; - render_pass_begin_info.clearValueCount = static_cast(clear_values.size()); - render_pass_begin_info.pClearValues = clear_values.data(); - - vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - const VkDeviceSize offset = 0; vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer, &offset); vkCmdBindIndexBuffer(command_buffer, index_buffer, 0, VK_INDEX_TYPE_UINT32); vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr); vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); vkCmdDrawIndexed(command_buffer, model_indices_count, 1, 0, 0, 0); - - vkCmdEndRenderPass(command_buffer); } void Vulkan_Demo::update_ubo_descriptor() { @@ -753,12 +749,91 @@ void Vulkan_Demo::update_uniform_buffer(bool cinematic) { vkUnmapMemory(get_device(), uniform_staging_buffer_memory); } -void Vulkan_Demo::render_view() { - fprintf(logfile, "render_view\n"); +void Vulkan_Demo::begin_frame() { + fprintf(logfile, "begin_frame\n"); + fflush(logfile); + //update_image_descriptor(false); + + VkBufferCopy region; + region.srcOffset = 0; + region.dstOffset = 0; + region.size = sizeof(Uniform_Buffer_Object); + vkCmdCopyBuffer(command_buffer, uniform_staging_buffer, uniform_buffer, 1, ®ion); + + VkBufferMemoryBarrier barrier; + barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; + barrier.pNext = nullptr; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.buffer = uniform_buffer; + barrier.offset = 0; + barrier.size = sizeof(Uniform_Buffer_Object); + + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, + 0, nullptr, 1, &barrier, 0, nullptr); + + std::array clear_values; + clear_values[0].color = {1.0f, 0.3f, 0.3f, 0.0f}; + clear_values[1].depthStencil = {1.0, 0}; + + VkRenderPassBeginInfo render_pass_begin_info; + render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + render_pass_begin_info.pNext = nullptr; + render_pass_begin_info.renderPass = render_pass; + render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index]; + render_pass_begin_info.renderArea.offset = {0, 0}; + render_pass_begin_info.renderArea.extent = {(uint32_t)window_width, (uint32_t)window_height}; + render_pass_begin_info.clearValueCount = static_cast(clear_values.size()); + render_pass_begin_info.pClearValues = clear_values.data(); + + vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + + tess_vertex_buffer_offset = 0; + tess_index_buffer_offset = 0; +} + +void Vulkan_Demo::end_frame() { + fprintf(logfile, "end_frame (vb_size %d, ib_size %d)\n", (int)tess_vertex_buffer_offset, (int)tess_index_buffer_offset); + fflush(logfile); + vkCmdEndRenderPass(command_buffer); +} + +void Vulkan_Demo::render_tess() { + fprintf(logfile, "render_tess (vert %d, inds %d)\n", tess.numVertexes, tess.numIndexes); fflush(logfile); - update_image_descriptor(false); - record_render_frame(); + void* data; + VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vertex), 0, &data); + check_vk_result(result, "vkMapMemory"); + Vertex* v = (Vertex*)data; + for (int i = 0; i < tess.numVertexes; i++, v++) { + v->pos.x = tess.xyz[i][0]; + v->pos.y = tess.xyz[i][1]; + v->pos.z = tess.xyz[i][2]; + v->tex_coord[0] = tess.texCoords[i][0][0]; + v->tex_coord[1] = tess.texCoords[i][0][1]; + } + vkUnmapMemory(get_device(), tess_vertex_buffer_memory); + + result = vkMapMemory(get_device(), tess_index_buffer_memory, tess_index_buffer_offset, tess.numIndexes * sizeof(uint32_t), 0, &data); + check_vk_result(result, "vkMapMemory"); + uint32_t* ind = (uint32_t*)data; + for (int i = 0; i < tess.numIndexes; i++, ind++) { + *ind = tess.indexes[i]; + } + vkUnmapMemory(get_device(), tess_index_buffer_memory); + + const VkDeviceSize offset = 0; + vkCmdBindVertexBuffers(command_buffer, 0, 1, &tess_vertex_buffer, &tess_vertex_buffer_offset); + vkCmdBindIndexBuffer(command_buffer, tess_index_buffer, tess_index_buffer_offset, VK_INDEX_TYPE_UINT32); + vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr); + vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + vkCmdDrawIndexed(command_buffer, tess.numIndexes, 1, 0, 0, 0); + tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex); + tess_index_buffer_offset += tess.numIndexes * sizeof(uint32_t); + update_uniform_buffer(false); } diff --git a/src/engine/renderer/vk_demo.h b/src/engine/renderer/vk_demo.h index a8fe29f..d9e248f 100644 --- a/src/engine/renderer/vk_demo.h +++ b/src/engine/renderer/vk_demo.h @@ -11,7 +11,9 @@ public: Vulkan_Demo(int window_width, int window_height, const SDL_SysWMinfo& window_sys_info); ~Vulkan_Demo(); - void render_view(); + void begin_frame(); + void end_frame(); + void render_tess(); void render_cinematic_frame(); public: @@ -66,6 +68,13 @@ public: VkBuffer index_buffer = VK_NULL_HANDLE; uint32_t model_indices_count = 0; + VkBuffer tess_vertex_buffer = VK_NULL_HANDLE; + VkDeviceMemory tess_vertex_buffer_memory = VK_NULL_HANDLE; + VkDeviceSize tess_vertex_buffer_offset = 0; + VkBuffer tess_index_buffer = VK_NULL_HANDLE; + VkDeviceMemory tess_index_buffer_memory = VK_NULL_HANDLE; + VkDeviceSize tess_index_buffer_offset = 0; + VkCommandBuffer command_buffer = VK_NULL_HANDLE; uint32_t swapchain_image_index = -1;