Handle multisampled renderbuffers with 0 sample count. Closes #2242

* GL apparently allows this, and it's equivalent to creating a non-multisampled
  renderbuffer. That means we need to create a 2D texture to blit to instead of
  a 2D MSAA texture.
This commit is contained in:
baldurk
2021-04-12 14:27:33 +01:00
parent 3995b81dcc
commit cf8785db90
@@ -2746,7 +2746,7 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
texDetails.width = width;
texDetails.height = height;
texDetails.depth = 1;
texDetails.samples = samples;
texDetails.samples = RDCMAX(1, samples);
texDetails.curType = eGL_RENDERBUFFER;
texDetails.internalFormat = internalformat;
texDetails.mipsValid = 1;
@@ -2806,11 +2806,31 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
internalformat = MakeGLFormat(resfmt);
}
// create read-from texture for displaying this render buffer
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE, texDetails.renderbufferReadTex);
GL.glTextureStorage2DMultisampleEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D_MULTISAMPLE,
samples, internalformat, width, height, true);
GLenum texEnum;
if(samples > 1)
{
texEnum = eGL_TEXTURE_2D_MULTISAMPLE;
// create read-from texture for displaying this render buffer
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(texEnum, texDetails.renderbufferReadTex);
GL.glTextureStorage2DMultisampleEXT(texDetails.renderbufferReadTex, texEnum, samples,
internalformat, width, height, true);
}
else
{
texEnum = eGL_TEXTURE_2D;
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(texEnum, texDetails.renderbufferReadTex);
GL.glTextureImage2DEXT(texDetails.renderbufferReadTex, texEnum, 0, internalformat, width,
height, 0, GetBaseFormat(internalformat), GetDataType(internalformat),
NULL);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MAX_LEVEL, 0);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MAG_FILTER,
eGL_LINEAR);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MIN_FILTER,
eGL_LINEAR);
}
GL.glGenFramebuffers(2, texDetails.renderbufferFBOs);
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[0]);
@@ -2825,8 +2845,8 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
attach = eGL_DEPTH_STENCIL_ATTACHMENT;
GL.glNamedFramebufferRenderbufferEXT(texDetails.renderbufferFBOs[0], attach, eGL_RENDERBUFFER,
renderbuffer.name);
GL.glNamedFramebufferTexture2DEXT(texDetails.renderbufferFBOs[1], attach,
eGL_TEXTURE_2D_MULTISAMPLE, texDetails.renderbufferReadTex, 0);
GL.glNamedFramebufferTexture2DEXT(texDetails.renderbufferFBOs[1], attach, texEnum,
texDetails.renderbufferReadTex, 0);
AddResourceInitChunk(renderbuffer);
}
@@ -2941,7 +2961,7 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisampleEXT(SerialiserType
texDetails.width = width;
texDetails.height = height;
texDetails.depth = 1;
texDetails.samples = samples;
texDetails.samples = RDCMAX(1, samples);
texDetails.curType = eGL_RENDERBUFFER;
texDetails.internalFormat = internalformat;
texDetails.mipsValid = 1;
@@ -3006,10 +3026,31 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisampleEXT(SerialiserType
}
// create read-from texture for displaying this render buffer
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(eGL_TEXTURE_2D_MULTISAMPLE, texDetails.renderbufferReadTex);
GL.glTextureStorage2DMultisampleEXT(texDetails.renderbufferReadTex, eGL_TEXTURE_2D_MULTISAMPLE,
samples, internalformat, width, height, true);
GLenum texEnum;
if(samples > 1)
{
texEnum = eGL_TEXTURE_2D_MULTISAMPLE;
// create read-from texture for displaying this render buffer
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(texEnum, texDetails.renderbufferReadTex);
GL.glTextureStorage2DMultisampleEXT(texDetails.renderbufferReadTex, texEnum, samples,
internalformat, width, height, true);
}
else
{
texEnum = eGL_TEXTURE_2D;
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(texEnum, texDetails.renderbufferReadTex);
GL.glTextureImage2DEXT(texDetails.renderbufferReadTex, texEnum, 0, internalformat, width,
height, 0, GetBaseFormat(internalformat), GetDataType(internalformat),
NULL);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MAX_LEVEL, 0);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MAG_FILTER,
eGL_LINEAR);
GL.glTextureParameteriEXT(texDetails.renderbufferReadTex, texEnum, eGL_TEXTURE_MIN_FILTER,
eGL_LINEAR);
}
GL.glGenFramebuffers(2, texDetails.renderbufferFBOs);
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[0]);
@@ -3024,8 +3065,8 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisampleEXT(SerialiserType
attach = eGL_DEPTH_STENCIL_ATTACHMENT;
GL.glNamedFramebufferRenderbufferEXT(texDetails.renderbufferFBOs[0], attach, eGL_RENDERBUFFER,
renderbuffer.name);
GL.glNamedFramebufferTexture2DEXT(texDetails.renderbufferFBOs[1], attach,
eGL_TEXTURE_2D_MULTISAMPLE, texDetails.renderbufferReadTex, 0);
GL.glNamedFramebufferTexture2DEXT(texDetails.renderbufferFBOs[1], attach, texEnum,
texDetails.renderbufferReadTex, 0);
AddResourceInitChunk(renderbuffer);