Don't trash tracked state when doing depth MSAA to array copy

* We save and restore the render state, but GLRenderState only sets the state
  directly on GL, if we make state changes through the driver our tracking will
  get out of sync.
This commit is contained in:
baldurk
2020-05-20 20:15:26 +01:00
parent 597230f352
commit 724b6185ee
+52 -55
View File
@@ -231,45 +231,42 @@ void WrappedOpenGL::CopyDepthTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLi
{
GLMarkerRegion renderoverlay("CopyDepthTex2DMSToArray");
WrappedOpenGL &drv = *this;
const ArrayMSPrograms &arrms = GetArrayMS();
GLRenderState rs;
rs.FetchState(this);
GLuint vao = 0;
drv.glGenVertexArrays(1, &vao);
drv.glBindVertexArray(vao);
GL.glGenVertexArrays(1, &vao);
GL.glBindVertexArray(vao);
GLuint texs[3];
drv.glGenTextures(3, texs);
drv.glTextureView(texs[0], eGL_TEXTURE_2D_ARRAY, destArray, intFormat, 0, 1, 0,
arraySize * samples);
drv.glTextureView(texs[1], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, srcMS, intFormat, 0, 1, 0, arraySize);
drv.glTextureView(texs[2], eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, srcMS, intFormat, 0, 1, 0, arraySize);
drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_BASE_LEVEL, 0);
drv.glTexParameteri(eGL_TEXTURE_2D_ARRAY, eGL_TEXTURE_MAX_LEVEL, 0);
GL.glGenTextures(3, texs);
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);
GLuint fbo = 0;
drv.glGenFramebuffers(1, &fbo);
drv.glBindFramebuffer(eGL_FRAMEBUFFER, fbo);
drv.glDrawBuffers(0, NULL);
GL.glGenFramebuffers(1, &fbo);
GL.glBindFramebuffer(eGL_FRAMEBUFFER, fbo);
GL.glDrawBuffers(0, NULL);
drv.glUseProgram(arrms.DepthMS2Array);
drv.glViewport(0, 0, width, height);
GL.glUseProgram(arrms.DepthMS2Array);
GL.glViewport(0, 0, width, height);
drv.glDisable(eGL_CULL_FACE);
drv.glDisable(eGL_BLEND);
drv.glDisable(eGL_SCISSOR_TEST);
GL.glDisable(eGL_CULL_FACE);
GL.glDisable(eGL_BLEND);
GL.glDisable(eGL_SCISSOR_TEST);
if(!IsGLES)
drv.glPolygonMode(eGL_FRONT_AND_BACK, eGL_FILL);
drv.glEnable(eGL_DEPTH_TEST);
drv.glEnable(eGL_STENCIL_TEST);
drv.glDepthFunc(eGL_ALWAYS);
drv.glDepthMask(GL_TRUE);
drv.glStencilOp(eGL_REPLACE, eGL_REPLACE, eGL_REPLACE);
drv.glStencilMask(0xff);
GL.glPolygonMode(eGL_FRONT_AND_BACK, eGL_FILL);
GL.glEnable(eGL_DEPTH_TEST);
GL.glEnable(eGL_STENCIL_TEST);
GL.glDepthFunc(eGL_ALWAYS);
GL.glDepthMask(GL_TRUE);
GL.glStencilOp(eGL_REPLACE, eGL_REPLACE, eGL_REPLACE);
GL.glStencilMask(0xff);
uint32_t numStencil = 1;
GLenum attach = eGL_DEPTH_ATTACHMENT;
@@ -294,59 +291,59 @@ void WrappedOpenGL::CopyDepthTex2DMSToArray(GLuint &destArray, GLuint srcMS, GLi
if(attach == eGL_DEPTH_STENCIL_ATTACHMENT || attach == eGL_DEPTH_ATTACHMENT)
{
// depth aspect
drv.glActiveTexture(eGL_TEXTURE0);
drv.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, texs[1]);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE);
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.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE,
eGL_DEPTH_COMPONENT);
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);
}
if(numStencil > 1)
{
// stencil aspect
drv.glActiveTexture(eGL_TEXTURE1);
drv.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, texs[2]);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE);
drv.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE);
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.glTexParameteri(eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, eGL_DEPTH_STENCIL_TEXTURE_MODE,
eGL_STENCIL_INDEX);
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);
}
GLint loc = drv.glGetUniformLocation(arrms.DepthMS2Array, "mscopy");
GLint loc = GL.glGetUniformLocation(arrms.DepthMS2Array, "mscopy");
if(loc >= 0)
{
for(GLint i = 0; i < arraySize * samples; i++)
{
drv.glFramebufferTextureLayer(eGL_DRAW_FRAMEBUFFER, attach, texs[0], 0, i);
GL.glFramebufferTextureLayer(eGL_DRAW_FRAMEBUFFER, attach, texs[0], 0, i);
for(uint32_t s = 0; s < numStencil; s++)
{
uint32_t currentStencil = numStencil == 1 ? 1000 : s;
drv.glStencilFunc(eGL_ALWAYS, int(s), 0xff);
GL.glStencilFunc(eGL_ALWAYS, int(s), 0xff);
drv.glProgramUniform4i(arrms.DepthMS2Array, loc, samples, i % samples, i / samples,
currentStencil);
GL.glProgramUniform4i(arrms.DepthMS2Array, loc, samples, i % samples, i / samples,
currentStencil);
drv.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4);
GL.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4);
}
}
}
rs.ApplyState(this);
drv.glDeleteVertexArrays(1, &vao);
drv.glDeleteFramebuffers(1, &fbo);
drv.glDeleteTextures(3, texs);
GL.glDeleteVertexArrays(1, &vao);
GL.glDeleteFramebuffers(1, &fbo);
GL.glDeleteTextures(3, texs);
}
void WrappedOpenGL::CopyArrayToTex2DMS(GLuint destMS, GLuint srcArray, GLint width, GLint height,