gallium/radeon: add and use radeon_info::max_alloc_size (v2)
authorMarek Olšák <marek.olsak@amd.com>
Thu, 30 Jun 2016 22:17:36 +0000 (00:17 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 4 Jul 2016 22:47:13 +0000 (00:47 +0200)
v2: - squashed the patches
    - use INT_MAX
    - clamp max_const_buffer_size
    - check the DRM version in radeon

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Vedran Miletić <vedran@miletic.net>
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeon/radeon_winsys.h
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c

index 119c76bd4a963653fb9c036de6f1360f4e685309..f23daf95109f244bf952b494ae5626b95c59f623 100644 (file)
@@ -301,7 +301,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                return 0;
 
        case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
-               return MIN2(rscreen->b.info.vram_size, 0xFFFFFFFF);
+               return MIN2(rscreen->b.info.max_alloc_size, INT_MAX);
 
         case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
                 return R600_MAP_BUFFER_ALIGNMENT;
@@ -509,7 +509,7 @@ static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, e
                        pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
                                PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
                                &max_const_buffer_size);
-                       return max_const_buffer_size;
+                       return MIN2(max_const_buffer_size, INT_MAX);
 
                } else {
                        return R600_MAX_CONST_BUFFER_SIZE;
index 74674e70e72d0fa457232b5644d2cf15489ca987..f75fa6c7d8c0d1e39fafeb50e3891c888cdfd71d 100644 (file)
@@ -864,8 +864,8 @@ static int r600_get_compute_param(struct pipe_screen *screen,
                         * 4 * MAX_MEM_ALLOC_SIZE.
                         */
                        *max_global_size = MIN2(4 * max_mem_alloc_size,
-                               rscreen->info.gart_size +
-                               rscreen->info.vram_size);
+                                               MAX2(rscreen->info.gart_size,
+                                                    rscreen->info.vram_size));
                }
                return sizeof(uint64_t);
 
@@ -889,10 +889,7 @@ static int r600_get_compute_param(struct pipe_screen *screen,
                if (ret) {
                        uint64_t *max_mem_alloc_size = ret;
 
-                       /* XXX: The limit in older kernels is 256 MB.  We
-                        * should add a query here for newer kernels.
-                        */
-                       *max_mem_alloc_size = 256 * 1024 * 1024;
+                       *max_mem_alloc_size = rscreen->info.max_alloc_size;
                }
                return sizeof(uint64_t);
 
@@ -1098,6 +1095,8 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
                printf("chip_class = %i\n", rscreen->info.chip_class);
                printf("gart_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.gart_size, 1024*1024));
                printf("vram_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.vram_size, 1024*1024));
+               printf("max_alloc_size = %i MB\n",
+                      (int)DIV_ROUND_UP(rscreen->info.max_alloc_size, 1024*1024));
                printf("has_virtual_memory = %i\n", rscreen->info.has_virtual_memory);
                printf("gfx_ib_pad_with_type2 = %i\n", rscreen->info.gfx_ib_pad_with_type2);
                printf("has_sdma = %i\n", rscreen->info.has_sdma);
index f32edf09a2d25b4d53b284c14d5b472a9c721559..5910b000104c4b452716b9bf18e2b063f8a2c2c7 100644 (file)
@@ -253,6 +253,7 @@ struct radeon_info {
     uint32_t                    gart_page_size;
     uint64_t                    gart_size;
     uint64_t                    vram_size;
+    uint64_t                    max_alloc_size;
     bool                        has_dedicated_vram;
     bool                        has_virtual_memory;
     bool                        gfx_ib_pad_with_type2;
index ad2a86a812bcd756736614c1fd7df02eea046673..57c3fbde3f65a0c578c5ff7b8135e74fef74fa67 100644 (file)
@@ -419,7 +419,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                       HAVE_LLVM >= 0x0307 ? 410 : 330;
 
        case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
-               return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
+               return MIN2(sscreen->b.info.max_alloc_size, INT_MAX);
 
        case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
                return 0;
@@ -566,7 +566,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
                        pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
                                PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
                                &max_const_buffer_size);
-                       return max_const_buffer_size;
+                       return MIN2(max_const_buffer_size, INT_MAX);
                }
                default:
                        /* If compute shaders don't require a special value
index b8fb4dde8949d2b9687da557f3759c5cb4a31522..9a04cbe07fa7b657760bdf2b9f3c87c623a7444e 100644 (file)
@@ -270,6 +270,8 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd)
    /* Set hardware information. */
    ws->info.gart_size = gtt.heap_size;
    ws->info.vram_size = vram.heap_size;
+   /* TODO: the kernel reports vram/gart.max_allocation == 251 MB (bug?) */
+   ws->info.max_alloc_size = MAX2(ws->info.vram_size, ws->info.gart_size);
    /* convert the shader clock from KHz to MHz */
    ws->info.max_shader_clock = ws->amdinfo.max_engine_clk / 1000;
    ws->info.max_se = ws->amdinfo.num_shader_engines;
index c4d28ffe4e42238975930f5a964d997df25ac885..1b32c377452621c7aa53031bc19aacdc28dac27e 100644 (file)
@@ -373,6 +373,10 @@ static bool do_winsys_init(struct radeon_drm_winsys *ws)
     ws->info.gart_size = gem_info.gart_size;
     ws->info.vram_size = gem_info.vram_size;
 
+    ws->info.max_alloc_size = MAX2(ws->info.vram_size, ws->info.gart_size);
+    if (ws->info.drm_minor < 40)
+        ws->info.max_alloc_size = MIN2(ws->info.max_alloc_size, 256*1024*1024);
+
     /* Get max clock frequency info and convert it to MHz */
     radeon_get_drm_value(ws->fd, RADEON_INFO_MAX_SCLK, NULL,
                          &ws->info.max_shader_clock);