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