From 670d9ad90bf5af9bcb2e4c82d37391acbac83210 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 2 Jul 2009 10:01:35 +0200 Subject: [PATCH] wined3d: Check if formats support blending when attached to an FBO. Remove the post-pixelshader blending flag if the format doesn't. Note that the patch doesn't enforce this restriction yet, it only adjusts the reported format capabilities. --- dlls/wined3d/utils.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 1d9f70cdf0f..91e19f67b54 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -570,6 +570,7 @@ static void check_fbo_compat(const WineD3D_GL_Info *gl_info, struct GlPixelForma ENTER_GL(); while(glGetError()); + glDisable(GL_BLEND); glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); @@ -639,6 +640,42 @@ static void check_fbo_compat(const WineD3D_GL_Info *gl_info, struct GlPixelForma } } + if (status == GL_FRAMEBUFFER_COMPLETE_EXT && format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + { + GLuint rb; + + if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + { + GL_EXTCALL(glGenRenderbuffersEXT(1, &rb)); + GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb)); + GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, 16, 16)); + GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, rb)); + GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, rb)); + checkGLcall("RB attachment"); + } + + glEnable(GL_BLEND); + glClear(GL_COLOR_BUFFER_BIT); + if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION_EXT) + { + while(glGetError()); + TRACE("Format doesn't support post-pixelshader blending.\n"); + format_desc->Flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; + } + + if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + { + GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, 0)); + GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, 0)); + GL_EXTCALL(glDeleteRenderbuffersEXT(1, &rb)); + checkGLcall("RB cleanup"); + } + } + glDeleteTextures(1, &tex); LEAVE_GL();