gryphn+vulkan command buffers

This commit is contained in:
Greg Wells
2025-05-30 08:19:22 -04:00
parent 706b558684
commit f5ff90bc93
19 changed files with 254 additions and 37 deletions

View File

@@ -0,0 +1,41 @@
#include "vulkan_command_buffer.h"
#include "commands/command_pool/vulkan_command_pool.h"
#include "output_device/vulkan_output_devices.h"
gnReturnCode gnCommandPoolAllocateCommandBuffersFn(struct gnCommandBuffer_t* commandBuffers, uint32_t count, struct gnCommandPool_t* pool) {
VkCommandBufferAllocateInfo allocInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = pool->commandPool->commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = count,
};
VkCommandBuffer* buffers = malloc(sizeof(VkCommandBuffer) * count);
if (vkAllocateCommandBuffers(pool->device->outputDevice->device, &allocInfo, buffers) != VK_SUCCESS)
return GN_FAILED_TO_ALLOCATE_COMMAND_BUFFERS;
for (int i = 0; i < count; i++) {
commandBuffers[i].commandBuffer = malloc(sizeof(gnPlatformCommandBuffer));
commandBuffers[i].commandBuffer->buffer = buffers[i];
}
return GN_SUCCESS;
}
gnReturnCode gnBeginCommandBufferFn(struct gnCommandBuffer_t* commandBuffer) {
VkCommandBufferBeginInfo beginInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
};
if (vkBeginCommandBuffer(commandBuffer->commandBuffer->buffer, &beginInfo) != VK_SUCCESS) {
return GN_FAILED_TO_BEGIN_RECORDING;
}
return GN_SUCCESS;
}
gnReturnCode gnEndCommandBufferFn(struct gnCommandBuffer_t* commandBuffer) {
if (vkEndCommandBuffer(commandBuffer->commandBuffer->buffer) != VK_SUCCESS)
return GN_FAIELD_TO_END_RECORDING;
return GN_SUCCESS;
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include "core/command/command_buffer/gryphn_command_buffer.h"
#include <vulkan/vulkan.h>
typedef struct gnPlatformCommandBuffer_t {
VkCommandBuffer buffer;
} gnPlatformCommandBuffer;

View File

@@ -0,0 +1,59 @@
#include <vulkan/vulkan.h>
#include "core/command/commands/gryphn_command.h"
#include <renderpass/vulkan_render_pass_descriptor.h>
#include "framebuffers/vulkan_framebuffer.h"
#include "commands/command_buffer/vulkan_command_buffer.h"
#include "pipelines/graphics_pipeline/vulkan_graphics_pipeline.h"
void gnCommandBeginRenderPassFn(struct gnCommandBuffer_t* buffer, struct gnRenderPassInfo_t passInfo) {
VkClearValue* values = malloc(sizeof(VkClearValue) * passInfo.clearValueCount);
for (int i = 0; i < passInfo.clearValueCount; i++) {
values[i] = (VkClearValue){{{
passInfo.clearValues[i].red,
passInfo.clearValues[i].green,
passInfo.clearValues[i].blue,
passInfo.clearValues[i].alpha
}}};
}
VkRenderPassBeginInfo renderPassInfo ={
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
.renderPass = passInfo.renderPassDescriptor->renderPassDescriptor->renderPass,
.framebuffer = passInfo.framebuffer->framebuffer->framebuffer,
.renderArea = {
.extent = { passInfo.size.x, passInfo.size.y },
.offset = { passInfo.offset.x, passInfo.offset.x }
},
.clearValueCount = passInfo.clearValueCount,
.pClearValues = values
};
vkCmdBeginRenderPass(buffer->commandBuffer->buffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
}
void gnCommandEndRenderPassFn(struct gnCommandBuffer_t* buffer) {
vkCmdEndRenderPass(buffer->commandBuffer->buffer);
}
void gnCommandBindGraphicsPipelineFn(struct gnCommandBuffer_t* buffer, struct gnGraphicsPipeline_t* graphicsPipeline) {
vkCmdBindPipeline(buffer->commandBuffer->buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline->graphicsPipeline->graphicsPipeline);
}
void gnCommandSetViewportFn(struct gnCommandBuffer_t* buffer, struct gnViewport_t viewport) {
VkViewport vkViewport = {
.x = viewport.position.x,
.y = viewport.position.y,
.width = viewport.size.x,
.height = viewport.size.y,
.minDepth = viewport.minDepth,
.maxDepth = viewport.maxDepth
};
vkCmdSetViewport(buffer->commandBuffer->buffer, 0, 1, &vkViewport);
}
void gnCommandSetScissorFn(struct gnCommandBuffer_t* buffer, struct gnScissor_t scissor) {
VkRect2D vkScissor = {
.extent = { scissor.size.x, scissor.size.y },
.offset = { scissor.position.x, scissor.position.y }
};
vkCmdSetScissor(buffer->commandBuffer->buffer, 0, 1, &vkScissor);
}
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
vkCmdDraw(buffer->commandBuffer->buffer, vertexCount, instanceCount, firstVertex, firstInstance);
}