From f2a594fad5de59180add789ebebac7ff74f69c32 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 5 Mar 2019 23:02:40 +1000 Subject: [PATCH] OGL: Fix binding error on shutdown This was occurring if the imgui vertex format was bound on shutdown, which is destroyed before the vertex buffers --- Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp | 1 + Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 6 ++++++ Source/Core/VideoBackends/OGL/ProgramShaderCache.h | 1 + 3 files changed, 8 insertions(+) diff --git a/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp b/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp index 50a6276c72..c95e1f8472 100644 --- a/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp +++ b/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp @@ -80,6 +80,7 @@ GLVertexFormat::GLVertexFormat(const PortableVertexDeclaration& vtx_decl) GLVertexFormat::~GLVertexFormat() { + ProgramShaderCache::InvalidateVertexFormatIfBound(VAO); glDeleteVertexArrays(1, &VAO); } } // namespace OGL diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 85084979c3..8832c8e6f0 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -494,6 +494,12 @@ void ProgramShaderCache::InvalidateVertexFormat() s_last_VAO = 0; } +void ProgramShaderCache::InvalidateVertexFormatIfBound(GLuint vao) +{ + if (s_last_VAO == vao) + s_last_VAO = 0; +} + void ProgramShaderCache::InvalidateLastProgram() { CurrentProgram = 0; diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.h b/Source/Core/VideoBackends/OGL/ProgramShaderCache.h index 4aeb40a6c9..bc93445c55 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.h +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.h @@ -72,6 +72,7 @@ public: static void BindVertexFormat(const GLVertexFormat* vertex_format); static bool IsValidVertexFormatBound(); static void InvalidateVertexFormat(); + static void InvalidateVertexFormatIfBound(GLuint vao); static void InvalidateLastProgram(); static bool CompileComputeShader(SHADER& shader, const std::string& code);