mirror of
https://github.com/libretro/cpp-cheat.git
synced 2025-04-15 01:30:01 +00:00
147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
#ifndef COMMON_H
|
|
#define COMMON_H
|
|
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
#define GLEW_STATIC
|
|
#include <GL/glew.h>
|
|
#include <GLFW/glfw3.h>
|
|
|
|
#include "common_texture.h"
|
|
|
|
/* FPS. */
|
|
static unsigned long common_fps_last_time_nanos;
|
|
static unsigned long common_get_nanos(void) {
|
|
struct timespec ts;
|
|
timespec_get(&ts, TIME_UTC);
|
|
return (long)ts.tv_sec * 1000000000L + ts.tv_nsec;
|
|
}
|
|
static void common_fps_init() {
|
|
common_fps_last_time_nanos = common_get_nanos();
|
|
}
|
|
static void common_fps_print() {
|
|
unsigned long t;
|
|
unsigned long dt;
|
|
static unsigned long nframes = 0;
|
|
nframes++;
|
|
t = common_get_nanos();
|
|
dt = t - common_fps_last_time_nanos;
|
|
if (dt > 250000000) {
|
|
printf("FPS = %f\n", (nframes / (dt / 1000000000.0)));
|
|
common_fps_last_time_nanos = t;
|
|
nframes = 0;
|
|
}
|
|
}
|
|
|
|
/* Build and compile shader program, return its ID. */
|
|
GLuint common_get_shader_program(
|
|
const char *vertex_shader_source,
|
|
const char *fragment_shader_source
|
|
) {
|
|
GLchar *log = NULL;
|
|
GLint log_length, success;
|
|
GLuint fragment_shader, program, vertex_shader;
|
|
|
|
/* Vertex shader */
|
|
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
|
|
glCompileShader(vertex_shader);
|
|
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
|
|
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &log_length);
|
|
log = malloc(log_length);
|
|
if (log_length > 0) {
|
|
glGetShaderInfoLog(vertex_shader, log_length, NULL, log);
|
|
printf("vertex shader log:\n\n%s\n", log);
|
|
}
|
|
if (!success) {
|
|
printf("vertex shader compile error\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Fragment shader */
|
|
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
|
|
glCompileShader(fragment_shader);
|
|
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
|
|
glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &log_length);
|
|
if (log_length > 0) {
|
|
log = realloc(log, log_length);
|
|
glGetShaderInfoLog(fragment_shader, log_length, NULL, log);
|
|
printf("fragment shader log:\n\n%s\n", log);
|
|
}
|
|
if (!success) {
|
|
printf("fragment shader compile error\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Link shaders */
|
|
program = glCreateProgram();
|
|
glAttachShader(program, vertex_shader);
|
|
glAttachShader(program, fragment_shader);
|
|
glLinkProgram(program);
|
|
glGetProgramiv(program, GL_LINK_STATUS, &success);
|
|
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_length);
|
|
if (log_length > 0) {
|
|
log = realloc(log, log_length);
|
|
glGetProgramInfoLog(program, log_length, NULL, log);
|
|
printf("shader link log:\n\n%s\n", log);
|
|
}
|
|
if (!success) {
|
|
printf("shader link error");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Cleanup. */
|
|
free(log);
|
|
glDeleteShader(vertex_shader);
|
|
glDeleteShader(fragment_shader);
|
|
return program;
|
|
}
|
|
|
|
GLuint common_get_compute_program(const char *source) {
|
|
GLchar *log = NULL;
|
|
GLint log_length, success;
|
|
GLuint program, shader;
|
|
|
|
/* Shader. */
|
|
shader = glCreateShader(GL_COMPUTE_SHADER);
|
|
glShaderSource(shader, 1, &source, NULL);
|
|
glCompileShader(shader);
|
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
|
|
log = malloc(log_length);
|
|
if (log_length > 0) {
|
|
glGetShaderInfoLog(shader, log_length, NULL, log);
|
|
printf("shader log:\n\n%s\n", log);
|
|
}
|
|
if (!success) {
|
|
printf("error: shader compile\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* Program. */
|
|
program = glCreateProgram();
|
|
glAttachShader(program, shader);
|
|
glLinkProgram(program);
|
|
glGetProgramiv(program, GL_LINK_STATUS, &success);
|
|
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_length);
|
|
if (log_length > 0) {
|
|
log = realloc(log, log_length);
|
|
glGetProgramInfoLog(program, log_length, NULL, log);
|
|
printf("shader link log:\n\n%s\n", log);
|
|
}
|
|
if (!success) {
|
|
printf("shader link error");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
free(log);
|
|
glDeleteShader(shader);
|
|
return program;
|
|
}
|
|
|
|
#endif
|