iris: Add support for depth bounds testing.

In gen12 we use the 3DSTATE_DEPTH_BOUNDS instruction
to enable depth bounds testing.

Signed-off-by: Plamena Manolova <plamena.manolova@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Plamena Manolova 2019-10-23 20:56:45 +01:00
parent 1ecd37eac6
commit 1df871f8ff
2 changed files with 24 additions and 0 deletions

View File

@ -135,6 +135,7 @@ enum {
#define IRIS_DIRTY_COMPUTE_RESOLVES_AND_FLUSHES (1ull << 56)
#define IRIS_DIRTY_VF_STATISTICS (1ull << 57)
#define IRIS_DIRTY_PMA_FIX (1ull << 58)
#define IRIS_DIRTY_DEPTH_BOUNDS (1ull << 59)
#define IRIS_ALL_DIRTY_FOR_COMPUTE (IRIS_DIRTY_CS | \
IRIS_DIRTY_SAMPLER_STATES_CS | \

View File

@ -1278,6 +1278,10 @@ struct iris_depth_stencil_alpha_state {
/** Partial 3DSTATE_WM_DEPTH_STENCIL. */
uint32_t wmds[GENX(3DSTATE_WM_DEPTH_STENCIL_length)];
#if GEN_GEN >= 12
uint32_t depth_bounds[GENX(3DSTATE_DEPTH_BOUNDS_length)];
#endif
/** Outbound to BLEND_STATE, 3DSTATE_PS_BLEND, COLOR_CALC_STATE. */
struct pipe_alpha_state alpha;
@ -1340,6 +1344,16 @@ iris_create_zsa_state(struct pipe_context *ctx,
/* wmds.[Backface]StencilReferenceValue are merged later */
}
#if GEN_GEN >= 12
iris_pack_command(GENX(3DSTATE_DEPTH_BOUNDS), cso->depth_bounds, depth_bounds) {
depth_bounds.DepthBoundsTestValueModifyDisable = false;
depth_bounds.DepthBoundsTestEnableModifyDisable = false;
depth_bounds.DepthBoundsTestEnable = state->depth.bounds_test;
depth_bounds.DepthBoundsTestMinValue = state->depth.bounds_min;
depth_bounds.DepthBoundsTestMaxValue = state->depth.bounds_max;
}
#endif
return cso;
}
@ -1370,6 +1384,11 @@ iris_bind_zsa_state(struct pipe_context *ctx, void *state)
ice->state.depth_writes_enabled = new_cso->depth_writes_enabled;
ice->state.stencil_writes_enabled = new_cso->stencil_writes_enabled;
#if GEN_GEN >= 12
if (cso_changed(depth_bounds))
ice->state.dirty |= IRIS_DIRTY_DEPTH_BOUNDS;
#endif
}
ice->state.cso_zsa = new_cso;
@ -5556,6 +5575,10 @@ iris_upload_dirty_render_state(struct iris_context *ice,
#else
iris_batch_emit(batch, cso->wmds, sizeof(cso->wmds));
#endif
#if GEN_GEN >= 12
iris_batch_emit(batch, cso->depth_bounds, sizeof(cso->depth_bounds));
#endif
}
if (dirty & IRIS_DIRTY_SCISSOR_RECT) {