r600/sfn: add callstack non-evergreen support
authorDave Airlie <airlied@redhat.com>
Mon, 18 May 2020 06:36:46 +0000 (16:36 +1000)
committerMarge Bot <eric+marge@anholt.net>
Mon, 18 May 2020 21:56:29 +0000 (21:56 +0000)
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5084>

src/gallium/drivers/r600/sfn/sfn_callstack.cpp

index da423a657fac5d0a933be3b09533d023b5ef80d1..681b89d8679cf9677a3179c6caed106f9c35ba41 100644 (file)
@@ -90,12 +90,40 @@ int CallStack::update_max_depth(unsigned type)
    elements = (stack.loop + stack.push_wqm ) * entry_size;
    elements += stack.push;
 
-   /* These next three lines are EVERGREEN specific and should
-    * be moved to a virtual function when other chipsets are to
-    * be supported */
-   assert(m_bc.chip_class == EVERGREEN);
-   if (type == FC_PUSH_VPM || stack.push > 0) {
-      elements += 1;
+   switch (m_bc.chip_class) {
+   case R600:
+   case R700:
+     /* pre-r8xx: if any non-WQM PUSH instruction is invoked, 2 elements on
+      * the stack must be reserved to hold the current active/continue
+      * masks */
+     if (type == FC_PUSH_VPM || stack.push > 0) {
+       elements += 2;
+     }
+     break;
+   case CAYMAN:
+     /* r9xx: any stack operation on empty stack consumes 2 additional
+      * elements */
+     elements += 2;
+     break;
+   case EVERGREEN:
+     /* r8xx+: 2 extra elements are not always required, but one extra
+      * element must be added for each of the following cases:
+      * 1. There is an ALU_ELSE_AFTER instruction at the point of greatest
+      *    stack usage.
+      *    (Currently we don't use ALU_ELSE_AFTER.)
+      * 2. There are LOOP/WQM frames on the stack when any flavor of non-WQM
+      *    PUSH instruction executed.
+      *
+      *    NOTE: it seems we also need to reserve additional element in some
+      *    other cases, e.g. when we have 4 levels of PUSH_VPM in the shader,
+      *    then STACK_SIZE should be 2 instead of 1 */
+     if (type == FC_PUSH_VPM || stack.push > 0) {
+       elements += 1;
+     }
+     break;
+   default:
+     assert(0);
+     break;
    }
 
    entry_size = 4;