diff --git a/projects/apis/opengl/src/commands/buffers/opengl_command_buffer.c b/projects/apis/opengl/src/commands/buffers/opengl_command_buffer.c index 62a604c..a0bea22 100644 --- a/projects/apis/opengl/src/commands/buffers/opengl_command_buffer.c +++ b/projects/apis/opengl/src/commands/buffers/opengl_command_buffer.c @@ -8,6 +8,7 @@ gnReturnCode openglCommandPoolAllocateCommandBuffers(gnCommandBufferHandle* comm if (pool->commandPool->canBeReallocated[c] == GN_TRUE) { pool->commandPool->canBeReallocated[c] = GN_FALSE; commandBuffers[i]->commandBuffer = &pool->commandPool->commandBuffers[c]; + commandBuffers[i]->commandBuffer->commmandRunner = openglCreateCommandRunner(); wasAbleToAllocate = GN_TRUE; break; } @@ -21,18 +22,15 @@ gnReturnCode openglCommandPoolAllocateCommandBuffers(gnCommandBufferHandle* comm return GN_SUCCESS; } -void openglResetCommandBuffer(gnCommandBuffer commandBuffer) { - // commandBuffer->commandBuffer-> - // nothing, for now command buffers are implictly reset on begin -} +void openglResetCommandBuffer(gnCommandBuffer commandBuffer) { /* nothing, for now command buffers are implictly reset on begin */ } gnReturnCode openglBeginCommandBuffer(gnCommandBuffer commandBuffer) { - commandBuffer->commandBuffer->commmandRunner = openglCreateCommandRunner(); + openglResetCommandRunner(commandBuffer->commandBuffer->commmandRunner); return GN_SUCCESS; } gnReturnCode openglEndCommandBuffer(gnCommandBuffer commandBuffer) { - openglDestroyCommandRunner(commandBuffer->commandBuffer->commmandRunner); return GN_SUCCESS; } void openglDestroyCommandBuffer(gnCommandBuffer commandBuffer) { commandBuffer->commandPool->commandPool->canBeReallocated[commandBuffer->commandBuffer->index] = GN_TRUE; + openglDestroyCommandRunner(&commandBuffer->commandBuffer->commmandRunner); } diff --git a/projects/apis/opengl/src/commands/commands/opengl_command_runner.cpp b/projects/apis/opengl/src/commands/commands/opengl_command_runner.cpp index 5774670..126b93c 100644 --- a/projects/apis/opengl/src/commands/commands/opengl_command_runner.cpp +++ b/projects/apis/opengl/src/commands/commands/opengl_command_runner.cpp @@ -1,8 +1,15 @@ #include "opengl_command_runner.h" +#include "vector" typedef struct openglCommandRunner_t { - + std::vector commands = {}; } glCommandRunner; GN_CPP_FUNCTION openglCommandRunner openglCreateCommandRunner() { return new glCommandRunner(); } -GN_CPP_FUNCTION void openglDestroyCommandRunner(openglCommandRunner runner) { delete runner; } +GN_CPP_FUNCTION void openglResetCommandRunner(openglCommandRunner runner) { runner->commands.clear(); } +GN_CPP_FUNCTION void openglDestroyCommandRunner(openglCommandRunner* runner) { + *runner = NULL; + delete runner; +} + +void openglCommandRunnerBindFunction(openglCommandRunner runner, openglFunctionBinding binding) { runner->commands.push_back(binding); } diff --git a/projects/apis/opengl/src/commands/commands/opengl_command_runner.h b/projects/apis/opengl/src/commands/commands/opengl_command_runner.h index 52e264e..4786f7d 100644 --- a/projects/apis/opengl/src/commands/commands/opengl_command_runner.h +++ b/projects/apis/opengl/src/commands/commands/opengl_command_runner.h @@ -1,6 +1,10 @@ #pragma once #include "utils/gryphn_cpp_function.h" typedef struct openglCommandRunner_t* openglCommandRunner; +typedef void (*openglFunctionBinding)(); GN_CPP_FUNCTION openglCommandRunner openglCreateCommandRunner(); -GN_CPP_FUNCTION void openglDestroyCommandRunner(openglCommandRunner runner); +GN_CPP_FUNCTION void openglResetCommandRunner(openglCommandRunner runner); +GN_CPP_FUNCTION void openglDestroyCommandRunner(openglCommandRunner* runner); + +void openglCommandRunnerBindFunction(openglCommandRunner runner, openglFunctionBinding binding); diff --git a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp index 367399c..caf29d9 100644 --- a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp +++ b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp @@ -1,8 +1,15 @@ #include "glad/glad.h" #include "opengl_commands.h" +#include "opengl_command_runner.h" +#include "commands/buffers/opengl_command_buffer.h" +#include "stdio.h" // #include "framebuffer/opengl_framebuffer.h" GN_CPP_FUNCTION void openglBeginRenderPass(gnCommandBuffer buffer, gnRenderPassInfo passInfo) { + openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, []{ + printf("Calling func: %s\n", "Begin Render Pass"); + }); + // glBindFramebuffer(GL_FRAMEBUFFER, passInfo.framebuffer->framebuffer->framebuffers[0]); // glClearColor(passInfo.clearValues[0].r, passInfo.clearValues[0].g, passInfo.clearValues[0].b, passInfo.clearValues[0].a); // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -10,6 +17,10 @@ GN_CPP_FUNCTION void openglBeginRenderPass(gnCommandBuffer buffer, gnRenderPassI // glViewport(passInfo.offset.x, passInfo.offset.y, passInfo.size.x, passInfo.size.y); } GN_CPP_FUNCTION void openglEndRenderPass(gnCommandBuffer buffer) { + openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, []{ + printf("Calling func: %s\n", "End Render Pass"); + }); + // glBindFramebuffer(GL_FRAMEBUFFER, 0); } GN_CPP_FUNCTION void openglBindGraphicsPipeline(gnCommandBuffer buffer, gnGraphicsPipeline graphicsPipeline);