mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-08 08:40:55 +00:00
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.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user