buffer allocation
[demo] / src / vulkan / vk.cc
index ce55be2..4a23211 100644 (file)
@@ -59,6 +59,7 @@ static bool create_swapchain(VkSwapchainKHR *sc);
 static bool create_zbuffer();
 static bool create_renderpass();
 static bool create_framebuffers();
+static bool create_pipelines();
 static bool begin_init_command_buffer(VkCommandBuffer *cb);
 static bool end_init_command_buffer(VkCommandBuffer *cb);
 static bool allocate_rendering_command_buffers(VkCommandBuffer *bufs);
@@ -129,6 +130,11 @@ bool init_vulkan()
                return false;
        }
 
+       if(!create_pipelines()) {
+               fprintf(stderr, "Failed to create the pipelines.\n");
+               return false;
+       }
+
        if(!end_init_command_buffer(&init_buf)) {
                fprintf(stderr, "Failed to end the command buffer.\n");
                return false;
@@ -348,12 +354,13 @@ static bool create_zbuffer()
        VkMemoryRequirements dmem_reqs;
        vkGetImageMemoryRequirements(vk_device, dimg, &dmem_reqs);
 
-       gpu_mem = vk_allocate(dmem_reqs.size);
-
-       if(!gpu_mem)
+       DevMemBlock block;
+       if(!vku_allocate(dmem_reqs.size, &block)) {
+               fprintf(stderr, "Failed to allocate zbuffer image.\n");
                return false;
+       }
 
-       vkBindImageMemory(vk_device, dimg, gpu_mem, 0);
+       vkBindImageMemory(vk_device, dimg, block.dev_mem, 0);
 
        if(!vk_image_set_layout(init_buf, dimg, VK_IMAGE_ASPECT_DEPTH_BIT,
                                VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
@@ -468,6 +475,57 @@ static bool create_framebuffers()
        return true;
 }
 
+static bool create_pipelines()
+{
+       VkDescriptorSetLayoutBinding dslb[1];
+       memset(&dslb[0], 0, sizeof dslb[0]);
+       dslb[0].binding = 0;
+       dslb[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+       dslb[0].descriptorCount = 1;
+       dslb[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
+
+       VkDescriptorSetLayoutCreateInfo dslinf;
+       memset(&dslinf, 0, sizeof dslinf);
+       dslinf.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+       dslinf.bindingCount = 1; //dslb.size();
+       dslinf.pBindings = dslb;
+
+       VkDescriptorSetLayout dsl;
+       if(vkCreateDescriptorSetLayout(vk_device, &dslinf, 0, &dsl) != VK_SUCCESS) {
+               fprintf(stderr, "Failed to create descriptor set layout.\n");
+               return false;
+       }
+
+       VkPipelineLayoutCreateInfo pinf;
+       memset(&pinf, 0, sizeof pinf);
+       pinf.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+       pinf.setLayoutCount = 1;
+       pinf.pSetLayouts = &dsl;
+
+       VkPipelineLayout pl;
+       if(vkCreatePipelineLayout(vk_device, &pinf, 0, &pl) != VK_SUCCESS) {
+               fprintf(stderr, "Failed to create pipeline layout.\n");
+               return false;
+       }
+
+       VkPipelineCacheCreateInfo pcinf;
+       memset(&pcinf, 0, sizeof pcinf);
+       pcinf.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
+
+       VkPipelineCache pcache;
+       if(vkCreatePipelineCache(vk_device, &pcinf, 0, &pcache) != VK_SUCCESS) {
+               fprintf(stderr, "Failed to create pipeline cache.\n");
+               return false;
+       }
+
+       VkGraphicsPipelineCreateInfo ginf;
+       memset(&ginf, 0, sizeof ginf);
+       ginf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+       ginf.stageCount = 2;
+
+       return true;
+}
+
 static bool end_init_command_buffer(VkCommandBuffer *cb)
 {
        if(vkEndCommandBuffer(*cb) != VK_SUCCESS) {
@@ -599,7 +657,6 @@ static bool begin_rendering_command_buffers(VkCommandBuffer *bufs, int count)
 
 void cleanup_vulkan()
 {
-       //TODO!!!
        free_rendering_command_buffers(rbufs, 2);
        if(win) {
                glfwDestroyWindow(win);
@@ -618,17 +675,6 @@ static void error_callback(int error, const char *description)
 
 static void reshape(int width, int height)
 {
-//     VkSwapchainKHR sc;
-//     if(!(sc = vku_create_swapchain(vk_surface, width, height, 2, VK_PRESENT_MODE_FIFO_KHR,
-//                                    vk_swapchain))) {
-//             fprintf(stderr, "Failed to create %dx%d double-buffered swapchain\n", width, height);
-//             return;
-//     }
-//     vk_swapchain = sc;
-//
-//     delete [] vkswapchain_images;
-//     vkswapchain_images = vku_get_swapchain_images(sc, 0);
-//     vk_curr_swapchain_image = vku_get_next_image(vk_swapchain);
 }
 
 static void clear(float r, float g, float b)