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:
@@ -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
|
||||||
|
Reference in New Issue
Block a user