diff --git a/projects/apis/metal/loader/metal_device_loader.m b/projects/apis/metal/loader/metal_device_loader.m index 57f8fe1..ad64c04 100644 --- a/projects/apis/metal/loader/metal_device_loader.m +++ b/projects/apis/metal/loader/metal_device_loader.m @@ -37,6 +37,7 @@ gnDeviceFunctions loadMetalDeviceFunctions() { ._gnCreateBuffer = createMetalBuffer, ._gnBufferData = metalBufferData, + ._gnBufferSubData = metalBufferSubData, ._gnMapBuffer = mapMetalBuffer, ._gnDestroyBuffer = destroyMetalBuffer, diff --git a/projects/apis/metal/src/buffer/metal_buffer.h b/projects/apis/metal/src/buffer/metal_buffer.h index 285d5fc..ea408bd 100644 --- a/projects/apis/metal/src/buffer/metal_buffer.h +++ b/projects/apis/metal/src/buffer/metal_buffer.h @@ -11,5 +11,6 @@ struct gnPlatformBuffer_t { gnReturnCode createMetalBuffer(gnBufferHandle buffer, gnDevice device, gnBufferInfo info); void metalBufferData(gnBufferHandle buffer, size_t dataSize, void* data); +void metalBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, gnBufferMemory data); void* mapMetalBuffer(gnBufferHandle buffer); void destroyMetalBuffer(gnBufferHandle buffer); diff --git a/projects/apis/metal/src/buffer/metal_buffer.m b/projects/apis/metal/src/buffer/metal_buffer.m index 2d92140..4546a02 100644 --- a/projects/apis/metal/src/buffer/metal_buffer.m +++ b/projects/apis/metal/src/buffer/metal_buffer.m @@ -14,9 +14,12 @@ gnReturnCode createMetalBuffer(gnBufferHandle buffer, gnDevice device, gnBufferI return GN_SUCCESS; } void metalBufferData(gnBufferHandle buffer, size_t dataSize, void* data) { + metalBufferSubData(buffer, 0, dataSize, data); +} +void metalBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, gnBufferMemory data) { void* bufferData; if (buffer->buffer->useStagingBuffer) { - memcpy(buffer->buffer->stagingBuffer.contents, data, dataSize); + memcpy(buffer->buffer->stagingBuffer.contents + offset, data, dataSize); id commandBuffer = [buffer->device->outputDevice->transferQueue commandBuffer]; id encoder = [commandBuffer blitCommandEncoder]; [encoder copyFromBuffer:buffer->buffer->stagingBuffer sourceOffset:0 toBuffer:buffer->buffer->buffer destinationOffset:0 size:dataSize]; @@ -24,7 +27,7 @@ void metalBufferData(gnBufferHandle buffer, size_t dataSize, void* data) { [commandBuffer commit]; [commandBuffer waitUntilCompleted]; } else - memcpy(buffer->buffer->buffer.contents, data, dataSize); + memcpy(buffer->buffer->buffer.contents + offset, data, dataSize); } void* mapMetalBuffer(gnBufferHandle buffer) { return buffer->buffer->buffer.contents; diff --git a/projects/apis/vulkan/src/commands/commands/vulkan_commands.c b/projects/apis/vulkan/src/commands/commands/vulkan_commands.c index 1186d18..4ce2715 100644 --- a/projects/apis/vulkan/src/commands/commands/vulkan_commands.c +++ b/projects/apis/vulkan/src/commands/commands/vulkan_commands.c @@ -69,12 +69,12 @@ void drawIndexed(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, buffer->commandBuffer->changedBuffer = gnFalse; } -void bindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set) { +void bindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets) { vkCmdBindDescriptorSets( buffer->commandBuffer->buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->pipelineLayout, set, 1, - &uniform->uniform->set, 0, NULL + &uniform->uniform->set, dynamicOffsetCount, dynamicOffsets ); } diff --git a/projects/apis/vulkan/src/commands/commands/vulkan_commands.h b/projects/apis/vulkan/src/commands/commands/vulkan_commands.h index 60878e5..42da0c1 100644 --- a/projects/apis/vulkan/src/commands/commands/vulkan_commands.h +++ b/projects/apis/vulkan/src/commands/commands/vulkan_commands.h @@ -17,5 +17,5 @@ void setScissor(gnCommandBuffer buffer, gnScissor scissor); void bindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type); void draw(gnCommandBuffer buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance); void drawIndexed(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, int firstIndex, int vertexOffset, int instanceCount, int firstInstance); -void bindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); +void bindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets); void pushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); diff --git a/projects/apis/vulkan/src/uniforms/vulkan_uniform.c b/projects/apis/vulkan/src/uniforms/vulkan_uniform.c index 4e84bde..df342f7 100644 --- a/projects/apis/vulkan/src/uniforms/vulkan_uniform.c +++ b/projects/apis/vulkan/src/uniforms/vulkan_uniform.c @@ -13,7 +13,7 @@ void updateBufferUniform(gnUniform uniform, gnBufferUniformInfo* info) { VkWriteDescriptorSet write = { .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .descriptorType = (info->dynamic) ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 1, .pBufferInfo = &bufferInfo, .dstSet = uniform->uniform->set, diff --git a/projects/apis/vulkan/src/uniforms/vulkan_uniform_layout.c b/projects/apis/vulkan/src/uniforms/vulkan_uniform_layout.c index 91df1c1..c6da021 100644 --- a/projects/apis/vulkan/src/uniforms/vulkan_uniform_layout.c +++ b/projects/apis/vulkan/src/uniforms/vulkan_uniform_layout.c @@ -4,6 +4,7 @@ VkDescriptorType vkGryphnUniformType(gnUniformType type) { switch(type) { case GN_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + case GN_DYNAMIC_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; case GN_SHADER_STORE_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; case GN_COMBINED_IMAGE_SAMPLER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; case GN_UNIFORM_TYPE_MAX: return VK_DESCRIPTOR_TYPE_MAX_ENUM; diff --git a/projects/core/src/command/commands/gryphn_command.c b/projects/core/src/command/commands/gryphn_command.c index 35bb57a..c6586f6 100644 --- a/projects/core/src/command/commands/gryphn_command.c +++ b/projects/core/src/command/commands/gryphn_command.c @@ -19,8 +19,8 @@ void gnCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport) { void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor) { buffer->commandPool->instance->callingLayer->commandFunctions._gnCommandSetScissor(buffer, scissor); } -void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set) { - buffer->commandPool->instance->callingLayer->commandFunctions._gnCommandBindUniform(buffer, uniform, set); +void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets) { + buffer->commandPool->instance->callingLayer->commandFunctions._gnCommandBindUniform(buffer, uniform, set, dynamicOffsetCount, dynamicOffsets); } void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) { buffer->commandPool->instance->callingLayer->commandFunctions._gnCommandBindBuffer(buffer, bufferToBind, type); diff --git a/projects/core/src/command/commands/gryphn_command.h b/projects/core/src/command/commands/gryphn_command.h index ec02309..dd04e3a 100644 --- a/projects/core/src/command/commands/gryphn_command.h +++ b/projects/core/src/command/commands/gryphn_command.h @@ -8,7 +8,7 @@ void gnCommandEndRenderPass(gnCommandBufferHandle buffer); void gnCommandBindGraphicsPipeline(gnCommandBufferHandle buffer, gnGraphicsPipelineHandle graphicsPipeline); void gnCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport); void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor); -void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); +void gnCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets); void gnCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); #include "buffers/gryphn_buffer.h" diff --git a/projects/core/src/uniforms/gryphn_uniform.h b/projects/core/src/uniforms/gryphn_uniform.h index e99bdb3..22260c1 100644 --- a/projects/core/src/uniforms/gryphn_uniform.h +++ b/projects/core/src/uniforms/gryphn_uniform.h @@ -2,6 +2,7 @@ #include "stdint.h" #include "stdlib.h" #include "utils/lists/gryphn_array_list.h" +#include "utils/gryphn_bool.h" #include "gryphn_handles.h" typedef struct gnBufferUniformInfo { @@ -9,6 +10,7 @@ typedef struct gnBufferUniformInfo { gnBuffer buffer; size_t offset; size_t size; + gnBool dynamic; } gnBufferUniformInfo; typedef struct gnStorageUniformInfo { diff --git a/projects/core/src/uniforms/gryphn_uniform_layout.h b/projects/core/src/uniforms/gryphn_uniform_layout.h index 240ce3d..191c4d8 100644 --- a/projects/core/src/uniforms/gryphn_uniform_layout.h +++ b/projects/core/src/uniforms/gryphn_uniform_layout.h @@ -4,6 +4,7 @@ typedef enum gnUniformType { GN_UNIFORM_BUFFER_DESCRIPTOR, + GN_DYNAMIC_UNIFORM_BUFFER_DESCRIPTOR, GN_SHADER_STORE_BUFFER_DESCRIPTOR, GN_COMBINED_IMAGE_SAMPLER_DESCRIPTOR, GN_UNIFORM_TYPE_MAX diff --git a/projects/loader/src/gryphn_command_functions.h b/projects/loader/src/gryphn_command_functions.h index 03e586b..6e35bf6 100644 --- a/projects/loader/src/gryphn_command_functions.h +++ b/projects/loader/src/gryphn_command_functions.h @@ -23,7 +23,7 @@ typedef struct gnCommandFunctions_t { void (*_gnCommandBindGraphicsPipeline)(gnCommandBufferHandle buffer, gnGraphicsPipelineHandle graphicsPipeline); void (*_gnCommandSetViewport)(gnCommandBufferHandle buffer, gnViewport viewport); void (*_gnCommandSetScissor)(gnCommandBufferHandle buffer, gnScissor scissor); - void (*_gnCommandBindUniform)(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); + void (*_gnCommandBindUniform)(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets); void (*_gnCommandPushConstant)(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); void (*_gnCommandBindBuffer)(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type); diff --git a/projects/validation_layers/function_loader/src/command_functions.c b/projects/validation_layers/function_loader/src/command_functions.c index 97bdd23..7007a5f 100644 --- a/projects/validation_layers/function_loader/src/command_functions.c +++ b/projects/validation_layers/function_loader/src/command_functions.c @@ -41,8 +41,8 @@ void checkCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport) void checkCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor) { CHECK_VOID_FUNCTION(buffer->instance, _gnCommandSetScissor, commandFunctions, buffer, scissor); } -void checkCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set) { - CHECK_VOID_FUNCTION(buffer->instance, _gnCommandBindUniform, commandFunctions, buffer, uniform, set); +void checkCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets) { + CHECK_VOID_FUNCTION(buffer->instance, _gnCommandBindUniform, commandFunctions, buffer, uniform, set, dynamicOffsetCount, dynamicOffsets); } void checkCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data) { CHECK_VOID_FUNCTION(buffer->instance, _gnCommandPushConstant, commandFunctions, buffer, layout, data); diff --git a/projects/validation_layers/function_loader/src/command_functions.h b/projects/validation_layers/function_loader/src/command_functions.h index 8350339..e44ce9b 100644 --- a/projects/validation_layers/function_loader/src/command_functions.h +++ b/projects/validation_layers/function_loader/src/command_functions.h @@ -12,7 +12,7 @@ void checkCommandEndRenderPass(gnCommandBufferHandle buffer); void checkCommandBindGraphicsPipeline(gnCommandBufferHandle buffer, gnGraphicsPipelineHandle graphicsPipeline); void checkCommandSetViewport(gnCommandBufferHandle buffer, gnViewport viewport); void checkCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor); -void checkCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set); +void checkCommandBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t set, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets); void checkCommandPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data); void checkCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);