From 9d97500df375665ce6757c1341373cdd34fd9235 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Sun, 11 Feb 2018 22:42:41 +0200 Subject: [PATCH] clear color works --- src/vulkan/image.cc | 11 +- src/vulkan/vk.cc | 574 ++++++++++++++++++++++++++++++-------------------- src/vulkan/vkutil.cc | 298 ++++---------------------- src/vulkan/vkutil.h | 20 +- 4 files changed, 402 insertions(+), 501 deletions(-) diff --git a/src/vulkan/image.cc b/src/vulkan/image.cc index 780bfa0..708c18d 100644 --- a/src/vulkan/image.cc +++ b/src/vulkan/image.cc @@ -7,7 +7,7 @@ #include "vkutil.h" bool vk_image_set_layout(VkCommandBuffer cmd_buf, VkImage img, VkImageAspectFlags aspect_flags, - VkImageLayout old_layout, VkImageLayout new_layout, VkAccessFlagBits access_mask) + VkImageLayout old_layout, VkImageLayout new_layout, VkAccessFlagBits access_mask) { VkImageMemoryBarrier imb; memset(&imb, 0, sizeof imb); @@ -20,11 +20,14 @@ bool vk_image_set_layout(VkCommandBuffer cmd_buf, VkImage img, VkImageAspectFlag if(new_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { imb.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - } else if (new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { + } + else if(new_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - } else if (new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + } + else if(new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { imb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - } else if (new_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { + } + else if(new_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; } diff --git a/src/vulkan/vk.cc b/src/vulkan/vk.cc index f5829ab..9297e63 100644 --- a/src/vulkan/vk.cc +++ b/src/vulkan/vk.cc @@ -21,20 +21,28 @@ extern GLFWwindow *win; extern int win_w; extern int win_h; -static VkCommandBuffer cmd_buf; // command buffer used at zbuffer creation +//command buffers +static VkCommandBuffer init_buf; +static VkCommandBuffer rbufs[2]; //depth buffer static VkImage dimg; static VkImageView dview; +static const VkFormat dformat = VK_FORMAT_D32_SFLOAT_S8_UINT; //swapchain static VkImage *images; static VkImageView *iviews; static uint32_t num_images; +//renderpass +static VkRenderPass rpass; +static VkFramebuffer fbs[2]; +//semaphores-drawing-presentation +static uint32_t curr_img; // current sc image +static VkSemaphore psema; + /* static variables */ static VkDeviceMemory gpu_mem; // to be replaced when I fix the allocator -// zbuffer image, view: - -VkCommandBuffer *swapchain_cmd_bufs; +static Vec4 clear_color(1, 0.1, 0.1, 1.0); /* static functions */ static void error_callback(int error, const char *descr); @@ -47,13 +55,15 @@ static void swapbuffers(); static void begin_drawing(); static void end_drawing(); -static bool create_swapchain(); -static bool begin_command_buffer(); -static bool create_swapchain_image_views(VkFormat format); +static bool create_swapchain(VkSwapchainKHR *sc); +static bool begin_init_command_buffer(VkCommandBuffer *cb); static bool create_zbuffer(); - -static bool create_swapchain_cmd_bufs(VkCommandPool vk_pool); -static bool record_cmd_clear(float r, float g, float b); +static bool create_renderpass(); +static bool create_framebuffers(VkFramebuffer *fb, VkImageView *views); +static bool end_init_command_buffer(VkCommandBuffer *cb); +static bool allocate_rendering_command_buffers(VkCommandBuffer *bufs); +static void free_rendering_command_buffers(VkCommandBuffer *bufs, int count); +static bool begin_rendering_command_buffers(VkCommandBuffer *bufs, int count); bool init_vulkan() { @@ -93,13 +103,13 @@ bool init_vulkan() return false; } - if(!create_swapchain()) { + if(!create_swapchain(&vk_swapchain)) { fprintf(stderr, "Failed to create swapchain.\n"); return false; } - cmd_buf = VK_NULL_HANDLE; - if(!begin_command_buffer()) { + init_buf = VK_NULL_HANDLE; + if(!begin_init_command_buffer(&init_buf)) { fprintf(stderr, "Failed to start VK_NULL_HANDLE command buffer.\n"); return false; } @@ -109,51 +119,45 @@ bool init_vulkan() return false; } - gfx_clear = clear; - gfx_viewport = viewport; - gfx_zbuffer = zbuffer; - gfx_cull_face = cull_face; - gfx_reshape = reshape; - gfx_swapbuffers = swapbuffers; - gfx_begin_drawing = begin_drawing; - gfx_end_drawing = end_drawing; - - -/* - if(!vku_create_semaphores()) + if(!create_renderpass()) { + fprintf(stderr, "Failed to create the renderpass.\n"); return false; + } - if(!(vk_swapchain = vku_create_swapchain(vk_surface, win_w, win_h, 2, - VK_PRESENT_MODE_IMMEDIATE_KHR, 0))) { - fprintf(stderr, "Failed to create swapchain.\n"); + if(!create_framebuffers(fbs, iviews)) { + fprintf(stderr, "Failed to create the framebuffer.\n"); return false; } - vkswapchain_images = vku_get_swapchain_images(vk_swapchain, &vknum_swapchain_images); - if(!vkswapchain_images) { - fprintf(stderr, "Failed to get swapchain images.\n"); + if(!end_init_command_buffer(&init_buf)) { + fprintf(stderr, "Failed to end the command buffer.\n"); return false; } -// vkswapchain_views = vku_create_image_views(vkswapchain_images, vknum_swapchain_images); -// if(!vkswapchain_views) { -// fprintf(stderr, "Failed to create swapchain image views.\n"); -// delete [] vkswapchain_images; -// return false; -// } - - if(!create_swapchain_cmd_bufs(vk_pool)) { + /* rendering command buffers */ + if(!allocate_rendering_command_buffers(rbufs)) { + fprintf(stderr, "Failed to allocate rendering command buffers.\n"); return false; } - if(!record_cmd_clear(1.0, 0.1, 0.1)) + if(!begin_rendering_command_buffers(rbufs, 2)) { + fprintf(stderr, "Failed to begin rendering command buffers.\n"); return false; - */ + } + + gfx_clear = clear; + gfx_viewport = viewport; + gfx_zbuffer = zbuffer; + gfx_cull_face = cull_face; + gfx_reshape = reshape; + gfx_swapbuffers = swapbuffers; + gfx_begin_drawing = begin_drawing; + gfx_end_drawing = end_drawing; return true; } -static bool create_swapchain() +static bool create_swapchain(VkSwapchainKHR *sc) { /* surface capabilities */ VkSurfaceCapabilitiesKHR scap; @@ -188,8 +192,8 @@ static bool create_swapchain() break; } if((scmode != VK_PRESENT_MODE_MAILBOX_KHR) && (modes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR)) { - //fallback - scmode = VK_PRESENT_MODE_IMMEDIATE_KHR; + //fallback + scmode = VK_PRESENT_MODE_IMMEDIATE_KHR; } } @@ -214,36 +218,25 @@ static bool create_swapchain() printf("num_images : %u\n", num_images); assert(num_images > 0); + images = new VkImage[num_images]; + iviews = new VkImageView[num_images]; + /* transform flags */ VkSurfaceTransformFlagBitsKHR pre_transf = scap.currentTransform; if(scap.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) pre_transf = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; /* find suitable colorspace, format */ - uint32_t fcount; - if(vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical, vk_surface, &fcount, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to get format count for physical device.\n"); - return false; - } - if(fcount == 0) { - fprintf(stderr, "No color formats were found.\n"); - return false; - } - VkFormat format; VkColorSpaceKHR colorspace; - VkSurfaceFormatKHR *formats = new VkSurfaceFormatKHR[fcount]; - if(vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical, vk_surface, &fcount, formats) != VK_SUCCESS) { - fprintf(stderr, "Failed to get surface formats.\n"); + VkSurfaceFormatKHR sformat; + if(!vku_get_surface_format(vk_physical, vk_surface, &sformat)) { return false; } - if((fcount == 1) && (formats[0].format == VK_FORMAT_UNDEFINED)) { - format = VK_FORMAT_B8G8R8_UNORM; - } else { - format = formats[0].format; - } - colorspace = formats[0].colorSpace; + + format = sformat.format; + colorspace = sformat.colorSpace; /* creating the swapchain */ VkSwapchainCreateInfoKHR sinfo; @@ -264,39 +257,23 @@ static bool create_swapchain() sinfo.oldSwapchain = VK_NULL_HANDLE; //TODO sinfo.clipped = VK_TRUE; //TODO - if(vkCreateSwapchainKHR(vk_device, &sinfo, 0, &vk_swapchain) != VK_SUCCESS) { + if(vkCreateSwapchainKHR(vk_device, &sinfo, 0, sc) != VK_SUCCESS) { fprintf(stderr, "Failed to create swapchain.\n"); return false; } - if(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &num_images, 0) != VK_SUCCESS) { + if(vkGetSwapchainImagesKHR(vk_device, *sc, &num_images, 0) != VK_SUCCESS) { fprintf(stderr, "Failed to get the number of the swapchain images.\n"); return false; } - images = new VkImage[num_images]; - if(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &num_images, images) != VK_SUCCESS) { + if(vkGetSwapchainImagesKHR(vk_device, *sc, &num_images, images) != VK_SUCCESS) { fprintf(stderr, "Failed to get the swapchain images.\n"); return false; } - assert(images); - if(!create_swapchain_image_views(format)) { - fprintf(stderr, "Failed to create image views for the swapchain images.\n"); - return false; - } - - // create renderpass - - - return true; -} - -static bool create_swapchain_image_views(VkFormat format) -{ VkImageViewCreateInfo ivinf; memset(&ivinf, 0, sizeof ivinf); - ivinf.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; ivinf.format = format; ivinf.components = { @@ -310,21 +287,23 @@ static bool create_swapchain_image_views(VkFormat format) ivinf.subresourceRange.layerCount = 1; ivinf.viewType = VK_IMAGE_VIEW_TYPE_2D; - iviews = new VkImageView[num_images]; for(uint32_t i=0; iformat = VK_FORMAT_B8G8R8_UNORM; } - return iviews; + delete [] formats; + return true; } + int vku_get_next_image(VkSwapchainKHR sc) { uint32_t next; @@ -470,89 +426,6 @@ void vku_present(VkSwapchainKHR sc, int img_idx) vkQueuePresentKHR(vk_queue, &inf); } -bool vku_create_renderpass() -{ - VkAttachmentDescription attachments[2]; - memset(&attachments, 0, 2 * sizeof *attachments); - - /* color */ - attachments[0].format = VK_FORMAT_B8G8R8A8_UNORM; - attachments[0].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - /* depth */ - attachments[1].format = VK_FORMAT_D32_SFLOAT_S8_UINT; //TODO - attachments[1].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkAttachmentReference color_ref; - color_ref.attachment = 0; - color_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentReference depth_ref; - depth_ref.attachment = 1; - depth_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass_desc; - memset(&subpass_desc, 0, sizeof subpass_desc); - - subpass_desc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass_desc.colorAttachmentCount = 1; - subpass_desc.pColorAttachments = &color_ref; - subpass_desc.pDepthStencilAttachment = &depth_ref; - - VkRenderPassCreateInfo inf; - memset(&inf, 0, sizeof inf); - - inf.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - inf.attachmentCount = 2; - inf.pAttachments = attachments; - inf.subpassCount = 1; - inf.pSubpasses = &subpass_desc; - - if(vkCreateRenderPass(vk_device, &inf, 0, &vkrpass) != VK_SUCCESS) { - return false; - } - - return true; -} - -bool vku_create_framebuffers(VkImageView *image_views, int count, int w, int h) -{ - delete vkfbufs; - vkfbufs = new VkFramebuffer[count]; - - VkFramebufferCreateInfo inf; - memset(&inf, 0, sizeof inf); - - inf.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - inf.renderPass = vkrpass; - inf.attachmentCount = count; - inf.pAttachments = image_views; - inf.width = w; - inf.height = h; - inf.layers = 1; - - for(int i=0; i ds_enabled; -// ds_enabled.push_back(VK_DYNAMIC_STATE_VIEWPORT); - //ds_enabled.push_back(VK_DYNAMIC_STATE_SCISSOR); -// VkPipelineDynamicStateCreateInfo ds; -// ds.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; -// ds.pDynamicStates = ds_enabled.data(); -// ds.dynamicStateCount = static_cast(ds_enabled.size()); - - /* depth tests */ - VkPipelineDepthStencilStateCreateInfo dsi; - memset(&dsi, 0, sizeof dsi); - dsi.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - dsi.depthTestEnable = VK_TRUE; - dsi.depthWriteEnable = VK_TRUE; - dsi.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL; - dsi.back.failOp = VK_STENCIL_OP_KEEP; - dsi.back.passOp = VK_STENCIL_OP_KEEP; - dsi.back.compareOp = VK_COMPARE_OP_ALWAYS; - dsi.front = dsi.back; - - /* multisampling - must be set even if not used */ - VkPipelineMultisampleStateCreateInfo msi; - memset(&msi, 0, sizeof msi); - msi.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - msi.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - - /* vertex input descriptions */ - VkVertexInputBindingDescription vib; - memset(&vib, 0, sizeof vib); - vib.stride = sizeof(Vec3); - vib.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - - /* input attr bindings */ - VkVertexInputAttributeDescription via[2]; - memset(&via, 0, sizeof via); - via[0].format = VK_FORMAT_R32G32B32A32_SFLOAT; - - return true; -} static const char *get_device_name_str(VkPhysicalDeviceType type) { diff --git a/src/vulkan/vkutil.h b/src/vulkan/vkutil.h index 396209f..71943bd 100644 --- a/src/vulkan/vkutil.h +++ b/src/vulkan/vkutil.h @@ -46,6 +46,7 @@ bool vku_create_semaphores(); /* command buffers */ VkCommandBuffer vku_alloc_cmdbuf(VkCommandPool pool, VkCommandBufferLevel level); +bool vku_alloc_cmdbufs(VkCommandPool pool, VkCommandBufferLevel level, unsigned int count, VkCommandBuffer *buf_array); void vku_free_cmdbuf(VkCommandPool pool, VkCommandBuffer buf); void vku_begin_cmdbuf(VkCommandBuffer buf, unsigned int flags); @@ -53,20 +54,12 @@ void vku_end_cmdbuf(VkCommandBuffer buf); void vku_reset_cmdbuf(VkCommandBuffer buf); void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkFence done_fence); -/* swapchain */ -VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n, - VkPresentModeKHR pmode, VkSwapchainKHR prev); -VkImage *vku_get_swapchain_images(VkSwapchainKHR sc, int *count); -VkImageView *vku_create_image_views(VkImage *images, int count); +bool vku_get_surface_format(VkPhysicalDevice gpu, VkSurfaceKHR surface, VkSurfaceFormatKHR *sformat); +VkColorSpaceKHR vku_get_surface_colorspace(VkPhysicalDevice gpu, VkSurfaceKHR surface); + int vku_get_next_image(VkSwapchainKHR sc); void vku_present(VkSwapchainKHR sc, int img_idx); -/* rederpass */ -bool vku_create_renderpass(); - -/* framebuffer */ -bool vku_create_framebuffers(VkImageView *image_views, int count, int w, int h); - /* buffers */ vku_buffer *vku_create_buffer(int sz, unsigned int usage); void vku_destroy_buffer(vku_buffer *buf); @@ -76,10 +69,5 @@ void vku_cmd_copybuf(VkCommandBuffer cmdbuf, VkBuffer dest, int doffs, /* other */ const char *vku_get_vulkan_error_str(VkResult error); -/* pipeline */ -bool vku_create_graphics_pipeline(VkPipelineLayout *layout); - -/* descriptor set */ -//bool vku_create_descriptor_set() #endif // VKUTIL_H_ -- 1.7.10.4