16a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/* 26a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Permission is hereby granted, free of charge, to any person obtaining a 36a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * copy of this software and associated documentation files (the "Software"), 46a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * to deal in the Software without restriction, including without limitation 56a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * on the rights to use, copy, modify, merge, publish, distribute, sub 66a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * license, and/or sell copies of the Software, and to permit persons to whom 76a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * the Software is furnished to do so, subject to the following conditions: 86a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * 96a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * The above copyright notice and this permission notice (including the next 106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * paragraph) shall be included in all copies or substantial portions of the 116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Software. 126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * 136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * USE OR OTHER DEALINGS IN THE SOFTWARE. 206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * 216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Authors: 226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Adam Rak <adam.rak@streamnovation.com> 236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_defines.h" 266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_state.h" 276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_context.h" 286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_blitter.h" 296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_double_list.h" 306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_transfer.h" 316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_surface.h" 326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_pack_color.h" 336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_memory.h" 346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_inlines.h" 356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_framebuffer.h" 366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600.h" 376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_resource.h" 386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_shader.h" 396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_pipe.h" 406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_formats.h" 416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "compute_memory_pool.h" 426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "evergreen_compute_internal.h" 436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 44951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšákstatic struct r600_texture * create_pool_texture(struct r600_screen * screen, 45eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard unsigned size_in_dw) 46eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard{ 47eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 48eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard struct pipe_resource templ; 49951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture * tex; 50eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 519b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard if (size_in_dw == 0) { 529b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard return NULL; 539b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard } 54eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard memset(&templ, 0, sizeof(templ)); 55eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.target = PIPE_TEXTURE_1D; 56da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard templ.format = PIPE_FORMAT_R32_UINT; 57eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.bind = PIPE_BIND_CUSTOM; 58eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.usage = PIPE_USAGE_IMMUTABLE; 59eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.flags = 0; 60eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.width0 = size_in_dw; 61eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.height0 = 1; 62eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.depth0 = 1; 63eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard templ.array_size = 1; 64eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 65951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák tex = (struct r600_texture *)r600_texture_create( 66eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard &screen->screen, &templ); 67eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard /* XXX: Propagate this error */ 68eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard assert(tex && "Out of memory"); 69eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard tex->is_rat = 1; 70eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard return tex; 71eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard} 72eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Creates a new pool 756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 766a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstruct compute_memory_pool* compute_memory_pool_new( 776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct r600_screen * rscreen) 786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool = (struct compute_memory_pool*) 806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak CALLOC(sizeof(struct compute_memory_pool), 1); 816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 82c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard COMPUTE_DBG("* compute_memory_pool_new()\n"); 83c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 84c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard pool->screen = rscreen; 85c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard return pool; 86c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard} 87c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 88c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellardstatic void compute_memory_pool_init(struct compute_memory_pool * pool, 89c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard unsigned initial_size_in_dw) 90c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard{ 91c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 92c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard COMPUTE_DBG("* compute_memory_pool_init() initial_size_in_dw = %ld\n", 93d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard initial_size_in_dw); 94d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 95c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard /* XXX: pool->shadow is used when the buffer needs to be resized, but 96c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard * resizing does not work at the moment. 97c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard * pool->shadow = (uint32_t*)CALLOC(4, pool->size_in_dw); 98c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard */ 996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->next_id = 1; 1006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->size_in_dw = initial_size_in_dw; 101eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard pool->bo = (struct r600_resource*)create_pool_texture(pool->screen, 102eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard pool->size_in_dw); 1036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 1046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 1066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Frees all stuff in the pool and the pool struct itself too 1076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 1086a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_pool_delete(struct compute_memory_pool* pool) 1096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 110d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_pool_delete()\n"); 1116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak free(pool->shadow); 1129b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard if (pool->bo) { 1139b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard pool->screen->screen.resource_destroy((struct pipe_screen *) 1146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->screen, (struct pipe_resource *)pool->bo); 1159b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard } 1166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak free(pool); 1176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 1186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 1206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Searches for an empty space in the pool, return with the pointer to the 1216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * allocatable space in the pool, returns -1 on failure. 1226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 1236a829a1b724ca0d960decee217d260b4de8a5463Adam Rakint64_t compute_memory_prealloc_chunk( 1246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool, 1256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t size_in_dw) 1266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 1276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(size_in_dw <= pool->size_in_dw); 1286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *item; 1306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int last_end = 0; 1326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 133d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_prealloc_chunk() size_in_dw = %ld\n", 134d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard size_in_dw); 135d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 1366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pool->item_list; item; item = item->next) { 1376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->start_in_dw > -1) { 1386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->start_in_dw-last_end > size_in_dw) { 1396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return last_end; 1406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak last_end = item->start_in_dw + item->size_in_dw; 1436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak last_end += (1024 - last_end % 1024); 1446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (pool->size_in_dw - last_end < size_in_dw) { 1486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return -1; 1496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return last_end; 1526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 1536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 1556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Search for the chunk where we can link our new chunk after it. 1566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 1576a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstruct compute_memory_item* compute_memory_postalloc_chunk( 1586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool, 1596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t start_in_dw) 1606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 1616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item* item; 1626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 163d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_postalloc_chunck() start_in_dw = %ld\n", 164d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard start_in_dw); 165d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 1666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pool->item_list; item; item = item->next) { 1676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->next) { 1686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->start_in_dw < start_in_dw 1696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak && item->next->start_in_dw > start_in_dw) { 1706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return item; 1716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 1746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak /* end of chain */ 1756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(item->start_in_dw < start_in_dw); 1766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return item; 1776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(0 && "unreachable"); 1816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return NULL; 1826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 1836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 1856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Reallocates pool, conserves data 1866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 1876a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_grow_pool(struct compute_memory_pool* pool, 1886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_context * pipe, int new_size_in_dw) 1896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 190d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_grow_pool() new_size_in_dw = %d\n", 191d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard new_size_in_dw); 192d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 1936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(new_size_in_dw >= pool->size_in_dw); 1946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 195c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard assert(!pool->bo && "Growing the global memory pool is not yet " 196c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard "supported. You will see this message if you are trying to" 197c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard "use more than 64 kb of memory"); 1986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 199c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard if (!pool->bo) { 200c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard compute_memory_pool_init(pool, 1024 * 16); 201c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard } else { 202c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard /* XXX: Growing memory pools does not work at the moment. I think 203c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard * it is because we are using fragment shaders to copy data to 204c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard * the new texture and some of the compute registers are being 205c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard * included in the 3D command stream. */ 206c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard fprintf(stderr, "Warning: growing the global memory pool to" 207c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard "more than 64 kb is not yet supported\n"); 208c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard new_size_in_dw += 1024 - (new_size_in_dw % 1024); 209c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 210c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard COMPUTE_DBG(" Aligned size = %d\n", new_size_in_dw); 211d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 2129b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard compute_memory_shadow(pool, pipe, 1); 213c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard pool->shadow = (uint32_t*)realloc(pool->shadow, new_size_in_dw*4); 214c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard pool->size_in_dw = new_size_in_dw; 2159b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard pool->screen->screen.resource_destroy( 2169b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard (struct pipe_screen *)pool->screen, 2179b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard (struct pipe_resource *)pool->bo); 2189b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard pool->bo = (struct r600_resource*)create_pool_texture( 2199b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard pool->screen, 220eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard pool->size_in_dw); 2219b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard compute_memory_shadow(pool, pipe, 0); 2229b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard } 2236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 2246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 2266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Copy pool from device to host, or host to device. 2276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 2286a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_shadow(struct compute_memory_pool* pool, 2296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_context * pipe, int device_to_host) 2306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 2316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item chunk; 2326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 233d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_shadow() device_to_host = %d\n", 234d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard device_to_host); 235d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 2366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak chunk.id = 0; 2376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak chunk.start_in_dw = 0; 2386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak chunk.size_in_dw = pool->size_in_dw; 2396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak chunk.prev = chunk.next = NULL; 2406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak compute_memory_transfer(pool, pipe, device_to_host, &chunk, 2416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->shadow, 0, pool->size_in_dw*4); 2426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 2436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 2456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Allocates pending allocations in the pool 2466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 2476a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_finalize_pending(struct compute_memory_pool* pool, 2486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_context * pipe) 2496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 2506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *pending_list = NULL, *end_p = NULL; 2516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *item, *next; 2526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t allocated = 0; 2546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t unallocated = 0; 2556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 256d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_finalize_pending()\n"); 257d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 2586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pool->item_list; item; item = item->next) { 2596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak COMPUTE_DBG("list: %i %p\n", item->start_in_dw, item->next); 2606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pool->item_list; item; item = next) { 2636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak next = item->next; 2646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->start_in_dw == -1) { 2676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (end_p) { 2686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak end_p->next = item; 2696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 2716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pending_list = item; 2726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->prev) { 2756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->prev->next = next; 2766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 2786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->item_list = next; 2796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (next) { 2826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak next->prev = item->prev; 2836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->prev = end_p; 2866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->next = NULL; 2876a829a1b724ca0d960decee217d260b4de8a5463Adam Rak end_p = item; 2886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak unallocated += item->size_in_dw+1024; 2906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 2926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak allocated += item->size_in_dw; 2936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (pool->size_in_dw < allocated+unallocated) { 2976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak compute_memory_grow_pool(pool, pipe, allocated+unallocated); 2986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pending_list; item; item = next) { 3016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak next = item->next; 3026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t start_in_dw; 3046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak while ((start_in_dw=compute_memory_prealloc_chunk(pool, 3066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->size_in_dw)) == -1) { 3076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t need = item->size_in_dw+2048 - 3086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak (pool->size_in_dw - allocated); 3096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak need += 1024 - (need % 1024); 3116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (need > 0) { 3136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak compute_memory_grow_pool(pool, 3146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe, 3156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->size_in_dw + need); 3166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 3186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak need = pool->size_in_dw / 10; 3196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak need += 1024 - (need % 1024); 3206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak compute_memory_grow_pool(pool, 3216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe, 3226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->size_in_dw + need); 3236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->start_in_dw = start_in_dw; 3276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->next = NULL; 3286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->prev = NULL; 3296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (pool->item_list) { 3316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *pos; 3326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pos = compute_memory_postalloc_chunk(pool, start_in_dw); 3346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->prev = pos; 3356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->next = pos->next; 3366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pos->next = item; 3376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->next) { 3396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->next->prev = item; 3406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 3436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->item_list = item; 3446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak allocated += item->size_in_dw; 3476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 3496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3516a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_free(struct compute_memory_pool* pool, int64_t id) 3526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 3536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *item, *next; 3546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 355d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_free() id + %ld \n", id); 356d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 3576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (item = pool->item_list; item; item = next) { 3586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak next = item->next; 3596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->id == id) { 3616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->prev) { 3626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->prev->next = item->next; 3636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 3656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->item_list = item->next; 3666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (item->next) { 3696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak item->next->prev = item->prev; 3706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak free(item); 3736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return; 3756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 3776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak fprintf(stderr, "Internal error, invalid id %ld " 3796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak "for compute_memory_free\n", id); 3806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(0 && "error"); 3826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 3836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 3856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Creates pending allocations 3866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 3876a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstruct compute_memory_item* compute_memory_alloc( 3886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool, 3896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t size_in_dw) 3906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 3916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *new_item; 3926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 393d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_alloc() size_in_dw = %ld\n", size_in_dw); 3946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 3956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item = (struct compute_memory_item *) 3966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak CALLOC(sizeof(struct compute_memory_item), 1); 3976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item->size_in_dw = size_in_dw; 3986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item->start_in_dw = -1; /* mark pending */ 3996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item->id = pool->next_id++; 4006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item->pool = pool; 4016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item *last_item; 4036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (pool->item_list) { 4056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak for (last_item = pool->item_list; last_item->next; 4066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak last_item = last_item->next); 4076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak last_item->next = new_item; 4096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak new_item->prev = last_item; 4106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 4116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak else { 4126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pool->item_list = new_item; 4136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 4146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return new_item; 4166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 4176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 4196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Transfer data host<->device, offset and size is in bytes 4206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 4216a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_transfer( 4226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool, 4236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_context * pipe, 4246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int device_to_host, 4256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item* chunk, 4266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak void* data, 4276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int offset_in_chunk, 4286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int size) 4296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 4306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t aligned_size = pool->size_in_dw; 4316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_resource* gart = (struct pipe_resource*)pool->bo; 4326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int64_t internal_offset = chunk->start_in_dw*4 + offset_in_chunk; 4336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct pipe_transfer *xfer; 4356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak uint32_t *map; 4366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4379b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard assert(gart); 4389b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard 439d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard COMPUTE_DBG("* compute_memory_transfer() device_to_host = %d, " 440d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard "offset_in_chunk = %d, size = %d\n", device_to_host, 441d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard offset_in_chunk, size); 442d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 4436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (device_to_host) 4446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak { 4456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak xfer = pipe->get_transfer(pipe, gart, 0, PIPE_TRANSFER_READ, 4466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak &(struct pipe_box) { .width = aligned_size, 4476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak .height = 1, .depth = 1 }); 4486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(xfer); 4496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak map = pipe->transfer_map(pipe, xfer); 4506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(map); 4516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak memcpy(data, map + internal_offset, size); 4526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe->transfer_unmap(pipe, xfer); 4536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe->transfer_destroy(pipe, xfer); 4546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } else { 4556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak xfer = pipe->get_transfer(pipe, gart, 0, PIPE_TRANSFER_WRITE, 4566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak &(struct pipe_box) { .width = aligned_size, 4576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak .height = 1, .depth = 1 }); 4586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(xfer); 4596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak map = pipe->transfer_map(pipe, xfer); 4606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak assert(map); 4616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak memcpy(map + internal_offset, data, size); 4626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe->transfer_unmap(pipe, xfer); 4636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak pipe->transfer_destroy(pipe, xfer); 4646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 4656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 4666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 4676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/** 4686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Transfer data between chunk<->data, it is for VRAM<->GART transfers 4696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */ 4706a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid compute_memory_transfer_direct( 4716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_pool* pool, 4726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int chunk_to_data, 4736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct compute_memory_item* chunk, 4746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct r600_resource* data, 4756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int offset_in_chunk, 4766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int offset_in_data, 4776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int size) 4786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 4796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak ///TODO: DMA 4806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 481