From ba20d5a95831c5ced9520763a7b62b9351fdf456 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Fri, 6 Jun 2025 11:41:09 -0400 Subject: [PATCH] vulkan create vertex layout --- .../vulkan_graphics_pipeline.c | 36 +++++++++++++++++-- .../gryphn_graphics_pipeline.h | 2 ++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c index c448373..94cc614 100644 --- a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c +++ b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c @@ -54,6 +54,12 @@ VkBlendOp vkGryphnBlendOperation(enum gnBlendOperation_e operation) { } } +VkFormat vkGryphnVertexFormat(gnVertexFormat format) { + switch (format) { + case GN_FLOAT2: return VK_FORMAT_R32G32_SFLOAT; + } +} + gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPipeline, struct gnOutputDevice_t* device, struct gnGraphicsPipelineInfo_t info) { graphicsPipeline->graphicsPipeline = malloc(sizeof(gnPlatformGraphicsPipeline)); @@ -71,10 +77,32 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip .pDynamicStates = dynamicStates }; + int vertexAttributeCount = 0; + VkVertexInputAttributeDescription* attributeDescriptions = NULL; + VkVertexInputBindingDescription* bindingDescriptions = malloc(sizeof(VkVertexInputBindingDescription) * info.shaderInputLayout.bufferCount); + for (int i = 0; i < info.shaderInputLayout.bufferCount; i++) { + bindingDescriptions[i].binding = info.shaderInputLayout.bufferAttributes[i].binding; + bindingDescriptions[i].stride = info.shaderInputLayout.bufferAttributes[i].size; + bindingDescriptions[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + vertexAttributeCount += info.shaderInputLayout.bufferAttributes[i].attributeCount; + } + attributeDescriptions = malloc(sizeof(VkVertexInputBindingDescription) * vertexAttributeCount); + for (int i = 0, j = 0; j < info.shaderInputLayout.bufferCount; j++) { + for (int k = 0; k < info.shaderInputLayout.bufferAttributes[j].attributeCount; k++) { + attributeDescriptions[i].binding = j; + attributeDescriptions[i].location = info.shaderInputLayout.bufferAttributes[j].attributes[k].location; + attributeDescriptions[i].offset = info.shaderInputLayout.bufferAttributes[j].attributes[k].offset; + attributeDescriptions[i].format = vkGryphnVertexFormat(info.shaderInputLayout.bufferAttributes[j].attributes[k].format); + i++; + } + } + graphicsPipeline->graphicsPipeline->vertexInfo = (VkPipelineVertexInputStateCreateInfo){ .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .vertexBindingDescriptionCount = 0, - .vertexAttributeDescriptionCount = 0 + .vertexBindingDescriptionCount = info.shaderInputLayout.bufferCount, + .pVertexBindingDescriptions = bindingDescriptions, + .vertexAttributeDescriptionCount = vertexAttributeCount, + .pVertexAttributeDescriptions = attributeDescriptions }; graphicsPipeline->graphicsPipeline->inputAssembly = (VkPipelineInputAssemblyStateCreateInfo){ @@ -192,7 +220,7 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip .renderPass = info.renderPassDescriptor->renderPassDescriptor->renderPass, .subpass = info.subpassIndex, .basePipelineHandle = VK_NULL_HANDLE, - .basePipelineIndex = -1 + .basePipelineIndex = -1, }; if (vkCreateGraphicsPipelines(device->outputDevice->device, VK_NULL_HANDLE, 1, &pipelineInfo, NULL, &graphicsPipeline->graphicsPipeline->graphicsPipeline) != VK_SUCCESS) { @@ -200,6 +228,8 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip } free(dynamicStates); + free(bindingDescriptions); + free(attributeDescriptions); return GN_SUCCESS; } diff --git a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h index d703641..2bfcffa 100644 --- a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h +++ b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h @@ -5,6 +5,7 @@ #include #include "utils/math/gryphn_vec2.h" #include "core/gryphn_handles.h" +#include "core/shader_input/gryphn_shader_layout.h" typedef enum gnDynamicState_e { GN_DYNAMIC_VIEWPORT, @@ -89,6 +90,7 @@ typedef struct gnGraphicsPipelineInfo_t { uint32_t shaderModuleCount; gnShaderModuleHandle* shaderModules; + gnShaderInputLayout shaderInputLayout; } gnGraphicsPipelineInfo; #ifdef GN_REVEAL_IMPL