gallium: implement ARB_conservative_depth
authorMarek Olšák <maraeo@gmail.com>
Fri, 18 Nov 2011 14:45:03 +0000 (15:45 +0100)
committerMarek Olšák <maraeo@gmail.com>
Sat, 10 Dec 2011 00:27:11 +0000 (01:27 +0100)
This adds a new TGSI property to represent the GLSL layout qualifier in TGSI.

src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/auxiliary/tgsi/tgsi_ureg.h
src/gallium/include/pipe/p_shader_tokens.h
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 91bc1245223f1db465a5d3e4846b2afce0ed6dca..e830aa53f204406419cae0bbcd9961af5a3e2eb5 100644 (file)
@@ -174,6 +174,7 @@ const char *tgsi_property_names[TGSI_PROPERTY_COUNT] =
    "FS_COORD_ORIGIN",
    "FS_COORD_PIXEL_CENTER",
    "FS_COLOR0_WRITES_ALL_CBUFS",
+   "FS_DEPTH_LAYOUT"
 };
 
 static const char *tgsi_type_names[] =
index cd445a6daa6e0e6d41001df02a0176a7fea19ba3..ee013a5d6870bd841260d8a02c3a2beff8c61070 100644 (file)
@@ -161,6 +161,7 @@ struct ureg_program
    unsigned char property_fs_coord_origin; /* = TGSI_FS_COORD_ORIGIN_* */
    unsigned char property_fs_coord_pixel_center; /* = TGSI_FS_COORD_PIXEL_CENTER_* */
    unsigned char property_fs_color0_writes_all_cbufs; /* = TGSI_FS_COLOR0_WRITES_ALL_CBUFS * */
+   unsigned char property_fs_depth_layout; /* TGSI_FS_DEPTH_LAYOUT */
 
    unsigned nr_addrs;
    unsigned nr_preds;
@@ -304,6 +305,13 @@ ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
    ureg->property_fs_color0_writes_all_cbufs = fs_color0_writes_all_cbufs;
 }
 
+void
+ureg_property_fs_depth_layout(struct ureg_program *ureg,
+                              unsigned fs_depth_layout)
+{
+   ureg->property_fs_depth_layout = fs_depth_layout;
+}
+
 struct ureg_src
 ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg,
                        unsigned semantic_name,
@@ -1388,6 +1396,14 @@ static void emit_decls( struct ureg_program *ureg )
                     ureg->property_fs_color0_writes_all_cbufs);
    }
 
+   if (ureg->property_fs_depth_layout) {
+      assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
+
+      emit_property(ureg,
+                    TGSI_PROPERTY_FS_DEPTH_LAYOUT,
+                    ureg->property_fs_depth_layout);
+   }
+
    if (ureg->processor == TGSI_PROCESSOR_VERTEX) {
       for (i = 0; i < UREG_MAX_INPUT; i++) {
          if (ureg->vs_inputs[i/32] & (1 << (i%32))) {
index 8f5f22e175023dc7006ae3bf44753474e80c7043..a70d30f873f86975d73da199e514883dae163129 100644 (file)
@@ -157,6 +157,11 @@ void
 ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
                             unsigned fs_color0_writes_all_cbufs);
 
+void
+ureg_property_fs_depth_layout(struct ureg_program *ureg,
+                              unsigned fs_depth_layout);
+
+
 /***********************************************************************
  * Build shader declarations:
  */
index b04e26d308e3cd844c75a9a842566c8122e83b29..10cfaf69ade62c8316424403b62d5148c7ea639a 100644 (file)
@@ -188,7 +188,8 @@ union tgsi_immediate_data
 #define TGSI_PROPERTY_FS_COORD_ORIGIN        3
 #define TGSI_PROPERTY_FS_COORD_PIXEL_CENTER  4
 #define TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS 5
-#define TGSI_PROPERTY_COUNT                  6
+#define TGSI_PROPERTY_FS_DEPTH_LAYOUT        6
+#define TGSI_PROPERTY_COUNT                  7
 
 struct tgsi_property {
    unsigned Type         : 4;  /**< TGSI_TOKEN_TYPE_PROPERTY */
@@ -203,6 +204,13 @@ struct tgsi_property {
 #define TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER 0
 #define TGSI_FS_COORD_PIXEL_CENTER_INTEGER 1
 
+#define TGSI_FS_DEPTH_LAYOUT_NONE         0
+#define TGSI_FS_DEPTH_LAYOUT_ANY          1
+#define TGSI_FS_DEPTH_LAYOUT_GREATER      2
+#define TGSI_FS_DEPTH_LAYOUT_LESS         3
+#define TGSI_FS_DEPTH_LAYOUT_UNCHANGED    4
+
+
 struct tgsi_property_data {
    unsigned Data;
 };
index 6cc655d70cf5f95b79f9ff36df30aef204e7b8e8..cd4db255f54dff7877269e78e3403cd0ecfad94a 100644 (file)
@@ -4557,6 +4557,25 @@ st_translate_program(
                                            interpMode[i]);
       }
 
+      if (program->shader_program->FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
+         switch (program->shader_program->FragDepthLayout) {
+         case FRAG_DEPTH_LAYOUT_ANY:
+            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
+            break;
+         case FRAG_DEPTH_LAYOUT_GREATER:
+            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
+            break;
+         case FRAG_DEPTH_LAYOUT_LESS:
+            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
+            break;
+         case FRAG_DEPTH_LAYOUT_UNCHANGED:
+            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
+            break;
+         default:
+            assert(0);
+         }
+      }
+
       if (proginfo->InputsRead & FRAG_BIT_WPOS) {
          /* Must do this after setting up t->inputs, and before
           * emitting constant references, below: