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