diff options
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_program.c | 7 | ||||
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_program.h | 6 | ||||
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_shader_state.c | 2 |
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); |