On Sat, Jan 19, 2019 at 2:56 PM Rhys Perry <pendingchao...@gmail.com> wrote: > > Signed-off-by: Rhys Perry <pendingchao...@gmail.com> > --- > src/amd/vulkan/radv_cmd_buffer.c | 65 ++++++++++++++++++++------------ > src/amd/vulkan/radv_private.h | 2 + > 2 files changed, 43 insertions(+), 24 deletions(-) > > diff --git a/src/amd/vulkan/radv_cmd_buffer.c > b/src/amd/vulkan/radv_cmd_buffer.c > index f430b4f20dd..6d538d7e88a 100644 > --- a/src/amd/vulkan/radv_cmd_buffer.c > +++ b/src/amd/vulkan/radv_cmd_buffer.c > @@ -920,6 +920,8 @@ radv_emit_scissor(struct radv_cmd_buffer *cmd_buffer) > cmd_buffer->state.dynamic.scissor.scissors, > cmd_buffer->state.dynamic.viewport.viewports, > > cmd_buffer->state.emitted_pipeline->graphics.can_use_guardband); > + > + cmd_buffer->state.workaround_scissor_bug = false; > } > > static void > @@ -1217,6 +1219,8 @@ radv_update_bound_fast_clear_ds(struct radv_cmd_buffer > *cmd_buffer, > radv_update_zrange_precision(cmd_buffer, &att->ds, image, > layout, false); > } > + > + cmd_buffer->state.workaround_scissor_bug = true; > } > > /** > @@ -1442,6 +1446,8 @@ radv_update_bound_fast_clear_color(struct > radv_cmd_buffer *cmd_buffer, > radeon_set_context_reg_seq(cs, R_028C8C_CB_COLOR0_CLEAR_WORD0 + > cb_idx * 0x3c, 2); > radeon_emit(cs, color_values[0]); > radeon_emit(cs, color_values[1]); > + > + cmd_buffer->state.workaround_scissor_bug = true; > } > > /** > @@ -1704,6 +1710,8 @@ void radv_set_db_count_control(struct radv_cmd_buffer > *cmd_buffer) > } > > radeon_set_context_reg(cmd_buffer->cs, R_028004_DB_COUNT_CONTROL, > db_count_control); > + > + cmd_buffer->state.workaround_scissor_bug = true; > } > > static void > @@ -2185,6 +2193,27 @@ radv_emit_draw_registers(struct radv_cmd_buffer > *cmd_buffer, > state->last_primitive_reset_index = > primitive_reset_index; > } > } > + > + if (draw_info->strmout_buffer) { > + uint64_t va = > radv_buffer_get_va(draw_info->strmout_buffer->bo); > + > + va += draw_info->strmout_buffer->offset + > + draw_info->strmout_buffer_offset; > + > + radeon_set_context_reg(cs, > R_028B30_VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE, > + draw_info->stride); > + > + radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0)); > + radeon_emit(cs, COPY_DATA_SRC_SEL(COPY_DATA_SRC_MEM) | > + COPY_DATA_DST_SEL(COPY_DATA_REG) | > + COPY_DATA_WR_CONFIRM); > + radeon_emit(cs, va); > + radeon_emit(cs, va >> 32); > + radeon_emit(cs, > R_028B2C_VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE >> 2); > + radeon_emit(cs, 0); /* unused */ > + > + radv_cs_add_buffer(cmd_buffer->device->ws, cs, > draw_info->strmout_buffer->bo); > + } > } > > static void radv_stage_flush(struct radv_cmd_buffer *cmd_buffer, > @@ -3470,27 +3499,6 @@ radv_emit_draw_packets(struct radv_cmd_buffer > *cmd_buffer, > struct radeon_winsys *ws = cmd_buffer->device->ws; > struct radeon_cmdbuf *cs = cmd_buffer->cs; > > - if (info->strmout_buffer) { > - uint64_t va = radv_buffer_get_va(info->strmout_buffer->bo); > - > - va += info->strmout_buffer->offset + > - info->strmout_buffer_offset; > - > - radeon_set_context_reg(cs, > R_028B30_VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE, > - info->stride); > - > - radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0)); > - radeon_emit(cs, COPY_DATA_SRC_SEL(COPY_DATA_SRC_MEM) | > - COPY_DATA_DST_SEL(COPY_DATA_REG) | > - COPY_DATA_WR_CONFIRM); > - radeon_emit(cs, va); > - radeon_emit(cs, va >> 32); > - radeon_emit(cs, > R_028B2C_VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE >> 2); > - radeon_emit(cs, 0); /* unused */ > - > - radv_cs_add_buffer(ws, cs, info->strmout_buffer->bo); > - } > - > if (info->indirect) { > uint64_t va = radv_buffer_get_va(info->indirect->bo); > uint64_t count_va = 0; > @@ -3609,13 +3617,16 @@ radv_emit_draw_packets(struct radv_cmd_buffer > *cmd_buffer, > * any context registers. > */ > static bool radv_need_late_scissor_emission(struct radv_cmd_buffer > *cmd_buffer, > - bool indexed_draw) > + const struct radv_draw_info > *info) > { > struct radv_cmd_state *state = &cmd_buffer->state; > > if (!cmd_buffer->device->physical_device->has_scissor_bug) > return false; > > + if (cmd_buffer->state.workaround_scissor_bug || info->strmout_buffer) > + return true; > + > uint32_t used_states = > cmd_buffer->state.pipeline->graphics.needed_dynamic_state | > ~RADV_CMD_DIRTY_DYNAMIC_ALL; > > /* Index, vertex and streamout buffers don't change context regs, and > @@ -3633,7 +3644,7 @@ static bool radv_need_late_scissor_emission(struct > radv_cmd_buffer *cmd_buffer, > if (cmd_buffer->state.emitted_pipeline != cmd_buffer->state.pipeline) > return true; > > - if (indexed_draw && state->pipeline->graphics.prim_restart_enable && > + if (info->indexed && state->pipeline->graphics.prim_restart_enable && > (state->index_type ? 0xffffffffu : 0xffffu) != > state->last_primitive_reset_index) > return true; > > @@ -3644,7 +3655,7 @@ static void > radv_emit_all_graphics_states(struct radv_cmd_buffer *cmd_buffer, > const struct radv_draw_info *info) > { > - bool late_scissor_emission = > radv_need_late_scissor_emission(cmd_buffer, info->indexed); > + bool late_scissor_emission = > radv_need_late_scissor_emission(cmd_buffer, info); > > if ((cmd_buffer->state.dirty & RADV_CMD_DIRTY_FRAMEBUFFER) || > cmd_buffer->state.emitted_pipeline != cmd_buffer->state.pipeline) > @@ -4843,6 +4854,8 @@ radv_emit_streamout_enable(struct radv_cmd_buffer > *cmd_buffer) > S_028B94_STREAMOUT_3_EN(so->streamout_enabled)); > radeon_emit(cs, so->hw_enabled_mask & > so->enabled_stream_buffers_mask); > + > + cmd_buffer->state.workaround_scissor_bug = true; > } > > static void > @@ -4919,6 +4932,8 @@ void radv_CmdBeginTransformFeedbackEXT( > radeon_emit(cs, sb[i].size >> 2); /* BUFFER_SIZE (in > DW) */ > radeon_emit(cs, so->stride_in_dw[i]); /* > VTX_STRIDE (in DW) */ > > + cmd_buffer->state.workaround_scissor_bug = true; > + > if (counter_buffer_idx >= 0 && pCounterBuffers && > pCounterBuffers[counter_buffer_idx]) { > /* The array of counter buffers is optional. */ > RADV_FROM_HANDLE(radv_buffer, buffer, > pCounterBuffers[counter_buffer_idx]); > @@ -4999,6 +5014,8 @@ void radv_CmdEndTransformFeedbackEXT( > * that the primitives-emitted query won't increment. > */ > radeon_set_context_reg(cs, R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 > + 16*i, 0); > + > + cmd_buffer->state.workaround_scissor_bug = true; > } > > radv_set_streamout_enable(cmd_buffer, false); > diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h > index 6089ee6a607..86473bb7100 100644 > --- a/src/amd/vulkan/radv_private.h > +++ b/src/amd/vulkan/radv_private.h > @@ -1055,6 +1055,8 @@ struct radv_cmd_state { > /* Conditional rendering info. */ > int predication_type; /* -1: disabled, 0: normal, 1: inverted */ > uint64_t predication_va; > + > + bool workaround_scissor_bug;
Can we call this something like `context_roll_without_scissor_emitted` or something else more descriptive? Otherwise, this series is Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> > }; > > struct radv_cmd_pool { > -- > 2.20.1 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev