Finish OpenGL support

This commit is contained in:
Gregory Wells
2025-08-20 14:37:39 -04:00
parent 263a8e54fa
commit 4d904557d8
3 changed files with 48 additions and 9 deletions

View File

@@ -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<void()>([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<void()>([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<void()>([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;
// }));
}

View File

@@ -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,

View File

@@ -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<spirv_cross::Resource>& 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());