From eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 21 Jun 2012 19:32:43 -0400 Subject: [PATCH] r600g: Use a texture as the underlying resource for compute_memory_pool This the first step towards being able to use evergreen_cb to bind RATs. --- .../drivers/r600/compute_memory_pool.c | 34 ++++++++++++++++--- .../drivers/r600/evergreen_compute_internal.c | 21 ++++-------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c index 01bf0c33dfd..1e88aafae0a 100644 --- a/src/gallium/drivers/r600/compute_memory_pool.c +++ b/src/gallium/drivers/r600/compute_memory_pool.c @@ -41,6 +41,32 @@ #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); } diff --git a/src/gallium/drivers/r600/evergreen_compute_internal.c b/src/gallium/drivers/r600/evergreen_compute_internal.c index 13c82f0e156..ca44837a432 100644 --- a/src/gallium/drivers/r600/evergreen_compute_internal.c +++ b/src/gallium/drivers/r600/evergreen_compute_internal.c @@ -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); -- 2.30.2