i965/Gen7: Include bitfield in the sampler key for CMS layout
authorChris Forbes <chrisf@ijw.co.nz>
Fri, 29 Nov 2013 21:01:12 +0000 (10:01 +1300)
committerChris Forbes <chrisf@ijw.co.nz>
Sat, 7 Dec 2013 03:09:12 +0000 (16:09 +1300)
We need to emit extra shader code in this case to sample the
MCS surface first; we can't just blindly do this all the time
since IVB will sometimes try to access the MCS surface even if
disabled.

V3: Use actual MSAA layout from the texture's mt, rather
then computing what would have been used based on the format.
This is simpler and less fragile - there's at least one case where
we might want to have a texture's MSAA layout change based on what
the app does (CMS SINT falling back to UMS if the app ever attempts
to render to it with a channel disabled.)

This also obsoletes V2's 1/10 -- compute_msaa_layout can now remain
an implementation detail of the miptree code.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_program.h
src/mesa/drivers/dri/i965/brw_wm.c

index 07be4a04569ad2f9e763a6c4e047b8b348ea63ba..51182eabd16947ab919d3ce81511cf53c6f17cf4 100644 (file)
@@ -45,6 +45,11 @@ struct brw_sampler_prog_key_data {
     * For RG32F, gather4's channel select is broken.
     */
    uint16_t gather_channel_quirk_mask;
+
+   /**
+    * Whether this sampler uses the compressed multisample surface layout.
+    */
+   uint16_t compressed_multisample_layout_mask;
 };
 
 #ifdef __cplusplus
index b8ea6f2df8d14252d6c00da2e27613760c14c473..a2ae73f1e148b176d6dd6805126148aab1ddaf2f 100644 (file)
@@ -38,6 +38,7 @@
 #include "main/samplerobj.h"
 #include "program/prog_parameter.h"
 #include "program/program.h"
+#include "intel_mipmap_tree.h"
 
 #include "glsl/ralloc.h"
 
@@ -356,6 +357,18 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
             if (img->InternalFormat == GL_RG32F)
                key->gather_channel_quirk_mask |= 1 << s;
          }
+
+         /* If this is a multisample sampler, and uses the CMS MSAA layout,
+          * then we need to emit slightly different code to first sample the
+          * MCS surface.
+          */
+         struct intel_texture_object *intel_tex =
+            intel_texture_object((struct gl_texture_object *)t);
+
+         if (brw->gen >= 7 &&
+             intel_tex->mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) {
+            key->compressed_multisample_layout_mask |= 1 << s;
+         }
       }
    }
 }