From 309ce8cd744a1c7575c443c388865b6bc857fe03 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Tue, 17 Jun 2025 15:40:47 -0400 Subject: [PATCH] push constants --- .../vulkan/src/commands/commands/vulkan_commands.c | 12 ++++++++++++ .../graphics_pipeline/vulkan_graphics_pipeline.c | 14 ++++++++++++-- .../graphics_pipeline/vulkan_graphics_pipeline.h | 1 + src/core/command/commands/gryphn_command.c | 3 +++ src/core/command/commands/gryphn_command.h | 1 + src/core/gryphn_platform_functions.h | 1 + src/core/instance/init/gryphn_init.c | 1 + src/core/uniforms/gryphn_uniform_layout.h | 8 ++++++++ 8 files changed, 39 insertions(+), 2 deletions(-) diff --git a/rendering_api/vulkan/src/commands/commands/vulkan_commands.c b/rendering_api/vulkan/src/commands/commands/vulkan_commands.c index 5db6715..88d786b 100644 --- a/rendering_api/vulkan/src/commands/commands/vulkan_commands.c +++ b/rendering_api/vulkan/src/commands/commands/vulkan_commands.c @@ -6,6 +6,7 @@ #include "pipelines/graphics_pipeline/vulkan_graphics_pipeline.h" #include "buffers/vulkan_buffer.h" #include "uniforms/vulkan_uniform.h" +#include "shader_module/vulkan_shader_module.h" void gnCommandBeginRenderPassFn(gnCommandBuffer buffer, struct gnRenderPassInfo_t passInfo) { VkClearValue* values = malloc(sizeof(VkClearValue) * passInfo.clearValueCount); @@ -83,3 +84,14 @@ void gnCommandBindUniformFn(gnCommandBufferHandle buffer, gnUniform uniform, uin &uniform->uniform->set, 0, NULL ); } + +void gnCommandPushConstantFn(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data) { + vkCmdPushConstants( + buffer->commandBuffer->buffer, + buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->pipelineLayout, + vkGryphnShaderModuleStage(layout.stage), + layout.offset, + layout.size, + data + ); +} 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 f2b9532..13edd55 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 @@ -241,12 +241,21 @@ gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnD graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout) * info.uniformLayout.setCount); for (int i = 0; i < info.uniformLayout.setCount; i++) graphicsPipeline->graphicsPipeline->sets[i] = vkGryphnCreateSetLayouts(&info.uniformLayout.sets[i], device->outputDevice->device); + graphicsPipeline->graphicsPipeline->ranges = malloc(sizeof(VkPushConstantRange) * info.uniformLayout.pushConstantCount); + for (int i = 0; i < info.uniformLayout.pushConstantCount; i++) { + graphicsPipeline->graphicsPipeline->ranges[i] = (VkPushConstantRange) { + .offset = info.uniformLayout.pushConstants[i].offset, + .size = info.uniformLayout.pushConstants[i].size, + .stageFlags = vkGryphnShaderModuleStage(info.uniformLayout.pushConstants[i].stage) + }; + } + VkPipelineLayoutCreateInfo pipelineLayoutInfo = { .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .setLayoutCount = graphicsPipeline->graphicsPipeline->setCount, pipelineLayoutInfo.pSetLayouts = graphicsPipeline->graphicsPipeline->sets, - pipelineLayoutInfo.pushConstantRangeCount = 0, - pipelineLayoutInfo.pPushConstantRanges = NULL + pipelineLayoutInfo.pushConstantRangeCount = info.uniformLayout.pushConstantCount, + pipelineLayoutInfo.pPushConstantRanges = graphicsPipeline->graphicsPipeline->ranges }; if (vkCreatePipelineLayout(device->outputDevice->device, &pipelineLayoutInfo, NULL, &graphicsPipeline->graphicsPipeline->pipelineLayout) != VK_SUCCESS) @@ -286,6 +295,7 @@ void gnDestroyGraphicsPipelineFn(struct gnGraphicsPipeline_t *graphicsPipeline) free(graphicsPipeline->graphicsPipeline->dynamicStates); free(graphicsPipeline->graphicsPipeline->bindingDescriptions); free(graphicsPipeline->graphicsPipeline->attributeDescriptions); + free(graphicsPipeline->graphicsPipeline->ranges); for (int i = 0; i < graphicsPipeline->graphicsPipeline->setCount; i++) vkDestroyDescriptorSetLayout(graphicsPipeline->device->outputDevice->device, graphicsPipeline->graphicsPipeline->sets[i], NULL); free(graphicsPipeline->graphicsPipeline->modules); diff --git a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.h b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.h index 9c9386d..05b3d05 100644 --- a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.h +++ b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.h @@ -31,4 +31,5 @@ typedef struct gnPlatformGraphicsPipeline_t { VkVertexInputBindingDescription* bindingDescriptions; VkVertexInputAttributeDescription* attributeDescriptions; VkPipelineShaderStageCreateInfo* modules; + VkPushConstantRange* ranges; } gnPlatformGraphicsPipeline; diff --git a/src/core/command/commands/gryphn_command.c b/src/core/command/commands/gryphn_command.c index 623ed37..3b46695 100644 --- a/src/core/command/commands/gryphn_command.c +++ b/src/core/command/commands/gryphn_command.c @@ -25,6 +25,9 @@ void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint3 void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) { buffer->commandPool->commandFunctions->_gnCommandBindBuffer(buffer, bufferToBind, type); } +void gnCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data) { + buffer->commandPool->commandFunctions->_gnCommandPushConstant(buffer, layout, data); +} void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) { buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance); } diff --git a/src/core/command/commands/gryphn_command.h b/src/core/command/commands/gryphn_command.h index b2ecb4a..ce2a550 100644 --- a/src/core/command/commands/gryphn_command.h +++ b/src/core/command/commands/gryphn_command.h @@ -9,6 +9,7 @@ void gnCommandBindGraphicsPipeline(gnCommandBufferHandle buffer, gnGraphicsPipel void gnCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport); void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor); void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); +void gnCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); #include "core/buffers/gryphn_buffer.h" void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type); diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 0674498..87be4c8 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -118,6 +118,7 @@ typedef struct gnCommandFunctions_t { void (*_gnCommandSetViewport)(gnCommandBufferHandle buffer, gnViewport viewport); void (*_gnCommandSetScissor)(gnCommandBufferHandle buffer, gnScissor scissor); void (*_gnCommandBindUniform)(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); + void (*_gnCommandPushConstant)(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); void (*_gnCommandBindBuffer)(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type); void (*_gnCommandDraw)(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance); diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index 377d89a..994fe5f 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -121,6 +121,7 @@ void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunc gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn"); gnLoadDLLFunction(lib, functions->_gnCommandBindUniform, "gnCommandBindUniformFn"); gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn"); + gnLoadDLLFunction(lib, functions->_gnCommandPushConstant, "gnCommandPushConstantFn"); gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn"); gnLoadDLLFunction(lib, functions->_gnCommandDrawIndexed, "gnCommandDrawIndexedFn"); } diff --git a/src/core/uniforms/gryphn_uniform_layout.h b/src/core/uniforms/gryphn_uniform_layout.h index 68c7fbf..a3b1aa7 100644 --- a/src/core/uniforms/gryphn_uniform_layout.h +++ b/src/core/uniforms/gryphn_uniform_layout.h @@ -19,7 +19,15 @@ typedef struct gnUniformSet { gnUniformBinding* uniformBindings; } gnUniformSet; +typedef struct gnPushConstantLayout { + gnShaderModuleStage stage; + size_t size; + size_t offset; +} gnPushConstantLayout; + typedef struct gnUniformLayout { uint32_t setCount; gnUniformSet* sets; + uint32_t pushConstantCount; + gnPushConstantLayout* pushConstants; } gnUniformLayout;