r600g: Use a texture as the underlying resource for compute_memory_pool
authorTom Stellard <thomas.stellard@amd.com>
Thu, 21 Jun 2012 23:32:43 +0000 (19:32 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Mon, 9 Jul 2012 13:41:18 +0000 (13:41 +0000)
This the first step towards being able to use evergreen_cb to bind RATs.

src/gallium/drivers/r600/compute_memory_pool.c
src/gallium/drivers/r600/evergreen_compute_internal.c

index 01bf0c33dfd0f4932342a7d2bc0f837d01eda3cd..1e88aafae0a9863c5ce2302f5f12910670633acd 100644 (file)
 #include "compute_memory_pool.h"
 #include "evergreen_compute_internal.h"
 
+static struct r600_resource_texture * create_pool_texture(struct r600_screen * screen,
+               unsigned size_in_dw)
+{
+
+       struct pipe_resource templ;
+       struct r600_resource_texture * tex;
+
+       memset(&templ, 0, sizeof(templ));
+       templ.target = PIPE_TEXTURE_1D;
+       templ.format = PIPE_FORMAT_R32_UNORM;
+       templ.bind = PIPE_BIND_CUSTOM;
+       templ.usage = PIPE_USAGE_IMMUTABLE;
+       templ.flags = 0;
+       templ.width0 = size_in_dw;
+       templ.height0 = 1;
+       templ.depth0 = 1;
+       templ.array_size = 1;
+
+       tex = (struct r600_resource_texture *)r600_texture_create(
+                                               &screen->screen, &templ);
+       /* XXX: Propagate this error */
+       assert(tex && "Out of memory");
+       tex->is_rat = 1;
+       return tex;
+}
+
 /**
  * Creates a new pool
  */
@@ -54,8 +80,8 @@ struct compute_memory_pool* compute_memory_pool_new(
        pool->next_id = 1;
        pool->size_in_dw = initial_size_in_dw;
        pool->screen = rscreen;
-       pool->bo = (struct r600_resource*)r600_compute_buffer_alloc_vram(
-                                       pool->screen, pool->size_in_dw*4);
+       pool->bo = (struct r600_resource*)create_pool_texture(pool->screen,
+                                                       pool->size_in_dw);
        pool->shadow = (uint32_t*)CALLOC(4, pool->size_in_dw);
 
        return pool;
@@ -147,8 +173,8 @@ void compute_memory_grow_pool(struct compute_memory_pool* pool,
        pool->screen->screen.resource_destroy(
                (struct pipe_screen *)pool->screen,
                (struct pipe_resource *)pool->bo);
-       pool->bo = r600_compute_buffer_alloc_vram(pool->screen,
-                                               pool->size_in_dw*4);
+       pool->bo = (struct r600_resource*)create_pool_texture(pool->screen,
+                                                       pool->size_in_dw);
        compute_memory_shadow(pool, pipe, 0);
 }
 
index 13c82f0e1568927f609baf05b604190608bac76f..ca44837a43299310184c5a6a64a096f397d023af 100644 (file)
@@ -298,20 +298,13 @@ void evergreen_set_rat(
                evergreen_compute_get_gpu_format(&fmt, bo);
        }
 
-       if (linear) {
-               evergreen_reg_set(res,
-                       R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1)
-                       | S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED)
-                       | S_028C70_FORMAT(fmt.format)
-                       | S_028C70_NUMBER_TYPE(fmt.number_type)
-               );
-               evergreen_emit_force_reloc(res);
-       } else {
-               assert(0 && "TODO");
-               ///TODO
-//      evergreen_reg_set(res, R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1) | S_028C70_ARRAY_MODE(????));
-//      evergreen_emit_force_reloc(res);
-       }
+       evergreen_reg_set(res,
+               R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1)
+               | S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED)
+               | S_028C70_FORMAT(fmt.format)
+               | S_028C70_NUMBER_TYPE(fmt.number_type)
+       );
+       evergreen_emit_force_reloc(res);
 
        evergreen_reg_set(res, R_028C74_CB_COLOR0_ATTRIB, S_028C74_NON_DISP_TILING_ORDER(1));
        evergreen_emit_force_reloc(res);