From 91d89f75c5875853210370e401814631754eeff0 Mon Sep 17 00:00:00 2001 From: Jeffrey Crowell Date: Thu, 19 May 2022 03:13:16 -0400 Subject: [PATCH] update --- .../libultraship/Lib/Fast3D/gfx_opengl.cpp | 81 ++++++++++++++----- .../Lib/ImGui/backends/imgui_impl_opengl3.cpp | 4 +- libultraship/libultraship/SohImGuiImpl.cpp | 2 +- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 50ee26175..bfe333a52 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -1,5 +1,7 @@ #include "../../Window.h" #ifdef ENABLE_OPENGL +#endif +#if 1 #include #include @@ -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, 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) { diff --git a/libultraship/libultraship/Lib/ImGui/backends/imgui_impl_opengl3.cpp b/libultraship/libultraship/Lib/ImGui/backends/imgui_impl_opengl3.cpp index e91d12aff..9ff0e80c2 100644 --- a/libultraship/libultraship/Lib/ImGui/backends/imgui_impl_opengl3.cpp +++ b/libultraship/libultraship/Lib/ImGui/backends/imgui_impl_opengl3.cpp @@ -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 diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 3c7b7f1bf..0df1b6f3f 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -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