Updated main program to create and register vertex structure with graphics pipeline
This commit is contained in:
@@ -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 <glm/glm.hpp>
|
||||
|
||||
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<Vertex> 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<const char*>({
|
||||
"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,
|
||||
@@ -192,3 +217,30 @@ void framebuffer_resized(GLFWwindow* window, int width, int height)
|
||||
return;
|
||||
swapchain->framebuffers_created = false;
|
||||
}
|
||||
|
||||
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<VkVertexInputAttributeDescription>(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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user