aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/video_core/renderer_opengl/gl_shader_util.cpp
diff options
context:
space:
mode:
authorGravatar Kevin Hartman <kevin@hart.mn>2014-08-21 00:27:53 -0700
committerGravatar Kevin Hartman <kevin@hart.mn>2014-08-25 20:56:59 -0700
commitcbfd6b6e52e3b8c1d6324d86461f4e8aa240a756 (patch)
tree31355774610d25174521e88ca7dcebfe5bbfe715 /src/video_core/renderer_opengl/gl_shader_util.cpp
parentaa7472057ae9b56e3f7216931cbb9e927e39a930 (diff)
Rewrite of OpenGL renderer, including OS X support
Screen contents are now displayed using textured quads. This can be updated to expose an FBO once an OpenGL backend for when Pica rendering is being worked on. That FBO's texture can then be applied to the quads. Previously, FBO blitting was used in order to display screen contents, which did not work on OS X. The new textured quad approach is less of a compatibility risk.
Diffstat (limited to 'src/video_core/renderer_opengl/gl_shader_util.cpp')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_util.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_util.cpp b/src/video_core/renderer_opengl/gl_shader_util.cpp
new file mode 100644
index 00000000..10239c8a
--- /dev/null
+++ b/src/video_core/renderer_opengl/gl_shader_util.cpp
@@ -0,0 +1,81 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include "gl_shader_util.h"
+#include "common/log.h"
+
+#include <vector>
+#include <algorithm>
+
+namespace ShaderUtil {
+
+GLuint LoadShaders(const char* vertex_shader, const char* fragment_shader) {
+
+ // Create the shaders
+ GLuint vertex_shader_id = glCreateShader(GL_VERTEX_SHADER);
+ GLuint fragment_shader_id = glCreateShader(GL_FRAGMENT_SHADER);
+
+ GLint result = GL_FALSE;
+ int info_log_length;
+
+ // Compile Vertex Shader
+ DEBUG_LOG(GPU, "Compiling vertex shader.");
+
+ glShaderSource(vertex_shader_id, 1, &vertex_shader, NULL);
+ glCompileShader(vertex_shader_id);
+
+ // Check Vertex Shader
+ glGetShaderiv(vertex_shader_id, GL_COMPILE_STATUS, &result);
+ glGetShaderiv(vertex_shader_id, GL_INFO_LOG_LENGTH, &info_log_length);
+
+ std::vector<char> vertex_shader_error(info_log_length);
+ glGetShaderInfoLog(vertex_shader_id, info_log_length, NULL, &vertex_shader_error[0]);
+
+ if (info_log_length > 1) {
+ DEBUG_LOG(GPU, "%s", &vertex_shader_error[0]);
+ }
+
+ // Compile Fragment Shader
+ DEBUG_LOG(GPU, "Compiling fragment shader.");
+
+ glShaderSource(fragment_shader_id, 1, &fragment_shader, NULL);
+ glCompileShader(fragment_shader_id);
+
+ // Check Fragment Shader
+ glGetShaderiv(fragment_shader_id, GL_COMPILE_STATUS, &result);
+ glGetShaderiv(fragment_shader_id, GL_INFO_LOG_LENGTH, &info_log_length);
+
+ std::vector<char> fragment_shader_error(info_log_length);
+ glGetShaderInfoLog(fragment_shader_id, info_log_length, NULL, &fragment_shader_error[0]);
+
+ if (info_log_length > 1) {
+ DEBUG_LOG(GPU, "%s", &fragment_shader_error[0]);
+ }
+
+ // Link the program
+ DEBUG_LOG(GPU, "Linking program.");
+
+ GLuint program_id = glCreateProgram();
+ glAttachShader(program_id, vertex_shader_id);
+ glAttachShader(program_id, fragment_shader_id);
+ glLinkProgram(program_id);
+
+ // Check the program
+ glGetProgramiv(program_id, GL_LINK_STATUS, &result);
+ glGetProgramiv(program_id, GL_INFO_LOG_LENGTH, &info_log_length);
+
+ std::vector<char> program_error(std::max(info_log_length, int(1)));
+ glGetProgramInfoLog(program_id, info_log_length, NULL, &program_error[0]);
+
+ if (info_log_length > 1) {
+ DEBUG_LOG(GPU, "%s", &program_error[0]);
+ }
+
+ glDeleteShader(vertex_shader_id);
+ glDeleteShader(fragment_shader_id);
+
+ return program_id;
+}
+
+}