reuse command buffers flag

This commit is contained in:
Greg Wells
2025-07-02 09:12:33 -04:00
parent 9c154c1eeb
commit a74dd63786
21 changed files with 51 additions and 11 deletions

View File

@@ -8,6 +8,7 @@ gnCommandFunctions loadMetalCommandFunctions() {
._gnBeginCommandBuffer = beginMetalCommandBuffer, ._gnBeginCommandBuffer = beginMetalCommandBuffer,
._gnResetCommandBuffer = resetMetalCommandBuffer, ._gnResetCommandBuffer = resetMetalCommandBuffer,
._gnEndCommandBuffer = endMetalCommandBuffer, ._gnEndCommandBuffer = endMetalCommandBuffer,
._gnDestroyCommandBuffer = destroyMetalCommandBuffer,
._gnCommandBeginRenderPass = metelBeginRenderPass, ._gnCommandBeginRenderPass = metelBeginRenderPass,
._gnCommandEndRenderPass = endMetalRenderPass, ._gnCommandEndRenderPass = endMetalRenderPass,

View File

@@ -5,7 +5,9 @@
#import <Metal/MTLCommandEncoder.h> #import <Metal/MTLCommandEncoder.h>
typedef struct gnPlatformCommandBuffer_t { typedef struct gnPlatformCommandBuffer_t {
gnBool isIndirectCommandBuffer;
id<MTLCommandBuffer> commandBuffer; id<MTLCommandBuffer> commandBuffer;
id<MTLCommandEncoder> encoder; id<MTLCommandEncoder> encoder;
gnGraphicsPipeline boundGraphcisPipeline; gnGraphicsPipeline boundGraphcisPipeline;
gnBufferHandle indexBuffer; gnBufferHandle indexBuffer;
@@ -13,5 +15,7 @@ typedef struct gnPlatformCommandBuffer_t {
gnReturnCode allocateMetalCommandBuffers(gnCommandBufferHandle* commandBuffers, uint32_t count, gnCommandPool pool); gnReturnCode allocateMetalCommandBuffers(gnCommandBufferHandle* commandBuffers, uint32_t count, gnCommandPool pool);
void resetMetalCommandBuffer(gnCommandBuffer commandBuffer); void resetMetalCommandBuffer(gnCommandBuffer commandBuffer);
void resetMetalCommandBuffer_validated(gnCommandBuffer commandBuffer);
gnReturnCode beginMetalCommandBuffer(gnCommandBuffer commandBuffer); gnReturnCode beginMetalCommandBuffer(gnCommandBuffer commandBuffer);
gnReturnCode endMetalCommandBuffer(gnCommandBuffer commandBuffer); gnReturnCode endMetalCommandBuffer(gnCommandBuffer commandBuffer);
void destroyMetalCommandBuffer(gnCommandBuffer commandBuffer);

View File

@@ -1,15 +1,24 @@
#include "metal_command_buffer.h" #include "metal_command_buffer.h"
#include "commands/command_pool/metal_command_pool.h" #include "commands/command_pool/metal_command_pool.h"
#include "debugger/gryphn_debugger.h"
#include "instance/gryphn_instance.h"
#import <Metal/Metal.h> #import <Metal/Metal.h>
gnReturnCode allocateMetalCommandBuffers(gnCommandBufferHandle* commandBuffers, uint32_t count, gnCommandPool pool) { gnReturnCode allocateMetalCommandBuffers(gnCommandBufferHandle* commandBuffers, uint32_t count, gnCommandPool pool) {
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
commandBuffers[i]->commandBuffer = malloc(sizeof(gnPlatformCommandBuffer)); } commandBuffers[i]->commandBuffer = malloc(sizeof(gnPlatformCommandBuffer));
commandBuffers[i]->commandBuffer->commandBuffer = [pool->commandPool->commandQueue commandBuffer];
// write a command log at some point
if ((pool->info.flags & GN_REUSE_COMMAND_BUFFERS) == GN_REUSE_COMMAND_BUFFERS)
commandBuffers[i]->commandBuffer->isIndirectCommandBuffer = gnTrue;
}
return GN_SUCCESS; return GN_SUCCESS;
} }
void resetMetalCommandBuffer(gnCommandBuffer commandBuffer) { void resetMetalCommandBuffer(gnCommandBuffer commandBuffer) {
commandBuffer->commandBuffer->commandBuffer = [commandBuffer->commandPool->commandPool->commandQueue commandBuffer]; if (commandBuffer->commandBuffer->isIndirectCommandBuffer)
commandBuffer->commandBuffer->commandBuffer = [commandBuffer->commandPool->commandPool->commandQueue commandBuffer];
} }
gnReturnCode beginMetalCommandBuffer(gnCommandBuffer commandBuffer) { gnReturnCode beginMetalCommandBuffer(gnCommandBuffer commandBuffer) {
commandBuffer->commandBuffer->boundGraphcisPipeline = NULL; commandBuffer->commandBuffer->boundGraphcisPipeline = NULL;
@@ -17,7 +26,8 @@ gnReturnCode beginMetalCommandBuffer(gnCommandBuffer commandBuffer) {
return GN_SUCCESS; return GN_SUCCESS;
} }
gnReturnCode endMetalCommandBuffer(gnCommandBuffer commandBuffer) { gnReturnCode endMetalCommandBuffer(gnCommandBuffer commandBuffer) { return GN_SUCCESS; }
// [commandBuffer->commandBuffer->commandBuffer commit];
return GN_SUCCESS; void destroyMetalCommandBuffer(gnCommandBuffer commandBuffer) {
[commandBuffer->commandBuffer->commandBuffer release];
} }

View File

@@ -53,9 +53,8 @@ gnReturnCode createMetalFramebuffer(gnFramebuffer framebuffer, gnOutputDevice de
wasDepthStencil = gnTrue; wasDepthStencil = gnTrue;
} }
if (isStencilFormat(info.renderPassDescriptor->info.attachmentInfos[i].format)) { if (isStencilFormat(info.renderPassDescriptor->info.attachmentInfos[i].format)) {
gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){ MTLRenderPassStencilAttachmentDescriptor* stencilAttachment = framebuffer->framebuffer->framebuffer.stencilAttachment;
.message = gnCreateString("Stencil attachments are not currently supported in metal (get on this)") stencilAttachment.texture = info.attachments[i]->texture->texture;
});
wasDepthStencil = gnTrue; wasDepthStencil = gnTrue;
} }

View File

@@ -8,6 +8,7 @@ gnCommandFunctions loadVulkanCommandFunctions() {
._gnBeginCommandBuffer = beginCommandBuffer, ._gnBeginCommandBuffer = beginCommandBuffer,
._gnResetCommandBuffer = resetCommandBuffer, ._gnResetCommandBuffer = resetCommandBuffer,
._gnEndCommandBuffer = endCommandBuffer, ._gnEndCommandBuffer = endCommandBuffer,
._gnDestroyCommandBuffer = destroyVulkanCommandBuffer,
._gnCommandBeginRenderPass = beginRenderPass, ._gnCommandBeginRenderPass = beginRenderPass,
._gnCommandEndRenderPass = endRenderPass, ._gnCommandEndRenderPass = endRenderPass,

View File

@@ -78,3 +78,7 @@ void VkEndTransferOperation(VkCommandBuffer transferBuffer, VkCommandPool pool,
vkQueueWaitIdle(syncQueue); vkQueueWaitIdle(syncQueue);
vkFreeCommandBuffers(device, pool, 1, &transferBuffer); vkFreeCommandBuffers(device, pool, 1, &transferBuffer);
} }
void destroyVulkanCommandBuffer(gnCommandBufferHandle commandBuffer) {
vkFreeCommandBuffers(commandBuffer->commandPool->device->outputDevice->device, commandBuffer->commandPool->commandPool->commandPool, 1, &commandBuffer->commandBuffer->buffer);
}

View File

@@ -19,3 +19,4 @@ gnReturnCode allocateCommandBuffers(gnCommandBufferHandle* commandBuffers, uint3
gnReturnCode beginCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode beginCommandBuffer(gnCommandBufferHandle commandBuffer);
void resetCommandBuffer(gnCommandBufferHandle commandBuffer); void resetCommandBuffer(gnCommandBufferHandle commandBuffer);
gnReturnCode endCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode endCommandBuffer(gnCommandBufferHandle commandBuffer);
void destroyVulkanCommandBuffer(gnCommandBufferHandle commandBuffer);

View File

@@ -30,3 +30,7 @@ gnReturnCode gnBeginCommandBuffer(gnCommandBufferHandle commandBuffer) {
gnReturnCode gnEndCommandBuffer(gnCommandBufferHandle commandBuffer) { gnReturnCode gnEndCommandBuffer(gnCommandBufferHandle commandBuffer) {
return commandBuffer->commandPool->instance->callingLayer->commandFunctions._gnEndCommandBuffer(commandBuffer); return commandBuffer->commandPool->instance->callingLayer->commandFunctions._gnEndCommandBuffer(commandBuffer);
} }
void gnDestroyCommandBuffer(gnCommandBufferHandle commandBuffer) {
commandBuffer->commandPool->instance->callingLayer->commandFunctions._gnDestroyCommandBuffer(commandBuffer);
}

View File

@@ -27,3 +27,4 @@ gnReturnCode gnCommandPoolAllocateCommandBuffersFromList(gnCommandBufferArrayLis
void gnResetCommandBuffer(gnCommandBufferHandle commandBuffer); void gnResetCommandBuffer(gnCommandBufferHandle commandBuffer);
gnReturnCode gnBeginCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode gnBeginCommandBuffer(gnCommandBufferHandle commandBuffer);
gnReturnCode gnEndCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode gnEndCommandBuffer(gnCommandBufferHandle commandBuffer);
void gnDestroyCommandBuffer(gnCommandBufferHandle commandBuffer);

View File

@@ -8,6 +8,7 @@ gnReturnCode gnCreateCommandPool(gnCommandPoolHandle* commandPool, gnOutputDevic
(*commandPool)->instance = device->instance; (*commandPool)->instance = device->instance;
(*commandPool)->device = device; (*commandPool)->device = device;
(*commandPool)->info = info;
return device->instance->callingLayer->deviceFunctions._gnCreateCommandPool((*commandPool), device, info); return device->instance->callingLayer->deviceFunctions._gnCreateCommandPool((*commandPool), device, info);
} }

View File

@@ -3,8 +3,14 @@
#include <utils/gryphn_error_code.h> #include <utils/gryphn_error_code.h>
#include "gryphn_handles.h" #include "gryphn_handles.h"
typedef enum gnCommandPoolFlags {
GN_NO_FLAGS = 0,
GN_REUSE_COMMAND_BUFFERS = 1
} gnCommandPoolFlags;
typedef struct gnCommandPoolInfo { typedef struct gnCommandPoolInfo {
uint32_t queueIndex; uint32_t queueIndex;
gnCommandPoolFlags flags;
} gnCommandPoolInfo; } gnCommandPoolInfo;
#ifdef GN_REVEAL_IMPL #ifdef GN_REVEAL_IMPL
@@ -12,6 +18,7 @@ struct gnCommandPool_t {
struct gnPlatformCommandPool_t* commandPool; struct gnPlatformCommandPool_t* commandPool;
gnDevice device; gnDevice device;
gnInstance instance; gnInstance instance;
gnCommandPoolInfo info;
}; };
#endif #endif

View File

@@ -15,6 +15,7 @@ typedef struct gnCommandFunctions_t {
gnReturnCode (*_gnBeginCommandBuffer)(gnCommandBufferHandle commandBuffer); gnReturnCode (*_gnBeginCommandBuffer)(gnCommandBufferHandle commandBuffer);
void (*_gnResetCommandBuffer)(gnCommandBufferHandle commandBuffer); void (*_gnResetCommandBuffer)(gnCommandBufferHandle commandBuffer);
gnReturnCode (*_gnEndCommandBuffer)(gnCommandBufferHandle commandBuffer); gnReturnCode (*_gnEndCommandBuffer)(gnCommandBufferHandle commandBuffer);
void (*_gnDestroyCommandBuffer)(gnCommandBufferHandle commandBuffer);
void (*_gnCommandBeginRenderPass)(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo); void (*_gnCommandBeginRenderPass)(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo);
void (*_gnCommandEndRenderPass)(gnCommandBufferHandle buffer); void (*_gnCommandEndRenderPass)(gnCommandBufferHandle buffer);

View File

@@ -8,3 +8,4 @@ target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE
target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../) target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../)
target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../core/src/) target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../core/src/)
target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../platform/) target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../platform/)
target_include_directories(GryphnFunctionValidator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/)

View File

@@ -1,7 +1,7 @@
#include "function_loader.h" #include "function_loader.h"
#include "instance_functions.h" #include "src/instance_functions.h"
#include "device_functions.h" #include "src/device_functions.h"
#include "command_functions.h" #include "src/command_functions.h"
gnInstanceFunctions loadFunctionLoaderInstanceFunctions() { gnInstanceFunctions loadFunctionLoaderInstanceFunctions() {
return (gnInstanceFunctions){ return (gnInstanceFunctions){
@@ -94,6 +94,7 @@ gnCommandFunctions loadFunctionLoaderCommandFunctions() {
._gnBeginCommandBuffer = checkBeginCommandBuffer, ._gnBeginCommandBuffer = checkBeginCommandBuffer,
._gnResetCommandBuffer = checkResetCommandBuffer, ._gnResetCommandBuffer = checkResetCommandBuffer,
._gnEndCommandBuffer = checkEndCommandBuffer, ._gnEndCommandBuffer = checkEndCommandBuffer,
._gnDestroyCommandBuffer = checkDestroyCommandBuffer,
._gnCommandBeginRenderPass = checkCommandBeginRenderPass, ._gnCommandBeginRenderPass = checkCommandBeginRenderPass,
._gnCommandEndRenderPass = checkCommandEndRenderPass, ._gnCommandEndRenderPass = checkCommandEndRenderPass,

View File

@@ -21,6 +21,9 @@ void checkResetCommandBuffer(gnCommandBufferHandle commandBuffer) {
gnReturnCode checkEndCommandBuffer(gnCommandBufferHandle commandBuffer) { gnReturnCode checkEndCommandBuffer(gnCommandBufferHandle commandBuffer) {
CHECK_FUNCTION_WITH_RETURN_CODE_COMMAND(commandBuffer->instance, _gnEndCommandBuffer, commandBuffer); CHECK_FUNCTION_WITH_RETURN_CODE_COMMAND(commandBuffer->instance, _gnEndCommandBuffer, commandBuffer);
} }
void checkDestroyCommandBuffer(gnCommandBufferHandle buffer) {
CHECK_VOID_FUNCTION_COMMAND(buffer->instance, _gnDestroyCommandBuffer, buffer);
}
void checkCommandBeginRenderPass(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo) { void checkCommandBeginRenderPass(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo) {
CHECK_VOID_FUNCTION_COMMAND(buffer->instance, _gnCommandBeginRenderPass, buffer, passInfo); CHECK_VOID_FUNCTION_COMMAND(buffer->instance, _gnCommandBeginRenderPass, buffer, passInfo);

View File

@@ -4,6 +4,7 @@ gnReturnCode checkCommandPoolAllocateCommandBuffers(gnCommandBufferHandle* comma
gnReturnCode checkBeginCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode checkBeginCommandBuffer(gnCommandBufferHandle commandBuffer);
void checkResetCommandBuffer(gnCommandBufferHandle commandBuffer); void checkResetCommandBuffer(gnCommandBufferHandle commandBuffer);
gnReturnCode checkEndCommandBuffer(gnCommandBufferHandle commandBuffer); gnReturnCode checkEndCommandBuffer(gnCommandBufferHandle commandBuffer);
void checkDestroyCommandBuffer(gnCommandBufferHandle commandBuffer);
void checkCommandBeginRenderPass(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo); void checkCommandBeginRenderPass(gnCommandBufferHandle buffer, gnRenderPassInfo passInfo);
void checkCommandEndRenderPass(gnCommandBufferHandle buffer); void checkCommandEndRenderPass(gnCommandBufferHandle buffer);