v2: Moved the high priority check to r600_texture_create_object

Signed-off-by: Lauri Kasanen <c...@gmx.com>
---
 src/gallium/drivers/r600/r600_state_common.c    | 2 +-
 src/gallium/drivers/radeon/r600_buffer_common.c | 6 ++++--
 src/gallium/drivers/radeon/r600_pipe_common.h   | 3 ++-
 src/gallium/drivers/radeon/r600_texture.c       | 9 ++++++++-
 src/gallium/drivers/radeon/radeon_uvd.c         | 4 ++--
 src/gallium/winsys/radeon/drm/radeon_drm_bo.c   | 4 ++++
 src/gallium/winsys/radeon/drm/radeon_drm_bo.h   | 1 +
 src/gallium/winsys/radeon/drm/radeon_drm_cs.c   | 2 +-
 src/gallium/winsys/radeon/drm/radeon_winsys.h   | 2 ++
 9 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_state_common.c 
b/src/gallium/drivers/r600/r600_state_common.c
index ba37af8..2f833ba 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -2106,7 +2106,7 @@ static void r600_invalidate_buffer(struct pipe_context 
*ctx, struct pipe_resourc
 
        /* Create a new one in the same pipe_resource. */
        r600_init_resource(&rctx->screen->b, rbuffer, rbuffer->b.b.width0, 
alignment,
-                          TRUE, rbuffer->b.b.usage);
+                          TRUE, rbuffer->b.b.usage, FALSE);
 
        /* We changed the buffer, now we need to bind it where the old one was 
bound. */
        /* Vertex buffers. */
diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c 
b/src/gallium/drivers/radeon/r600_buffer_common.c
index ac5fbcc..6083253 100644
--- a/src/gallium/drivers/radeon/r600_buffer_common.c
+++ b/src/gallium/drivers/radeon/r600_buffer_common.c
@@ -98,7 +98,8 @@ void *r600_buffer_map_sync_with_rings(struct 
r600_common_context *ctx,
 bool r600_init_resource(struct r600_common_screen *rscreen,
                        struct r600_resource *res,
                        unsigned size, unsigned alignment,
-                       bool use_reusable_pool, unsigned usage)
+                       bool use_reusable_pool, unsigned usage,
+                       bool high_prio)
 {
        uint32_t initial_domain, domains;
 
@@ -131,6 +132,7 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
 
        res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment,
                                               use_reusable_pool,
+                                              high_prio,
                                               initial_domain);
        if (!res->buf) {
                return false;
@@ -314,7 +316,7 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen 
*screen,
        rbuffer->b.vtbl = &r600_buffer_vtbl;
        util_range_init(&rbuffer->valid_buffer_range);
 
-       if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, 
TRUE, templ->usage)) {
+       if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, 
TRUE, templ->usage, FALSE)) {
                FREE(rbuffer);
                return NULL;
        }
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
b/src/gallium/drivers/radeon/r600_pipe_common.h
index 4c35e66..75c78e3 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -278,7 +278,8 @@ void *r600_buffer_map_sync_with_rings(struct 
r600_common_context *ctx,
 bool r600_init_resource(struct r600_common_screen *rscreen,
                        struct r600_resource *res,
                        unsigned size, unsigned alignment,
-                       bool use_reusable_pool, unsigned usage);
+                       bool use_reusable_pool, unsigned usage,
+                       bool high_prio);
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
                                         const struct pipe_resource *templ,
                                         unsigned alignment);
diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index caf3743..26c27c9 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -620,7 +620,14 @@ r600_texture_create_object(struct pipe_screen *screen,
                unsigned usage = rtex->surface.level[0].mode >= 
RADEON_SURF_MODE_1D ?
                                         PIPE_USAGE_STATIC : base->usage;
 
-               if (!r600_init_resource(rscreen, resource, rtex->size, 
base_align, FALSE, usage)) {
+               bool high_prio = false;
+
+               /* If it's depth or MSAA, consider it high priority */
+               if (rtex->is_depth || base->nr_samples > 1)
+                       high_prio = true;
+
+               if (!r600_init_resource(rscreen, resource, rtex->size,
+                                       base_align, FALSE, usage, high_prio)) {
                        FREE(rtex);
                        return NULL;
                }
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c 
b/src/gallium/drivers/radeon/radeon_uvd.c
index 95757e3..1cc1997 100644
--- a/src/gallium/drivers/radeon/radeon_uvd.c
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
@@ -168,7 +168,7 @@ static bool create_buffer(struct ruvd_decoder *dec,
                          struct ruvd_buffer *buffer,
                          unsigned size)
 {
-       buffer->buf = dec->ws->buffer_create(dec->ws, size, 4096, false,
+       buffer->buf = dec->ws->buffer_create(dec->ws, size, 4096, false, true,
                                             RADEON_DOMAIN_GTT | 
RADEON_DOMAIN_VRAM);
        if (!buffer->buf)
                return false;
@@ -1008,7 +1008,7 @@ void ruvd_join_surfaces(struct radeon_winsys* ws, 
unsigned bind,
        /* TODO: 2D tiling workaround */
        alignment *= 2;
 
-       pb = ws->buffer_create(ws, size, alignment, bind, RADEON_DOMAIN_VRAM);
+       pb = ws->buffer_create(ws, size, alignment, bind, true, 
RADEON_DOMAIN_VRAM);
        if (!pb)
                return;
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c 
b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
index 606b65a..f6d5d98 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
@@ -650,6 +650,8 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct 
pb_manager *_mgr,
     else if (rdesc->initial_domains & RADEON_DOMAIN_GTT)
         rws->allocated_gtt += align(size, 4096);
 
+    bo->stats.high_prio = rdesc->high_prio;
+
     if (rws->bo_stats_file) {
         fprintf(rws->bo_stats_file, "%p created, size %u, prio %u, @%llu\n", 
bo, size,
                                    bo->stats.high_prio, stats_time_get(rws));
@@ -870,6 +872,7 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
                         unsigned size,
                         unsigned alignment,
                         boolean use_reusable_pool,
+                        boolean high_prio,
                         enum radeon_bo_domain domain)
 {
     struct radeon_drm_winsys *ws = radeon_drm_winsys(rws);
@@ -884,6 +887,7 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
     /* Additional criteria for the cache manager. */
     desc.base.usage = domain;
     desc.initial_domains = domain;
+    desc.high_prio = high_prio;
 
     /* Assign a buffer manager. */
     if (use_reusable_pool)
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h 
b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
index 651694b..e93e615 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
@@ -42,6 +42,7 @@ struct radeon_bo_desc {
     struct pb_desc base;
 
     unsigned initial_domains;
+    bool high_prio;
 };
 
 struct radeon_bo_stats {
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c 
b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index 5c1b756..d5b192f 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -638,7 +638,7 @@ radeon_cs_create_fence(struct radeon_winsys_cs *rcs)
     struct pb_buffer *fence;
 
     /* Create a fence, which is a dummy BO. */
-    fence = cs->ws->base.buffer_create(&cs->ws->base, 1, 1, TRUE,
+    fence = cs->ws->base.buffer_create(&cs->ws->base, 1, 1, TRUE, FALSE,
                                        RADEON_DOMAIN_GTT);
     /* Add the fence as a dummy relocation. */
     cs->ws->base.cs_add_reloc(rcs, cs->ws->base.buffer_get_cs_handle(fence),
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h 
b/src/gallium/winsys/radeon/drm/radeon_winsys.h
index 0e559e1..885510b 100644
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
@@ -250,6 +250,7 @@ struct radeon_winsys {
      * \param size      The size to allocate.
      * \param alignment An alignment of the buffer in memory.
      * \param use_reusable_pool Whether the cache buffer manager should be 
used.
+     * \param high_prio Whether this bo should be considered high priority
      * \param domain    A bitmask of the RADEON_DOMAIN_* flags.
      * \return          The created buffer object.
      */
@@ -257,6 +258,7 @@ struct radeon_winsys {
                                        unsigned size,
                                        unsigned alignment,
                                        boolean use_reusable_pool,
+                                       boolean high_prio,
                                        enum radeon_bo_domain domain);
 
     struct radeon_winsys_cs_handle *(*buffer_get_cs_handle)(
-- 
1.8.3.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to