diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 66025a9d0..e1bea4e8f 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -187,14 +187,13 @@ bool GLResourceManager::Prepare_InitialState(GLResource res) gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_FORMAT, &immut); if(immut) - { gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_LEVELS, (GLint *)&mips); - } else - { - gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, (GLint *)&mips); - mips++; - } + mips = CalcNumMips(details.width, details.height, details.depth); + + GLint maxLevel = 1000; + gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, &maxLevel); + mips = RDCMIN(mips, maxLevel); gl.glBindTexture(details.curType, tex); @@ -416,14 +415,13 @@ bool GLResourceManager::Serialise_InitialState(GLResource res) gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_FORMAT, &immut); if(immut) - { gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_LEVELS, (GLint *)&imgmips); - } else - { - gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, (GLint *)&imgmips); - imgmips++; - } + imgmips = CalcNumMips(details.width, details.height, details.depth); + + GLint maxLevel = 1000; + gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, &maxLevel); + imgmips = RDCMIN(imgmips, maxLevel); TextureStateInitialData *state = (TextureStateInitialData *)GetInitialContents(Id).blob; @@ -788,14 +786,13 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_FORMAT, &immut); if(immut) - { gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_IMMUTABLE_LEVELS, (GLint *)&mips); - } else - { - gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, (GLint *)&mips); - mips++; - } + mips = CalcNumMips(details.width, details.height, details.depth); + + GLint maxLevel = 1000; + gl.glGetTexParameteriv(details.curType, eGL_TEXTURE_MAX_LEVEL, &maxLevel); + mips = RDCMIN(mips, maxLevel); // copy over mips for(int i=0; i < mips; i++) @@ -862,7 +859,7 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i VertexBufferInitialData &buf = initialdata->VertexBuffers[i]; - GLuint buffer = GetLiveResource(buf.Buffer).name; + GLuint buffer = buf.Buffer == ResourceId() ? 0 : GetLiveResource(buf.Buffer).name; gl.glBindVertexBuffer(i, buffer, (GLintptr)buf.Offset, (GLsizei)buf.Stride); gl.glVertexBindingDivisor(i, buf.Divisor); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 83f41e63b..ce48a102a 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -512,11 +512,13 @@ void GLReplay::CacheTexture(ResourceId id) else { // assuming complete texture - GLint mips = 0; - gl.glGetTexParameteriv(target, eGL_TEXTURE_MAX_LEVEL, &mips); - tex.mips = (uint32_t)mips + 1; + tex.mips = CalcNumMips(tex.width, tex.height, tex.depth); } + GLuint maxLevel = 1000; + gl.glGetTexParameteriv(target, eGL_TEXTURE_MAX_LEVEL, (GLint *)&maxLevel); + tex.mips = RDCMIN(tex.mips, maxLevel); + tex.numSubresources = tex.mips*tex.arraysize; GLint compressed;