53 lines
2.6 KiB
C
53 lines
2.6 KiB
C
#include "opengl_graphics_pipeline.h"
|
|
#include "shaders/opengl_shader_module.h"
|
|
#include "core/src/instance/gryphn_instance.h"
|
|
|
|
#include "stdio.h"
|
|
|
|
gnReturnCode openglCreateGraphicsPipeline(gnGraphicsPipeline graphicsPipeline, gnOutputDevice device, gnGraphicsPipelineInfo info) {
|
|
graphicsPipeline->graphicsPipeline = malloc(sizeof(gnPlatformGraphicsPipeline));
|
|
graphicsPipeline->graphicsPipeline->program = glCreateProgram();
|
|
for (int i = 0; i < info.shaderModuleCount; i++)
|
|
glAttachShader(graphicsPipeline->graphicsPipeline->program, info.shaderModules[i]->shaderModule->id);
|
|
glLinkProgram(graphicsPipeline->graphicsPipeline->program);
|
|
GLint linked;
|
|
glGetProgramiv(graphicsPipeline->graphicsPipeline->program, GL_LINK_STATUS, &linked);
|
|
if (!linked) {
|
|
GLchar infoLog[512];
|
|
glGetProgramInfoLog(graphicsPipeline->graphicsPipeline->program, 512, NULL, infoLog);
|
|
gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){
|
|
.message = gnCreateString(infoLog)
|
|
});
|
|
} else {
|
|
gnDebuggerSetVerboseMessage(&device->instance->debugger, (gnMessageData){
|
|
.message = gnCreateString("Successfully linked program")
|
|
});
|
|
}
|
|
|
|
glCreateVertexArrays(1, &graphicsPipeline->graphicsPipeline->vertexArrayObject);
|
|
|
|
glVertexArrayAttribFormat(graphicsPipeline->graphicsPipeline->vertexArrayObject, 0, 3, GL_FLOAT, GL_FALSE, 0);
|
|
glVertexArrayAttribBinding(graphicsPipeline->graphicsPipeline->vertexArrayObject, 0, 0);
|
|
|
|
// Attribute 1: texcoord (2 floats)
|
|
glVertexArrayAttribFormat(graphicsPipeline->graphicsPipeline->vertexArrayObject, 1, 2, GL_FLOAT, GL_FALSE, sizeof(float)*3);
|
|
glVertexArrayAttribBinding(graphicsPipeline->graphicsPipeline->vertexArrayObject, 1, 0);
|
|
|
|
// Attribute 2: color (3 floats)
|
|
glVertexArrayAttribFormat(graphicsPipeline->graphicsPipeline->vertexArrayObject, 2, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5);
|
|
glVertexArrayAttribBinding(graphicsPipeline->graphicsPipeline->vertexArrayObject, 2, 0);
|
|
|
|
graphicsPipeline->graphicsPipeline->stride = (sizeof(float) * 8);
|
|
|
|
// Enable them
|
|
glEnableVertexArrayAttrib(graphicsPipeline->graphicsPipeline->vertexArrayObject, 0);
|
|
glEnableVertexArrayAttrib(graphicsPipeline->graphicsPipeline->vertexArrayObject, 1);
|
|
glEnableVertexArrayAttrib(graphicsPipeline->graphicsPipeline->vertexArrayObject, 2);
|
|
|
|
return GN_SUCCESS;
|
|
}
|
|
void openglDestroyGraphicsPipeline(gnGraphicsPipeline graphicsPipeline) {
|
|
glDeleteProgram(graphicsPipeline->graphicsPipeline->program);
|
|
free(graphicsPipeline->graphicsPipeline);
|
|
}
|