radeon/compute: Fix reported values for MAX_GLOBAL_SIZE and MAX_MEM_ALLOC_SIZE
authorTom Stellard <thomas.stellard@amd.com>
Thu, 7 Aug 2014 19:21:59 +0000 (15:21 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Wed, 13 Aug 2014 18:11:43 +0000 (14:11 -0400)
There is a hard limit in older kernels of 256 MB for buffer allocations,
so report this value as MAX_MEM_ALLOC_SIZE and adjust MAX_GLOBAL_SIZE
to statisfy requirements of OpenCL.

CC: "10.2" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/radeon/r600_pipe_common.c

index eb44d7255ba95abc97c6f1dc41fd80a507e9dd4c..95abfb82f419cd620a53750c5fa0b71d508946e8 100644 (file)
@@ -474,13 +474,21 @@ static int r600_get_compute_param(struct pipe_screen *screen,
        case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
                if (ret) {
                        uint64_t *max_global_size = ret;
-                       /* XXX: This is what the proprietary driver reports, we
-                        * may want to use a different value. */
-                       /* XXX: Not sure what to put here for SI. */
-                       if (rscreen->chip_class >= SI)
-                               *max_global_size = 2000000000;
-                       else
-                               *max_global_size = 201326592;
+                       uint64_t max_mem_alloc_size;
+
+                       r600_get_compute_param(screen,
+                               PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
+                               &max_mem_alloc_size);
+
+                       /* In OpenCL, the MAX_MEM_ALLOC_SIZE must be at least
+                        * 1/4 of the MAX_GLOBAL_SIZE.  Since the
+                        * MAX_MEM_ALLOC_SIZE is fixed for older kernels,
+                        * make sure we never report more than
+                        * 4 * MAX_MEM_ALLOC_SIZE.
+                        */
+                       *max_global_size = MIN2(4 * max_mem_alloc_size,
+                               rscreen->info.gart_size +
+                               rscreen->info.vram_size);
                }
                return sizeof(uint64_t);
 
@@ -504,13 +512,11 @@ static int r600_get_compute_param(struct pipe_screen *screen,
                if (ret) {
                        uint64_t max_global_size;
                        uint64_t *max_mem_alloc_size = ret;
-                       r600_get_compute_param(screen, PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE, &max_global_size);
-                       /* OpenCL requres this value be at least
-                        * max(MAX_GLOBAL_SIZE / 4, 128 * 1024 *1024)
-                        * I'm really not sure what value to report here, but
-                        * MAX_GLOBAL_SIZE / 4 seems resonable.
+
+                       /* XXX: The limit in older kernels is 256 MB.  We
+                        * should add a query here for newer kernels.
                         */
-                       *max_mem_alloc_size = max_global_size / 4;
+                       *max_mem_alloc_size = 256 * 1024 * 1024;
                }
                return sizeof(uint64_t);