diff options
| author | Unknown W. Brackets <checkins@unknownbrackets.org> | 2014-12-03 23:24:58 -0800 |
|---|---|---|
| committer | Unknown W. Brackets <checkins@unknownbrackets.org> | 2014-12-06 19:27:49 -0800 |
| commit | b19cff8a08a03b39653ea16ec5f51a2c80c5f2d1 (patch) | |
| tree | 4153f73c3df632eebd9a5cde1d888e0455175305 /Source/Core/VideoBackends/OGL/GLUtil.cpp | |
| parent | f7a16eca84a868b5dcce113ece3e84d21347feae (diff) | |
OGL: Use a fixed VAO for attributeless rendering.
Instead of abusing whatever VAO is previously bound, which might have
enabled arrays.
Only used in one instance currently, which fixes a crash with older
NVIDIA drivers.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/GLUtil.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/GLUtil.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/OGL/GLUtil.cpp b/Source/Core/VideoBackends/OGL/GLUtil.cpp index bfd6170839..f91b079c3b 100644 --- a/Source/Core/VideoBackends/OGL/GLUtil.cpp +++ b/Source/Core/VideoBackends/OGL/GLUtil.cpp @@ -16,6 +16,8 @@ #include "VideoCommon/VideoConfig.h" cInterfaceBase *GLInterface; +static GLuint attributelessVAO = 0; +static GLuint attributelessVBO = 0; namespace OGL { @@ -113,3 +115,32 @@ GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShade return programID; } +static void CreateAttributelessVAO() +{ + glGenVertexArrays(1, &attributelessVAO); + + // In a compatibility context, we require a valid, bound array buffer. + glGenBuffers(1, &attributelessVBO); + + // Initialize the buffer with nothing. + glBindBuffer(GL_ARRAY_BUFFER, attributelessVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat), nullptr, GL_STATIC_DRAW); + + // We must also define vertex attribute 0. + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); +} + +void OpenGL_BindAttributelessVAO() +{ + if (attributelessVAO == 0) + CreateAttributelessVAO(); + + glBindVertexArray(attributelessVAO); + glBindBuffer(GL_ARRAY_BUFFER, attributelessVBO); +} + +void OpenGL_DeleteAttributelessVAO() +{ + glDeleteVertexArrays(1, &attributelessVAO); + glDeleteBuffers(1, &attributelessVBO); +} |
