diff options
| author | Jules Blok <jules.blok@gmail.com> | 2015-03-02 14:59:18 +0100 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2015-03-02 17:03:49 +0100 |
| commit | 728081dad2223b4047cff359b1b414260060ee21 (patch) | |
| tree | 0caf11c0a54b777a15171ac3d9a768e6cbafd5b8 /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | |
| parent | 6a211978c1037d131acc9767028755c8cb9ad95a (diff) | |
ProgramShaderCache: Do plenty of error checking before writing shaders to the disk.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index e0f0eac72d..47a8151286 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -473,25 +473,33 @@ void ProgramShaderCache::Shutdown() { for (auto& entry : pshaders) { + // Clear any prior error code + glGetError(); + if (entry.second.in_cache) { continue; } - GLint binary_size; + GLint link_status = GL_FALSE, delete_status = GL_TRUE, binary_size = 0; + glGetProgramiv(entry.second.shader.glprogid, GL_LINK_STATUS, &link_status); + glGetProgramiv(entry.second.shader.glprogid, GL_DELETE_STATUS, &delete_status); glGetProgramiv(entry.second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); - if (!binary_size) + if (glGetError() != GL_NO_ERROR || link_status == GL_FALSE || delete_status == GL_TRUE || !binary_size) { continue; } - u8 *data = new u8[binary_size+sizeof(GLenum)]; - u8 *binary = data + sizeof(GLenum); - GLenum *prog_format = (GLenum*)data; + std::vector<u8> data(binary_size + sizeof(GLenum)); + u8* binary = &data[sizeof(GLenum)]; + GLenum* prog_format = (GLenum*)&data[0]; glGetProgramBinary(entry.second.shader.glprogid, binary_size, nullptr, prog_format, binary); + if (glGetError() != GL_NO_ERROR) + { + continue; + } - g_program_disk_cache.Append(entry.first, data, binary_size+sizeof(GLenum)); - delete [] data; + g_program_disk_cache.Append(entry.first, &data[0], binary_size + sizeof(GLenum)); } g_program_disk_cache.Sync(); |
