This commit is contained in:
Jeffrey Crowell 2022-05-19 03:13:16 -04:00
commit 91d89f75c5
3 changed files with 63 additions and 24 deletions

View file

@ -1,5 +1,7 @@
#include "../../Window.h"
#ifdef ENABLE_OPENGL
#endif
#if 1
#include <stdint.h>
#include <stdbool.h>
@ -68,6 +70,35 @@ struct Framebuffer {
GLuint fbo, clrbuf, clrbuf_msaa, rbo;
};
struct GLTexture {
GLuint gltex;
GLfloat size[2];
bool filter;
};
void CheckOpenGLError(const char* stmt, const char* fname, int line)
{
GLenum err = glGetError();
if (err != GL_NO_ERROR)
{
printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt);
abort();
}
}
#ifdef __APPLE__
#define GL_CHECK(stmt) do { \
stmt; \
CheckOpenGLError(#stmt, __FILE__, __LINE__); \
} while (0)
#else
#define GL_CHECK(stmt) stmt
#endif
static struct GLTexture opengl_tex[2];
static GLint opengl_curtex = 0;
static map<pair<uint64_t, uint32_t>, struct ShaderProgram> shader_program_pool;
static GLuint opengl_vbo;
static bool current_depth_mask;
@ -431,22 +462,22 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
vs_buf[vs_len] = '\0';
fs_buf[fs_len] = '\0';
/*
puts("Vertex shader:");
/*puts("Vertex shader:");
puts(vs_buf);
puts("Fragment shader:");
puts(fs_buf);
puts("End");
*/
puts("End");*/
const GLchar *sources[2] = { vs_buf, fs_buf };
const GLint lengths[2] = { (GLint) vs_len, (GLint) fs_len };
GLint success;
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &sources[0], &lengths[0]);
glCompileShader(vertex_shader);
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
GL_CHECK(glShaderSource(vertex_shader, 1, &sources[0], &lengths[0]));
GL_CHECK(glCompileShader(vertex_shader));
GL_CHECK(glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success));
if (!success) {
GLint max_length = 0;
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &max_length);
@ -458,12 +489,12 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
}
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &sources[1], &lengths[1]);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
GL_CHECK(glShaderSource(fragment_shader, 1, &sources[1], &lengths[1]));
GL_CHECK(glCompileShader(fragment_shader));
GL_CHECK(glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success));
if (!success) {
GLint max_length = 0;
glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &max_length);
GL_CHECK(glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &max_length));
char error_log[1024];
fprintf(stderr, "Fragment shader compilation failed\n");
glGetShaderInfoLog(fragment_shader, max_length, &max_length, &error_log[0]);
@ -472,9 +503,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
}
GLuint shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
GL_CHECK(glAttachShader(shader_program, vertex_shader));
GL_CHECK(glAttachShader(shader_program, fragment_shader));
GL_CHECK(glLinkProgram(shader_program));
size_t cnt = 0;
@ -535,13 +566,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
GLint sampler_location = glGetUniformLocation(shader_program, "uTex0");
GLint uniform_location_0 = glGetUniformLocation(shader_program, "texSize0");
glUniform1i(sampler_location, 0);
glUniform2f(uniform_location_0, 64.0,32.0);
glUniform2f(uniform_location_0, opengl_tex[0].size[0], opengl_tex[0].size[1]);
}
if (cc_features.used_textures[1]) {
GLint sampler_location = glGetUniformLocation(shader_program, "uTex1");
GLint sampler_location = glGetUniformLocation(shader_program, "uTex1");
GLint uniform_location_1 = glGetUniformLocation(shader_program, "texSize1");
glUniform1i(sampler_location, 1);
glUniform2f(uniform_location_1, 128.0,64.0);
GL_CHECK(glUniform1i(sampler_location, 1));
GL_CHECK(glUniform2f(uniform_location_1, opengl_tex[1].size[0], opengl_tex[1].size[1]));
}
if (cc_features.opt_alpha && cc_features.opt_noise) {
@ -567,6 +598,7 @@ static void gfx_opengl_shader_get_info(struct ShaderProgram *prg, uint8_t *num_i
}
static GLuint gfx_opengl_new_texture(void) {
GLuint ret;
glGenTextures(1, &ret);
return ret;
@ -577,10 +609,15 @@ static void gfx_opengl_delete_texture(uint32_t texID) {
}
static void gfx_opengl_select_texture(int tile, GLuint texture_id) {
//printf("CURTEX: %d\n", texture_id);
opengl_curtex = texture_id;
glActiveTexture(GL_TEXTURE0 + tile);
glBindTexture(GL_TEXTURE_2D, texture_id);
}
static void gfx_opengl_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) {
//printf("SHIT: texture %d: %d x %d\n", opengl_curtex, width, height);
opengl_tex[opengl_curtex].size[0] = width;
opengl_tex[opengl_curtex].size[1] = height;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf);
}
@ -600,7 +637,7 @@ static uint32_t gfx_cm_to_opengl(uint32_t val) {
static void gfx_opengl_set_sampler_parameters(int tile, bool linear_filter, uint32_t cms, uint32_t cmt) {
const GLint filter = linear_filter && current_filter_mode == LINEAR ? GL_LINEAR : GL_NEAREST;
glActiveTexture(GL_TEXTURE0 + tile);
GL_CHECK(glActiveTexture(GL_TEXTURE0 + tile));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gfx_cm_to_opengl(cms));
@ -646,8 +683,10 @@ static void gfx_opengl_set_use_alpha(bool use_alpha) {
static void gfx_opengl_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) {
//printf("flushing %d tris\n", buf_vbo_num_tris);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buf_vbo_len, buf_vbo, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris);
GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buf_vbo_len, buf_vbo, GL_STREAM_DRAW));
//GL_CHECK(glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris));
GL_CHECK(glDrawArrays(GL_POINTS, 0, buf_vbo_num_tris));
}
static void gfx_opengl_init(void) {

View file

@ -256,14 +256,14 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
// Store GLSL version string so we can refer to it later in case we recreate shaders.
// Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
if (glsl_version == NULL || true)
if (glsl_version == NULL)
{
#if defined(IMGUI_IMPL_OPENGL_ES2)
glsl_version = "#version 100";
#elif defined(IMGUI_IMPL_OPENGL_ES3)
glsl_version = "#version 300 es";
#elif defined(__APPLE__)
glsl_version = "#version 150";
glsl_version = "#version 120";
#else
glsl_version = "#version 130";
#endif

View file

@ -154,7 +154,7 @@ namespace SohImGui {
switch (impl.backend) {
case Backend::SDL:
#if __APPLE__
ImGui_ImplOpenGL3_Init("#version 120");
ImGui_ImplOpenGL3_Init("#version 420");
#else
ImGui_ImplOpenGL3_Init("#version 120");
#endif