wined3d: Fix post-pixelshader blending test.

This commit is contained in:
Matteo Bruni 2011-11-09 22:16:36 +01:00 committed by Alexandre Julliard
parent edfeec60b1
commit 56c9952ee6
1 changed files with 65 additions and 58 deletions

View File

@ -1080,7 +1080,7 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined
}
glEnable(GL_BLEND);
glClearColor(0, 0, 0, 1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION)
{
@ -1088,65 +1088,72 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined
TRACE("Format doesn't support post-pixelshader blending.\n");
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)
else
{
TRACE("Format doesn't support post-pixelshader blending.\n");
TRACE("Color output: %#x\n", color);
format->flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
glViewport(0, 0, 16, 16);
glDisable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, tex);
glDeleteTextures(1, &tex2);
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;
}
else
{
TRACE("Format supports post-pixelshader blending.\n");
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])