summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2018-01-10 04:41:02 +0000
committerDave Airlie <[email protected]>2018-01-18 03:38:05 +0000
commit8cfec333c08a9518735d261cc9d6a96d64276f1c (patch)
tree828f29ca7b512d8a277128b836315dc20bbb4746 /src/gallium/drivers/r600
parent71a50de4fcf8202b500d51916100e8e905de3c44 (diff)
r600/sb: schedule LDS ops in appropriate places.
So LDS ops have to be SLOT_X, and LDS OQ reads have read port restrictions so we try and force those into only having one per slot and avoiding bank swizzles. Acked-By: Roland Scheidegger <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r--src/gallium/drivers/r600/sb/sb_bc.h3
-rw-r--r--src/gallium/drivers/r600/sb/sb_sched.cpp4
2 files changed, 7 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_bc.h b/src/gallium/drivers/r600/sb/sb_bc.h
index 3a3bae9d445..b35671bf0ff 100644
--- a/src/gallium/drivers/r600/sb/sb_bc.h
+++ b/src/gallium/drivers/r600/sb/sb_bc.h
@@ -711,6 +711,9 @@ public:
mask = 0x0F;
if (!is_cayman() && (slot_flags & AF_S))
mask |= 0x10;
+ /* Force LDS_IDX ops into SLOT_X */
+ if (op_ptr->opcode[0] == -1 && ((op_ptr->opcode[1] & 0xFF) == 0x11))
+ mask = 0x01;
return mask;
}
diff --git a/src/gallium/drivers/r600/sb/sb_sched.cpp b/src/gallium/drivers/r600/sb/sb_sched.cpp
index 1feef585dfb..f5fd84d54ac 100644
--- a/src/gallium/drivers/r600/sb/sb_sched.cpp
+++ b/src/gallium/drivers/r600/sb/sb_sched.cpp
@@ -461,6 +461,10 @@ bool alu_group_tracker::try_reserve(alu_node* n) {
if (n->uses_ar() && has_mova)
return false;
+ if (consumes_lds_oqa)
+ return false;
+ if (n->consumes_lds_oq() && available_slots != (sh.get_ctx().has_trans ? 0x1F : 0x0F))
+ return false;
for (unsigned i = 0; i < nsrc; ++i) {
unsigned last_id = next_id;