aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/video_core/renderer_opengl/gl_shader_util.cpp
diff options
context:
space:
mode:
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;
+}
+
+}