Sod it, fall back on compatibility mode if it's available

This way, I can use immediate mode, which is way faster than using
buffers for some reason. Since I'm not using profiles anymore, I
dropped the minimum requirement to OpenGL 3.1. If a driver doesn't
support Legacy GL, then it can use the slow buffer code.

But seriously, I need to figure out why using buffers is so slow.
If this was a common problem, Modern OpenGL wouldn't have made it the
only option.
This commit is contained in:
Clownacy 2019-08-09 19:19:43 +01:00
parent 4afe7f4b11
commit 7146288e94
3 changed files with 44 additions and 30 deletions

View file

@ -11,7 +11,7 @@ option(JAPANESE "Enable the Japanese-language build" OFF)
option(FIX_BUGS "Fix certain bugs (see src/Bug Fixes.txt)" OFF)
option(NONPORTABLE "Enable bits of code that aren't portable, but are what the original game used" OFF)
option(FORCE_LOCAL_LIBS "Compile the built-in versions of SDL2, FreeType, and FLTK instead of using the system-provided ones" OFF)
set(RENDERER "Texture" CACHE STRING "Which renderer the game should use: 'OpenGL3' for an OpenGL 3.2 renderer, 'Texture' for SDL2's hardware-accelerated Texture API, 'Surface' for SDL2's software-rendered Surface API, and 'Software' for a handwritten software renderer")
set(RENDERER "Texture" CACHE STRING "Which renderer the game should use: 'OpenGL3' for an OpenGL 3.1 renderer, 'Texture' for SDL2's hardware-accelerated Texture API, 'Surface' for SDL2's software-rendered Surface API, and 'Software' for a handwritten software renderer")
project(CSE2 LANGUAGES C CXX)

View file

@ -30,7 +30,7 @@ You can also add the following flags:
* `-DFIX_BUGS=ON` - Fix bugs in the game (see [src/Bug Fixes.txt](src/Bug%20Fixes.txt))
* `-DNONPORTABLE=ON` - Enable bits of code that aren't portable, but are what the original game used
* `-DFORCE_LOCAL_LIBS=ON` - Compile the built-in versions of SDL2, FreeType, and FLTK instead of using the system-provided ones
* `-DRENDERER=OpenGL3` - Use the hardware-accelerated OpenGL 3.2 renderer
* `-DRENDERER=OpenGL3` - Use the hardware-accelerated OpenGL 3.1 renderer
* `-DRENDERER=Texture` - Use the hardware-accelerated SDL2 Texture API renderer (default)
* `-DRENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer
* `-DRENDERER=Software` - Use a handwritten software renderer
@ -58,7 +58,7 @@ Run 'make' in this folder, preferably with some of the following settings:
* `WINDOWS=1` - Enable Windows-only features like a unique file/taskbar icon, and system font loading (needed for the font setting in Config.dat to do anything)
* `RASPBERRY_PI=1` - Enable tweaks to improve performance on Raspberry Pis
* `NONPORTABLE=1` - Enable bits of code that aren't portable, but are what the original game used
* `RENDERER=OpenGL3` - Use the hardware-accelerated OpenGL 3.2 renderer
* `RENDERER=OpenGL3` - Use the hardware-accelerated OpenGL 3.1 renderer
* `RENDERER=Texture` - Use the hardware-accelerated SDL2 Texture API renderer (default)
* `RENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer
* `RENDERER=Software` - Use a hand-written software renderer

View file

@ -63,7 +63,7 @@ static VertexBuffer vertex_buffer;
static Backend_Surface framebuffer_surface;
static const GLchar *vertex_shader_plain = " \
#version 150 core\n \
#version 140\n \
in vec2 input_vertex_coordinates; \
void main() \
{ \
@ -72,7 +72,7 @@ void main() \
";
static const GLchar *vertex_shader_texture = " \
#version 150 core\n \
#version 140\n \
in vec2 input_vertex_coordinates; \
in vec2 input_texture_coordinates; \
out vec2 texture_coordinates; \
@ -84,7 +84,7 @@ void main() \
";
static const GLchar *fragment_shader_texture = " \
#version 150 core\n \
#version 140\n \
uniform sampler2D tex; \
in vec2 texture_coordinates; \
out vec4 fragment; \
@ -95,7 +95,7 @@ void main() \
";
static const GLchar *fragment_shader_texture_colour_key = " \
#version 150 core\n \
#version 140\n \
uniform sampler2D tex; \
in vec2 texture_coordinates; \
out vec4 fragment; \
@ -111,7 +111,7 @@ void main() \
";
static const GLchar *fragment_shader_colour_fill = " \
#version 150 core\n \
#version 140\n \
uniform vec4 colour; \
out vec4 fragment; \
void main() \
@ -121,7 +121,7 @@ void main() \
";
static const GLchar *fragment_shader_glyph_normal = " \
#version 150 core\n \
#version 140\n \
uniform sampler2D tex; \
uniform vec4 colour; \
in vec2 texture_coordinates; \
@ -133,7 +133,7 @@ void main() \
";
static const GLchar *fragment_shader_glyph_subpixel_part1 = " \
#version 150 core\n \
#version 140\n \
uniform sampler2D tex; \
in vec2 texture_coordinates; \
out vec4 fragment; \
@ -144,7 +144,7 @@ void main() \
";
static const GLchar *fragment_shader_glyph_subpixel_part2 = " \
#version 150 core\n \
#version 140\n \
uniform sampler2D tex; \
uniform vec4 colour; \
in vec2 texture_coordinates; \
@ -218,10 +218,8 @@ static void SetFramebufferTarget(GLuint texture_id)
SDL_Window* Backend_CreateWindow(const char *title, int width, int height)
{
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
return SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
}
@ -238,8 +236,8 @@ BOOL Backend_Init(SDL_Window *p_window)
if (glewInit() != GLEW_OK)
return FALSE;
// Check if the platform supports OpenGL 3.2
if (!GLEW_VERSION_3_2)
// Check if the platform supports OpenGL 3.1
if (!GLEW_VERSION_3_1)
return FALSE;
glEnable(GL_DEBUG_OUTPUT);
@ -248,6 +246,14 @@ BOOL Backend_Init(SDL_Window *p_window)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
if (GLEW_ARB_compatibility)
{
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, vertex_buffer.vertexes);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, vertex_buffer.texture_coordinates);
}
else
{
// Set up Vertex Array Object
glGenVertexArrays(1, &vertex_array_id);
glBindVertexArray(vertex_array_id);
@ -260,6 +266,7 @@ BOOL Backend_Init(SDL_Window *p_window)
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offsetof(VertexBuffer, vertexes));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offsetof(VertexBuffer, texture_coordinates));
}
// Set up our shaders
program_texture = CompileShader(vertex_shader_texture, fragment_shader_texture);
@ -347,7 +354,9 @@ void Backend_DrawScreen(void)
vertex_buffer.vertexes[3].x = -1.0f;
vertex_buffer.vertexes[3].y = 1.0f;
if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
SDL_GL_SwapWindow(window);
@ -461,7 +470,9 @@ static void BlitCommon(Backend_Surface *source_surface, const RECT *rect, Backen
vertex_buffer.vertexes[3].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom;
if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
@ -510,7 +521,9 @@ static void ColourFillCommon(Backend_Surface *surface, const RECT *rect, unsigne
vertex_buffer.vertexes[3].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom;
if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
@ -640,6 +653,7 @@ static void DrawGlyphCommon(Backend_Surface *surface, Backend_Glyph *glyph, long
vertex_buffer.vertexes[3].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom;
if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
if (glyph->pixel_mode == FONT_PIXEL_MODE_LCD)