diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index e8f4c55..dc6dfe2 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -23,3 +23,4 @@ #include #include #include +#include diff --git a/rendering_api/vulkan/src/buffers/vulkan_buffer.h b/rendering_api/vulkan/src/buffers/vulkan_buffer.h index c26793b..57eafd0 100644 --- a/rendering_api/vulkan/src/buffers/vulkan_buffer.h +++ b/rendering_api/vulkan/src/buffers/vulkan_buffer.h @@ -1,6 +1,7 @@ #pragma once #include #include "utils/gryphn_bool.h" +#include struct gnPlatformBuffer_t { VkBuffer buffer; diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform.c b/rendering_api/vulkan/src/uniforms/vulkan_uniform.c new file mode 100644 index 0000000..e7ae89a --- /dev/null +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform.c @@ -0,0 +1,24 @@ +#include "vulkan_uniform.h" +#include "buffers/vulkan_buffer.h" +#include "output_device/vulkan_output_devices.h" +#include "core/uniforms/gryphn_uniform_pool.h" + +void gnUpdateBufferUniformFn(gnUniform uniform, gnBufferUniformInfo* info) { + VkDescriptorBufferInfo bufferInfo = { + .buffer = info->buffer->buffer->buffer, + .offset = info->offset, + .range = info->size + }; + + VkWriteDescriptorSet write = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .descriptorCount = 1, + .pBufferInfo = &bufferInfo, + .dstSet = uniform->uniform->set, + .dstBinding = info->binding, + .dstArrayElement = 0 + }; + + vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL); +} diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform.h b/rendering_api/vulkan/src/uniforms/vulkan_uniform.h index 109c64c..c40ca8a 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform.h +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform.h @@ -1,5 +1,6 @@ #pragma once #include +#include "core/uniforms/gryphn_uniform.h" typedef struct gnPlatformUniform_t { VkDescriptorSet set; diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index d10c5f2..8a33299 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -19,6 +19,7 @@ #include "core/submit/gryphn_submit.h" #include "core/present/gryphn_present.h" #include "core/buffers/gryphn_buffer.h" +#include "core/uniforms/gryphn_uniform.h" typedef struct gnFunctions_t { gnReturnCode (*_gnCreateInstance)(gnInstanceHandle instance, gnInstanceInfo info); @@ -91,6 +92,8 @@ typedef struct gnDeviceFunctions_t { gnUniform* (*_gnUniformPoolAllocateUniforms)(gnUniformPool pool, const gnUniformLayout layout); void (*_gnDestroyUniformPool)(gnUniformPool pool); + void (*_gnUpdateBufferUniform)(gnUniform uniform, gnBufferUniformInfo* bufferInfo); + gnReturnCode (*_gnCreateFence)(gnFenceHandle fence, gnOutputDeviceHandle device); void (*_gnSignalFence)(gnFenceHandle fence); void (*_gnWaitForFence)(gnFenceHandle fence, uint64_t timeout); diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index 70c6d07..8693552 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -92,6 +92,7 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti gnLoadDLLFunction(lib, functions->_gnCreateUniformPool, "gnCreateUniformPoolFn"); gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn"); gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn"); + gnLoadDLLFunction(lib, functions->_gnUpdateBufferUniform, "gnUpdateBufferUniformFn"); gnLoadDLLFunction(lib, functions->_gnCreateFence, "gnCreateFenceFn"); gnLoadDLLFunction(lib, functions->_gnSignalFence, "gnSignalFenceFn"); gnLoadDLLFunction(lib, functions->_gnWaitForFence, "gnWaitForFenceFn"); diff --git a/src/core/uniforms/gryphn_uniform.c b/src/core/uniforms/gryphn_uniform.c new file mode 100644 index 0000000..0e18396 --- /dev/null +++ b/src/core/uniforms/gryphn_uniform.c @@ -0,0 +1,8 @@ +#include "gryphn_uniform.h" +#include "gryphn_uniform_pool.h" +#include "core/output_device/gryphn_output_device.h" +#include "core/gryphn_platform_functions.h" + +void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo) { + uniform->pool->device->deviceFunctions->_gnUpdateBufferUniform(uniform, &bufferInfo); +} diff --git a/src/core/uniforms/gryphn_uniform.h b/src/core/uniforms/gryphn_uniform.h index a710f8c..5d84bec 100644 --- a/src/core/uniforms/gryphn_uniform.h +++ b/src/core/uniforms/gryphn_uniform.h @@ -1,7 +1,21 @@ #pragma once +#include "stdint.h" +#include "stdlib.h" +#include "core/gryphn_handles.h" + +typedef struct gnBufferUniformInfo { + gnUniform uniform; + uint32_t binding; + gnBuffer buffer; + size_t offset; + size_t size; +} gnBufferUniformInfo; #ifdef GN_REVEAL_IMPL struct gnUniform_t { struct gnPlatformUniform_t* uniform; + gnUniformPool pool; }; #endif + +void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo); diff --git a/src/core/uniforms/gryphn_uniform_pool.c b/src/core/uniforms/gryphn_uniform_pool.c index 5ac87ec..7fafa44 100644 --- a/src/core/uniforms/gryphn_uniform_pool.c +++ b/src/core/uniforms/gryphn_uniform_pool.c @@ -1,6 +1,7 @@ #include "gryphn_uniform_pool.h" #include "core/output_device/gryphn_output_device.h" #include "core/gryphn_platform_functions.h" +#include "gryphn_uniform.h" #include "stdlib.h" gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) { @@ -9,8 +10,12 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) { return device->deviceFunctions->_gnCreateUniformPool(*pool, device); } +// you own this memory now gnUniform* gnUniformPoolAllocateUniforms(gnUniformPool pool, const gnUniformLayout layout) { - return pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, layout); + gnUniform* uniforms = pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, layout); + for (int i = 0; i < layout.uniformBindingCount; i++) + uniforms[i]->pool = pool; + return uniforms; } void gnDestroyUniformPool(gnUniformPool pool) {