From: Marek Olšák <marek.ol...@amd.com> Calculate depth ranges from viewport states and pipe_rasterizer_state::clip_halfz.
The evergreend.h change is required to silence a warning. This fixes this recently updated piglit: arb_depth_clamp/depth-clamp-range --- src/gallium/drivers/r600/evergreen_state.c | 1 + src/gallium/drivers/r600/evergreend.h | 4 +- src/gallium/drivers/r600/r600_hw_context.c | 1 + src/gallium/drivers/r600/r600_pipe.h | 1 + src/gallium/drivers/r600/r600_state.c | 1 + src/gallium/drivers/r600/r600_state_common.c | 2 +- src/gallium/drivers/radeon/r600_pipe_common.h | 5 +- src/gallium/drivers/radeon/r600_viewport.c | 73 ++++++++++++++++++++++++--- src/gallium/drivers/radeon/r600d_common.h | 2 + src/gallium/drivers/radeonsi/si_hw_context.c | 1 + src/gallium/drivers/radeonsi/si_state.c | 3 +- src/gallium/drivers/radeonsi/si_state.h | 1 + 12 files changed, 82 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 11c8161..5ca5453 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -466,20 +466,21 @@ static void *evergreen_create_rs_state(struct pipe_context *ctx, float psize_min, psize_max; struct r600_rasterizer_state *rs = CALLOC_STRUCT(r600_rasterizer_state); if (!rs) { return NULL; } r600_init_command_buffer(&rs->buffer, 30); rs->scissor_enable = state->scissor; + rs->clip_halfz = state->clip_halfz; rs->flatshade = state->flatshade; rs->sprite_coord_enable = state->sprite_coord_enable; rs->two_side = state->light_twoside; rs->clip_plane_enable = state->clip_plane_enable; rs->pa_sc_line_stipple = state->line_stipple_enable ? S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; rs->pa_cl_clip_cntl = S_028810_DX_CLIP_SPACE_DEF(state->clip_halfz) | S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | diff --git a/src/gallium/drivers/r600/evergreend.h b/src/gallium/drivers/r600/evergreend.h index a81b6c5..3f33e42 100644 --- a/src/gallium/drivers/r600/evergreend.h +++ b/src/gallium/drivers/r600/evergreend.h @@ -1856,22 +1856,22 @@ #define R_0283DC_SQ_VTX_SEMANTIC_23 0x000283DC #define R_0283E0_SQ_VTX_SEMANTIC_24 0x000283E0 #define R_0283E4_SQ_VTX_SEMANTIC_25 0x000283E4 #define R_0283E8_SQ_VTX_SEMANTIC_26 0x000283E8 #define R_0283EC_SQ_VTX_SEMANTIC_27 0x000283EC #define R_0283F0_SQ_VTX_SEMANTIC_28 0x000283F0 #define R_0283F4_SQ_VTX_SEMANTIC_29 0x000283F4 #define R_0283F8_SQ_VTX_SEMANTIC_30 0x000283F8 #define R_0283FC_SQ_VTX_SEMANTIC_31 0x000283FC #define R_0288F0_SQ_VTX_SEMANTIC_CLEAR 0x000288F0 -#define R_0282D0_PA_SC_VPORT_ZMIN_0 0x000282D0 -#define R_0282D4_PA_SC_VPORT_ZMAX_0 0x000282D4 +#define R_0282D0_PA_SC_VPORT_ZMIN_0 0x0282D0 +#define R_0282D4_PA_SC_VPORT_ZMAX_0 0x0282D4 #define R_028400_VGT_MAX_VTX_INDX 0x00028400 #define R_028404_VGT_MIN_VTX_INDX 0x00028404 #define R_028408_VGT_INDX_OFFSET 0x00028408 #define R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX 0x0002840C #define R_028414_CB_BLEND_RED 0x00028414 #define R_028418_CB_BLEND_GREEN 0x00028418 #define R_02841C_CB_BLEND_BLUE 0x0002841C #define R_028420_CB_BLEND_ALPHA 0x00028420 #define R_028438_SX_ALPHA_REF 0x00028438 #define R_02843C_PA_CL_VPORT_XSCALE_0 0x0002843C diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c index 58ba09d..dc5ad75 100644 --- a/src/gallium/drivers/r600/r600_hw_context.c +++ b/src/gallium/drivers/r600/r600_hw_context.c @@ -305,20 +305,21 @@ void r600_begin_new_cs(struct r600_context *ctx) r600_mark_atom_dirty(ctx, &ctx->db_misc_state.atom); r600_mark_atom_dirty(ctx, &ctx->db_state.atom); r600_mark_atom_dirty(ctx, &ctx->framebuffer.atom); r600_mark_atom_dirty(ctx, &ctx->hw_shader_stages[R600_HW_STAGE_PS].atom); r600_mark_atom_dirty(ctx, &ctx->poly_offset_state.atom); r600_mark_atom_dirty(ctx, &ctx->vgt_state.atom); r600_mark_atom_dirty(ctx, &ctx->sample_mask.atom); ctx->b.scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; r600_mark_atom_dirty(ctx, &ctx->b.scissors.atom); ctx->b.viewports.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; + ctx->b.viewports.depth_range_dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; r600_mark_atom_dirty(ctx, &ctx->b.viewports.atom); if (ctx->b.chip_class <= EVERGREEN) { r600_mark_atom_dirty(ctx, &ctx->config_state.atom); } r600_mark_atom_dirty(ctx, &ctx->stencil_ref.atom); r600_mark_atom_dirty(ctx, &ctx->vertex_fetch_shader.atom); r600_mark_atom_dirty(ctx, &ctx->hw_shader_stages[R600_HW_STAGE_ES].atom); r600_mark_atom_dirty(ctx, &ctx->shader_stages.atom); if (ctx->gs_shader) { r600_mark_atom_dirty(ctx, &ctx->hw_shader_stages[R600_HW_STAGE_GS].atom); diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index e1b2aed..4403aca 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -269,20 +269,21 @@ struct r600_rasterizer_state { unsigned clip_plane_enable; unsigned pa_sc_line_stipple; unsigned pa_cl_clip_cntl; unsigned pa_su_sc_mode_cntl; float offset_units; float offset_scale; bool offset_enable; bool offset_units_unscaled; bool scissor_enable; bool multisample_enable; + bool clip_halfz; }; struct r600_poly_offset_state { struct r600_atom atom; enum pipe_format zs_format; float offset_units; float offset_scale; bool offset_units_unscaled; }; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index fb2861a..c8768e0 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -465,20 +465,21 @@ static void *r600_create_rs_state(struct pipe_context *ctx, float psize_min, psize_max; struct r600_rasterizer_state *rs = CALLOC_STRUCT(r600_rasterizer_state); if (!rs) { return NULL; } r600_init_command_buffer(&rs->buffer, 30); rs->scissor_enable = state->scissor; + rs->clip_halfz = state->clip_halfz; rs->flatshade = state->flatshade; rs->sprite_coord_enable = state->sprite_coord_enable; rs->two_side = state->light_twoside; rs->clip_plane_enable = state->clip_plane_enable; rs->pa_sc_line_stipple = state->line_stipple_enable ? S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; rs->pa_cl_clip_cntl = S_028810_DX_CLIP_SPACE_DEF(state->clip_halfz) | S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 0349432..32eab83 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -359,21 +359,21 @@ static void r600_bind_rs_state(struct pipe_context *ctx, void *state) } /* Update clip_misc_state. */ if (rctx->clip_misc_state.pa_cl_clip_cntl != rs->pa_cl_clip_cntl || rctx->clip_misc_state.clip_plane_enable != rs->clip_plane_enable) { rctx->clip_misc_state.pa_cl_clip_cntl = rs->pa_cl_clip_cntl; rctx->clip_misc_state.clip_plane_enable = rs->clip_plane_enable; r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom); } - r600_set_scissor_enable(&rctx->b, rs->scissor_enable); + r600_viewport_set_rast_deps(&rctx->b, rs->scissor_enable, rs->clip_halfz); /* Re-emit PA_SC_LINE_STIPPLE. */ rctx->last_primitive_type = -1; } static void r600_delete_rs_state(struct pipe_context *ctx, void *state) { struct r600_rasterizer_state *rs = (struct r600_rasterizer_state *)state; r600_release_command_buffer(&rs->buffer); diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index d821eaa..aa40a54 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -479,20 +479,21 @@ struct r600_signed_scissor { struct r600_scissors { struct r600_atom atom; unsigned dirty_mask; struct pipe_scissor_state states[R600_MAX_VIEWPORTS]; }; struct r600_viewports { struct r600_atom atom; unsigned dirty_mask; + unsigned depth_range_dirty_mask; struct pipe_viewport_state states[R600_MAX_VIEWPORTS]; struct r600_signed_scissor as_scissor[R600_MAX_VIEWPORTS]; }; struct r600_ring { struct radeon_winsys_cs *cs; void (*flush)(void *ctx, unsigned flags, struct pipe_fence_handle **fence); }; @@ -530,20 +531,21 @@ struct r600_common_context { /* Current unaccounted memory usage. */ uint64_t vram; uint64_t gtt; /* States. */ struct r600_streamout streamout; struct r600_scissors scissors; struct r600_viewports viewports; bool scissor_enabled; + bool clip_halfz; bool vs_writes_viewport_index; bool vs_disables_clipping_viewport; /* Additional context states. */ unsigned flags; /* flush flags */ /* Queries. */ /* Maintain the list of active queries for pausing between IBs. */ int num_occlusion_queries; int num_perfect_occlusion_queries; @@ -786,21 +788,22 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx, unsigned *buffers, unsigned *dirty_cbufs, const union pipe_color_union *color); bool r600_texture_disable_dcc(struct r600_common_context *rctx, struct r600_texture *rtex); void r600_init_screen_texture_functions(struct r600_common_screen *rscreen); void r600_init_context_texture_functions(struct r600_common_context *rctx); /* r600_viewport.c */ void evergreen_apply_scissor_bug_workaround(struct r600_common_context *rctx, struct pipe_scissor_state *scissor); -void r600_set_scissor_enable(struct r600_common_context *rctx, bool enable); +void r600_viewport_set_rast_deps(struct r600_common_context *rctx, + bool scissor_enable, bool clip_halfz); void r600_update_vs_writes_viewport_index(struct r600_common_context *rctx, struct tgsi_shader_info *info); void r600_init_viewport_functions(struct r600_common_context *rctx); /* cayman_msaa.c */ extern const uint32_t eg_sample_locs_2x[4]; extern const unsigned eg_max_dist_2x; extern const uint32_t eg_sample_locs_4x[4]; extern const unsigned eg_max_dist_4x; void cayman_get_sample_position(struct pipe_context *ctx, unsigned sample_count, diff --git a/src/gallium/drivers/radeon/r600_viewport.c b/src/gallium/drivers/radeon/r600_viewport.c index 2d68783..2de1382 100644 --- a/src/gallium/drivers/radeon/r600_viewport.c +++ b/src/gallium/drivers/radeon/r600_viewport.c @@ -15,20 +15,21 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "r600_cs.h" +#include "util/u_viewport.h" #include "tgsi/tgsi_scan.h" #define GET_MAX_SCISSOR(rctx) (rctx->chip_class >= EVERGREEN ? 16384 : 8192) static void r600_set_scissor_states(struct pipe_context *ctx, unsigned start_slot, unsigned num_scissors, const struct pipe_scissor_state *state) { struct r600_common_context *rctx = (struct r600_common_context *)ctx; @@ -253,50 +254,53 @@ static void r600_emit_scissors(struct r600_common_context *rctx, struct r600_ato r600_emit_guardband(rctx, &max_vp_scissor); rctx->scissors.dirty_mask = 0; } static void r600_set_viewport_states(struct pipe_context *ctx, unsigned start_slot, unsigned num_viewports, const struct pipe_viewport_state *state) { struct r600_common_context *rctx = (struct r600_common_context *)ctx; + unsigned mask; int i; for (i = 0; i < num_viewports; i++) { unsigned index = start_slot + i; rctx->viewports.states[index] = state[i]; r600_get_scissor_from_viewport(rctx, &state[i], &rctx->viewports.as_scissor[index]); } - rctx->viewports.dirty_mask |= ((1 << num_viewports) - 1) << start_slot; - rctx->scissors.dirty_mask |= ((1 << num_viewports) - 1) << start_slot; + mask = ((1 << num_viewports) - 1) << start_slot; + rctx->viewports.dirty_mask |= mask; + rctx->viewports.depth_range_dirty_mask |= mask; + rctx->scissors.dirty_mask |= mask; rctx->set_atom_dirty(rctx, &rctx->viewports.atom, true); rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); } static void r600_emit_one_viewport(struct r600_common_context *rctx, struct pipe_viewport_state *state) { struct radeon_winsys_cs *cs = rctx->gfx.cs; radeon_emit(cs, fui(state->scale[0])); radeon_emit(cs, fui(state->translate[0])); radeon_emit(cs, fui(state->scale[1])); radeon_emit(cs, fui(state->translate[1])); radeon_emit(cs, fui(state->scale[2])); radeon_emit(cs, fui(state->translate[2])); } -static void r600_emit_viewports(struct r600_common_context *rctx, struct r600_atom *atom) +static void r600_emit_viewports(struct r600_common_context *rctx) { struct radeon_winsys_cs *cs = rctx->gfx.cs; struct pipe_viewport_state *states = rctx->viewports.states; unsigned mask = rctx->viewports.dirty_mask; /* The simple case: Only 1 viewport is active. */ if (!rctx->vs_writes_viewport_index) { if (!(mask & 1)) return; @@ -312,27 +316,78 @@ static void r600_emit_viewports(struct r600_common_context *rctx, struct r600_at u_bit_scan_consecutive_range(&mask, &start, &count); radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE + start * 4 * 6, count * 6); for (i = start; i < start+count; i++) r600_emit_one_viewport(rctx, &states[i]); } rctx->viewports.dirty_mask = 0; } -void r600_set_scissor_enable(struct r600_common_context *rctx, bool enable) +static void r600_emit_depth_ranges(struct r600_common_context *rctx) { - if (rctx->scissor_enabled != enable) { - rctx->scissor_enabled = enable; + struct radeon_winsys_cs *cs = rctx->gfx.cs; + struct pipe_viewport_state *states = rctx->viewports.states; + unsigned mask = rctx->viewports.depth_range_dirty_mask; + float zmin, zmax; + + /* The simple case: Only 1 viewport is active. */ + if (!rctx->vs_writes_viewport_index) { + if (!(mask & 1)) + return; + + util_viewport_zmin_zmax(&states[0], rctx->clip_halfz, &zmin, &zmax); + + radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0, 2); + radeon_emit(cs, fui(zmin)); + radeon_emit(cs, fui(zmax)); + rctx->viewports.depth_range_dirty_mask &= ~1; /* clear one bit */ + return; + } + + while (mask) { + int start, count, i; + + u_bit_scan_consecutive_range(&mask, &start, &count); + + radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0 + + start * 4 * 2, count * 2); + for (i = start; i < start+count; i++) { + util_viewport_zmin_zmax(&states[i], rctx->clip_halfz, &zmin, &zmax); + radeon_emit(cs, fui(zmin)); + radeon_emit(cs, fui(zmax)); + } + } + rctx->viewports.depth_range_dirty_mask = 0; +} + +static void r600_emit_viewport_states(struct r600_common_context *rctx, + struct r600_atom *atom) +{ + r600_emit_viewports(rctx); + r600_emit_depth_ranges(rctx); +} + +/* Set viewport dependencies on pipe_rasterizer_state. */ +void r600_viewport_set_rast_deps(struct r600_common_context *rctx, + bool scissor_enable, bool clip_halfz) +{ + if (rctx->scissor_enabled != scissor_enable) { + rctx->scissor_enabled = scissor_enable; rctx->scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); } + if (rctx->clip_halfz != clip_halfz) { + rctx->clip_halfz = clip_halfz; + rctx->viewports.depth_range_dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; + rctx->set_atom_dirty(rctx, &rctx->viewports.atom, true); + } } /** * Normally, we only emit 1 viewport and 1 scissor if no shader is using * the VIEWPORT_INDEX output, and emitting the other viewports and scissors * is delayed. When a shader with VIEWPORT_INDEX appears, this should be * called to emit the rest. */ void r600_update_vs_writes_viewport_index(struct r600_common_context *rctx, struct tgsi_shader_info *info) @@ -352,25 +407,27 @@ void r600_update_vs_writes_viewport_index(struct r600_common_context *rctx, rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); } /* Viewport index handling. */ rctx->vs_writes_viewport_index = info->writes_viewport_index; if (!rctx->vs_writes_viewport_index) return; if (rctx->scissors.dirty_mask) rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); - if (rctx->viewports.dirty_mask) + + if (rctx->viewports.dirty_mask || + rctx->viewports.depth_range_dirty_mask) rctx->set_atom_dirty(rctx, &rctx->viewports.atom, true); } void r600_init_viewport_functions(struct r600_common_context *rctx) { rctx->scissors.atom.emit = r600_emit_scissors; - rctx->viewports.atom.emit = r600_emit_viewports; + rctx->viewports.atom.emit = r600_emit_viewport_states; rctx->scissors.atom.num_dw = (2 + 16 * 2) + 6; rctx->viewports.atom.num_dw = 2 + 16 * 6; rctx->b.set_scissor_states = r600_set_scissor_states; rctx->b.set_viewport_states = r600_set_viewport_states; } diff --git a/src/gallium/drivers/radeon/r600d_common.h b/src/gallium/drivers/radeon/r600d_common.h index 6f534b3..3dbe43a 100644 --- a/src/gallium/drivers/radeon/r600d_common.h +++ b/src/gallium/drivers/radeon/r600d_common.h @@ -239,12 +239,14 @@ #define C_028250_TL_Y 0x8000FFFF #define S_028250_WINDOW_OFFSET_DISABLE(x) (((unsigned)(x) & 0x1) << 31) #define G_028250_WINDOW_OFFSET_DISABLE(x) (((x) >> 31) & 0x1) #define C_028250_WINDOW_OFFSET_DISABLE 0x7FFFFFFF #define S_028254_BR_X(x) (((unsigned)(x) & 0x7FFF) << 0) #define G_028254_BR_X(x) (((x) >> 0) & 0x7FFF) #define C_028254_BR_X 0xFFFF8000 #define S_028254_BR_Y(x) (((unsigned)(x) & 0x7FFF) << 16) #define G_028254_BR_Y(x) (((x) >> 16) & 0x7FFF) #define C_028254_BR_Y 0x8000FFFF +#define R_0282D0_PA_SC_VPORT_ZMIN_0 0x0282D0 +#define R_0282D4_PA_SC_VPORT_ZMAX_0 0x0282D4 #endif diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c index aeccb2d..a03b327 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -206,20 +206,21 @@ void si_begin_new_cs(struct si_context *ctx) si_mark_atom_dirty(ctx, &ctx->blend_color.atom); si_mark_atom_dirty(ctx, &ctx->db_render_state); si_mark_atom_dirty(ctx, &ctx->stencil_ref.atom); si_mark_atom_dirty(ctx, &ctx->spi_map); si_mark_atom_dirty(ctx, &ctx->b.streamout.enable_atom); si_mark_atom_dirty(ctx, &ctx->b.render_cond_atom); si_all_descriptors_begin_new_cs(ctx); ctx->b.scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; ctx->b.viewports.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; + ctx->b.viewports.depth_range_dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; si_mark_atom_dirty(ctx, &ctx->b.scissors.atom); si_mark_atom_dirty(ctx, &ctx->b.viewports.atom); r600_postflush_resume_features(&ctx->b); assert(!ctx->b.gfx.cs->prev_dw); ctx->b.initial_gfx_cs_size = ctx->b.gfx.cs->current.cdw; /* Invalidate various draw states so that they are emitted before * the first draw call. */ diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 803a021..526f628 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -725,20 +725,21 @@ static void *si_create_rs_state(struct pipe_context *ctx, struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer); struct si_pm4_state *pm4 = &rs->pm4; unsigned tmp, i; float psize_min, psize_max; if (!rs) { return NULL; } rs->scissor_enable = state->scissor; + rs->clip_halfz = state->clip_halfz; rs->two_side = state->light_twoside; rs->multisample_enable = state->multisample; rs->force_persample_interp = state->force_persample_interp; rs->clip_plane_enable = state->clip_plane_enable; rs->line_stipple_enable = state->line_stipple_enable; rs->poly_stipple_enable = state->poly_stipple_enable; rs->line_smooth = state->line_smooth; rs->poly_smooth = state->poly_smooth; rs->uses_poly_offset = state->offset_point || state->offset_line || state->offset_tri; @@ -864,21 +865,21 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state) return; if (sctx->framebuffer.nr_samples > 1 && (!old_rs || old_rs->multisample_enable != rs->multisample_enable)) { si_mark_atom_dirty(sctx, &sctx->db_render_state); if (sctx->b.family >= CHIP_POLARIS10) si_mark_atom_dirty(sctx, &sctx->msaa_sample_locs.atom); } - r600_set_scissor_enable(&sctx->b, rs->scissor_enable); + r600_viewport_set_rast_deps(&sctx->b, rs->scissor_enable, rs->clip_halfz); si_pm4_bind_state(sctx, rasterizer, rs); si_update_poly_offset_state(sctx); si_mark_atom_dirty(sctx, &sctx->clip_regs); sctx->do_update_shaders = true; } static void si_delete_rs_state(struct pipe_context *ctx, void *state) { diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index f4f7575..d0e519c 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -69,20 +69,21 @@ struct si_state_rasterizer { unsigned pa_sc_line_stipple; unsigned pa_cl_clip_cntl; unsigned clip_plane_enable; bool poly_stipple_enable; bool line_smooth; bool poly_smooth; bool uses_poly_offset; bool clamp_fragment_color; bool rasterizer_discard; bool scissor_enable; + bool clip_halfz; }; struct si_dsa_stencil_ref_part { uint8_t valuemask[2]; uint8_t writemask[2]; }; struct si_state_dsa { struct si_pm4_state pm4; unsigned alpha_func; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev