summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authorMarkus Wick <markus+github@selfnet.de>2015-03-02 17:24:00 +0100
committerMarkus Wick <markus+github@selfnet.de>2015-03-02 17:24:00 +0100
commitcc5a2f341192c58e66f4cedb67c7b4f961386ae2 (patch)
tree69467fc09a418223e232ff2a2bf7dc73a762d3ec /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parentcd8c37bc0792a492b59976eba10a3e54e0ea2842 (diff)
parent728081dad2223b4047cff359b1b414260060ee21 (diff)
Merge pull request #2164 from Armada651/cache-fix
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.cpp22
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();