diff --git a/src/pc/gfx/gfx_vulkan.cpp b/src/pc/gfx/gfx_vulkan.cpp index 255330e..19364f2 100644 --- a/src/pc/gfx/gfx_vulkan.cpp +++ b/src/pc/gfx/gfx_vulkan.cpp @@ -40,6 +40,9 @@ static VkCommandBuffer current_cmd = VK_NULL_HANDLE; static VkPipeline pipeline = VK_NULL_HANDLE; static VkPipelineLayout pipeline_layout = VK_NULL_HANDLE; +static VkBuffer vertex_buffer = VK_NULL_HANDLE; +static VkDeviceMemory vertex_memory = VK_NULL_HANDLE; + VKAPI_ATTR VkBool32 VKAPI_CALL gfx_vulkan_debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, @@ -632,6 +635,35 @@ static void gfx_vulkan_create_framebuffers() { } } +static void gfx_vulkan_create_buffers() { + vkDeviceWaitIdle(device); + + // create buffer + VkBufferCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + create_info.size = 60000; + create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + vkCreateBuffer(device, &create_info, nullptr, &vertex_buffer); + + // allocate memory + VkMemoryRequirements memory_requirements; + vkGetBufferMemoryRequirements(device, vertex_buffer, &memory_requirements); + + VkMemoryAllocateInfo allocate_info = {}; + allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocate_info.allocationSize = memory_requirements.size; + allocate_info.memoryTypeIndex = + gfx_vulkan_find_memory_type(memory_requirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + vkAllocateMemory(device, &allocate_info, nullptr, &vertex_memory); + + vkBindBufferMemory(device, vertex_buffer, vertex_memory, 0); +} + static void gfx_vulkan_renderer_init(void) { gfx_vulkan_create_instance(); gfx_vulkan_create_device(); @@ -640,6 +672,7 @@ static void gfx_vulkan_renderer_init(void) { gfx_vulkan_create_sync(); gfx_vulkan_create_depth(); gfx_vulkan_create_framebuffers(); + gfx_vulkan_create_buffers(); } static void gfx_vulkan_renderer_on_resize(void) { @@ -731,6 +764,22 @@ static void gfx_vulkan_renderer_draw_triangles(float buf_vbo[], size_t buf_vbo_l // FIXME: uh no vkCmdBindPipeline(current_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + void* mapped_data = nullptr; + vkMapMemory(device, vertex_memory, 0, buf_vbo_len, 0, &mapped_data); + + memcpy(mapped_data, buf_vbo, buf_vbo_len); + + VkMappedMemoryRange range = {}; + range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range.memory = vertex_memory; + range.size = buf_vbo_len; + vkFlushMappedMemoryRanges(device, 1, &range); + + vkUnmapMemory(device, vertex_memory); + + VkDeviceSize offsets[] = {0}; + vkCmdBindVertexBuffers(current_cmd, 0, 1, &vertex_buffer, offsets); + vkCmdDraw(current_cmd, buf_vbo_num_tris, 1, 0, 0); }