summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/nvc0/nvc0_program.c7
-rw-r--r--src/gallium/drivers/nvc0/nvc0_program.h6
-rw-r--r--src/gallium/drivers/nvc0/nvc0_shader_state.c2
3 files changed, 13 insertions, 2 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_program.c b/src/gallium/drivers/nvc0/nvc0_program.c
index 3e7fc4d350e..57a0874e679 100644
--- a/src/gallium/drivers/nvc0/nvc0_program.c
+++ b/src/gallium/drivers/nvc0/nvc0_program.c
@@ -598,6 +598,13 @@ nvc0_prog_scan(struct nvc0_translation_info *ti)
case PIPE_SHADER_FRAGMENT:
ti->input_file = NV_FILE_MEM_V;
ti->output_file = NV_FILE_GPR;
+
+ if (ti->scan.writes_z)
+ prog->flags[0] = 0x11; /* ? */
+ else
+ if (!ti->global_stores)
+ prog->fp.early_z = 1;
+
ret = nvc0_fp_gen_header(prog, ti);
break;
default:
diff --git a/src/gallium/drivers/nvc0/nvc0_program.h b/src/gallium/drivers/nvc0/nvc0_program.h
index 1271303144e..2e84caecc9e 100644
--- a/src/gallium/drivers/nvc0/nvc0_program.h
+++ b/src/gallium/drivers/nvc0/nvc0_program.h
@@ -23,12 +23,15 @@ struct nvc0_program {
uint32_t hdr[20];
- uint32_t flags[2]; /* FP_ZORDER */
+ uint32_t flags[2];
struct {
uint8_t edgeflag;
uint8_t num_ucps;
} vp;
+ struct {
+ uint8_t early_z;
+ } fp;
void *relocs;
unsigned num_relocs;
@@ -66,6 +69,7 @@ struct nvc0_translation_info {
boolean indirect_inputs;
boolean indirect_outputs;
boolean require_stores;
+ boolean global_stores;
uint32_t *immd32;
ubyte *immd32_ty;
unsigned immd32_nr;
diff --git a/src/gallium/drivers/nvc0/nvc0_shader_state.c b/src/gallium/drivers/nvc0/nvc0_shader_state.c
index a6595c56106..981b5488d08 100644
--- a/src/gallium/drivers/nvc0/nvc0_shader_state.c
+++ b/src/gallium/drivers/nvc0/nvc0_shader_state.c
@@ -100,7 +100,7 @@ nvc0_fragprog_validate(struct nvc0_context *nvc0)
return;
BEGIN_RING(chan, RING_3D(EARLY_FRAGMENT_TESTS), 1);
- OUT_RING (chan, 0);
+ OUT_RING (chan, fp->fp.early_z);
BEGIN_RING(chan, RING_3D(SP_SELECT(5)), 2);
OUT_RING (chan, 0x51);
OUT_RING (chan, fp->code_base);