When creating an unsized renderbuffer, convert to sized. Closes #1116

This commit is contained in:
baldurk
2018-10-01 16:38:40 +01:00
parent a008a4825b
commit 0ffff7d5da
@@ -2186,6 +2186,8 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageEXT(SerialiserType &ser,
ResourceId liveId = GetResourceManager()->GetID(renderbuffer);
TextureData &texDetails = m_Textures[liveId];
GLenum fmt = GetBaseFormat(internalformat);
texDetails.width = width;
texDetails.height = height;
texDetails.depth = 1;
@@ -2196,6 +2198,58 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageEXT(SerialiserType &ser,
GL.glNamedRenderbufferStorageEXT(renderbuffer.name, internalformat, width, height);
if(internalformat == eGL_DEPTH_COMPONENT || internalformat == eGL_DEPTH_STENCIL ||
internalformat == eGL_STENCIL || internalformat == eGL_STENCIL_INDEX)
{
// fetch the exact sized depth-stencil formats corresponding to whatever unsized format was
// specified.
GLint depth = 0;
GLint stencil = 0;
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_DEPTH_SIZE, &depth);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_STENCIL_SIZE,
&stencil);
if(depth == 16 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT16;
else if(depth == 24 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT24;
else if(depth == 24 && stencil == 8)
internalformat = eGL_DEPTH24_STENCIL8;
else if(depth == 32 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT32F;
else if(depth == 32 && stencil == 8)
internalformat = eGL_DEPTH32F_STENCIL8;
else if(depth == 0 && stencil == 8)
internalformat = eGL_STENCIL_INDEX8;
}
else if(internalformat == eGL_RGBA || internalformat == eGL_RGBA_INTEGER ||
internalformat == eGL_RGB || internalformat == eGL_RGB_INTEGER ||
internalformat == eGL_RG || internalformat == eGL_RG_INTEGER ||
internalformat == eGL_RED || internalformat == eGL_RED_INTEGER)
{
// if the color format is unsized, find the corresponding sized format
GLint red = 0, green = 0, blue = 0, alpha = 0;
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_RED_SIZE, &red);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_GREEN_SIZE, &green);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_BLUE_SIZE, &blue);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_ALPHA_SIZE, &alpha);
// we only handle a straight regular format here
RDCASSERT(red > 0);
RDCASSERT(green == 0 || green == red);
RDCASSERT(blue == 0 || green == red);
RDCASSERT(alpha == 0 || green == red);
// to start with, create resource format based on the unsized internalformat
ResourceFormat resfmt = MakeResourceFormat(eGL_TEXTURE_2D, internalformat);
// then set the byte size
resfmt.compByteWidth = uint8_t(red / 8);
internalformat = MakeGLFormat(resfmt);
}
// create read-from texture for displaying this render buffer
GL.glGenTextures(1, &texDetails.renderbufferReadTex);
GL.glBindTexture(eGL_TEXTURE_2D, texDetails.renderbufferReadTex);
@@ -2209,8 +2263,6 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageEXT(SerialiserType &ser,
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[0]);
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[1]);
GLenum fmt = GetBaseFormat(internalformat);
GLenum attach = eGL_COLOR_ATTACHMENT0;
if(fmt == eGL_DEPTH_COMPONENT)
attach = eGL_DEPTH_ATTACHMENT;
@@ -2320,6 +2372,8 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
ResourceId liveId = GetResourceManager()->GetID(renderbuffer);
TextureData &texDetails = m_Textures[liveId];
GLenum fmt = GetBaseFormat(internalformat);
texDetails.width = width;
texDetails.height = height;
texDetails.depth = 1;
@@ -2331,6 +2385,58 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
GL.glNamedRenderbufferStorageMultisampleEXT(renderbuffer.name, samples, internalformat, width,
height);
if(internalformat == eGL_DEPTH_COMPONENT || internalformat == eGL_DEPTH_STENCIL ||
internalformat == eGL_STENCIL || internalformat == eGL_STENCIL_INDEX)
{
// fetch the exact sized depth-stencil formats corresponding to whatever unsized format was
// specified.
GLint depth = 0;
GLint stencil = 0;
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_DEPTH_SIZE, &depth);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_STENCIL_SIZE,
&stencil);
if(depth == 16 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT16;
else if(depth == 24 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT24;
else if(depth == 24 && stencil == 8)
internalformat = eGL_DEPTH24_STENCIL8;
else if(depth == 32 && stencil == 0)
internalformat = eGL_DEPTH_COMPONENT32F;
else if(depth == 32 && stencil == 8)
internalformat = eGL_DEPTH32F_STENCIL8;
else if(depth == 0 && stencil == 8)
internalformat = eGL_STENCIL_INDEX8;
}
else if(internalformat == eGL_RGBA || internalformat == eGL_RGBA_INTEGER ||
internalformat == eGL_RGB || internalformat == eGL_RGB_INTEGER ||
internalformat == eGL_RG || internalformat == eGL_RG_INTEGER ||
internalformat == eGL_RED || internalformat == eGL_RED_INTEGER)
{
// if the color format is unsized, find the corresponding sized format
GLint red = 0, green = 0, blue = 0, alpha = 0;
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_RED_SIZE, &red);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_GREEN_SIZE, &green);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_BLUE_SIZE, &blue);
GL.glGetNamedRenderbufferParameterivEXT(renderbuffer.name, eGL_RENDERBUFFER_ALPHA_SIZE, &alpha);
// we only handle a straight regular format here
RDCASSERT(red > 0);
RDCASSERT(green == 0 || green == red);
RDCASSERT(blue == 0 || green == red);
RDCASSERT(alpha == 0 || green == red);
// to start with, create resource format based on the unsized internalformat
ResourceFormat resfmt = MakeResourceFormat(eGL_TEXTURE_2D, internalformat);
// then set the byte size
resfmt.compByteWidth = uint8_t(red / 8);
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);
@@ -2341,8 +2447,6 @@ bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(Serialise
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[0]);
GL.glBindFramebuffer(eGL_FRAMEBUFFER, texDetails.renderbufferFBOs[1]);
GLenum fmt = GetBaseFormat(internalformat);
GLenum attach = eGL_COLOR_ATTACHMENT0;
if(fmt == eGL_DEPTH_COMPONENT)
attach = eGL_DEPTH_ATTACHMENT;