On Fri, Oct 16, 2015 at 6:52 PM, Glenn Kennard <glenn.kenn...@gmail.com> wrote: > Supported on R700 and up. > > Signed-off-by: Glenn Kennard <glenn.kenn...@gmail.com> > --- > Not exactly a commonly used extension, but might as well set the > hardware registers rather than just dropping the hint on the floor. > > src/gallium/drivers/r600/evergreen_state.c | 13 +++++++++++++ > src/gallium/drivers/r600/evergreend.h | 7 +++++++ > src/gallium/drivers/r600/r600_shader.c | 1 + > src/gallium/drivers/r600/r600_shader.h | 2 ++ > src/gallium/drivers/r600/r600_state.c | 15 +++++++++++++++ > src/gallium/drivers/r600/r600d.h | 8 ++++++++ > 6 files changed, 46 insertions(+) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index c6702a9..96c6b11 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -2940,6 +2940,19 @@ void evergreen_update_ps_state(struct pipe_context > *ctx, struct r600_pipe_shader > db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(stencil_export); > db_shader_control |= S_02880C_MASK_EXPORT_ENABLE(mask_export); > > + switch (rshader->ps_conservative_z) { > + default: /* fall through */ > + case TGSI_FS_DEPTH_LAYOUT_ANY: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_ANY_Z); > + break; > + case TGSI_FS_DEPTH_LAYOUT_GREATER: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_GREATER_THAN_Z); > + break; > + case TGSI_FS_DEPTH_LAYOUT_LESS: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_LESS_THAN_Z); > + break; > + } > + > exports_ps = 0; > for (i = 0; i < rshader->noutput; i++) { > if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || > diff --git a/src/gallium/drivers/r600/evergreend.h > b/src/gallium/drivers/r600/evergreend.h > index 937ffcb..a9a65f7 100644 > --- a/src/gallium/drivers/r600/evergreend.h > +++ b/src/gallium/drivers/r600/evergreend.h > @@ -815,6 +815,13 @@ > #define V_02880C_EXPORT_DB_FOUR16 0x01 > #define V_02880C_EXPORT_DB_TWO 0x02 > #define S_02880C_ALPHA_TO_MASK_DISABLE(x) (((x) & 0x1) << 12) > +#define S_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) & 0x03) << 16) > +#define G_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) >> 16) & 0x03) > +#define C_02880C_CONSERVATIVE_Z_EXPORT 0xFFFCFFFF > +#define V_02880C_EXPORT_ANY_Z 0 > +#define V_02880C_EXPORT_LESS_THAN_Z 1 > +#define V_02880C_EXPORT_GREATER_THAN_Z 2 > +#define V_02880C_EXPORT_RESERVED 3 > > #define R_028A00_PA_SU_POINT_SIZE 0x028A00 > #define S_028A00_HEIGHT(x) (((x) & 0xFFFF) << 0) > diff --git a/src/gallium/drivers/r600/r600_shader.c > b/src/gallium/drivers/r600/r600_shader.c > index 8efe902..560696d 100644 > --- a/src/gallium/drivers/r600/r600_shader.c > +++ b/src/gallium/drivers/r600/r600_shader.c > @@ -2048,6 +2048,7 @@ static int r600_shader_from_tgsi(struct r600_context > *rctx, > > shader->fs_write_all = > ctx.info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS]; > shader->vs_position_window_space = > ctx.info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION]; > + shader->ps_conservative_z = > ctx.info.properties[TGSI_PROPERTY_FS_DEPTH_LAYOUT]; > > if (shader->vs_as_gs_a) > vs_add_primid_output(&ctx, key.vs.prim_id_out); > diff --git a/src/gallium/drivers/r600/r600_shader.h > b/src/gallium/drivers/r600/r600_shader.h > index c240e71..e085263 100644 > --- a/src/gallium/drivers/r600/r600_shader.h > +++ b/src/gallium/drivers/r600/r600_shader.h > @@ -76,6 +76,8 @@ struct r600_shader { > boolean uses_tex_buffers; > boolean gs_prim_id_input; > > + unsigned ps_conservative_z; > + > /* Size in bytes of a data item in the ring(s) (single vertex data). > Stages with only one ring items 123 will be set to 0. */ > unsigned ring_item_sizes[4]; > diff --git a/src/gallium/drivers/r600/r600_state.c > b/src/gallium/drivers/r600/r600_state.c > index 1be3e1b..09b2325 100644 > --- a/src/gallium/drivers/r600/r600_state.c > +++ b/src/gallium/drivers/r600/r600_state.c > @@ -2533,6 +2533,21 @@ void r600_update_ps_state(struct pipe_context *ctx, > struct r600_pipe_shader *sha > if (rshader->uses_kill) > db_shader_control |= S_02880C_KILL_ENABLE(1); > > + if (rctx->b.chip_class >= R700) { > + switch (rshader->ps_conservative_z) { > + default: /* fall through */ > + case TGSI_FS_DEPTH_LAYOUT_ANY: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_ANY_Z); > + break; > + case TGSI_FS_DEPTH_LAYOUT_GREATER: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_GREATER_THAN_Z); > + break; > + case TGSI_FS_DEPTH_LAYOUT_LESS: > + db_shader_control |= > S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_LESS_THAN_Z); > + break; > + } > + } > + > exports_ps = 0; > for (i = 0; i < rshader->noutput; i++) { > if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || > diff --git a/src/gallium/drivers/r600/r600d.h > b/src/gallium/drivers/r600/r600d.h > index 6bba88c..06c4356 100644 > --- a/src/gallium/drivers/r600/r600d.h > +++ b/src/gallium/drivers/r600/r600d.h > @@ -853,6 +853,14 @@ > #define S_02880C_DUAL_EXPORT_ENABLE(x) (((x) & 0x1) << 9) > #define G_02880C_DUAL_EXPORT_ENABLE(x) (((x) >> 9) & 0x1) > #define C_02880C_DUAL_EXPORT_ENABLE 0xFFFFFDFF > +#define S_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) & 0x03) << 13) > +#define G_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) >> 13) & 0x03) > +#define C_02880C_CONSERVATIVE_Z_EXPORT 0xFFFF9FFF > +#define V_02880C_EXPORT_ANY_Z 0 > +#define V_02880C_EXPORT_LESS_THAN_Z 1 > +#define V_02880C_EXPORT_GREATER_THAN_Z 2 > +#define V_02880C_EXPORT_RESERVED 3 > +
Wrong register. CONSERVATIVE_Z_EXPORT is bits 14:13 of DB_RENDER_CONTROL (0x28d0c) on 7xx. Alex > #define R_028DF8_PA_SU_POLY_OFFSET_DB_FMT_CNTL 0x028DF8 > #define S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS(x) (((x) & 0xFF) << 0) > #define G_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS(x) (((x) >> 0) & 0xFF) > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev