From 9d4dfd85fcf0e7c937eb2c10d1d0af5b80b14f17 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Tue, 12 Aug 2025 22:49:23 -0400 Subject: [PATCH] finish OpenGL shader creation --- .../opengl/src/shaders/opengl_shader_module.c | 27 +++++++++++++++++++ .../opengl/src/shaders/opengl_shader_module.h | 1 + 2 files changed, 28 insertions(+) diff --git a/projects/apis/opengl/src/shaders/opengl_shader_module.c b/projects/apis/opengl/src/shaders/opengl_shader_module.c index f3253ba..fa22e91 100644 --- a/projects/apis/opengl/src/shaders/opengl_shader_module.c +++ b/projects/apis/opengl/src/shaders/opengl_shader_module.c @@ -1,7 +1,17 @@ #include "opengl_shader_module.h" #include "opengl_shader_compiler.h" +#include "output_device/gryphn_output_device.h" +#include "instance/gryphn_instance.h" #include "stdlib.h" +GLenum gnShaderTypeToGLEnum(gnShaderModuleStage stage) { + switch (stage) { + case GN_VERTEX_SHADER_MODULE: return GL_VERTEX_SHADER; + case GN_FRAGMENT_SHADER_MODULE: return GL_FRAGMENT_SHADER; + case GN_ALL_SHADER_MODULE: return GL_VERTEX_SHADER | GL_FRAGMENT_SHADER; + } +} + gnReturnCode openglCreateShaderModule(gnShaderModule module, gnDevice device, gnShaderModuleInfo shaderModuleInfo) { module->shaderModule = malloc(sizeof(gnPlatformShaderModule)); glCompilerInfo info = { @@ -12,8 +22,25 @@ gnReturnCode openglCreateShaderModule(gnShaderModule module, gnDevice device, gn glCompiler compiler = glCreateCompiler(&info); module->shaderModule->shader = glCompilerCompilerShader(compiler); glDestroyCompiler(compiler); + + module->shaderModule->id = glCreateShader(gnShaderTypeToGLEnum(shaderModuleInfo.stage)); + const char* source = module->shaderModule->shader.source; + glShaderSource(module->shaderModule->id, 1, &source, NULL); + glCompileShader(module->shaderModule->id); + + GLint returnCode; + glGetShaderiv(module->shaderModule->id, GL_COMPILE_STATUS, &returnCode); + if(!returnCode) { + char infoLog[512]; + glGetShaderInfoLog(module->shaderModule->id, 512, NULL, infoLog); + gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){ + .message = gnCreateString(infoLog) + }); + } + return GN_SUCCESS; } void openglDestroyShaderModule(gnShaderModule module) { + glDeleteShader(module->shaderModule->id); free(module->shaderModule); } diff --git a/projects/apis/opengl/src/shaders/opengl_shader_module.h b/projects/apis/opengl/src/shaders/opengl_shader_module.h index 4b2c54b..ec26027 100644 --- a/projects/apis/opengl/src/shaders/opengl_shader_module.h +++ b/projects/apis/opengl/src/shaders/opengl_shader_module.h @@ -4,6 +4,7 @@ typedef struct gnPlatformShaderModule_t { glShader shader; + GLuint id; } gnPlatformShaderModule; gnReturnCode openglCreateShaderModule(gnShaderModule module, gnDevice device, gnShaderModuleInfo shaderModuleInfo);