summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2011-11-18 15:45:03 +0100
committerMarek Olšák <maraeo@gmail.com>2011-12-10 01:27:11 +0100
commit06f217d80f3d1318da4974bf7b31ea7edcf5eb0b (patch)
treec510dbe660ece96c1dd8ed54636c605e3bd368fe
parentc83fb4d45f2a47042f395271efe6e5489b2c4aee (diff)
gallium: implement ARB_conservative_depth
This adds a new TGSI property to represent the GLSL layout qualifier in TGSI.
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_dump.c1
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.c16
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.h5
-rw-r--r--src/gallium/include/pipe/p_shader_tokens.h10
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp19
5 files changed, 50 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index 91bc124522..e830aa53f2 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -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[] =
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index cd445a6daa..ee013a5d68 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -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))) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index 8f5f22e175..a70d30f873 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -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:
*/
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index b04e26d308..10cfaf69ad 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -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;
};
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 6cc655d70c..cd4db255f5 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -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: