shithub: cstory

Download patch

ref: a40c3d7b1bd03c7937b25ca2d08ba4addb0bd041
parent: 0c9c0115cf889e37caca66596ded3ec024046126
author: Clownacy <[email protected]>
date: Fri Jan 17 05:54:49 EST 2020

Perform cleanup when OpenGL's Backend_Init fails

--- a/src/Backends/Rendering/OpenGL3.cpp
+++ b/src/Backends/Rendering/OpenGL3.cpp
@@ -288,76 +288,105 @@
 
 	context = SDL_GL_CreateContext(window);
 
-	if (context == NULL)
-		return NULL;
+	if (context != NULL)
+	{
+		if (SDL_GL_MakeCurrent(window, context) == 0)
+		{
+			if (gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
+			{
+				// Check if the platform supports OpenGL 3.2
+				if (GLAD_GL_VERSION_3_2)
+				{
+					//glEnable(GL_DEBUG_OUTPUT);
+					//glDebugMessageCallback(MessageCallback, 0);
 
-	if (SDL_GL_MakeCurrent(window, context) < 0)
-		return NULL;
+					glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+					glClear(GL_COLOR_BUFFER_BIT);
 
-	if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
-		return NULL;
+					// Set up Vertex Array Object
+					glGenVertexArrays(1, &vertex_array_id);
+					glBindVertexArray(vertex_array_id);
 
-	// Check if the platform supports OpenGL 3.2
-	if (!GLAD_GL_VERSION_3_2)
-		return NULL;
+					// Set up Vertex Buffer Object
+					glGenBuffers(1, &vertex_buffer_id);
+					glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id);
+					glBufferData(GL_ARRAY_BUFFER, 1 * sizeof(VertexBufferSlot), NULL, GL_STREAM_DRAW);
 
-//	glEnable(GL_DEBUG_OUTPUT);
-//	glDebugMessageCallback(MessageCallback, 0);
+					// Set up the vertex attributes
+					glEnableVertexAttribArray(1);
+					glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, vertex_coordinate));
+					glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, texture_coordinate));
 
-	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-	glClear(GL_COLOR_BUFFER_BIT);
+					// Set up our shaders
+					program_texture = CompileShader(vertex_shader_texture, fragment_shader_texture);
+					program_texture_colour_key = CompileShader(vertex_shader_texture, fragment_shader_texture_colour_key);
+					program_colour_fill = CompileShader(vertex_shader_plain, fragment_shader_colour_fill);
+					program_glyph_normal = CompileShader(vertex_shader_texture, fragment_shader_glyph_normal);
+					program_glyph_subpixel_part1 = CompileShader(vertex_shader_texture, fragment_shader_glyph_subpixel_part1);
+					program_glyph_subpixel_part2 = CompileShader(vertex_shader_texture, fragment_shader_glyph_subpixel_part2);
 
-	// Set up Vertex Array Object
-	glGenVertexArrays(1, &vertex_array_id);
-	glBindVertexArray(vertex_array_id);
+					if (program_texture == 0 || program_texture_colour_key == 0 || program_colour_fill == 0 || program_glyph_normal == 0 || program_glyph_subpixel_part1 == 0 || program_glyph_subpixel_part2 == 0)
+					{
+						printf("Failed to compile shaders\n");
+					}
+					else
+					{
+						// Get shader uniforms
+						program_colour_fill_uniform_colour = glGetUniformLocation(program_colour_fill, "colour");
+						program_glyph_normal_uniform_colour = glGetUniformLocation(program_glyph_normal, "colour");
+						program_glyph_subpixel_part2_uniform_colour = glGetUniformLocation(program_glyph_subpixel_part2, "colour");
 
-	// Set up Vertex Buffer Object
-	glGenBuffers(1, &vertex_buffer_id);
-	glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id);
-	glBufferData(GL_ARRAY_BUFFER, 1 * sizeof(VertexBufferSlot), NULL, GL_STREAM_DRAW);
+						// Set up framebuffer (used for surface-to-surface blitting)
+						glGenFramebuffers(1, &framebuffer_id);
+						glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
 
-	// Set up the vertex attributes
-	glEnableVertexAttribArray(1);
-	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, vertex_coordinate));
-	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, texture_coordinate));
+						// Set up framebuffer screen texture (used for screen-to-surface blitting)
+						glGenTextures(1, &framebuffer.texture_id);
+						glBindTexture(GL_TEXTURE_2D, framebuffer.texture_id);
+						glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, window_width, window_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+						glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 
-	// Set up our shaders
-	program_texture = CompileShader(vertex_shader_texture, fragment_shader_texture);
-	program_texture_colour_key = CompileShader(vertex_shader_texture, fragment_shader_texture_colour_key);
-	program_colour_fill = CompileShader(vertex_shader_plain, fragment_shader_colour_fill);
-	program_glyph_normal = CompileShader(vertex_shader_texture, fragment_shader_glyph_normal);
-	program_glyph_subpixel_part1 = CompileShader(vertex_shader_texture, fragment_shader_glyph_subpixel_part1);
-	program_glyph_subpixel_part2 = CompileShader(vertex_shader_texture, fragment_shader_glyph_subpixel_part2);
+						framebuffer.width = window_width;
+						framebuffer.height = window_height;
 
-	if (program_texture == 0 || program_texture_colour_key == 0 || program_colour_fill == 0 || program_glyph_normal == 0 || program_glyph_subpixel_part1 == 0 || program_glyph_subpixel_part2 == 0)
-		printf("Failed to compile shaders\n");
+						glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebuffer.texture_id, 0);
+						glViewport(0, 0, framebuffer.width, framebuffer.height);
 
-	// Get shader uniforms
-	program_colour_fill_uniform_colour = glGetUniformLocation(program_colour_fill, "colour");
-	program_glyph_normal_uniform_colour = glGetUniformLocation(program_glyph_normal, "colour");
-	program_glyph_subpixel_part2_uniform_colour = glGetUniformLocation(program_glyph_subpixel_part2, "colour");
+						return &framebuffer;
+					}
 
-	// Set up framebuffer (used for surface-to-surface blitting)
-	glGenFramebuffers(1, &framebuffer_id);
-	glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
+					if (program_glyph_subpixel_part2 != 0)
+						glDeleteProgram(program_glyph_subpixel_part2);
 
-	// Set up framebuffer screen texture (used for screen-to-surface blitting)
-	glGenTextures(1, &framebuffer.texture_id);
-	glBindTexture(GL_TEXTURE_2D, framebuffer.texture_id);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, window_width, window_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+					if (program_glyph_subpixel_part1 != 0)
+						glDeleteProgram(program_glyph_subpixel_part1);
 
-	framebuffer.width = window_width;
-	framebuffer.height = window_height;
+					if (program_glyph_normal != 0)
+						glDeleteProgram(program_glyph_normal);
 
-	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebuffer.texture_id, 0);
-	glViewport(0, 0, framebuffer.width, framebuffer.height);
+					if (program_texture_colour_key != 0)
+						glDeleteProgram(program_texture_colour_key);
 
-	return &framebuffer;
+					if (program_texture_colour_key != 0)
+						glDeleteProgram(program_texture_colour_key);
+
+					if (program_texture != 0)
+						glDeleteProgram(program_texture);
+
+					glDeleteBuffers(1, &vertex_buffer_id);
+					glDeleteVertexArrays(1, &vertex_array_id);
+				}
+			}
+		}
+
+		SDL_GL_DeleteContext(context);
+	}
+
+	return NULL;
 }
 
 void Backend_Deinit(void)