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]);