From df575a17b4499fd6cd3c8670b6fbb7b3192e951f Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 15 Jun 2020 15:43:41 +0100 Subject: [PATCH] Ensure all texture parameter set & get happens with active texture 0 * It's unclear exactly what happens when a different active texture is set, the spec seems to suggest that the active texture unit is ignored for most queries that aren't about texture-slot bindings but then it doesn't say explicitly whether that means glBindTexture() with a non-zero active slot will then bind the texture for querying or not. * For safety and simplicity we always work on texture unit 0. On replay this is most simply accomplished by pushing and popping the active slot at the same time that we push and pop the binding for our EXT_direct_state_access emulation. * For the couple of cases that happen during capture when we might not be emulating EXT_direct_state_access, we push and pop by hand. --- renderdoc/driver/gl/gl_common.cpp | 9 ++ renderdoc/driver/gl/gl_debug.cpp | 26 ++--- renderdoc/driver/gl/gl_driver.cpp | 12 +-- renderdoc/driver/gl/gl_msaa_array_conv.cpp | 96 ++++++++++--------- renderdoc/driver/gl/gl_outputwindow.cpp | 29 ++++-- renderdoc/driver/gl/gl_overlay.cpp | 93 +++++++++++------- renderdoc/driver/gl/gl_rendertext.cpp | 5 + renderdoc/driver/gl/gl_rendertexture.cpp | 6 +- renderdoc/driver/gl/gl_replay.cpp | 72 +++++++------- renderdoc/driver/gl/wrappers/gl_emulated.cpp | 36 ++++++- .../gl/wrappers/gl_framebuffer_funcs.cpp | 14 ++- 11 files changed, 249 insertions(+), 149 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index ef3c37846..7a6a9ea65 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -556,6 +556,10 @@ void DoVendorChecks(GLPlatform &platform, GLWindowingData context) GLuint prevTex = 0; GL.glGetIntegerv(eGL_TEXTURE_BINDING_2D, (GLint *)&prevTex); + GLenum oldActive = eGL_TEXTURE0; + GL.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&oldActive); + GL.glActiveTexture(eGL_TEXTURE0); + GLuint texs[2]; GL.glGenTextures(2, texs); @@ -585,6 +589,7 @@ void DoVendorChecks(GLPlatform &platform, GLWindowingData context) } GL.glBindTexture(eGL_TEXTURE_2D, prevTex); + GL.glActiveTexture(oldActive); GL.glDeleteTextures(2, texs); ClearGLErrors(); @@ -595,6 +600,9 @@ void DoVendorChecks(GLPlatform &platform, GLWindowingData context) GL.glGetIntegerv(eGL_TEXTURE_BINDING_CUBE_MAP, (GLint *)&prevTex); GL.glGenTextures(2, texs); + GL.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&oldActive); + GL.glActiveTexture(eGL_TEXTURE0); + const size_t dim = 32; char buf[dim * dim / 2]; @@ -656,6 +664,7 @@ void DoVendorChecks(GLPlatform &platform, GLWindowingData context) } GL.glBindTexture(eGL_TEXTURE_CUBE_MAP, prevTex); + GL.glActiveTexture(oldActive); GL.glDeleteTextures(2, texs); ClearGLErrors(); diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index d265a8318..087e1f0e8 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -757,11 +757,15 @@ void GLReplay::InitDebugData() drv.glTextureImage2DEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, 0, eGL_RGBA32F, 1, 1, 0, eGL_RGBA, eGL_FLOAT, NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(DebugData.pickPixelTex, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); drv.glFramebufferTexture2D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, eGL_TEXTURE_2D, DebugData.pickPixelTex, 0); @@ -1572,8 +1576,8 @@ bool GLReplay::GetMinMax(ResourceId texid, const Subresource &sub, CompType type GLint origDSTexMode = eGL_DEPTH_COMPONENT; if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) { - GL.glGetTexParameteriv(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); - GL.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); + GL.glGetTextureParameterivEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); + GL.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); } GLint baseLevel[4] = {-1}; @@ -1645,7 +1649,7 @@ bool GLReplay::GetMinMax(ResourceId texid, const Subresource &sub, CompType type maxval[3] = minmax[1].w; if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) - GL.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); + GL.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); return true; } @@ -1852,8 +1856,8 @@ bool GLReplay::GetHistogram(ResourceId texid, const Subresource &sub, CompType t GLint origDSTexMode = eGL_DEPTH_COMPONENT; if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) { - GL.glGetTexParameteriv(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); - GL.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); + GL.glGetTextureParameterivEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); + GL.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); } GLint baseLevel[4] = {-1}; @@ -1913,7 +1917,7 @@ bool GLReplay::GetHistogram(ResourceId texid, const Subresource &sub, CompType t RestoreSamplerParams(target, texname, prevSampState); if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) - GL.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); + GL.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); return true; } diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 95765df54..79bba8ccf 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -786,11 +786,11 @@ void WrappedOpenGL::CreateReplayBackbuffer(const GLInitParams ¶ms, ResourceI { drv.glTextureImage2DEXT(col, target, 0, colfmt, width, height, 0, GetBaseFormat(colfmt), GetDataType(colfmt), NULL); - drv.glTexParameteri(target, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(target, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(target, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(target, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(target, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(col, target, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(col, target, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(col, target, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(col, target, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(col, target, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); } drv.glFramebufferTexture2D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, target, col, 0); @@ -842,7 +842,7 @@ void WrappedOpenGL::CreateReplayBackbuffer(const GLInitParams ¶ms, ResourceI } else { - drv.glTexParameteri(target, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(depth, target, eGL_TEXTURE_MAX_LEVEL, 0); drv.glTextureImage2DEXT(depth, target, 0, depthfmt, width, height, 0, GetBaseFormat(depthfmt), GetDataType(depthfmt), NULL); } diff --git a/renderdoc/driver/gl/gl_msaa_array_conv.cpp b/renderdoc/driver/gl/gl_msaa_array_conv.cpp index c876c2acf..85c92792d 100644 --- a/renderdoc/driver/gl/gl_msaa_array_conv.cpp +++ b/renderdoc/driver/gl/gl_msaa_array_conv.cpp @@ -159,7 +159,7 @@ void WrappedOpenGL::CopyTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLint wi GL.glTextureImage3DEXT(destArray, eGL_TEXTURE_2D_ARRAY, 0, intFormat, width, height, arraySize * samples, 0, GetBaseFormat(intFormat), GetDataType(intFormat), NULL); - GL.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + GL.glTextureParameteriEXT(destArray, eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); return; } @@ -206,8 +206,8 @@ void WrappedOpenGL::CopyTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLint wi GL.glBindImageTexture(2, texs[0], 0, GL_TRUE, 0, eGL_WRITE_ONLY, fmt); GL.glActiveTexture(eGL_TEXTURE0); GL.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, texs[1]); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); GL.glUseProgram(arrms.MS2Array); @@ -245,8 +245,8 @@ void WrappedOpenGL::CopyDepthTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLi GL.glTextureView(texs[0], eGL_TEXTURE_2D_ARRAY, destArray, intFormat, 0, 1, 0, arraySize * samples); GL.glTextureView(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, srcMS, intFormat, 0, 1, 0, arraySize); GL.glTextureView(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, srcMS, intFormat, 0, 1, 0, arraySize); - GL.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + GL.glTextureParameteriEXT(texs[0], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + GL.glTextureParameteriEXT(texs[0], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); GLuint fbo = 0; GL.glGenFramebuffers(1, &fbo); @@ -293,14 +293,18 @@ void WrappedOpenGL::CopyDepthTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLi // depth aspect GL.glActiveTexture(eGL_TEXTURE0); GL.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, texs[1]); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, - eGL_DEPTH_COMPONENT); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + GL.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, + eGL_DEPTH_STENCIL_TEXTURE_MODE, eGL_DEPTH_COMPONENT); } if(numStencil > 1) @@ -308,14 +312,18 @@ void WrappedOpenGL::CopyDepthTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLi // stencil aspect GL.glActiveTexture(eGL_TEXTURE1); GL.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, texs[2]); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, - eGL_STENCIL_INDEX); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + GL.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, + eGL_DEPTH_STENCIL_TEXTURE_MODE, eGL_STENCIL_INDEX); } GLint loc = GL.glGetUniformLocation(arrms.DepthMS2Array, "mscopy"); @@ -424,12 +432,12 @@ void WrappedOpenGL::CopyArrayToTex2DMS(GLuint destMS, GLuint srcArray, GLint wid drv.glBindImageTexture(2, texs[0], 0, GL_TRUE, 0, eGL_WRITE_ONLY, fmt); drv.glActiveTexture(eGL_TEXTURE0); drv.glBindTexture(eGL_TEXTURE_2D_ARRAY, texs[1]); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); drv.glUseProgram(arrms.Array2MS); @@ -482,8 +490,8 @@ void WrappedOpenGL::CopyDepthArrayToTex2DMS(GLuint destMS, GLuint srcArray, GLin drv.glTextureView(texs[0], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, destMS, intFormat, 0, 1, 0, arraySize); drv.glTextureView(texs[1], eGL_TEXTURE_2D_ARRAY, srcArray, intFormat, 0, 1, 0, arraySize * samples); drv.glTextureView(texs[2], eGL_TEXTURE_2D_ARRAY, srcArray, intFormat, 0, 1, 0, arraySize * samples); - drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(texs[0], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + drv.glTextureParameteriEXT(texs[0], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); GLuint fbo = 0; drv.glGenFramebuffers(1, &fbo); @@ -532,13 +540,14 @@ void WrappedOpenGL::CopyDepthArrayToTex2DMS(GLuint destMS, GLuint srcArray, GLin // depth aspect drv.glActiveTexture(eGL_TEXTURE0); drv.glBindTexture(eGL_TEXTURE_2D_ARRAY, texs[1]); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, eGL_DEPTH_COMPONENT); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(texs[1], eGL_TEXTURE_2D_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, + eGL_DEPTH_COMPONENT); } if(numStencil > 1) @@ -546,13 +555,14 @@ void WrappedOpenGL::CopyDepthArrayToTex2DMS(GLuint destMS, GLuint srcArray, GLin // stencil aspect drv.glActiveTexture(eGL_TEXTURE1); drv.glBindTexture(eGL_TEXTURE_2D_ARRAY, texs[2]); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, eGL_STENCIL_INDEX); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(texs[2], eGL_TEXTURE_2D_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE, + eGL_STENCIL_INDEX); } GLint loc = drv.glGetUniformLocation(arrms.DepthArray2MS, "mscopy"); diff --git a/renderdoc/driver/gl/gl_outputwindow.cpp b/renderdoc/driver/gl/gl_outputwindow.cpp index 9af678e19..e9a116c76 100644 --- a/renderdoc/driver/gl/gl_outputwindow.cpp +++ b/renderdoc/driver/gl/gl_outputwindow.cpp @@ -46,11 +46,15 @@ void GLReplay::CreateOutputWindowBackbuffer(OutputWindow &outwin, bool depth) drv.glTextureImage2DEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, 0, eGL_SRGB8_ALPHA8, outwin.width, outwin.height, 0, eGL_RGBA, eGL_UNSIGNED_BYTE, NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(outwin.BlitData.backbuffer, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); drv.glFramebufferTexture2D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, eGL_TEXTURE_2D, outwin.BlitData.backbuffer, 0); @@ -62,11 +66,16 @@ void GLReplay::CreateOutputWindowBackbuffer(OutputWindow &outwin, bool depth) drv.glTextureImage2DEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, 0, eGL_DEPTH_COMPONENT24, outwin.width, outwin.height, 0, eGL_DEPTH_COMPONENT, eGL_UNSIGNED_INT, NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, + 0); + drv.glTextureParameteriEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(outwin.BlitData.depthstencil, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } else { diff --git a/renderdoc/driver/gl/gl_overlay.cpp b/renderdoc/driver/gl/gl_overlay.cpp index e4d0c6294..a266d6761 100644 --- a/renderdoc/driver/gl/gl_overlay.cpp +++ b/renderdoc/driver/gl/gl_overlay.cpp @@ -533,11 +533,16 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug RDCMAX(1, texDetails.height >> i), 0, format, type, NULL); } - drv.glTexParameteri(texBindingEnum, eGL_TEXTURE_MAX_LEVEL, texMips - 1); - drv.glTexParameteri(texBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(texBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(texBindingEnum, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(texBindingEnum, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(DebugData.overlayTex, texBindingEnum, eGL_TEXTURE_MAX_LEVEL, + texMips - 1); + drv.glTextureParameteriEXT(DebugData.overlayTex, texBindingEnum, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(DebugData.overlayTex, texBindingEnum, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(DebugData.overlayTex, texBindingEnum, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(DebugData.overlayTex, texBindingEnum, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } // clear all mips first @@ -886,11 +891,13 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug depthCopy, copyBindingEnum, i, fmt, RDCMAX(1, DebugData.overlayTexWidth >> i), RDCMAX(1, DebugData.overlayTexHeight >> i), DebugData.overlayTexSlices, 0, GetBaseFormat(fmt), GetDataType(fmt), NULL); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } } else @@ -911,11 +918,13 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug RDCMAX(1, DebugData.overlayTexWidth >> i), RDCMAX(1, DebugData.overlayTexHeight >> i), 0, GetBaseFormat(fmt), GetDataType(fmt), NULL); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(depthCopy, copyBindingEnum, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } } @@ -966,11 +975,15 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug stencilCopy, copyBindingEnum, i, fmt, RDCMAX(1, DebugData.overlayTexWidth >> i), RDCMAX(1, DebugData.overlayTexHeight >> i), DebugData.overlayTexSlices, 0, GetBaseFormat(fmt), GetDataType(fmt), NULL); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } } else @@ -991,11 +1004,15 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug RDCMAX(1, DebugData.overlayTexWidth >> i), RDCMAX(1, DebugData.overlayTexHeight >> i), 0, GetBaseFormat(fmt), GetDataType(fmt), NULL); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(copyBindingEnum, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(stencilCopy, copyBindingEnum, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); } } @@ -1572,7 +1589,7 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug drv.glTextureImage3DEXT(quadtexs[2], eGL_TEXTURE_2D_ARRAY, 0, eGL_R32UI, RDCMAX(1, outWidth >> 1), RDCMAX(1, outHeight >> 1), 4, 0, eGL_RED_INTEGER, eGL_UNSIGNED_INT, NULL); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(quadtexs[2], eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); // temporarily attach to FBO to clear it GLint zero[4] = {0}; @@ -1588,11 +1605,13 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug drv.glBindTexture(eGL_TEXTURE_2D, quadtexs[0]); drv.glTextureImage2DEXT(quadtexs[0], eGL_TEXTURE_2D, 0, eGL_RGBA8, outWidth, outHeight, 0, eGL_RGBA, eGL_UNSIGNED_BYTE, NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(quadtexs[0], eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(quadtexs[0], eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(quadtexs[0], eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(quadtexs[0], eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(quadtexs[0], eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); drv.glFramebufferTexture2D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, eGL_TEXTURE_2D, quadtexs[0], 0); @@ -1630,11 +1649,13 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, Debug drv.glBindTexture(eGL_TEXTURE_2D, quadtexs[1]); drv.glTextureImage2DEXT(quadtexs[1], eGL_TEXTURE_2D, 0, fmt, outWidth, outHeight, 0, GetBaseFormat(fmt), GetDataType(fmt), NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(quadtexs[1], eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(quadtexs[1], eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(quadtexs[1], eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(quadtexs[1], eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(quadtexs[1], eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); GLenum dsAttach = eGL_DEPTH_STENCIL_ATTACHMENT; diff --git a/renderdoc/driver/gl/gl_rendertext.cpp b/renderdoc/driver/gl/gl_rendertext.cpp index 8b4037371..a9c1bc2b4 100644 --- a/renderdoc/driver/gl/gl_rendertext.cpp +++ b/renderdoc/driver/gl/gl_rendertext.cpp @@ -91,6 +91,10 @@ void WrappedOpenGL::ContextData::CreateDebugData() GLuint curtex = 0; GL.glGetIntegerv(eGL_TEXTURE_BINDING_2D, (GLint *)&curtex); + GLenum oldActive = eGL_TEXTURE0; + GL.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&oldActive); + GL.glActiveTexture(eGL_TEXTURE0); + GLenum texFmt = eGL_R8; if(Legacy()) texFmt = eGL_LUMINANCE; @@ -104,6 +108,7 @@ void WrappedOpenGL::ContextData::CreateDebugData() GL.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_LINEAR); GL.glBindTexture(eGL_TEXTURE_2D, curtex); + GL.glActiveTexture(oldActive); pack.Apply(false); unpack.Apply(false); diff --git a/renderdoc/driver/gl/gl_rendertexture.cpp b/renderdoc/driver/gl/gl_rendertexture.cpp index 9cd9558f6..fe78e0e03 100644 --- a/renderdoc/driver/gl/gl_rendertexture.cpp +++ b/renderdoc/driver/gl/gl_rendertexture.cpp @@ -436,8 +436,8 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, TexDisplayFlags flags) GLint origDSTexMode = eGL_DEPTH_COMPONENT; if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) { - drv.glGetTexParameteriv(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); - drv.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); + drv.glGetTextureParameterivEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &origDSTexMode); + drv.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, dsTexMode); } // defined as arrays mostly for Coverity code analysis to stay calm about passing @@ -676,7 +676,7 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, TexDisplayFlags flags) } if(dsTexMode != eGL_NONE && HasExt[ARB_stencil_texturing]) - drv.glTexParameteri(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); + drv.glTextureParameteriEXT(texname, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, origDSTexMode); if(castTexture) drv.glDeleteTextures(1, &castTexture); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 09678a419..4e80a1724 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1283,8 +1283,8 @@ void GLReplay::SavePipelineState(uint32_t eventId) if(target != eGL_TEXTURE_BUFFER) { - drv.glGetTexParameteriv(target, eGL_TEXTURE_BASE_LEVEL, &firstMip); - drv.glGetTexParameteriv(target, eGL_TEXTURE_MAX_LEVEL, &numMips); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_BASE_LEVEL, &firstMip); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_MAX_LEVEL, &numMips); numMips = numMips - firstMip + 1; } @@ -1305,7 +1305,7 @@ void GLReplay::SavePipelineState(uint32_t eventId) GLint depthMode = eGL_DEPTH_COMPONENT; if(HasExt[ARB_stencil_texturing]) - drv.glGetTexParameteriv(target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &depthMode); + drv.glGetTextureParameterivEXT(tex, target, eGL_DEPTH_STENCIL_TEXTURE_MODE, &depthMode); if(depthMode == eGL_DEPTH_COMPONENT) pipe.textures[unit].depthReadChannel = 0; @@ -1352,29 +1352,29 @@ void GLReplay::SavePipelineState(uint32_t eventId) drv.glGetSamplerParameterfv(samp, eGL_TEXTURE_BORDER_COLOR, &pipe.samplers[unit].borderColor[0]); else - drv.glGetTexParameterfv(target, eGL_TEXTURE_BORDER_COLOR, - &pipe.samplers[unit].borderColor[0]); + drv.glGetTextureParameterfvEXT(tex, target, eGL_TEXTURE_BORDER_COLOR, + &pipe.samplers[unit].borderColor[0]); GLint v; v = 0; if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_S, &v); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_S, &v); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_WRAP_S, &v); pipe.samplers[unit].addressS = MakeAddressMode((GLenum)v); v = 0; if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_T, &v); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_T, &v); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_WRAP_T, &v); pipe.samplers[unit].addressT = MakeAddressMode((GLenum)v); v = 0; if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_R, &v); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_R, &v); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_WRAP_R, &v); pipe.samplers[unit].addressR = MakeAddressMode((GLenum)v); v = 0; @@ -1383,7 +1383,7 @@ void GLReplay::SavePipelineState(uint32_t eventId) if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_CUBE_MAP_SEAMLESS, &v); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_CUBE_MAP_SEAMLESS, &v); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_CUBE_MAP_SEAMLESS, &v); } pipe.samplers[unit].seamlessCubeMap = (v != 0 || rs.Enabled[GLRenderState::eEnabled_TexCubeSeamless]); @@ -1392,7 +1392,7 @@ void GLReplay::SavePipelineState(uint32_t eventId) if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_COMPARE_FUNC, &v); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_COMPARE_FUNC, &v); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_COMPARE_FUNC, &v); pipe.samplers[unit].compareFunction = MakeCompareFunc((GLenum)v); GLint minf = 0; @@ -1400,12 +1400,12 @@ void GLReplay::SavePipelineState(uint32_t eventId) if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_MIN_FILTER, &minf); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_MIN_FILTER, &minf); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_MIN_FILTER, &minf); if(samp != 0) drv.glGetSamplerParameteriv(samp, eGL_TEXTURE_MAG_FILTER, &magf); else - drv.glGetTexParameteriv(target, eGL_TEXTURE_MAG_FILTER, &magf); + drv.glGetTextureParameterivEXT(tex, target, eGL_TEXTURE_MAG_FILTER, &magf); if(HasExt[ARB_texture_filter_anisotropic]) { @@ -1413,8 +1413,8 @@ void GLReplay::SavePipelineState(uint32_t eventId) drv.glGetSamplerParameterfv(samp, eGL_TEXTURE_MAX_ANISOTROPY, &pipe.samplers[unit].maxAnisotropy); else - drv.glGetTexParameterfv(target, eGL_TEXTURE_MAX_ANISOTROPY, - &pipe.samplers[unit].maxAnisotropy); + drv.glGetTextureParameterfvEXT(tex, target, eGL_TEXTURE_MAX_ANISOTROPY, + &pipe.samplers[unit].maxAnisotropy); } else { @@ -1427,12 +1427,14 @@ void GLReplay::SavePipelineState(uint32_t eventId) if(samp != 0) drv.glGetSamplerParameterfv(samp, eGL_TEXTURE_MAX_LOD, &pipe.samplers[unit].maxLOD); else - drv.glGetTexParameterfv(target, eGL_TEXTURE_MAX_LOD, &pipe.samplers[unit].maxLOD); + drv.glGetTextureParameterfvEXT(tex, target, eGL_TEXTURE_MAX_LOD, + &pipe.samplers[unit].maxLOD); if(samp != 0) drv.glGetSamplerParameterfv(samp, eGL_TEXTURE_MIN_LOD, &pipe.samplers[unit].minLOD); else - drv.glGetTexParameterfv(target, eGL_TEXTURE_MIN_LOD, &pipe.samplers[unit].minLOD); + drv.glGetTextureParameterfvEXT(tex, target, eGL_TEXTURE_MIN_LOD, + &pipe.samplers[unit].minLOD); if(!IsGLES) { @@ -1440,7 +1442,8 @@ void GLReplay::SavePipelineState(uint32_t eventId) drv.glGetSamplerParameterfv(samp, eGL_TEXTURE_LOD_BIAS, &pipe.samplers[unit].mipLODBias); else - drv.glGetTexParameterfv(target, eGL_TEXTURE_LOD_BIAS, &pipe.samplers[unit].mipLODBias); + drv.glGetTextureParameterfvEXT(tex, target, eGL_TEXTURE_LOD_BIAS, + &pipe.samplers[unit].mipLODBias); } else { @@ -2432,18 +2435,18 @@ void GLReplay::GetTextureData(ResourceId tex, const Subresource &sub, else drv.glTextureImage2DEXT(tempTex, newtarget, 0, finalFormat, width, height, 0, GetBaseFormat(finalFormat), GetDataType(finalFormat), NULL); - drv.glTexParameteri(newtarget, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_MAX_LEVEL, 0); // create temp framebuffer GLuint fbo = 0; drv.glGenFramebuffers(1, &fbo); drv.glBindFramebuffer(eGL_FRAMEBUFFER, fbo); - drv.glTexParameteri(newtarget, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - drv.glTexParameteri(newtarget, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - drv.glTexParameteri(newtarget, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(newtarget, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); - drv.glTexParameteri(newtarget, eGL_TEXTURE_WRAP_R, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + drv.glTextureParameteriEXT(tempTex, newtarget, eGL_TEXTURE_WRAP_R, eGL_CLAMP_TO_EDGE); if(newtarget == eGL_TEXTURE_3D) drv.glFramebufferTexture3D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, eGL_TEXTURE_3D, tempTex, 0, 0); @@ -2586,7 +2589,7 @@ void GLReplay::GetTextureData(ResourceId tex, const Subresource &sub, drv.glBindTexture(eGL_TEXTURE_2D, tempTex); drv.glTextureImage2DEXT(tempTex, eGL_TEXTURE_2D, 0, intFormat, width, height, 0, GetBaseFormat(intFormat), GetDataType(intFormat), NULL); - drv.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(tempTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); // create temp framebuffers GLuint fbos[2] = {0}; @@ -2996,12 +2999,17 @@ void GLReplay::CreateCustomShaderTex(uint32_t w, uint32_t h) (GLsizei)RDCMAX(1U, w >> i), (GLsizei)RDCMAX(1U, h >> i), 0, eGL_RGBA, eGL_FLOAT, NULL); } - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_BASE_LEVEL, 0); - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, mips - 1); - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - m_pDriver->glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, + eGL_NEAREST); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, + eGL_NEAREST); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_BASE_LEVEL, 0); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, + mips - 1); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, + eGL_CLAMP_TO_EDGE); + m_pDriver->glTextureParameteriEXT(DebugData.customTex, eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, + eGL_CLAMP_TO_EDGE); DebugData.CustomShaderTexID = m_pDriver->GetResourceManager()->GetID(TextureRes(m_pDriver->GetCtx(), DebugData.customTex)); @@ -3217,7 +3225,7 @@ ResourceId GLReplay::CreateProxyTexture(const TextureDescription &templateTex) } } - drv.glTexParameteri(target, eGL_TEXTURE_MAX_LEVEL, templateTex.mips - 1); + drv.glTextureParameteriEXT(tex, target, eGL_TEXTURE_MAX_LEVEL, templateTex.mips - 1); } // Swizzle R/B channels only for non BGRA textures @@ -3450,7 +3458,7 @@ void GLReplay::SetProxyTextureData(ResourceId texid, const Subresource &sub, byt drv.glBindTexture(eGL_TEXTURE_2D_ARRAY, uploadTex); drv.glTextureStorage3DEXT(uploadTex, eGL_TEXTURE_2D_ARRAY, 1, texdetails.internalFormat, width, height, texdetails.samples * RDCMAX(1, texdetails.depth)); - drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); + drv.glTextureParameteriEXT(uploadTex, eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0); GLint unpackedSlice = slice * texdetails.samples + sample; diff --git a/renderdoc/driver/gl/wrappers/gl_emulated.cpp b/renderdoc/driver/gl/wrappers/gl_emulated.cpp index 00bb1e70e..d00a4a116 100644 --- a/renderdoc/driver/gl/wrappers/gl_emulated.cpp +++ b/renderdoc/driver/gl/wrappers/gl_emulated.cpp @@ -81,6 +81,30 @@ struct PushPop GL.glGetIntegerv(binding, (GLint *)&o); } + PushPop(GLenum target, PFNGLBINDTEXTUREPROC bindFunc, PFNGLACTIVETEXTUREPROC activeFunc, + BindingLookupFunc bindingLookup) + { + GL.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&activeTex); + activeFunc(eGL_TEXTURE0); + + other = bindFunc; + active = activeFunc; + t = target; + GL.glGetIntegerv(bindingLookup(target), (GLint *)&o); + } + + PushPop(GLenum target, PFNGLBINDTEXTUREPROC bindFunc, PFNGLACTIVETEXTUREPROC activeFunc, + GLenum binding) + { + GL.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&activeTex); + activeFunc(eGL_TEXTURE0); + + other = bindFunc; + active = activeFunc; + t = target; + GL.glGetIntegerv(binding, (GLint *)&o); + } + PushPop(VAOMode, PFNGLBINDVERTEXARRAYPROC bindFunc) { vao = bindFunc; @@ -101,14 +125,20 @@ struct PushPop prog(o); else if(other) other(t, o); + + if(active) + active(activeTex); } PFNGLUSEPROGRAMPROC prog = NULL; PFNGLBINDVERTEXARRAYPROC vao = NULL; PFNGLBINDTEXTUREPROC other = NULL; + PFNGLACTIVETEXTUREPROC active = NULL; GLenum t = eGL_NONE; GLuint o = 0; + + GLenum activeTex = eGL_TEXTURE0; }; // if specifying the image or etc for a cubemap face, we must bind the cubemap itself. @@ -128,9 +158,9 @@ GLenum TexBindTarget(GLenum target) return target; } -#define PushPopTexture(target, obj) \ - GLenum bindtarget = TexBindTarget(target); \ - PushPop CONCAT(prev, __LINE__)(bindtarget, GL.glBindTexture, &TextureBinding); \ +#define PushPopTexture(target, obj) \ + GLenum bindtarget = TexBindTarget(target); \ + PushPop CONCAT(prev, __LINE__)(bindtarget, GL.glBindTexture, GL.glActiveTexture, &TextureBinding); \ GL.glBindTexture(bindtarget, obj); #define PushPopBuffer(target, obj) \ diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 2536d140d..22509a577 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -2415,11 +2415,15 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageEXT(SerialiserType &ser, // create read-from texture for displaying this render buffer GL.glGenTextures(1, &texDetails.renderbufferReadTex); GL.glBindTexture(eGL_TEXTURE_2D, texDetails.renderbufferReadTex); - GL.glTexImage2D(eGL_TEXTURE_2D, 0, internalformat, width, height, 0, - GetBaseFormat(internalformat), GetDataType(internalformat), NULL); - GL.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, 0); - GL.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_LINEAR); - GL.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_LINEAR); + GL.glTextureImage2DEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D, 0, internalformat, width, + height, 0, GetBaseFormat(internalformat), GetDataType(internalformat), + NULL); + GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D, eGL_TEXTURE_MAX_LEVEL, + 0); + GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D, + eGL_TEXTURE_MAG_FILTER, eGL_LINEAR); + GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D, + eGL_TEXTURE_MIN_FILTER, eGL_LINEAR); GL.glGenFramebuffers(2, texDetails.renderbufferFBOs); GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[0]);