summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnuj Phogat <[email protected]>2012-07-18 11:41:15 -0700
committerAnuj Phogat <[email protected]>2012-07-18 11:54:12 -0700
commitcd5cd85a43dc43f62274be72d3252503dfc88bab (patch)
tree7f60ee5c17420a73aacc6d7e1315f9607dc69096
parentfb18ec4f2775f96982a39247efd1c70cccbc46fc (diff)
i965/msaa: Disable alpha-to-{coverage, one} when drawbuffer zero is in integer format
OpenGL specification 3.3 (page 196), section 4.1.3 says: If drawbuffer zero is not NONE and the buffer it references has an integer format, the SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE operations are skipped." This should work properly even if there are other draw buffers that are not in integer format. This patch makes following piglit tests pass on mesa: int-draw-buffers-alpha-to-coverage int-draw-buffers-alpha-to-one Reviewed-by: Chad Versace <[email protected]> Reviewed-by: Ian Romanick <[email protected]> Signed-off-by: Anuj Phogat <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/gen6_cc.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_cc.c b/src/mesa/drivers/dri/i965/gen6_cc.c
index e0523efdc70..6aeaaa253b9 100644
--- a/src/mesa/drivers/dri/i965/gen6_cc.c
+++ b/src/mesa/drivers/dri/i965/gen6_cc.c
@@ -35,6 +35,7 @@
static void
gen6_upload_blend_state(struct brw_context *brw)
{
+ bool is_buffer_zero_integer_format = false;
struct gl_context *ctx = &brw->intel.ctx;
struct gen6_blend_state *blend;
int b;
@@ -68,7 +69,6 @@ gen6_upload_blend_state(struct brw_context *brw)
rb_type = GL_UNSIGNED_NORMALIZED;
/* Used for implementing the following bit of GL_EXT_texture_integer:
- *
* "Per-fragment operations that require floating-point color
* components, including multisample alpha operations, alpha test,
* blending, and dithering, have no effect when the corresponding
@@ -76,6 +76,9 @@ gen6_upload_blend_state(struct brw_context *brw)
*/
integer = (rb_type == GL_INT || rb_type == GL_UNSIGNED_INT);
+ if(b == 0 && integer)
+ is_buffer_zero_integer_format = true;
+
/* _NEW_COLOR */
if (ctx->Color.ColorLogicOpEnabled) {
/* Floating point RTs should have no effect from LogicOp,
@@ -162,12 +165,23 @@ gen6_upload_blend_state(struct brw_context *brw)
blend[b].blend1.write_disable_b = !ctx->Color.ColorMask[b][2];
blend[b].blend1.write_disable_a = !ctx->Color.ColorMask[b][3];
- /* _NEW_MULTISAMPLE */
- blend[b].blend1.alpha_to_coverage =
- ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToCoverage;
- blend[b].blend1.alpha_to_one =
- ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToOne;
- blend[b].blend1.alpha_to_coverage_dither = (brw->intel.gen >= 7);
+ /* OpenGL specification 3.3 (page 196), section 4.1.3 says:
+ * "If drawbuffer zero is not NONE and the buffer it references has an
+ * integer format, the SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE
+ * operations are skipped."
+ */
+ if(!is_buffer_zero_integer_format) {
+ /* _NEW_MULTISAMPLE */
+ blend[b].blend1.alpha_to_coverage =
+ ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToCoverage;
+ blend[b].blend1.alpha_to_one =
+ ctx->Multisample._Enabled && ctx->Multisample.SampleAlphaToOne;
+ blend[b].blend1.alpha_to_coverage_dither = (brw->intel.gen >= 7);
+ }
+ else {
+ blend[b].blend1.alpha_to_coverage = false;
+ blend[b].blend1.alpha_to_one = false;
+ }
}
brw->state.dirty.cache |= CACHE_NEW_BLEND_STATE;