diff options
author | Kevin Hartman <kevin@hart.mn> | 2014-08-21 00:27:53 -0700 |
---|---|---|
committer | Kevin Hartman <kevin@hart.mn> | 2014-08-25 20:56:59 -0700 |
commit | cbfd6b6e52e3b8c1d6324d86461f4e8aa240a756 (patch) | |
tree | 31355774610d25174521e88ca7dcebfe5bbfe715 /src/video_core/renderer_opengl/gl_shader_util.cpp | |
parent | aa7472057ae9b56e3f7216931cbb9e927e39a930 (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.cpp | 81 |
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; +} + +} |