summaryrefslogtreecommitdiff
path: root/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer')
-rw-r--r--src/renderer/backends/backend_vulkan.c103
-rw-r--r--src/renderer/ral_types.h3
-rw-r--r--src/renderer/render.c43
-rw-r--r--src/renderer/render.h21
-rw-r--r--src/renderer/render_types.h3
5 files changed, 159 insertions, 14 deletions
diff --git a/src/renderer/backends/backend_vulkan.c b/src/renderer/backends/backend_vulkan.c
index f83ef84..3a9c4e1 100644
--- a/src/renderer/backends/backend_vulkan.c
+++ b/src/renderer/backends/backend_vulkan.c
@@ -84,6 +84,7 @@ bool create_logical_device(gpu_device* out_device);
void create_swapchain_framebuffers();
void create_sync_objects();
void create_descriptor_pools();
+size_t vertex_attrib_size(vertex_attrib_type attr);
VkShaderModule create_shader_module(str8 spirv);
@@ -106,7 +107,7 @@ bool gpu_backend_init(const char* window_name, GLFWwindow* window) {
// Setup Vulkan instance
VkApplicationInfo app_info = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
- app_info.apiVersion = VK_API_VERSION_1_3;
+ app_info.apiVersion = VK_API_VERSION_1_2;
app_info.pApplicationName = window_name;
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.pEngineName = "Celeritas Engine";
@@ -351,6 +352,35 @@ static void recreate_swapchain(gpu_swapchain* swapchain) {
create_swapchain_framebuffers();
}
+VkFormat format_from_vertex_attr(vertex_attrib_type attr) {
+ switch (attr) {
+ case ATTR_F32:
+ return VK_FORMAT_R32_SFLOAT;
+ case ATTR_U32:
+ return VK_FORMAT_R32_UINT;
+ case ATTR_I32:
+ return VK_FORMAT_R32_SINT;
+ case ATTR_F32x2:
+ return VK_FORMAT_R32G32_SFLOAT;
+ case ATTR_U32x2:
+ return VK_FORMAT_R32G32_UINT;
+ case ATTR_I32x2:
+ return VK_FORMAT_R32G32_UINT;
+ case ATTR_F32x3:
+ return VK_FORMAT_R32G32B32_SFLOAT;
+ case ATTR_U32x3:
+ return VK_FORMAT_R32G32B32_UINT;
+ case ATTR_I32x3:
+ return VK_FORMAT_R32G32B32_SINT;
+ case ATTR_F32x4:
+ return VK_FORMAT_R32G32B32A32_SFLOAT;
+ case ATTR_U32x4:
+ return VK_FORMAT_R32G32B32A32_UINT;
+ case ATTR_I32x4:
+ return VK_FORMAT_R32G32B32A32_SINT;
+ }
+}
+
gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc description) {
// Allocate
gpu_pipeline_layout* layout = malloc(sizeof(gpu_pipeline_layout));
@@ -381,22 +411,35 @@ gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc descrip
frag_shader_stage_info };
// TODO: Attributes
- VkVertexInputAttributeDescription attribute_descs[2];
+ VkVertexInputAttributeDescription attribute_descs[2] = {0};
+ /* u32 offset = 0; */
+ /* for (u32 i = 0; i < description.vertex_desc.attributes_count; i++) { */
+ /* attribute_descs[i].binding = 0; */
+ /* attribute_descs[i].location = i; */
+ /* attribute_descs[i].format = format_from_vertex_attr(description.vertex_desc.attributes[i]); */
+ /* attribute_descs[i].offset = offset; */
+ /* size_t this_offset = vertex_attrib_size(description.vertex_desc.attributes[i]); */
+ /* printf("offset total %d this attr %ld\n", offset, this_offset); */
+ /* printf("sizeof vertex %ld\n", sizeof(vertex)); */
+ /* printf("%d \n", offsetof(vertex, static_3d)); */
+ /* offset += this_offset; */
+ /* } */
+ printf("Vertex attributes\n");
attribute_descs[0].binding = 0;
attribute_descs[0].location = 0;
- attribute_descs[0].format = VK_FORMAT_R32G32_SFLOAT;
- attribute_descs[0].offset = offsetof(custom_vertex, pos);
+ attribute_descs[0].format = VK_FORMAT_R32G32B32_SFLOAT;
+ attribute_descs[0].offset = 0; // offsetof(custom_vertex, pos);
attribute_descs[1].binding = 0;
attribute_descs[1].location = 1;
attribute_descs[1].format = VK_FORMAT_R32G32B32_SFLOAT;
- attribute_descs[1].offset = offsetof(custom_vertex, color);
+ attribute_descs[1].offset = 12; // offsetof(custom_vertex, color);
// Vertex input
// TODO: Generate this from descroiption now
VkVertexInputBindingDescription binding_desc;
binding_desc.binding = 0;
- binding_desc.stride = sizeof(custom_vertex);
+ binding_desc.stride = sizeof(vertex); // description.vertex_desc.stride;
binding_desc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
VkPipelineVertexInputStateCreateInfo vertex_input_info = {
@@ -404,7 +447,7 @@ gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc descrip
};
vertex_input_info.vertexBindingDescriptionCount = 1;
vertex_input_info.pVertexBindingDescriptions = &binding_desc;
- vertex_input_info.vertexAttributeDescriptionCount = 2;
+ vertex_input_info.vertexAttributeDescriptionCount = 2; // description.vertex_desc.attributes_count;
vertex_input_info.pVertexAttributeDescriptions = attribute_descs;
// Input Assembly
@@ -441,6 +484,7 @@ gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc descrip
rasterizer_create_info.lineWidth = 1.0f;
rasterizer_create_info.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizer_create_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
+ /* rasterizer_create_info.frontFace = VK_FRONT_FACE_CLOCKWISE; */
rasterizer_create_info.depthBiasEnable = VK_FALSE;
rasterizer_create_info.depthBiasConstantFactor = 0.0;
rasterizer_create_info.depthBiasClamp = 0.0;
@@ -584,6 +628,7 @@ gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc descrip
VK_CHECK(vkCreateDescriptorSetLayout(context.device->logical_device, &desc_set_layout_info,
context.allocator, &desc_set_layouts[i]));
}
+ printf("Descriptor set layouts\n");
// Layout
VkPipelineLayoutCreateInfo pipeline_layout_create_info = {
@@ -621,13 +666,18 @@ gpu_pipeline* gpu_graphics_pipeline_create(struct graphics_pipeline_desc descrip
pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;
pipeline_create_info.basePipelineIndex = -1;
+ printf("Here\n");
+
VkResult result =
vkCreateGraphicsPipelines(context.device->logical_device, VK_NULL_HANDLE, 1,
&pipeline_create_info, context.allocator, &pipeline->handle);
if (result != VK_SUCCESS) {
+ printf("BAD\n");
FATAL("graphics pipeline creation failed. its fked mate");
ERROR_EXIT("Doomed");
}
+ printf("Here2\n");
+ TRACE("Vulkan Graphics pipeline created");
// once the pipeline has been created we can destroy these
vkDestroyShaderModule(context.device->logical_device, vertex_shader, context.allocator);
@@ -820,9 +870,7 @@ void encode_bind_shader_data(gpu_cmd_encoder* encoder, u32 group, shader_data* d
alloc_info.pSetLayouts = &encoder->pipeline->desc_set_layouts[group];
VkDescriptorSet sets[1];
- VK_CHECK(
- vkAllocateDescriptorSets(context.device->logical_device, &alloc_info, sets)
- );
+ VK_CHECK(vkAllocateDescriptorSets(context.device->logical_device, &alloc_info, sets));
VkDescriptorSet_darray_push(context.free_set_queue, sets[0]);
shader_data_layout sdl = data->shader_data_get_layout(NULL);
@@ -870,7 +918,7 @@ void encode_set_vertex_buffer(gpu_cmd_encoder* encoder, buffer_handle buf) {
void encode_set_index_buffer(gpu_cmd_encoder* encoder, buffer_handle buf) {
gpu_buffer buffer = context.buffers[buf.raw];
- vkCmdBindIndexBuffer(encoder->cmd_buffer, buffer.handle, 0, VK_INDEX_TYPE_UINT16);
+ vkCmdBindIndexBuffer(encoder->cmd_buffer, buffer.handle, 0, VK_INDEX_TYPE_UINT32);
}
// TEMP
@@ -1310,3 +1358,36 @@ void encode_buffer_copy(gpu_cmd_encoder* encoder, buffer_handle src, u64 src_off
vkCmdCopyBuffer(encoder->cmd_buffer, context.buffers[src.raw].handle,
context.buffers[dst.raw].handle, 1, &copy_region);
}
+
+size_t vertex_attrib_size(vertex_attrib_type attr) {
+ switch (attr) {
+ case ATTR_F32:
+ case ATTR_U32:
+ case ATTR_I32:
+ return 4;
+ case ATTR_F32x2:
+ case ATTR_U32x2:
+ case ATTR_I32x2:
+ return 8;
+ case ATTR_F32x3:
+ case ATTR_U32x3:
+ case ATTR_I32x3:
+ return 12;
+ case ATTR_F32x4:
+ case ATTR_U32x4:
+ case ATTR_I32x4:
+ return 16;
+ break;
+ }
+}
+
+void vertex_desc_add(vertex_description* builder, const char* name, vertex_attrib_type type) {
+ u32 i = builder->attributes_count;
+
+ size_t size = vertex_attrib_size(type);
+ builder->attributes[i] = type;
+ builder->stride += size;
+ builder->attr_names[i] = name;
+
+ builder->attributes_count++;
+}
diff --git a/src/renderer/ral_types.h b/src/renderer/ral_types.h
index 48695ea..c802a9b 100644
--- a/src/renderer/ral_types.h
+++ b/src/renderer/ral_types.h
@@ -85,8 +85,8 @@ typedef enum vertex_format {
typedef union vertex {
struct {
vec3 position;
- vec2 tex_coords;
vec3 normal;
+ vec2 tex_coords;
} static_3d; /** @brief standard vertex format for static geometry in 3D */
struct {
@@ -149,6 +149,7 @@ typedef struct vertex_description {
char* debug_label;
const char* attr_names[MAX_VERTEX_ATTRIBUTES];
vertex_attrib_type attributes[MAX_VERTEX_ATTRIBUTES];
+ u32 attributes_count;
size_t stride;
} vertex_description;
diff --git a/src/renderer/render.c b/src/renderer/render.c
index 9f5b21a..efef6a6 100644
--- a/src/renderer/render.c
+++ b/src/renderer/render.c
@@ -4,6 +4,7 @@
#include "file.h"
#include "log.h"
#include "ral.h"
+#include "ral_types.h"
/** @brief Creates the pipelines built into Celeritas such as rendering static opaque geometry,
debug visualisations, immediate mode UI, etc */
@@ -126,6 +127,48 @@ void render_frame_end(renderer* ren) {
}
void render_frame_draw(renderer* ren) {}
+void draw_mesh(mesh* mesh, mat4* model) { // , mat4* view, mat4* proj) {
+ gpu_cmd_encoder* enc = gpu_get_default_cmd_encoder();
+ encode_set_vertex_buffer(enc, mesh->vertex_buffer);
+ if (mesh->has_indices) {
+ encode_set_index_buffer(enc, mesh->index_buffer);
+ }
+ // Assume this has already been done
+ /* encode_bind_shader_data(enc, 0, &mvp_uniforms_data); */
+ encode_draw_indexed(enc, mesh->index_count);
+}
+
void gfx_backend_draw_frame(renderer* ren, camera* camera, mat4 model, texture* tex) {}
void geo_set_vertex_colours(geometry_data* geo, vec4 colour) {}
+
+// --- NEW
+
+mesh mesh_create(geometry_data* geometry, bool free_on_upload) {
+ mesh m = { 0 };
+
+ // Create and upload vertex buffer
+ size_t vert_bytes = geometry->vertices->len * sizeof(vertex);
+ INFO("Creating vertex buffer with size %d (%d x %d)", vert_bytes, geometry->vertices->len,
+ sizeof(vertex));
+ m.vertex_buffer = gpu_buffer_create(vert_bytes, CEL_BUFFER_VERTEX, CEL_BUFFER_FLAG_GPU,
+ geometry->vertices->data);
+
+ // Create and upload index buffer
+ size_t index_bytes = geometry->indices.len * sizeof(u32);
+ INFO("Creating index buffer with size %d (len: %d)", index_bytes, geometry->indices.len);
+ m.index_buffer =
+ gpu_buffer_create(index_bytes, CEL_BUFFER_INDEX, CEL_BUFFER_FLAG_GPU, geometry->indices.data);
+
+ m.is_uploaded = true;
+ m.has_indices = geometry->has_indices;
+ m.index_count = geometry->indices.len;
+ m.vertices = geometry;
+ if (free_on_upload) {
+ geo_free_data(geometry);
+ }
+
+ // TODO: materials?
+
+ return m;
+}
diff --git a/src/renderer/render.h b/src/renderer/render.h
index 4477121..c87e5f7 100644
--- a/src/renderer/render.h
+++ b/src/renderer/render.h
@@ -25,6 +25,11 @@ void render_frame_draw(renderer* ren);
typedef struct camera camera;
void gfx_backend_draw_frame(renderer* ren, camera* camera, mat4 model, texture* tex);
+typedef struct render_ctx {
+ mat4 view;
+ mat4 projection;
+} render_ctx;
+
// frontend -- these can be called from say a loop in an example, or via FFI
texture_handle texture_create(const char* debug_name, texture_desc description, const u8* data);
@@ -39,10 +44,22 @@ sampler_handle sampler_create();
void shader_hot_reload(const char* filepath);
// models and meshes are implemented **in terms of the above**
-mesh mesh_create(geometry_data* geometry);
+
+/**
+ * @brief Creates buffers and returns a struct that holds handles to our resources
+ *
+ * @param geometry
+ * @param free_on_upload frees the CPU-side vertex/index data stored in geometry_data when we successfully upload
+ that data to the GPU-side buffer
+ * @return mesh
+ */
+mesh mesh_create(geometry_data* geometry, bool free_on_upload);
+
+void draw_mesh(mesh* mesh, mat4* model);//, mat4* view, mat4* proj); // TODO: material
model_handle model_load(const char* debug_name, const char* filepath);
+void geo_free_data(geometry_data* geo);
void geo_set_vertex_colours(geometry_data* geo, vec4 colour);
-vertex_description static_3d_vertex_description(); \ No newline at end of file
+vertex_description static_3d_vertex_description();
diff --git a/src/renderer/render_types.h b/src/renderer/render_types.h
index 06a8415..ac98627 100644
--- a/src/renderer/render_types.h
+++ b/src/renderer/render_types.h
@@ -45,12 +45,15 @@ typedef struct geometry_data {
vec3 colour; /** Optional: set vertex colours */
} geometry_data;
+// 'Upload' a geometry_data (to GPU) -> get back a mesh
typedef struct mesh {
buffer_handle vertex_buffer;
buffer_handle index_buffer;
u32 index_count;
bool has_indices;
geometry_data* vertices; // NULL means it has been freed
+ bool is_uploaded;
+ bool is_latent;
} mesh;
/* Hot reloading: