vulkan create vertex layout
This commit is contained in:
@@ -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) {
|
gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPipeline, struct gnOutputDevice_t* device, struct gnGraphicsPipelineInfo_t info) {
|
||||||
graphicsPipeline->graphicsPipeline = malloc(sizeof(gnPlatformGraphicsPipeline));
|
graphicsPipeline->graphicsPipeline = malloc(sizeof(gnPlatformGraphicsPipeline));
|
||||||
|
|
||||||
@@ -71,10 +77,32 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip
|
|||||||
.pDynamicStates = dynamicStates
|
.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){
|
graphicsPipeline->graphicsPipeline->vertexInfo = (VkPipelineVertexInputStateCreateInfo){
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
|
||||||
.vertexBindingDescriptionCount = 0,
|
.vertexBindingDescriptionCount = info.shaderInputLayout.bufferCount,
|
||||||
.vertexAttributeDescriptionCount = 0
|
.pVertexBindingDescriptions = bindingDescriptions,
|
||||||
|
.vertexAttributeDescriptionCount = vertexAttributeCount,
|
||||||
|
.pVertexAttributeDescriptions = attributeDescriptions
|
||||||
};
|
};
|
||||||
|
|
||||||
graphicsPipeline->graphicsPipeline->inputAssembly = (VkPipelineInputAssemblyStateCreateInfo){
|
graphicsPipeline->graphicsPipeline->inputAssembly = (VkPipelineInputAssemblyStateCreateInfo){
|
||||||
@@ -192,7 +220,7 @@ gnReturnCode gnCreateGraphicsPipelineFn(struct gnGraphicsPipeline_t* graphicsPip
|
|||||||
.renderPass = info.renderPassDescriptor->renderPassDescriptor->renderPass,
|
.renderPass = info.renderPassDescriptor->renderPassDescriptor->renderPass,
|
||||||
.subpass = info.subpassIndex,
|
.subpass = info.subpassIndex,
|
||||||
.basePipelineHandle = VK_NULL_HANDLE,
|
.basePipelineHandle = VK_NULL_HANDLE,
|
||||||
.basePipelineIndex = -1
|
.basePipelineIndex = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (vkCreateGraphicsPipelines(device->outputDevice->device, VK_NULL_HANDLE, 1, &pipelineInfo, NULL, &graphicsPipeline->graphicsPipeline->graphicsPipeline) != VK_SUCCESS) {
|
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(dynamicStates);
|
||||||
|
free(bindingDescriptions);
|
||||||
|
free(attributeDescriptions);
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
#include <core/shader_module/gryphn_shader_module.h>
|
#include <core/shader_module/gryphn_shader_module.h>
|
||||||
#include "utils/math/gryphn_vec2.h"
|
#include "utils/math/gryphn_vec2.h"
|
||||||
#include "core/gryphn_handles.h"
|
#include "core/gryphn_handles.h"
|
||||||
|
#include "core/shader_input/gryphn_shader_layout.h"
|
||||||
|
|
||||||
typedef enum gnDynamicState_e {
|
typedef enum gnDynamicState_e {
|
||||||
GN_DYNAMIC_VIEWPORT,
|
GN_DYNAMIC_VIEWPORT,
|
||||||
@@ -89,6 +90,7 @@ typedef struct gnGraphicsPipelineInfo_t {
|
|||||||
|
|
||||||
uint32_t shaderModuleCount;
|
uint32_t shaderModuleCount;
|
||||||
gnShaderModuleHandle* shaderModules;
|
gnShaderModuleHandle* shaderModules;
|
||||||
|
gnShaderInputLayout shaderInputLayout;
|
||||||
} gnGraphicsPipelineInfo;
|
} gnGraphicsPipelineInfo;
|
||||||
|
|
||||||
#ifdef GN_REVEAL_IMPL
|
#ifdef GN_REVEAL_IMPL
|
||||||
|
Reference in New Issue
Block a user