Module: wine Branch: master Commit: 7b0ba5153f3e42f31b922e5eb997d5e1d0cb44d4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7b0ba5153f3e42f31b922e5eb9...
Author: Matteo Bruni mbruni@codeweavers.com Date: Thu Nov 3 15:26:36 2011 +0100
wined3d: Test more thoroughly for post-pixelshader blending support, try on more texture formats.
---
dlls/wined3d/utils.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index f374967..981ed2c 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1053,9 +1053,13 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined } }
- if (status == GL_FRAMEBUFFER_COMPLETE && format->flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + if (status == GL_FRAMEBUFFER_COMPLETE && ((format->flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + || !(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))) { - GLuint rb; + GLuint rb, tex2; + DWORD readback[16 * 16], color; + BYTE r, a; + BOOL match = TRUE;
if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_PACKED_DEPTH_STENCIL]) @@ -1069,6 +1073,7 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined }
glEnable(GL_BLEND); + glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION) { @@ -1077,6 +1082,65 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined format->flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; }
+ glViewport(0, 0, 16, 16); + glDisable(GL_LIGHTING); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + /* Draw a full-black quad */ + glBegin(GL_TRIANGLE_STRIP); + glColor4ub(0x00, 0x00, 0x00, 0xff); + glVertex3f(-1.0f, -1.0f, 0.0f); + glColor4ub(0x00, 0x00, 0x00, 0xff); + glVertex3f(1.0f, -1.0f, 0.0f); + glColor4ub(0x00, 0x00, 0x00, 0xff); + glVertex3f(-1.0f, 1.0f, 0.0f); + glColor4ub(0x00, 0x00, 0x00, 0xff); + glVertex3f(1.0f, 1.0f, 0.0f); + glEnd(); + + /* Draw a half-transparent red quad */ + glBegin(GL_TRIANGLE_STRIP); + glColor4ub(0xff, 0x00, 0x00, 0x80); + glVertex3f(-1.0f, -1.0f, 0.0f); + glColor4ub(0xff, 0x00, 0x00, 0x80); + glVertex3f(1.0f, -1.0f, 0.0f); + glColor4ub(0xff, 0x00, 0x00, 0x80); + glVertex3f(-1.0f, 1.0f, 0.0f); + glColor4ub(0xff, 0x00, 0x00, 0x80); + glVertex3f(1.0f, 1.0f, 0.0f); + glEnd(); + + glGenTextures(1, &tex2); + glBindTexture(GL_TEXTURE_2D, tex2); + + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, 16, 16, 0); + glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, readback); + checkGLcall("Post-pixelshader blending check"); + + color = readback[7 * 16 + 7]; + a = color >> 24; + r = (color & 0x00ff0000) >> 16; + + if (format->red_mask && (r < 0x7b || r > 0x84)) + match = FALSE; + /* If the alpha component is more than 1 bit */ + else if ((format->alpha_mask & (format->alpha_mask - 1)) && (a < 0x9f || a > 0xdf)) + match = FALSE; + if (!match) + { + TRACE("Format doesn't support post-pixelshader blending.\n"); + TRACE("Color output: %#x\n", color); + format->flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; + } + + glBindTexture(GL_TEXTURE_2D, tex); + glDeleteTextures(1, &tex2); + if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_PACKED_DEPTH_STENCIL]) { @@ -1125,6 +1189,8 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
gl_info->fbo_ops.glGenFramebuffers(1, &fbo); gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glDrawBuffer(GL_COLOR_ATTACHMENT0); + glReadBuffer(GL_COLOR_ATTACHMENT0);
LEAVE_GL(); }