1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Adam Rak <adam.rak@streamnovation.com> 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blitter.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_double_list.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_transfer.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_framebuffer.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_resource.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_shader.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_pipe.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_formats.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "compute_memory_pool.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "evergreen_compute_internal.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_texture * create_pool_texture(struct r600_screen * screen, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size_in_dw) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_texture * tex; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size_in_dw == 0) { 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = PIPE_TEXTURE_1D; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = PIPE_FORMAT_R32_UINT; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = PIPE_BIND_CUSTOM; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.usage = PIPE_USAGE_IMMUTABLE; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.flags = 0; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = size_in_dw; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = 1; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = (struct r600_texture *)r600_texture_create( 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &screen->screen, &templ); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Propagate this error */ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex && "Out of memory"); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->is_rat = 1; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tex; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Creates a new pool 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct compute_memory_pool* compute_memory_pool_new( 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_screen * rscreen) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool = (struct compute_memory_pool*) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALLOC(sizeof(struct compute_memory_pool), 1); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_pool_new()\n"); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->screen = rscreen; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pool; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void compute_memory_pool_init(struct compute_memory_pool * pool, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned initial_size_in_dw) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_pool_init() initial_size_in_dw = %ld\n", 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org initial_size_in_dw); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: pool->shadow is used when the buffer needs to be resized, but 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * resizing does not work at the moment. 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pool->shadow = (uint32_t*)CALLOC(4, pool->size_in_dw); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->next_id = 1; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw = initial_size_in_dw; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->bo = (struct r600_resource*)create_pool_texture(pool->screen, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Frees all stuff in the pool and the pool struct itself too 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_pool_delete(struct compute_memory_pool* pool) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_pool_delete()\n"); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(pool->shadow); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pool->bo) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->screen->screen.resource_destroy((struct pipe_screen *) 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->screen, (struct pipe_resource *)pool->bo); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(pool); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Searches for an empty space in the pool, return with the pointer to the 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * allocatable space in the pool, returns -1 on failure. 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint64_t compute_memory_prealloc_chunk( 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t size_in_dw) 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(size_in_dw <= pool->size_in_dw); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *item; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_end = 0; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_prealloc_chunk() size_in_dw = %ld\n", 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_in_dw); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pool->item_list; item; item = item->next) { 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->start_in_dw > -1) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->start_in_dw-last_end > size_in_dw) { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return last_end; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org last_end = item->start_in_dw + item->size_in_dw; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org last_end += (1024 - last_end % 1024); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pool->size_in_dw - last_end < size_in_dw) { 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return last_end; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Search for the chunk where we can link our new chunk after it. 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct compute_memory_item* compute_memory_postalloc_chunk( 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t start_in_dw) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item* item; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_postalloc_chunck() start_in_dw = %ld\n", 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start_in_dw); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pool->item_list; item; item = item->next) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->next) { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->start_in_dw < start_in_dw 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && item->next->start_in_dw > start_in_dw) { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return item; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* end of chain */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(item->start_in_dw < start_in_dw); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return item; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "unreachable"); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Reallocates pool, conserves data 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_grow_pool(struct compute_memory_pool* pool, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context * pipe, int new_size_in_dw) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_grow_pool() new_size_in_dw = %d\n", 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_size_in_dw); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(new_size_in_dw >= pool->size_in_dw); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!pool->bo && "Growing the global memory pool is not yet " 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "supported. You will see this message if you are trying to" 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "use more than 64 kb of memory"); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pool->bo) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_pool_init(pool, 1024 * 16); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Growing memory pools does not work at the moment. I think 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it is because we are using fragment shaders to copy data to 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the new texture and some of the compute registers are being 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in the 3D command stream. */ 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "Warning: growing the global memory pool to" 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "more than 64 kb is not yet supported\n"); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_size_in_dw += 1024 - (new_size_in_dw % 1024); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG(" Aligned size = %d\n", new_size_in_dw); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_shadow(pool, pipe, 1); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->shadow = (uint32_t*)realloc(pool->shadow, new_size_in_dw*4); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw = new_size_in_dw; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->screen->screen.resource_destroy( 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_screen *)pool->screen, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_resource *)pool->bo); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->bo = (struct r600_resource*)create_pool_texture( 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->screen, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_shadow(pool, pipe, 0); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy pool from device to host, or host to device. 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_shadow(struct compute_memory_pool* pool, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context * pipe, int device_to_host) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item chunk; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_shadow() device_to_host = %d\n", 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org device_to_host); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chunk.id = 0; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chunk.start_in_dw = 0; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chunk.size_in_dw = pool->size_in_dw; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chunk.prev = chunk.next = NULL; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_transfer(pool, pipe, device_to_host, &chunk, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->shadow, 0, pool->size_in_dw*4); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocates pending allocations in the pool 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_finalize_pending(struct compute_memory_pool* pool, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context * pipe) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *pending_list = NULL, *end_p = NULL; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *item, *next; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t allocated = 0; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t unallocated = 0; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_finalize_pending()\n"); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pool->item_list; item; item = item->next) { 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("list: %i %p\n", item->start_in_dw, item->next); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pool->item_list; item; item = next) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = item->next; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->start_in_dw == -1) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (end_p) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org end_p->next = item; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pending_list = item; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->prev) { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->prev->next = next; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->item_list = next; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (next) { 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next->prev = item->prev; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->prev = end_p; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->next = NULL; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org end_p = item; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unallocated += item->size_in_dw+1024; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org allocated += item->size_in_dw; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pool->size_in_dw < allocated+unallocated) { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_grow_pool(pool, pipe, allocated+unallocated); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pending_list; item; item = next) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = item->next; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t start_in_dw; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((start_in_dw=compute_memory_prealloc_chunk(pool, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->size_in_dw)) == -1) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t need = item->size_in_dw+2048 - 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (pool->size_in_dw - allocated); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need += 1024 - (need % 1024); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (need > 0) { 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_grow_pool(pool, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw + need); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need = pool->size_in_dw / 10; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need += 1024 - (need % 1024); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_memory_grow_pool(pool, 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->size_in_dw + need); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->start_in_dw = start_in_dw; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->next = NULL; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->prev = NULL; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pool->item_list) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *pos; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos = compute_memory_postalloc_chunk(pool, start_in_dw); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->prev = pos; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->next = pos->next; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos->next = item; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->next) { 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->next->prev = item; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->item_list = item; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org allocated += item->size_in_dw; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_free(struct compute_memory_pool* pool, int64_t id) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *item, *next; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_free() id + %ld \n", id); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (item = pool->item_list; item; item = next) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = item->next; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->id == id) { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->prev) { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->prev->next = item->next; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->item_list = item->next; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (item->next) { 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org item->next->prev = item->prev; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(item); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "Internal error, invalid id %ld " 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "for compute_memory_free\n", id); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "error"); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Creates pending allocations 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct compute_memory_item* compute_memory_alloc( 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool, 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t size_in_dw) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *new_item; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_alloc() size_in_dw = %ld\n", size_in_dw); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item = (struct compute_memory_item *) 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALLOC(sizeof(struct compute_memory_item), 1); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item->size_in_dw = size_in_dw; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item->start_in_dw = -1; /* mark pending */ 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item->id = pool->next_id++; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item->pool = pool; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item *last_item; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pool->item_list) { 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (last_item = pool->item_list; last_item->next; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org last_item = last_item->next); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org last_item->next = new_item; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_item->prev = last_item; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pool->item_list = new_item; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return new_item; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Transfer data host<->device, offset and size is in bytes 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_transfer( 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context * pipe, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int device_to_host, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item* chunk, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* data, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset_in_chunk, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int size) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t aligned_size = pool->size_in_dw; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* gart = (struct pipe_resource*)pool->bo; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t internal_offset = chunk->start_in_dw*4 + offset_in_chunk; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *xfer; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *map; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(gart); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COMPUTE_DBG("* compute_memory_transfer() device_to_host = %d, " 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "offset_in_chunk = %d, size = %d\n", device_to_host, 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_in_chunk, size); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (device_to_host) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xfer = pipe->get_transfer(pipe, gart, 0, PIPE_TRANSFER_READ, 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &(struct pipe_box) { .width = aligned_size, 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .height = 1, .depth = 1 }); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(xfer); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe->transfer_map(pipe, xfer); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(map); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(data, map + internal_offset, size); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, xfer); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, xfer); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xfer = pipe->get_transfer(pipe, gart, 0, PIPE_TRANSFER_WRITE, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &(struct pipe_box) { .width = aligned_size, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .height = 1, .depth = 1 }); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(xfer); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe->transfer_map(pipe, xfer); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(map); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(map + internal_offset, data, size); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, xfer); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, xfer); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Transfer data between chunk<->data, it is for VRAM<->GART transfers 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid compute_memory_transfer_direct( 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_pool* pool, 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int chunk_to_data, 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct compute_memory_item* chunk, 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_resource* data, 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset_in_chunk, 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset_in_data, 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int size) 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ///TODO: DMA 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 481