Files
2025-01-29 10:55:49 +01:00

87 lines
2.9 KiB
C

#include "vulkan.h"
#include <kinc/graphics5/constantbuffer.h>
bool memory_type_from_properties(uint32_t typeBits, VkFlags requirements_mask, uint32_t *typeIndex);
// VkBuffer *vk_ctx.vertex_uniform_buffer = NULL;
// VkBuffer *vk_ctx.fragment_uniform_buffer = NULL;
bool kinc_g5_transposeMat3 = true;
bool kinc_g5_transposeMat4 = true;
static void createUniformBuffer(VkBuffer *buf, VkMemoryAllocateInfo *mem_alloc, VkDeviceMemory *mem, VkDescriptorBufferInfo *buffer_info, int size) {
VkBufferCreateInfo buf_info;
memset(&buf_info, 0, sizeof(buf_info));
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
buf_info.size = size;
VkResult err = vkCreateBuffer(vk_ctx.device, &buf_info, NULL, buf);
assert(!err);
VkMemoryRequirements mem_reqs;
vkGetBufferMemoryRequirements(vk_ctx.device, *buf, &mem_reqs);
mem_alloc->sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
mem_alloc->pNext = NULL;
mem_alloc->allocationSize = mem_reqs.size;
mem_alloc->memoryTypeIndex = 0;
bool pass = memory_type_from_properties(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &mem_alloc->memoryTypeIndex);
assert(pass);
err = vkAllocateMemory(vk_ctx.device, mem_alloc, NULL, mem);
assert(!err);
err = vkBindBufferMemory(vk_ctx.device, *buf, *mem, 0);
assert(!err);
buffer_info->buffer = *buf;
buffer_info->offset = 0;
buffer_info->range = size;
}
void kinc_g5_constant_buffer_init(kinc_g5_constant_buffer_t *buffer, int size) {
buffer->impl.mySize = size;
buffer->data = NULL;
createUniformBuffer(&buffer->impl.buf, &buffer->impl.mem_alloc, &buffer->impl.mem, &buffer->impl.buffer_info, size);
// buffer hack
if (vk_ctx.vertex_uniform_buffer == NULL) {
vk_ctx.vertex_uniform_buffer = &buffer->impl.buf;
}
else if (vk_ctx.fragment_uniform_buffer == NULL) {
vk_ctx.fragment_uniform_buffer = &buffer->impl.buf;
}
void *p;
VkResult err = vkMapMemory(vk_ctx.device, buffer->impl.mem, 0, buffer->impl.mem_alloc.allocationSize, 0, (void **)&p);
assert(!err);
memset(p, 0, buffer->impl.mem_alloc.allocationSize);
vkUnmapMemory(vk_ctx.device, buffer->impl.mem);
}
void kinc_g5_constant_buffer_destroy(kinc_g5_constant_buffer_t *buffer) {
vkFreeMemory(vk_ctx.device, buffer->impl.mem, NULL);
vkDestroyBuffer(vk_ctx.device, buffer->impl.buf, NULL);
}
void kinc_g5_constant_buffer_lock_all(kinc_g5_constant_buffer_t *buffer) {
kinc_g5_constant_buffer_lock(buffer, 0, kinc_g5_constant_buffer_size(buffer));
}
void kinc_g5_constant_buffer_lock(kinc_g5_constant_buffer_t *buffer, int start, int count) {
VkResult err = vkMapMemory(vk_ctx.device, buffer->impl.mem, start, count, 0, (void **)&buffer->data);
assert(!err);
}
void kinc_g5_constant_buffer_unlock(kinc_g5_constant_buffer_t *buffer) {
vkUnmapMemory(vk_ctx.device, buffer->impl.mem);
buffer->data = NULL;
}
int kinc_g5_constant_buffer_size(kinc_g5_constant_buffer_t *buffer) {
return buffer->impl.mySize;
}