From 7cd761640151eb45301395ac3e4cbc033e0dbd18 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 9 Sep 2020 16:38:05 +0100 Subject: [PATCH] Serialise max anisotropy level in GL texture & sampler initial states --- renderdoc/driver/gl/gl_common.cpp | 4 ++++ renderdoc/driver/gl/gl_driver.h | 2 +- renderdoc/driver/gl/gl_initstate.cpp | 24 ++++++++++++++++++++++++ renderdoc/driver/gl/gl_initstate.h | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 04cd2362a..29eb2d3d3 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -1194,6 +1194,10 @@ bool GLInitParams::IsSupportedVersion(uint64_t ver) if(ver == 0x21) return true; + // 0x22 -> 0x23 - Add missing serialisation of maxAniso in texture initial contents. + if(ver == 0x21) + return true; + return false; } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 391f22848..2de1d00fc 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -59,7 +59,7 @@ struct GLInitParams rdcstr renderer, version; // check if a frame capture section version is supported - static const uint64_t CurrentVersion = 0x22; + static const uint64_t CurrentVersion = 0x23; static bool IsSupportedVersion(uint64_t ver); }; diff --git a/renderdoc/driver/gl/gl_initstate.cpp b/renderdoc/driver/gl/gl_initstate.cpp index 04f8d5ad6..e86be42c5 100644 --- a/renderdoc/driver/gl/gl_initstate.cpp +++ b/renderdoc/driver/gl/gl_initstate.cpp @@ -132,6 +132,11 @@ void DoSerialise(SerialiserType &ser, SamplerInitialData &el) SERIALISE_MEMBER(magFilter); SERIALISE_MEMBER(maxAniso); SERIALISE_MEMBER(wrap); + + // samplers from before 0x23 didn't have this field filled out at all. Set it to 1.0 as a + // reasonably sensible default + if(ser.VersionLess(0x23)) + el.maxAniso = 1.0f; } template @@ -165,6 +170,12 @@ void DoSerialise(SerialiserType &ser, TextureStateInitialData &el) SERIALISE_MEMBER(texBuffer); SERIALISE_MEMBER(texBufOffs); SERIALISE_MEMBER(texBufSize); + + if(ser.VersionAtLeast(0x23)) + SERIALISE_MEMBER(maxAniso); + else if(ser.IsReading()) + el.maxAniso = 1.0f; // no default is perfect, but at least set 1.0 instead of leaving it + // uninitialised or 0.0 } void WrappedOpenGL::TextureData::GetCompressedImageDataGLES(int mip, GLenum target, size_t size, @@ -401,6 +412,9 @@ void GLResourceManager::ContextPrepare_InitialState(GLResource res) if(!IsGLES) GL.glGetSamplerParameterfv(res.name, eGL_TEXTURE_LOD_BIAS, &data.lodBias); + if(HasExt[ARB_texture_filter_anisotropic]) + GL.glGetSamplerParameterfv(res.name, eGL_TEXTURE_MAX_ANISOTROPY, &data.maxAniso); + // technically border color has been in since GL 1.0, but since this extension was really // early and dovetails nicely with OES_texture_border_color which added both border colors and // clamping, we check it. @@ -699,6 +713,10 @@ void GLResourceManager::PrepareTextureInitialContents(ResourceId liveid, Resourc GL.glGetTextureParameterfvEXT(res.name, details.curType, eGL_TEXTURE_LOD_BIAS, &state.lodBias); + if(HasExt[ARB_texture_filter_anisotropic]) + GL.glGetTextureParameterfvEXT(res.name, details.curType, eGL_TEXTURE_MAX_ANISOTROPY, + &state.maxAniso); + // CLAMP isn't supported (border texels gone), assume they meant CLAMP_TO_EDGE if(state.wrap[0] == eGL_CLAMP) state.wrap[0] = eGL_CLAMP_TO_EDGE; @@ -2127,6 +2145,10 @@ void GLResourceManager::Apply_InitialState(GLResource live, const GLInitialConte if(!IsGLES) GL.glTextureParameterfvEXT(live.name, details.curType, eGL_TEXTURE_LOD_BIAS, &state.lodBias); + + if(HasExt[ARB_texture_filter_anisotropic]) + GL.glTextureParameterfvEXT(live.name, details.curType, eGL_TEXTURE_MAX_ANISOTROPY, + &state.maxAniso); if(details.curType != eGL_TEXTURE_RECTANGLE) { GL.glTextureParameterfvEXT(live.name, details.curType, eGL_TEXTURE_MIN_LOD, &state.minLod); @@ -2357,6 +2379,8 @@ void GLResourceManager::Apply_InitialState(GLResource live, const GLInitialConte GL.glSamplerParameterf(live.name, eGL_TEXTURE_MAX_LOD, data.maxLod); if(!IsGLES) GL.glSamplerParameterf(live.name, eGL_TEXTURE_LOD_BIAS, data.lodBias); + if(HasExt[ARB_texture_filter_anisotropic]) + GL.glSamplerParameterf(live.name, eGL_TEXTURE_MAX_ANISOTROPY, data.maxAniso); // see fetch in PrepareTextureInitialContents if(HasExt[ARB_texture_border_clamp]) diff --git a/renderdoc/driver/gl/gl_initstate.h b/renderdoc/driver/gl/gl_initstate.h index d016b7f72..dcd5a070e 100644 --- a/renderdoc/driver/gl/gl_initstate.h +++ b/renderdoc/driver/gl/gl_initstate.h @@ -146,6 +146,7 @@ struct TextureStateInitialData GLResource texBuffer; uint32_t texBufOffs; uint32_t texBufSize; + float maxAniso; }; DECLARE_REFLECTION_STRUCT(TextureStateInitialData);