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(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(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) 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) 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)) * `-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 * `-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 * `-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=Texture` - Use the hardware-accelerated SDL2 Texture API renderer (default)
* `-DRENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer * `-DRENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer
* `-DRENDERER=Software` - Use a handwritten software 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) * `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 * `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 * `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=Texture` - Use the hardware-accelerated SDL2 Texture API renderer (default)
* `RENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer * `RENDERER=Surface` - Use the software-rendered SDL2 Surface API renderer
* `RENDERER=Software` - Use a hand-written software 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 Backend_Surface framebuffer_surface;
static const GLchar *vertex_shader_plain = " \ static const GLchar *vertex_shader_plain = " \
#version 150 core\n \ #version 140\n \
in vec2 input_vertex_coordinates; \ in vec2 input_vertex_coordinates; \
void main() \ void main() \
{ \ { \
@ -72,7 +72,7 @@ void main() \
"; ";
static const GLchar *vertex_shader_texture = " \ static const GLchar *vertex_shader_texture = " \
#version 150 core\n \ #version 140\n \
in vec2 input_vertex_coordinates; \ in vec2 input_vertex_coordinates; \
in vec2 input_texture_coordinates; \ in vec2 input_texture_coordinates; \
out vec2 texture_coordinates; \ out vec2 texture_coordinates; \
@ -84,7 +84,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_texture = " \ static const GLchar *fragment_shader_texture = " \
#version 150 core\n \ #version 140\n \
uniform sampler2D tex; \ uniform sampler2D tex; \
in vec2 texture_coordinates; \ in vec2 texture_coordinates; \
out vec4 fragment; \ out vec4 fragment; \
@ -95,7 +95,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_texture_colour_key = " \ static const GLchar *fragment_shader_texture_colour_key = " \
#version 150 core\n \ #version 140\n \
uniform sampler2D tex; \ uniform sampler2D tex; \
in vec2 texture_coordinates; \ in vec2 texture_coordinates; \
out vec4 fragment; \ out vec4 fragment; \
@ -111,7 +111,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_colour_fill = " \ static const GLchar *fragment_shader_colour_fill = " \
#version 150 core\n \ #version 140\n \
uniform vec4 colour; \ uniform vec4 colour; \
out vec4 fragment; \ out vec4 fragment; \
void main() \ void main() \
@ -121,7 +121,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_glyph_normal = " \ static const GLchar *fragment_shader_glyph_normal = " \
#version 150 core\n \ #version 140\n \
uniform sampler2D tex; \ uniform sampler2D tex; \
uniform vec4 colour; \ uniform vec4 colour; \
in vec2 texture_coordinates; \ in vec2 texture_coordinates; \
@ -133,7 +133,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_glyph_subpixel_part1 = " \ static const GLchar *fragment_shader_glyph_subpixel_part1 = " \
#version 150 core\n \ #version 140\n \
uniform sampler2D tex; \ uniform sampler2D tex; \
in vec2 texture_coordinates; \ in vec2 texture_coordinates; \
out vec4 fragment; \ out vec4 fragment; \
@ -144,7 +144,7 @@ void main() \
"; ";
static const GLchar *fragment_shader_glyph_subpixel_part2 = " \ static const GLchar *fragment_shader_glyph_subpixel_part2 = " \
#version 150 core\n \ #version 140\n \
uniform sampler2D tex; \ uniform sampler2D tex; \
uniform vec4 colour; \ uniform vec4 colour; \
in vec2 texture_coordinates; \ 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_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_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); 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) if (glewInit() != GLEW_OK)
return FALSE; return FALSE;
// Check if the platform supports OpenGL 3.2 // Check if the platform supports OpenGL 3.1
if (!GLEW_VERSION_3_2) if (!GLEW_VERSION_3_1)
return FALSE; return FALSE;
glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT);
@ -248,18 +246,27 @@ BOOL Backend_Init(SDL_Window *p_window)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
// Set up Vertex Array Object if (GLEW_ARB_compatibility)
glGenVertexArrays(1, &vertex_array_id); {
glBindVertexArray(vertex_array_id); 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);
// Set up Vertex Buffer Object // Set up Vertex Buffer Object
glGenBuffers(1, &vertex_buffer_id); glGenBuffers(1, &vertex_buffer_id);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id);
// Set up the vertex attributes // Set up the vertex attributes
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offsetof(VertexBuffer, vertexes)); 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)); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offsetof(VertexBuffer, texture_coordinates));
}
// Set up our shaders // Set up our shaders
program_texture = CompileShader(vertex_shader_texture, fragment_shader_texture); 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].x = -1.0f;
vertex_buffer.vertexes[3].y = 1.0f; vertex_buffer.vertexes[3].y = 1.0f;
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW); if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
SDL_GL_SwapWindow(window); 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].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom; vertex_buffer.vertexes[3].y = vertex_bottom;
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW); if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 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].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom; vertex_buffer.vertexes[3].y = vertex_bottom;
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW); if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
} }
@ -640,7 +653,8 @@ static void DrawGlyphCommon(Backend_Surface *surface, Backend_Glyph *glyph, long
vertex_buffer.vertexes[3].x = vertex_left; vertex_buffer.vertexes[3].x = vertex_left;
vertex_buffer.vertexes[3].y = vertex_bottom; vertex_buffer.vertexes[3].y = vertex_bottom;
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW); if (!GLEW_ARB_compatibility)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), &vertex_buffer, GL_STREAM_DRAW);
if (glyph->pixel_mode == FONT_PIXEL_MODE_LCD) if (glyph->pixel_mode == FONT_PIXEL_MODE_LCD)
{ {