diff options
| author | Markus Wick <degasus@users.noreply.github.com> | 2015-09-22 15:32:48 +0200 |
|---|---|---|
| committer | Markus Wick <degasus@users.noreply.github.com> | 2015-09-22 15:32:48 +0200 |
| commit | 3930c929cbd6d286c104333337f513ec0c91902c (patch) | |
| tree | 4fe7068fbf8b3c22cdafebd16b3a1ff573f4144b /Source/Core/Common/GL/GLUtil.cpp | |
| parent | a537ca7543bb3b147a9fbb1c6f44083902848d2d (diff) | |
| parent | c9836ff59292855093ba5f7bdc47755ea74123a5 (diff) | |
Merge pull request #3062 from phire/moveGL
Move GL interface code out of the OpenGL video backend.
Diffstat (limited to 'Source/Core/Common/GL/GLUtil.cpp')
| -rw-r--r-- | Source/Core/Common/GL/GLUtil.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/Source/Core/Common/GL/GLUtil.cpp b/Source/Core/Common/GL/GLUtil.cpp new file mode 100644 index 0000000000..3cb8499b0d --- /dev/null +++ b/Source/Core/Common/GL/GLUtil.cpp @@ -0,0 +1,135 @@ +// Copyright 2008 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "Common/GL/GLInterfaceBase.h" +#include "Common/GL/GLUtil.h" +#include "Common/Logging/Log.h" + +cInterfaceBase *GLInterface; +static GLuint attributelessVAO = 0; +static GLuint attributelessVBO = 0; + +void InitInterface() +{ + GLInterface = HostGL_CreateGLInterface(); +} + +GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShader) +{ + // generate objects + GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + GLuint programID = glCreateProgram(); + + // compile vertex shader + glShaderSource(vertexShaderID, 1, &vertexShader, nullptr); + glCompileShader(vertexShaderID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLint Result = GL_FALSE; + char stringBuffer[1024]; + GLsizei stringBufferUsage = 0; + glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderInfoLog(vertexShaderID, 1024, &stringBufferUsage, stringBuffer); + + if (Result && stringBufferUsage) + { + ERROR_LOG(VIDEO, "GLSL vertex shader warnings:\n%s%s", stringBuffer, vertexShader); + } + else if (!Result) + { + ERROR_LOG(VIDEO, "GLSL vertex shader error:\n%s%s", stringBuffer, vertexShader); + } + else + { + DEBUG_LOG(VIDEO, "GLSL vertex shader compiled:\n%s", vertexShader); + } + + bool shader_errors = !Result; +#endif + + // compile fragment shader + glShaderSource(fragmentShaderID, 1, &fragmentShader, nullptr); + glCompileShader(fragmentShaderID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderInfoLog(fragmentShaderID, 1024, &stringBufferUsage, stringBuffer); + + if (Result && stringBufferUsage) + { + ERROR_LOG(VIDEO, "GLSL fragment shader warnings:\n%s%s", stringBuffer, fragmentShader); + } + else if (!Result) + { + ERROR_LOG(VIDEO, "GLSL fragment shader error:\n%s%s", stringBuffer, fragmentShader); + } + else + { + DEBUG_LOG(VIDEO, "GLSL fragment shader compiled:\n%s", fragmentShader); + } + + shader_errors |= !Result; +#endif + + // link them + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + glGetProgramiv(programID, GL_LINK_STATUS, &Result); + glGetProgramInfoLog(programID, 1024, &stringBufferUsage, stringBuffer); + + if (Result && stringBufferUsage) + { + ERROR_LOG(VIDEO, "GLSL linker warnings:\n%s%s%s", stringBuffer, vertexShader, fragmentShader); + } + else if (!Result && !shader_errors) + { + ERROR_LOG(VIDEO, "GLSL linker error:\n%s%s%s", stringBuffer, vertexShader, fragmentShader); + } +#endif + + // cleanup + glDeleteShader(vertexShaderID); + glDeleteShader(fragmentShaderID); + + return programID; +} + +void OpenGL_CreateAttributelessVAO() +{ + glGenVertexArrays(1, &attributelessVAO); + _dbg_assert_msg_(VIDEO, attributelessVAO != 0, "Attributeless VAO should have been created successfully.") + + // In a compatibility context, we require a valid, bound array buffer. + glGenBuffers(1, &attributelessVBO); + _dbg_assert_msg_(VIDEO, attributelessVBO != 0, "Attributeless VBO should have been created successfully.") + + // Initialize the buffer with nothing. 16 floats is an arbitrary size that may work around driver issues. + glBindBuffer(GL_ARRAY_BUFFER, attributelessVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 16, nullptr, GL_STATIC_DRAW); + + // We must also define vertex attribute 0. + glBindVertexArray(attributelessVAO); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(0); +} + +void OpenGL_BindAttributelessVAO() +{ + _dbg_assert_msg_(VIDEO, attributelessVAO != 0, "Attributeless VAO should have already been created.") + glBindVertexArray(attributelessVAO); +} + +void OpenGL_DeleteAttributelessVAO() +{ + _dbg_assert_msg_(VIDEO, attributelessVAO != 0, "Attributeless VAO should have already been created.") + if (attributelessVAO != 0) + { + glDeleteVertexArrays(1, &attributelessVAO); + glDeleteBuffers(1, &attributelessVBO); + + attributelessVAO = 0; + attributelessVBO = 0; + } +} |
