i965/chv: Check that compute threads are above threshold
authorBen Widawsky <benjamin.widawsky@intel.com>
Tue, 9 Feb 2016 02:00:41 +0000 (18:00 -0800)
committerBen Widawsky <benjamin.widawsky@intel.com>
Fri, 11 Mar 2016 19:17:28 +0000 (11:17 -0800)
The way we are organizing this code, the statically configured max_cs_threads
should always be the minimum value we actually support (ie. are aware of). As a
result, we can fall back to that if we get invalid numbers from the kernel (ie.
when the query succeeds, but the result is lower than expected).

I was originally planning to use an assert, but there is no reason to be so
mean.

Signed-off-by: Ben Widawsky <benjamin.widawsky@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_device_info.h

index 6e3f0a084320d10da590d9b0cc9726ef1f3f228e..defcae521a89a6678e63c0fc21ec8b4f44000905 100644 (file)
@@ -934,6 +934,10 @@ brwCreateContext(gl_api api,
        screen->subslice_total > 0 && screen->eu_total > 0) {
       /* Logical CS threads = EUs per subslice * 7 threads per EU */
       brw->max_cs_threads = screen->eu_total / screen->subslice_total * 7;
+
+      /* Fuse configurations may give more threads than expected, never less. */
+      if (brw->max_cs_threads < devinfo->max_cs_threads)
+         brw->max_cs_threads = devinfo->max_cs_threads;
    } else {
       brw->max_cs_threads = devinfo->max_cs_threads;
    }
index 73d682083a15f3b13d5cc28084fc11eec9931416..5c9517eda0f9de9477b115f026ff0d6619ffa16a 100644 (file)
@@ -71,6 +71,11 @@ struct brw_device_info
    /**
     * Total number of slices present on the device whether or not they've been
     * fused off.
+    *
+    * XXX: CS thread counts are limited by the inability to do cross subslice
+    * communication. It is the effectively the number of logical threads which
+    * can be executed in a subslice. Fuse configurations may cause this number
+    * to change, so we program @max_cs_threads as the lower maximum.
     */
    unsigned num_slices;
    unsigned max_vs_threads;