anv: Add flush_pipeline_before_pipeline_select

flush_pipeline_before_pipeline_select adds workarounds required before
switching the pipeline.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Jordan Justen
2016-03-10 17:25:45 -08:00
parent 1b126305de
commit c8ec65a1f5

View File

@@ -764,10 +764,31 @@ void genX(CmdDispatchIndirect)(
anv_batch_emit(batch, GENX(MEDIA_STATE_FLUSH)); anv_batch_emit(batch, GENX(MEDIA_STATE_FLUSH));
} }
static void
flush_pipeline_before_pipeline_select(struct anv_cmd_buffer *cmd_buffer,
uint32_t pipeline)
{
#if GEN_GEN >= 8 && GEN_GEN < 10
/* From the Broadwell PRM, Volume 2a: Instructions, PIPELINE_SELECT:
*
* Software must clear the COLOR_CALC_STATE Valid field in
* 3DSTATE_CC_STATE_POINTERS command prior to send a PIPELINE_SELECT
* with Pipeline Select set to GPGPU.
*
* The internal hardware docs recommend the same workaround for Gen9
* hardware too.
*/
if (pipeline == GPGPU)
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CC_STATE_POINTERS));
#endif
}
void void
genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer) genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer)
{ {
if (cmd_buffer->state.current_pipeline != _3D) { if (cmd_buffer->state.current_pipeline != _3D) {
flush_pipeline_before_pipeline_select(cmd_buffer, _3D);
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT), anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
#if GEN_GEN >= 9 #if GEN_GEN >= 9
.MaskBits = 3, .MaskBits = 3,
@@ -781,19 +802,7 @@ void
genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer) genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer)
{ {
if (cmd_buffer->state.current_pipeline != GPGPU) { if (cmd_buffer->state.current_pipeline != GPGPU) {
#if GEN_GEN >= 8 && GEN_GEN < 10 flush_pipeline_before_pipeline_select(cmd_buffer, GPGPU);
/* From the Broadwell PRM, Volume 2a: Instructions, PIPELINE_SELECT:
*
* Software must clear the COLOR_CALC_STATE Valid field in
* 3DSTATE_CC_STATE_POINTERS command prior to send a PIPELINE_SELECT
* with Pipeline Select set to GPGPU.
*
* The internal hardware docs recommend the same workaround for Gen9
* hardware too.
*/
anv_batch_emit(&cmd_buffer->batch,
GENX(3DSTATE_CC_STATE_POINTERS));
#endif
anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT), anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
#if GEN_GEN >= 9 #if GEN_GEN >= 9