gallium/radeon: add RADEON_FLAG_HANDLE
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 9 Sep 2016 09:49:18 +0000 (11:49 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 27 Sep 2016 14:45:05 +0000 (16:45 +0200)
When passed to winsys->buffer_create, this flag will indicate that we require
a buffer that maps 1:1 with a kernel buffer handle.

This is currently set for all textures, since textures can potentially be
exported to other processes. This is not a huge loss, since the main purpose
of this patch series is to deal with applications that allocate many small
buffers.

A hypothetical application with tons of tiny textures might still benefit
from not setting this flag, but that's not a use case I'm worried about
just now.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/radeon/r600_texture.c
src/gallium/drivers/radeon/radeon_winsys.h
src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
src/gallium/winsys/radeon/drm/radeon_drm_bo.c
src/gallium/winsys/radeon/drm/radeon_drm_cs.c

index 5f459e4819e7b87a4456f04982b7cb30d6c46627..fbac07a79a4ac9ce1446e6af7f5666ac56a8414e 100644 (file)
@@ -1114,7 +1114,7 @@ r300_texture_create_object(struct r300_screen *rscreen,
     /* Create the backing buffer if needed. */
     if (!tex->buf) {
         tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048,
-                                      tex->domain, 0);
+                                      tex->domain, RADEON_FLAG_HANDLE);
 
         if (!tex->buf) {
             goto fail;
index b02b2dc527dc2fb99fa034e1b85fc6540d845c10..b2ed93cff2dc210cff94ca1c2e44c5a2c811bf8a 100644 (file)
@@ -1117,6 +1117,8 @@ r600_texture_create_object(struct pipe_screen *screen,
                r600_init_resource_fields(rscreen, resource, rtex->size,
                                          rtex->surface.bo_alignment);
 
+               resource->flags |= RADEON_FLAG_HANDLE;
+
                if (!r600_alloc_resource(rscreen, resource)) {
                        FREE(rtex);
                        return NULL;
index 809a2032f7d660f7c883dafa0fe8ac40024ce779..cce7928203123bc137851183516b75be91a302f7 100644 (file)
@@ -52,6 +52,7 @@ enum radeon_bo_flag { /* bitfield */
     RADEON_FLAG_GTT_WC =        (1 << 0),
     RADEON_FLAG_CPU_ACCESS =    (1 << 1),
     RADEON_FLAG_NO_CPU_ACCESS = (1 << 2),
+    RADEON_FLAG_HANDLE =        (1 << 3), /* the buffer most not be suballocated */
 };
 
 enum radeon_bo_usage { /* bitfield */
index 5b099b09a6365fb38fa9efff5cc1d4d934d5f685..0dbd0fb28de54243a482e7411f3d79b9663ceb44 100644 (file)
@@ -508,6 +508,9 @@ amdgpu_bo_create(struct radeon_winsys *rws,
    struct amdgpu_winsys_bo *bo;
    unsigned usage = 0, pb_cache_bucket;
 
+   /* This flag is irrelevant for the cache. */
+   flags &= ~RADEON_FLAG_HANDLE;
+
    /* Align size to page size. This is the minimum alignment for normal
     * BOs. Aligning this here helps the cached bufmgr. Especially small BOs,
     * like constant/uniform buffers, can benefit from better and more reuse.
index 5db20619b96ae21ef528ac3ed44ac85ba19da29f..db920357cb48e1422a066dbedce2e18ba9be94a2 100644 (file)
@@ -750,6 +750,9 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
     if (size > UINT_MAX)
         return NULL;
 
+    /* This flag is irrelevant for the cache. */
+    flags &= ~RADEON_FLAG_HANDLE;
+
     /* Align size to page size. This is the minimum alignment for normal
      * BOs. Aligning this here helps the cached bufmgr. Especially small BOs,
      * like constant/uniform buffers, can benefit from better and more reuse.
index c4933f09ebadd0a01723f86d719a93d13e2d134b..a3b03be640a349fbe33a2b837f14a6211c51b56f 100644 (file)
@@ -620,7 +620,7 @@ radeon_cs_create_fence(struct radeon_winsys_cs *rcs)
 
     /* Create a fence, which is a dummy BO. */
     fence = cs->ws->base.buffer_create(&cs->ws->base, 1, 1,
-                                       RADEON_DOMAIN_GTT, 0);
+                                       RADEON_DOMAIN_GTT, RADEON_FLAG_HANDLE);
     /* Add the fence as a dummy relocation. */
     cs->ws->base.cs_add_buffer(rcs, fence,
                               RADEON_USAGE_READWRITE, RADEON_DOMAIN_GTT,