diff --git a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp index cabcd03..baec17e 100644 --- a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp +++ b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp @@ -50,11 +50,18 @@ GN_CPP_FUNCTION void openglBindGraphicsPipeline(gnCommandBuffer commandBuffer, g glUseProgram(buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->program); })); } -GN_CPP_FUNCTION void openglSetViewport(gnCommandBuffer buffer, gnViewport viewport) { - +GN_CPP_FUNCTION void openglSetViewport(gnCommandBuffer buffer, gnViewport sViewport) { + gnViewport viewport = sViewport; + openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, std::function([viewport]{ + glViewport(viewport.position.x, viewport.position.y, viewport.size.x, viewport.size.y); + glDepthRange(viewport.minDepth, viewport.maxDepth); + })); } -GN_CPP_FUNCTION void openglSetScissor(gnCommandBuffer buffer, gnScissor scissor) { - +GN_CPP_FUNCTION void openglSetScissor(gnCommandBuffer buffer, gnScissor sScissor) { + gnScissor scissor = sScissor; + openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, std::function([scissor]{ + glScissor(scissor.position.x, scissor.position.y, scissor.size.x, scissor.size.y); + })); } GN_CPP_FUNCTION void openglBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) { gnBufferType bType = type; @@ -121,6 +128,18 @@ GN_CPP_FUNCTION void openglBindUniform(gnCommandBufferHandle sBuffer, gnUniform } })); } -GN_CPP_FUNCTION void openglPushConstant(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data) { +// #include "stdio.h" +GN_CPP_FUNCTION void openglPushConstant(gnCommandBufferHandle sBuffer, gnPushConstantLayout sLayout, void* sData) { + // gnCommandBufferHandle buffer = sBuffer; + // // gnPushConstantLayout layout = sLayout; + // // void* data = malloc(sizeof(sLayout.size)); + // // memcpy(data, sData, sizeof(sLayout.size)); + // openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, std::function([buffer]{ + // //TODO: implement OpenGL push constants, its just hard because OpenGL is a bitch and i hate it + + // // GLint loc = glGetUniformLocation(buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->program, "gnPushConstantBlock"); + // // printf("member loc: %i\n", loc); + // // if (loc == -1) return; + // })); } diff --git a/projects/apis/opengl/src/device/opengl_physical_device.c b/projects/apis/opengl/src/device/opengl_physical_device.c index 4b62ab9..3e71011 100644 --- a/projects/apis/opengl/src/device/opengl_physical_device.c +++ b/projects/apis/opengl/src/device/opengl_physical_device.c @@ -12,7 +12,7 @@ gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCou .maxColorSamples = GN_SAMPLE_BIT_1, .maxDepthSamples = GN_SAMPLE_BIT_1, .maxMemoryAllocations = 0x40000000, - .maxPushConstantSize = 256 + .maxPushConstantSize = 0 }, .properties = { .deviceType = GN_DEDICATED_DEVICE, diff --git a/projects/apis/opengl/src/shaders/opengl_shader_compiler.cpp b/projects/apis/opengl/src/shaders/opengl_shader_compiler.cpp index 59bdbf1..712d453 100644 --- a/projects/apis/opengl/src/shaders/opengl_shader_compiler.cpp +++ b/projects/apis/opengl/src/shaders/opengl_shader_compiler.cpp @@ -1,12 +1,9 @@ #include "opengl_shader_compiler.h" #include "spirv_glsl.hpp" - typedef struct glCompiler_t { spirv_cross::CompilerGLSL* glsl; } glInternalCompiler; - - void handle_resources(spirv_cross::CompilerGLSL& compiler, spirv_cross::SmallVector& resources, glSet* setMap) { for (size_t i = 0; i < resources.size(); i++) { uint32_t @@ -40,6 +37,29 @@ GN_CPP_FUNCTION glShader glCompilerCompilerShader(glCompiler compiler, gnUniform handle_resources(*compiler->glsl, arg_buffers.storage_buffers, shader.sets); handle_resources(*compiler->glsl, arg_buffers.sampled_images, shader.sets); + // for (auto &pc : arg_buffers.push_constant_buffers) { + // compiler->glsl->set_name(pc.id, "gnPushConstantBlock"); + // auto type = compiler->glsl->get_type(pc.type_id); + // // printf("members: %lu\n", type.member_types.size()); + // for (uint32_t i = 0; i < type.member_types.size(); ++i) { + // // // std::string name = compiler->glsl->get_member_name(pc.type_id, i); + + // // compiler.set_member_name(push_constant_type_id, 0, "myMat4"); + // // compiler.set_member_name(push_constant_type_id, 1, "myVec3"); + // // compiler.set_member_name(push_constant_type_id, 2, "myInt"); + + // auto member_type = compiler->glsl->get_type(type.member_types[i]); + + // // // Example: check if it's a mat4, vec3, or int + // // if (member_type.columns == 4 && member_type.vecsize == 4) + // // printf("member %s: mat4\n", name.c_str()); + // // else if (member_type.vecsize == 3 && member_type.columns == 1) + // // printf("member %s: vec3\n", name.c_str()); + // // else if (member_type.basetype == spirv_cross::SPIRType::Int) + // // printf("member %s: int\n", name.c_str()); + // } + // } + std::string output = compiler->glsl->compile(); shader.source = (char*)malloc(sizeof(char*) * (output.size() + 1)); strcpy(shader.source, output.c_str());