push constants
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include "pipelines/graphics_pipeline/vulkan_graphics_pipeline.h"
|
#include "pipelines/graphics_pipeline/vulkan_graphics_pipeline.h"
|
||||||
#include "buffers/vulkan_buffer.h"
|
#include "buffers/vulkan_buffer.h"
|
||||||
#include "uniforms/vulkan_uniform.h"
|
#include "uniforms/vulkan_uniform.h"
|
||||||
|
#include "shader_module/vulkan_shader_module.h"
|
||||||
|
|
||||||
void gnCommandBeginRenderPassFn(gnCommandBuffer buffer, struct gnRenderPassInfo_t passInfo) {
|
void gnCommandBeginRenderPassFn(gnCommandBuffer buffer, struct gnRenderPassInfo_t passInfo) {
|
||||||
VkClearValue* values = malloc(sizeof(VkClearValue) * passInfo.clearValueCount);
|
VkClearValue* values = malloc(sizeof(VkClearValue) * passInfo.clearValueCount);
|
||||||
@@ -83,3 +84,14 @@ void gnCommandBindUniformFn(gnCommandBufferHandle buffer, gnUniform uniform, uin
|
|||||||
&uniform->uniform->set, 0, NULL
|
&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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@@ -241,12 +241,21 @@ gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnD
|
|||||||
graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout) * info.uniformLayout.setCount);
|
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);
|
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 = {
|
VkPipelineLayoutCreateInfo pipelineLayoutInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||||
.setLayoutCount = graphicsPipeline->graphicsPipeline->setCount,
|
.setLayoutCount = graphicsPipeline->graphicsPipeline->setCount,
|
||||||
pipelineLayoutInfo.pSetLayouts = graphicsPipeline->graphicsPipeline->sets,
|
pipelineLayoutInfo.pSetLayouts = graphicsPipeline->graphicsPipeline->sets,
|
||||||
pipelineLayoutInfo.pushConstantRangeCount = 0,
|
pipelineLayoutInfo.pushConstantRangeCount = info.uniformLayout.pushConstantCount,
|
||||||
pipelineLayoutInfo.pPushConstantRanges = NULL
|
pipelineLayoutInfo.pPushConstantRanges = graphicsPipeline->graphicsPipeline->ranges
|
||||||
};
|
};
|
||||||
|
|
||||||
if (vkCreatePipelineLayout(device->outputDevice->device, &pipelineLayoutInfo, NULL, &graphicsPipeline->graphicsPipeline->pipelineLayout) != VK_SUCCESS)
|
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->dynamicStates);
|
||||||
free(graphicsPipeline->graphicsPipeline->bindingDescriptions);
|
free(graphicsPipeline->graphicsPipeline->bindingDescriptions);
|
||||||
free(graphicsPipeline->graphicsPipeline->attributeDescriptions);
|
free(graphicsPipeline->graphicsPipeline->attributeDescriptions);
|
||||||
|
free(graphicsPipeline->graphicsPipeline->ranges);
|
||||||
for (int i = 0; i < graphicsPipeline->graphicsPipeline->setCount; i++)
|
for (int i = 0; i < graphicsPipeline->graphicsPipeline->setCount; i++)
|
||||||
vkDestroyDescriptorSetLayout(graphicsPipeline->device->outputDevice->device, graphicsPipeline->graphicsPipeline->sets[i], NULL);
|
vkDestroyDescriptorSetLayout(graphicsPipeline->device->outputDevice->device, graphicsPipeline->graphicsPipeline->sets[i], NULL);
|
||||||
free(graphicsPipeline->graphicsPipeline->modules);
|
free(graphicsPipeline->graphicsPipeline->modules);
|
||||||
|
@@ -31,4 +31,5 @@ typedef struct gnPlatformGraphicsPipeline_t {
|
|||||||
VkVertexInputBindingDescription* bindingDescriptions;
|
VkVertexInputBindingDescription* bindingDescriptions;
|
||||||
VkVertexInputAttributeDescription* attributeDescriptions;
|
VkVertexInputAttributeDescription* attributeDescriptions;
|
||||||
VkPipelineShaderStageCreateInfo* modules;
|
VkPipelineShaderStageCreateInfo* modules;
|
||||||
|
VkPushConstantRange* ranges;
|
||||||
} gnPlatformGraphicsPipeline;
|
} gnPlatformGraphicsPipeline;
|
||||||
|
@@ -25,6 +25,9 @@ void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint3
|
|||||||
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
||||||
buffer->commandPool->commandFunctions->_gnCommandBindBuffer(buffer, bufferToBind, 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) {
|
void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
||||||
buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance);
|
buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance);
|
||||||
}
|
}
|
||||||
|
@@ -9,6 +9,7 @@ void gnCommandBindGraphicsPipeline(gnCommandBufferHandle buffer, gnGraphicsPipel
|
|||||||
void gnCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport);
|
void gnCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport);
|
||||||
void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor);
|
void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor);
|
||||||
void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set);
|
void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set);
|
||||||
|
void gnCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data);
|
||||||
|
|
||||||
#include "core/buffers/gryphn_buffer.h"
|
#include "core/buffers/gryphn_buffer.h"
|
||||||
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
||||||
|
@@ -118,6 +118,7 @@ typedef struct gnCommandFunctions_t {
|
|||||||
void (*_gnCommandSetViewport)(gnCommandBufferHandle buffer, gnViewport viewport);
|
void (*_gnCommandSetViewport)(gnCommandBufferHandle buffer, gnViewport viewport);
|
||||||
void (*_gnCommandSetScissor)(gnCommandBufferHandle buffer, gnScissor scissor);
|
void (*_gnCommandSetScissor)(gnCommandBufferHandle buffer, gnScissor scissor);
|
||||||
void (*_gnCommandBindUniform)(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set);
|
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 (*_gnCommandBindBuffer)(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
||||||
void (*_gnCommandDraw)(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
void (*_gnCommandDraw)(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
||||||
|
@@ -121,6 +121,7 @@ void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunc
|
|||||||
gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandBindUniform, "gnCommandBindUniformFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandBindUniform, "gnCommandBindUniformFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn");
|
||||||
|
gnLoadDLLFunction(lib, functions->_gnCommandPushConstant, "gnCommandPushConstantFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandDrawIndexed, "gnCommandDrawIndexedFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandDrawIndexed, "gnCommandDrawIndexedFn");
|
||||||
}
|
}
|
||||||
|
@@ -19,7 +19,15 @@ typedef struct gnUniformSet {
|
|||||||
gnUniformBinding* uniformBindings;
|
gnUniformBinding* uniformBindings;
|
||||||
} gnUniformSet;
|
} gnUniformSet;
|
||||||
|
|
||||||
|
typedef struct gnPushConstantLayout {
|
||||||
|
gnShaderModuleStage stage;
|
||||||
|
size_t size;
|
||||||
|
size_t offset;
|
||||||
|
} gnPushConstantLayout;
|
||||||
|
|
||||||
typedef struct gnUniformLayout {
|
typedef struct gnUniformLayout {
|
||||||
uint32_t setCount;
|
uint32_t setCount;
|
||||||
gnUniformSet* sets;
|
gnUniformSet* sets;
|
||||||
|
uint32_t pushConstantCount;
|
||||||
|
gnPushConstantLayout* pushConstants;
|
||||||
} gnUniformLayout;
|
} gnUniformLayout;
|
||||||
|
Reference in New Issue
Block a user