diff --git a/tests/basic/src/main.cpp b/tests/basic/src/main.cpp index 59e43fd..c9d2cf8 100644 --- a/tests/basic/src/main.cpp +++ b/tests/basic/src/main.cpp @@ -1,10 +1,31 @@ +// TODO: Memory leak with application array, likely get_attribude_descriptions +// Don't know how though as they are deleted immediately after being used + #include "vulkan/basalt_command_buffer.h" #include "vulkan/basalt_swapchain.h" +#include + +struct Vertex +{ + glm::vec2 pos; + glm::vec3 colour; + + static VkVertexInputBindingDescription get_binding_description(void); + static VkResult get_attribute_descriptions(VkVertexInputAttributeDescription** out_attributes, u32* out_num_attributes); +}; + +static basalt::darray verts({ + {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, + {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, + {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} + }, MEMORY_TAG_CLASS_ARRAY | MEMORY_TAG_ZONE_APPLICATION | MEMORY_TAG_ALIGN_32); void framebuffer_resized(GLFWwindow* window, int width, int height); void application() { + VkResult err = VK_SUCCESS; + basalt::Context ctx("Basic", basalt::darray({ "VK_LAYER_KHRONOS_validation" @@ -66,6 +87,9 @@ void application() }) .build(); + VkVertexInputAttributeDescription* vertex_attribs = nullptr; + u32 num_vertex_attribs = 0; + VK_ASSERT(Vertex::get_attribute_descriptions(&vertex_attribs, &num_vertex_attribs), "Failed to get vertex input attribute description(s)\n\tAt %s:%d\n\tError %s\n\tVertex class %s\n", typeid(Vertex).name()); basalt::Pipeline pipeline = basalt::PipelineBuilder(dev, swapchain.swapchain_extent, VK_NULL_HANDLE) .add_dynamic_state(VK_DYNAMIC_STATE_SCISSOR) .add_dynamic_state(VK_DYNAMIC_STATE_VIEWPORT) @@ -82,7 +106,9 @@ void application() }) .add_shader("shaders/out/simple.vert.spv", VK_SHADER_STAGE_VERTEX_BIT) .add_shader("shaders/out/simple.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT) + .add_vertex_binding(Vertex::get_binding_description(), vertex_attribs, num_vertex_attribs) .build(); + basalt::mem::dealloc(vertex_attribs, sizeof(VkVertexInputAttributeDescription) * num_vertex_attribs, MEMORY_TAG_CLASS_ARRAY | MEMORY_TAG_ZONE_APPLICATION | MEMORY_TAG_ALIGN_ANY); swapchain.create_framebuffers(pass.render_pass); @@ -98,7 +124,6 @@ void application() BINFO("%s\n", mem_str); basalt::mem::dealloc(mem_str, mem_str_len, MEMORY_TAG_CLASS_STRING | MEMORY_TAG_ZONE_DEBUG | MEMORY_TAG_ALIGN_ANY); - VkResult err = VK_SUCCESS; VkRect2D render_area = { .offset = {0,0}, .extent = swapchain.swapchain_extent }; VkViewport viewport = { .x = (float)render_area.offset.x, @@ -191,4 +216,31 @@ void framebuffer_resized(GLFWwindow* window, int width, int height) if (swapchain == nullptr) return; swapchain->framebuffers_created = false; -} \ No newline at end of file +} + +VkVertexInputBindingDescription Vertex::get_binding_description(void) +{ + VkVertexInputBindingDescription ret{}; + ret.binding = 0; + ret.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + ret.stride = sizeof(Vertex); + return ret; +} + +VkResult Vertex::get_attribute_descriptions(VkVertexInputAttributeDescription** out_attributes, u32* out_num_attributes) +{ + *out_attributes = basalt::mem::allocT(2, MEMORY_TAG_CLASS_ARRAY | MEMORY_TAG_ZONE_APPLICATION | MEMORY_TAG_ALIGN_ANY); + if (out_attributes == nullptr) + return VK_ERROR_OUT_OF_HOST_MEMORY; + *out_num_attributes = 2; + VkVertexInputAttributeDescription* ptr = *out_attributes; + ptr[0].binding = 0; + ptr[0].location = 0; + ptr[0].format = VK_FORMAT_R32G32_SFLOAT; + ptr[0].offset = offsetof(Vertex, pos); + ptr[1].binding = 0; + ptr[1].location = 1; + ptr[1].format = VK_FORMAT_R32G32B32_SFLOAT; + ptr[1].offset = offsetof(Vertex, colour); + return VK_SUCCESS; +}