ref: f8a40318a2a8506d57a6621d76448eb3fa0dd736
parent: 73de1adc45a6c941c70d774664cb1ae93fc0c63f
author: Clownacy <[email protected]>
date: Tue Jan 21 10:52:33 EST 2020
OpenGL fixes and optimisations Now the VBO isn't resized constantly, and CreateSurface preserves the currently-bound texture.
--- a/src/Backends/Rendering/OpenGL3.cpp
+++ b/src/Backends/Rendering/OpenGL3.cpp
@@ -80,7 +80,8 @@
static GLuint vertex_buffer_id;
static GLuint framebuffer_id;
-static VertexBufferSlot *vertex_buffer;
+static VertexBufferSlot *local_vertex_buffer;
+static unsigned long local_vertex_buffer_size;
static unsigned long current_vertex_buffer_slot;
static RenderMode last_render_mode;
@@ -342,26 +343,33 @@
static VertexBufferSlot* GetVertexBufferSlot(void)
{
- static unsigned long max_slots = 0;
-
- if (current_vertex_buffer_slot >= max_slots)
+ if (current_vertex_buffer_slot >= local_vertex_buffer_size)
{
- if (max_slots == 0)
- max_slots = 1;
+ if (local_vertex_buffer_size == 0)
+ local_vertex_buffer_size = 1;
else
- max_slots <<= 1;
+ local_vertex_buffer_size <<= 1;
- vertex_buffer = (VertexBufferSlot*)realloc(vertex_buffer, max_slots * sizeof(VertexBufferSlot));
- glBufferData(GL_ARRAY_BUFFER, max_slots * sizeof(VertexBufferSlot), NULL, GL_STREAM_DRAW);
+ local_vertex_buffer = (VertexBufferSlot*)realloc(local_vertex_buffer, local_vertex_buffer_size * sizeof(VertexBufferSlot));
}
- return &vertex_buffer[current_vertex_buffer_slot++];
+ return &local_vertex_buffer[current_vertex_buffer_slot++];
}
static void FlushVertexBuffer(void)
{
- glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexBufferSlot) * current_vertex_buffer_slot, vertex_buffer);
+ static unsigned long vertex_buffer_size = 0;
+ if (local_vertex_buffer_size > vertex_buffer_size)
+ {
+ vertex_buffer_size = local_vertex_buffer_size;
+ glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size * sizeof(VertexBufferSlot), local_vertex_buffer, GL_STREAM_DRAW);
+ }
+ else
+ {
+ glBufferSubData(GL_ARRAY_BUFFER, 0, current_vertex_buffer_slot * sizeof(VertexBufferSlot), local_vertex_buffer);
+ }
+
if (last_render_mode == MODE_DRAW_GLYPH_LCD)
{
// Here we're going to draw with per-component alpha.
@@ -532,7 +540,7 @@
void Backend_Deinit(void)
{
- free(vertex_buffer);
+ free(local_vertex_buffer);
glDeleteTextures(1, &framebuffer.texture_id);
glDeleteFramebuffers(1, &framebuffer_id);
@@ -618,6 +626,9 @@
if (surface == NULL)
return NULL;
+ GLint previously_bound_texture;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &previously_bound_texture);
+
glGenTextures(1, &surface->texture_id);
glBindTexture(GL_TEXTURE_2D, surface->texture_id);
#ifdef USE_OPENGLES2
@@ -633,6 +644,8 @@
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
#endif
+ glBindTexture(GL_TEXTURE_2D, previously_bound_texture);
+
surface->width = width;
surface->height = height;
@@ -797,8 +810,6 @@
glDisableVertexAttribArray(2);
glUniform4f(program_colour_fill_uniform_colour, red / 255.0f, green / 255.0f, blue / 255.0f, 1.0f);
-
- current_vertex_buffer_slot = 0;
}
const GLfloat vertex_left = (rect->left * (2.0f / surface->width)) - 1.0f;