Use glRenderbufferStorageMultisampleEXT when available on GLES
Important for Mali in particular. This GLES implementation seems to choke when using a glRenderbufferStorageMultisample-allocated renderbuffer with a texture attached via glFramebufferTexture2DMultisampleEXT. Amends 590c85c80b5e84f20282256f64662da8a25d51a9 Change-Id: Ied1cbbd2525a22088d54c1130a2f830a5133eb83 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
6b66bb9a21
commit
38caabed3f
@ -1103,6 +1103,8 @@ bool QRhiGles2::create(QRhi::Flags flags)
|
||||
if (caps.glesMultisampleRenderToTexture) {
|
||||
glFramebufferTexture2DMultisampleEXT = reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei)>(
|
||||
ctx->getProcAddress(QByteArrayLiteral("glFramebufferTexture2DMultisampleEXT")));
|
||||
glRenderbufferStorageMultisampleEXT = reinterpret_cast<void(QOPENGLF_APIENTRYP)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)>(
|
||||
ctx->getProcAddress(QByteArrayLiteral("glRenderbufferStorageMultisampleEXT")));
|
||||
}
|
||||
caps.glesMultiviewMultisampleRenderToTexture = ctx->hasExtension("GL_OVR_multiview_multisampled_render_to_texture");
|
||||
if (caps.glesMultiviewMultisampleRenderToTexture) {
|
||||
@ -5488,8 +5490,15 @@ bool QGles2RenderBuffer::create()
|
||||
switch (m_type) {
|
||||
case QRhiRenderBuffer::DepthStencil:
|
||||
if (rhiD->caps.msaaRenderBuffer && samples > 1) {
|
||||
rhiD->f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8,
|
||||
size.width(), size.height());
|
||||
if (rhiD->caps.glesMultisampleRenderToTexture) {
|
||||
// Must match the logic in QGles2TextureRenderTarget::create().
|
||||
// EXT and non-EXT are not the same thing.
|
||||
rhiD->glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8,
|
||||
size.width(), size.height());
|
||||
} else {
|
||||
rhiD->f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8,
|
||||
size.width(), size.height());
|
||||
}
|
||||
stencilRenderbuffer = 0;
|
||||
} else if (rhiD->caps.packedDepthStencil || rhiD->caps.needsDepthStencilCombinedAttach) {
|
||||
const GLenum storage = rhiD->caps.needsDepthStencilCombinedAttach ? GL_DEPTH_STENCIL : GL_DEPTH24_STENCIL8;
|
||||
|
@ -966,6 +966,7 @@ public:
|
||||
void (QOPENGLF_APIENTRYP glObjectLabel)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr;
|
||||
void (QOPENGLF_APIENTRYP glFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei) = nullptr;
|
||||
void (QOPENGLF_APIENTRYP glFramebufferTextureMultisampleMultiviewOVR)(GLenum, GLenum, GLuint, GLint, GLsizei, GLint, GLsizei) = nullptr;
|
||||
void (QOPENGLF_APIENTRYP glRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr;
|
||||
uint vao = 0;
|
||||
struct Caps {
|
||||
Caps()
|
||||
|
Loading…
x
Reference in New Issue
Block a user