Files
Itemzflow/itemzflow/source/shader_common.cpp
T
LightningMods 36ca31d21b ItemzCore version: 1.4-V-2024-01-23T18:42:41
- Fixed dumping DLCs and AC w/p data
- Added an Install all PKGs option for folders with more than 1 PKG
- Installing a PKG will no longer boot you back to settings
- Carried over some improvements from the PS5 version of IF
- Replaced reg. vectors for ThreadSafeVectors
- Added the Chinese lang files
- Fixed a bug that would cause the Utility thread to deadlock
- Fixed a Bug that caused the daemon not to give a backtrace on 9.00
2024-01-23 18:56:00 -05:00

86 lines
2.6 KiB
C++

/*
shader_common.c
GLES2 shaders facilities about loading and building shaders
2019-21, masterzorag
*/
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <unistd.h> // sleep
#include "defines.h"
GLuint create_vbo(const GLsizeiptr size, const GLvoid* data, const GLenum usage)
{
assert(data != NULL);
GLuint vbo_object;
glGenBuffers(1, &vbo_object);
assert(vbo_object != 0);
glBindBuffer(GL_ARRAY_BUFFER, vbo_object);
glBufferData(GL_ARRAY_BUFFER, size, data, usage);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return vbo_object;
}
static GLuint LinkProgram(GLuint vertexShader, GLuint fragmentShader)
{
GLuint programHandle = glCreateProgram();
glAttachShader(programHandle, vertexShader);
glAttachShader(programHandle, fragmentShader);
glLinkProgram(programHandle);
GLint linkSuccess;
glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE)
{
log_error("GL_LINK_STATUS error!"); programHandle = 0;
}
/* once we have the SL porgram, don't leak any shader! */
if (vertexShader) { glDeleteShader(vertexShader), vertexShader = 0; }
if (fragmentShader) { glDeleteShader(fragmentShader), fragmentShader = 0; }
return programHandle;
}
static GLuint compile(GLenum type, const char* source, int size) {
GLint compile_result;
GLchar msg[512];
GLuint handle = glCreateShader(type);
if (!handle) {
log_error("GLShader::compile: glCreateShader failed (%s) %i", type == GL_VERTEX_SHADER ? "vertex" : "fragment", glGetError());
return GL_FALSE;
}
if (size > 0) {
log_info("compile: glShaderBinary: type: %s, handle = %i, size = %i", type == GL_VERTEX_SHADER ? "vertex" : "fragment", handle, size);
glShaderBinary(1, &handle, 0, (const GLvoid*)source, size);
}
else {
log_info("compile: glShaderSource: type: %s, handle = %i, size = %i", type == GL_VERTEX_SHADER ? "vertex" : "fragment", handle, strlen(source));
glShaderSource(handle, 1, &source, 0);
glCompileShader(handle);
}
glGetShaderiv(handle, GL_COMPILE_STATUS, &compile_result);
if (compile_result == GL_FALSE) {
glGetShaderInfoLog(handle, sizeof(msg), NULL, msg);
log_info("GLShader::compile: %u: %s", type, msg);
glDeleteShader(handle);
return GL_FALSE;
}
return handle;
}
GLuint BuildProgram(const char* vShader, const char* fShader, int vs_size, int fs_size)
{
return LinkProgram(compile(GL_VERTEX_SHADER, vShader, vs_size), compile(GL_FRAGMENT_SHADER, fShader, fs_size));
}