13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2011 Adam Rak <adam.rak@streamnovation.com>
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * copy of this software and associated documentation files (the "Software"),
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * to deal in the Software without restriction, including without limitation
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * on the rights to use, copy, modify, merge, publish, distribute, sub
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * license, and/or sell copies of the Software, and to permit persons to whom
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * the Software is furnished to do so, subject to the following conditions:
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice (including the next
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * paragraph) shall be included in all copies or substantial portions of the
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * USE OR OTHER DEALINGS IN THE SOFTWARE.
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Authors:
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Adam Rak <adam.rak@streamnovation.com>
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <stdio.h>
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <errno.h>
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_state.h"
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_context.h"
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_blitter.h"
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_double_list.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_transfer.h"
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_surface.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_pack_color.h"
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
38d432f462c28b60e1b1a2bcb4e17bbda0ea316d2aBrian Paul#include "util/u_inlines.h"
3958ea42b7db72586563914dea6fed9656caaf7678Brian Paul#include "util/u_framebuffer.h"
40e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca#include "pipebuffer/pb_buffer.h"
41e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca#include "r600.h"
42d432f462c28b60e1b1a2bcb4e17bbda0ea316d2aBrian Paul#include "evergreend.h"
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "r600_resource.h"
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "r600_shader.h"
45022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul#include "r600_pipe.h"
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "r600_formats.h"
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "evergreen_compute.h"
48cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "r600_hw_context_priv.h"
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "evergreen_compute_internal.h"
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "compute_memory_pool.h"
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifdef HAVE_OPENCL
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "llvm_wrapper.h"
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
563192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzRAT0 is for global binding write
573192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzVTX1 is for global binding read
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfor wrting images RAT1...
60f21669e9a2f07502e3c4b0633adcfab397fb0760Brian Paulfor reading images TEX2...
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz  TEX2-RAT1 is paired
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
633192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzTEX2... consumes the same fetch resources, that VTX2... would consume
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
653192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzCONST0 and VTX0 is for parameters
6658ea42b7db72586563914dea6fed9656caaf7678Brian Paul  CONST0 is binding smaller input parameter buffer, and for constant indexing,
67022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul  also constant cached
68022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul  VTX0 is for indirect/non-constant indexing, or if the input is bigger than
6958ea42b7db72586563914dea6fed9656caaf7678Brian Paul  the constant cache can handle
7058ea42b7db72586563914dea6fed9656caaf7678Brian Paul
7158ea42b7db72586563914dea6fed9656caaf7678Brian PaulRAT-s are limited to 12, so we can only bind at most 11 texture for writing
7258ea42b7db72586563914dea6fed9656caaf7678Brian Paulbecause we reserve RAT0 for global bindings. With byteaddressing enabled,
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzwe should reserve another one too.=> 10 image binding for writing max.
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfrom Nvidia OpenCL:
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz  CL_DEVICE_MAX_READ_IMAGE_ARGS:        128
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz  CL_DEVICE_MAX_WRITE_IMAGE_ARGS:       8
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzso 10 for writing is enough. 176 is the max for reading according to the docs
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzwritable images should be listed first < 10, so their id corresponds to RAT(id+1)
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzwritable images will consume TEX slots, VTX slots too because of linear indexing
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz*/
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void evergreen_cs_set_vertex_buffer(
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context * rctx,
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned vb_index,
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned offset,
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct pipe_resource * buffer)
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_vertexbuf_state *state = &rctx->cs_vertex_buffer_state;
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct pipe_vertex_buffer *vb = &state->vb[vb_index];
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	vb->stride = 1;
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	vb->buffer_offset = offset;
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	vb->buffer = buffer;
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	vb->user_buffer = NULL;
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_inval_vertex_cache(rctx);
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	state->enabled_mask |= 1 << vb_index;
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	state->dirty_mask |= 1 << vb_index;
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_atom_dirty(rctx, &state->atom);
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzconst struct u_resource_vtbl r600_global_buffer_vtbl =
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	u_default_resource_get_handle, /* get_handle */
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_buffer_destroy, /* resource_destroy */
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_get_transfer, /* get_transfer */
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_transfer_destroy, /* transfer_destroy */
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_transfer_map, /* transfer_map */
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_transfer_flush_region,/* transfer_flush_region */
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_transfer_unmap, /* transfer_unmap */
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_global_transfer_inline_write /* transfer_inline_write */
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid *evergreen_create_compute_state(
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct pipe_context *ctx_,
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	const const struct pipe_compute_state *cso)
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context *ctx = (struct r600_context *)ctx_;
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute);
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	void *p;
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifdef HAVE_OPENCL
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	const struct pipe_llvm_program_header * header;
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	const unsigned char * code;
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("*** evergreen_create_compute_state\n");
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	header = cso->prog;
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	code = cso->prog + sizeof(struct pipe_llvm_program_header);
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->ctx = (struct r600_context*)ctx;
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->resources = (struct evergreen_compute_resource*)
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			CALLOC(sizeof(struct evergreen_compute_resource),
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			get_compute_resource_num());
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->local_size = cso->req_local_mem; ///TODO: assert it
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->private_size = cso->req_private_mem;
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->input_size = cso->req_input_mem;
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifdef HAVE_OPENCL
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->mod = llvm_parse_bitcode(code, header->num_bytes);
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_compute_shader_create(ctx_, shader->mod, &shader->bc);
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	shader->shader_code_bo = r600_compute_buffer_alloc_vram(ctx->screen,
1502f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul							shader->bc.ndw * 4);
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	p = ctx->ws->buffer_map(shader->shader_code_bo->cs_buf, ctx->cs,
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz							PIPE_TRANSFER_WRITE);
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4);
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->ws->buffer_unmap(shader->shader_code_bo->cs_buf);
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	return shader;
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
159c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz
160f7d84c177fe58e767a58748b33794ecea507ac8cBrian Paulvoid evergreen_delete_compute_state(struct pipe_context *ctx, void* state)
161f7d84c177fe58e767a58748b33794ecea507ac8cBrian Paul{
162f7d84c177fe58e767a58748b33794ecea507ac8cBrian Paul	struct r600_pipe_compute *shader = (struct r600_pipe_compute *)state;
163f7d84c177fe58e767a58748b33794ecea507ac8cBrian Paul
164c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz	free(shader->resources);
165c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz	free(shader);
166c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz}
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void evergreen_bind_compute_state(struct pipe_context *ctx_, void *state)
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context *ctx = (struct r600_context *)ctx_;
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("*** evergreen_bind_compute_state\n");
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->cs_shader_state.shader = (struct r600_pipe_compute *)state;
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* The kernel parameters are stored a vtx buffer (ID=0), besides the explicit
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * kernel parameters there are inplicit parameters that need to be stored
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * in the vertex buffer as well.  Here is how these parameters are organized in
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * the buffer:
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * DWORDS 0-2: Number of work groups in each dimension (x,y,z)
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * DWORDS 3-5: Number of global work items in each dimension (x,y,z)
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * DWORDS 6-8: Number of work items within each work group in each dimension
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *             (x,y,z)
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * DWORDS 9+ : Kernel parameters
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
188b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheideggervoid evergreen_compute_upload_input(
189b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger	struct pipe_context *ctx_,
190e8983f70b41ea92a9527cb618db011b5dd136626Roland Scheidegger	const uint *block_layout,
191b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger	const uint *grid_layout,
192b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger	const void *input)
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context *ctx = (struct r600_context *)ctx_;
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_pipe_compute *shader = ctx->cs_shader_state.shader;
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	int i;
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned kernel_parameters_offset_bytes = 36;
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	uint32_t * num_work_groups_start;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	uint32_t * global_size_start;
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	uint32_t * local_size_start;
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	uint32_t * kernel_parameters_start;
202b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	if (shader->input_size == 0) {
204f6106566081978f663cf08e54bb8908cb58a5316Michal Krol		return;
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	if (!shader->kernel_param) {
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		unsigned buffer_size = shader->input_size;
2096d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
210287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		/* Add space for the grid dimensions */
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		buffer_size += kernel_parameters_offset_bytes * sizeof(uint);
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		shader->kernel_param = r600_compute_buffer_alloc_vram(
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz						ctx->screen, buffer_size);
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
215b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell
216b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell	num_work_groups_start = ctx->ws->buffer_map(
217b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell		shader->kernel_param->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
218b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell	global_size_start = num_work_groups_start + (3 * (sizeof(uint) /4));
219b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell	local_size_start = global_size_start + (3 * (sizeof(uint)) / 4);
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	kernel_parameters_start = local_size_start + (3 * (sizeof(uint)) / 4);
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Copy the work group size */
2239381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger	memcpy(num_work_groups_start, grid_layout, 3 * sizeof(uint));
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Copy the global size */
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < 3; i++) {
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		global_size_start[i] = grid_layout[i] * block_layout[i];
228f6106566081978f663cf08e54bb8908cb58a5316Michal Krol	}
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Copy the local dimensions */
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	memcpy(local_size_start, block_layout, 3 * sizeof(uint));
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Copy the kernel inputs */
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	memcpy(kernel_parameters_start, input, shader->input_size);
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < (kernel_parameters_offset_bytes / 4) +
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					(shader->input_size / 4); i++) {
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		COMPUTE_DBG("input %i : %i\n", i,
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			((unsigned*)num_work_groups_start)[i]);
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->ws->buffer_unmap(shader->kernel_param->cs_buf);
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	///ID=0 is reserved for the parameters
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	evergreen_cs_set_vertex_buffer(ctx, 0, 0,
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			(struct pipe_resource*)shader->kernel_param);
24764762af008ec9333c7f3561ea3c930d407c911c7Brian Paul	///ID=0 is reserved for parameters
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	evergreen_set_const_cache(shader, 0, shader->kernel_param,
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz						shader->input_size, 0);
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void evergreen_emit_direct_dispatch(
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		struct r600_context *rctx,
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		const uint *block_layout, const uint *grid_layout)
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	int i;
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct radeon_winsys_cs *cs = rctx->cs;
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned num_waves;
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned num_pipes = rctx->screen->info.r600_max_pipes;
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned wave_divisor = (16 * num_pipes);
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	int group_size = 1;
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	int grid_size = 1;
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* XXX: Enable lds and get size from cs_shader_state */
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	unsigned lds_size = 0;
265287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Calculate group_size/grid_size */
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < 3; i++) {
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		group_size *= block_layout[i];
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < 3; i++)	{
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		grid_size *= grid_layout[i];
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* num_waves = ceil((tg_size.x * tg_size.y, tg_size.z) / (16 * num_pipes)) */
276e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca	num_waves = (block_layout[0] * block_layout[1] * block_layout[2] +
277e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca			wave_divisor - 1) / wave_divisor;
278e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("Using %u pipes, there are %u wavefronts per thread block\n",
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz							num_pipes, num_waves);
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* XXX: Partition the LDS between PS/CS.  By default half (4096 dwords
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * on Evergreen) oes to Pixel Shaders and half goes to Compute Shaders.
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * We may need to allocat the entire LDS space for Compute Shaders.
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 *
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * EG: R_008E2C_SQ_LDS_RESOURCE_MGMT := S_008E2C_NUM_LS_LDS(lds_dwords)
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * CM: CM_R_0286FC_SPI_LDS_MGMT :=  S_0286FC_NUM_LS_LDS(lds_dwords)
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 */
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_config_reg(cs, R_008970_VGT_NUM_INDICES, group_size);
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_config_reg_seq(cs, R_00899C_VGT_COMPUTE_START_X, 3);
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, 0); /* R_00899C_VGT_COMPUTE_START_X */
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, 0); /* R_0089A0_VGT_COMPUTE_START_Y */
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, 0); /* R_0089A4_VGT_COMPUTE_START_Z */
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_config_reg(cs, R_0089AC_VGT_COMPUTE_THREAD_GROUP_SIZE,
298ff0f0875135a7842e78fae002ee1187892f9405bJakob Bornecrantz								group_size);
299ff0f0875135a7842e78fae002ee1187892f9405bJakob Bornecrantz
300ff0f0875135a7842e78fae002ee1187892f9405bJakob Bornecrantz	r600_write_compute_context_reg_seq(cs, R_0286EC_SPI_COMPUTE_NUM_THREAD_X, 3);
301ff0f0875135a7842e78fae002ee1187892f9405bJakob Bornecrantz	r600_write_value(cs, block_layout[0]); /* R_0286EC_SPI_COMPUTE_NUM_THREAD_X */
302ff0f0875135a7842e78fae002ee1187892f9405bJakob Bornecrantz	r600_write_value(cs, block_layout[1]); /* R_0286F0_SPI_COMPUTE_NUM_THREAD_Y */
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, block_layout[2]); /* R_0286F4_SPI_COMPUTE_NUM_THREAD_Z */
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_compute_context_reg(cs, CM_R_0288E8_SQ_LDS_ALLOC,
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					lds_size | (num_waves << 14));
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Dispatch packet */
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, PKT3C(PKT3_DISPATCH_DIRECT, 3, 0));
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, grid_layout[0]);
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, grid_layout[1]);
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, grid_layout[2]);
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* VGT_DISPATCH_INITIATOR = COMPUTE_SHADER_EN */
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, 1);
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void compute_emit_cs(struct r600_context *ctx, const uint *block_layout,
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		const uint *grid_layout)
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct radeon_winsys_cs *cs = ctx->cs;
3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	int i;
3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_resource *onebo = NULL;
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_pipe_state *cb_state;
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct evergreen_compute_resource *resources =
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					ctx->cs_shader_state.shader->resources;
327c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz
328c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz	/* Initialize all the compute-related registers.
329c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz	 *
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * See evergreen_init_atom_start_compute_cs() in this file for the list
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * of registers initialized by the start_compute_cs_cmd atom.
3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 */
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_emit_atom(ctx, &ctx->start_compute_cs_cmd.atom);
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Emit cb_state */
3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz        cb_state = ctx->states[R600_PIPE_STATE_FRAMEBUFFER];
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_context_pipe_state_emit(ctx, cb_state, RADEON_CP_PACKET3_COMPUTE_MODE);
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Set CB_TARGET_MASK  XXX: Use cb_misc_state */
340cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca	r600_write_compute_context_reg(cs, R_028238_CB_TARGET_MASK,
341cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca					ctx->compute_cb_target_mask);
342cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca
343cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Emit vertex buffer state */
345d432f462c28b60e1b1a2bcb4e17bbda0ea316d2aBrian Paul	ctx->cs_vertex_buffer_state.atom.num_dw = 12 * util_bitcount(ctx->cs_vertex_buffer_state.dirty_mask);
3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_emit_atom(ctx, &ctx->cs_vertex_buffer_state.atom);
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Emit compute shader state */
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_emit_atom(ctx, &ctx->cs_shader_state.atom);
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < get_compute_resource_num(); i++) {
3523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		if (resources[i].enabled) {
3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			int j;
3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			COMPUTE_DBG("resnum: %i, cdw: %i\n", i, cs->cdw);
3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			for (j = 0; j < resources[i].cs_end; j++) {
3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				if (resources[i].do_reloc[j]) {
3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					assert(resources[i].bo);
3596b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca					evergreen_emit_ctx_reloc(ctx,
3606b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca						resources[i].bo,
3616b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca						resources[i].usage);
3626b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca				}
3636b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca
3643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				cs->buf[cs->cdw++] = resources[i].cs[j];
3653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			}
3663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			if (resources[i].bo) {
3683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				onebo = resources[i].bo;
3693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				evergreen_emit_ctx_reloc(ctx,
3703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					resources[i].bo,
3713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					resources[i].usage);
3723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				///special case for textures
3743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				if (resources[i].do_reloc
3753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					[resources[i].cs_end] == 2) {
3763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					evergreen_emit_ctx_reloc(ctx,
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz						resources[i].bo,
3783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz						resources[i].usage);
3793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				}
3803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			}
3813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		}
3823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
3833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* Emit dispatch state and dispatch packet */
3853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	evergreen_emit_direct_dispatch(ctx, block_layout, grid_layout);
3863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	/* r600_flush_framebuffer() updates the cb_flush_flags and then
3883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * calls r600_emit_atom() on the ctx->surface_sync_cmd.atom, which emits
3893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * a SURFACE_SYNC packet via r600_emit_surface_sync().
3903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 *
391ba251376556835e84c7edb9b02b3fdefde32908aRoland Scheidegger	 * XXX r600_emit_surface_sync() hardcodes the CP_COHER_SIZE to
3923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * 0xffffffff, so we will need to add a field to struct
3933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 * r600_surface_sync_cmd if we want to manually set this value.
3943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 */
3953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_flush_framebuffer(ctx, true /* Flush now */);
3963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#if 0
3983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("cdw: %i\n", cs->cdw);
3993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (i = 0; i < cs->cdw; i++) {
4003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		COMPUTE_DBG("%4i : 0x%08X\n", i, ctx->cs->buf[i]);
4013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	}
402429f0e3b37e33a33289f8488369474b20bfd5247Roland Scheidegger#endif
4039381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger
4043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->ws->cs_flush(ctx->cs, RADEON_FLUSH_ASYNC | RADEON_FLUSH_COMPUTE);
4053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->pm4_dirty_cdwords = 0;
4073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->flags = 0;
4083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("shader started\n");
4103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->ws->buffer_wait(onebo->buf, 0);
4123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("...\n");
4146dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie
4153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->streamout_start = TRUE;
4163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	ctx->streamout_append_bitmask = ~0;
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
4223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Emit function for r600_cs_shader_state atom
4233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
4243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid evergreen_emit_cs_shader(
4253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		struct r600_context *rctx,
4263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		struct r600_atom *atom)
4273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_cs_shader_state *state =
4293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz					(struct r600_cs_shader_state*)atom;
4303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_pipe_compute *shader = state->shader;
4313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct radeon_winsys_cs *cs = rctx->cs;
4323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	uint64_t va;
4333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	va = r600_resource_va(&rctx->screen->screen, &shader->shader_code_bo->b.b);
4353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_compute_context_reg_seq(cs, R_0288D0_SQ_PGM_START_LS, 3);
4373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, va >> 8); /* R_0288D0_SQ_PGM_START_LS */
4383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs,           /* R_0288D4_SQ_PGM_RESOURCES_LS */
4393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			S_0288D4_NUM_GPRS(shader->bc.ngpr)
4403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			| S_0288D4_STACK_SIZE(shader->bc.nstack));
4413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, 0);	/* R_0288D8_SQ_PGM_RESOURCES_LS_2 */
4423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	r600_write_value(cs, PKT3C(PKT3_NOP, 0, 0));
4443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_write_value(cs, r600_context_bo_reloc(rctx, shader->shader_code_bo,
4453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz							RADEON_USAGE_READ));
4463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	r600_inval_shader_cache(rctx);
4483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void evergreen_launch_grid(
4513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		struct pipe_context *ctx_,
4523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		const uint *block_layout, const uint *grid_layout,
4531e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca		uint32_t pc, const void *input)
4541e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca{
4553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context *ctx = (struct r600_context *)ctx_;
4560ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca
4570ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca	COMPUTE_DBG("PC: %i\n", pc);
4587f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
4597f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell	evergreen_compute_upload_input(ctx_, block_layout, grid_layout, input);
4607f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell	compute_emit_cs(ctx, block_layout, grid_layout);
4617f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell}
4623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void evergreen_set_compute_resources(struct pipe_context * ctx_,
4643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		unsigned start, unsigned count,
4653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		struct pipe_surface ** surfaces)
4663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_context *ctx = (struct r600_context *)ctx_;
4683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	struct r600_surface **resources = (struct r600_surface **)surfaces;
4693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	COMPUTE_DBG("*** evergreen_set_compute_resources: start = %u count = %u\n",
4713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			start, count);
4723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	for (int i = 0; i < count; i++)	{
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		/* The First two vertex buffers are reserved for parameters and
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		 * global buffers. */
476		unsigned vtx_id = 2 + i;
477		if (resources[i]) {
478			struct r600_resource_global *buffer =
479				(struct r600_resource_global*)
480				resources[i]->base.texture;
481			if (resources[i]->base.writable) {
482				assert(i+1 < 12);
483
484				evergreen_set_rat(ctx->cs_shader_state.shader, i+1,
485				(struct r600_resource *)resources[i]->base.texture,
486				buffer->chunk->start_in_dw*4,
487				resources[i]->base.texture->width0);
488			}
489
490			evergreen_cs_set_vertex_buffer(ctx, vtx_id,
491					buffer->chunk->start_in_dw * 4,
492					resources[i]->base.texture);
493		}
494	}
495}
496
497static void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
498		unsigned start_slot, unsigned count,
499		struct pipe_sampler_view **views)
500{
501	struct r600_context *ctx = (struct r600_context *)ctx_;
502	struct r600_pipe_sampler_view **resource =
503		(struct r600_pipe_sampler_view **)views;
504
505	for (int i = 0; i < count; i++)	{
506		if (resource[i]) {
507			assert(i+1 < 12);
508			///FETCH0 = VTX0 (param buffer),
509			//FETCH1 = VTX1 (global buffer pool), FETCH2... = TEX
510			evergreen_set_tex_resource(ctx->cs_shader_state.shader, resource[i], i+2);
511		}
512	}
513}
514
515static void evergreen_bind_compute_sampler_states(
516	struct pipe_context *ctx_,
517	unsigned start_slot,
518	unsigned num_samplers,
519	void **samplers_)
520{
521	struct r600_context *ctx = (struct r600_context *)ctx_;
522	struct compute_sampler_state ** samplers =
523		(struct compute_sampler_state **)samplers_;
524
525	for (int i = 0; i < num_samplers; i++) {
526		if (samplers[i]) {
527			evergreen_set_sampler_resource(
528				ctx->cs_shader_state.shader, samplers[i], i);
529		}
530	}
531}
532
533static void evergreen_set_global_binding(
534	struct pipe_context *ctx_, unsigned first, unsigned n,
535	struct pipe_resource **resources,
536	uint32_t **handles)
537{
538	struct r600_context *ctx = (struct r600_context *)ctx_;
539	struct compute_memory_pool *pool = ctx->screen->global_pool;
540	struct r600_resource_global **buffers =
541		(struct r600_resource_global **)resources;
542
543	COMPUTE_DBG("*** evergreen_set_global_binding first = %u n = %u\n",
544			first, n);
545
546	if (!resources) {
547		/* XXX: Unset */
548		return;
549	}
550
551	compute_memory_finalize_pending(pool, ctx_);
552
553	for (int i = 0; i < n; i++)
554	{
555		assert(resources[i]->target == PIPE_BUFFER);
556		assert(resources[i]->bind & PIPE_BIND_GLOBAL);
557
558		*(handles[i]) = buffers[i]->chunk->start_in_dw * 4;
559	}
560
561	evergreen_set_rat(ctx->cs_shader_state.shader, 0, pool->bo, 0, pool->size_in_dw * 4);
562	evergreen_cs_set_vertex_buffer(ctx, 1, 0,
563				(struct pipe_resource*)pool->bo);
564}
565
566/**
567 * This function initializes all the compute specific registers that need to
568 * be initialized for each compute command stream.  Registers that are common
569 * to both compute and 3D will be initialized at the beginning of each compute
570 * command stream by the start_cs_cmd atom.  However, since the SET_CONTEXT_REG
571 * packet requires that the shader type bit be set, we must initialize all
572 * context registers needed for compute in this function.  The registers
573 * intialized by the start_cs_cmd atom can be found in evereen_state.c in the
574 * functions evergreen_init_atom_start_cs or cayman_init_atom_start_cs depending
575 * on the GPU family.
576 */
577void evergreen_init_atom_start_compute_cs(struct r600_context *ctx)
578{
579	struct r600_command_buffer *cb = &ctx->start_compute_cs_cmd;
580	int num_threads;
581	int num_stack_entries;
582
583	/* since all required registers are initialised in the
584	 * start_compute_cs_cmd atom, we can EMIT_EARLY here.
585	 */
586	r600_init_command_buffer(cb, 256, EMIT_EARLY);
587	cb->pkt_flags = RADEON_CP_PACKET3_COMPUTE_MODE;
588
589	switch (ctx->family) {
590	case CHIP_CEDAR:
591	default:
592		num_threads = 128;
593		num_stack_entries = 256;
594		break;
595	case CHIP_REDWOOD:
596		num_threads = 128;
597		num_stack_entries = 256;
598		break;
599	case CHIP_JUNIPER:
600		num_threads = 128;
601		num_stack_entries = 512;
602		break;
603	case CHIP_CYPRESS:
604	case CHIP_HEMLOCK:
605		num_threads = 128;
606		num_stack_entries = 512;
607		break;
608	case CHIP_PALM:
609		num_threads = 128;
610		num_stack_entries = 256;
611		break;
612	case CHIP_SUMO:
613		num_threads = 128;
614		num_stack_entries = 256;
615		break;
616	case CHIP_SUMO2:
617		num_threads = 128;
618		num_stack_entries = 512;
619		break;
620	case CHIP_BARTS:
621		num_threads = 128;
622		num_stack_entries = 512;
623		break;
624	case CHIP_TURKS:
625		num_threads = 128;
626		num_stack_entries = 256;
627		break;
628	case CHIP_CAICOS:
629		num_threads = 128;
630		num_stack_entries = 256;
631		break;
632	}
633
634	/* Config Registers */
635	evergreen_init_common_regs(cb, ctx->chip_class
636			, ctx->family, ctx->screen->info.drm_minor);
637
638	/* The primitive type always needs to be POINTLIST for compute. */
639	r600_store_config_reg(cb, R_008958_VGT_PRIMITIVE_TYPE,
640						V_008958_DI_PT_POINTLIST);
641
642	if (ctx->chip_class < CAYMAN) {
643
644		/* These registers control which simds can be used by each stage.
645		 * The default for these registers is 0xffffffff, which means
646		 * all simds are available for each stage.  It's possible we may
647		 * want to play around with these in the future, but for now
648		 * the default value is fine.
649		 *
650		 * R_008E20_SQ_STATIC_THREAD_MGMT1
651		 * R_008E24_SQ_STATIC_THREAD_MGMT2
652		 * R_008E28_SQ_STATIC_THREAD_MGMT3
653		 */
654
655		/* XXX: We may need to adjust the thread and stack resouce
656		 * values for 3D/compute interop */
657
658		r600_store_config_reg_seq(cb, R_008C18_SQ_THREAD_RESOURCE_MGMT_1, 5);
659
660		/* R_008C18_SQ_THREAD_RESOURCE_MGMT_1
661		 * Set the number of threads used by the PS/VS/GS/ES stage to
662		 * 0.
663		 */
664		r600_store_value(cb, 0);
665
666		/* R_008C1C_SQ_THREAD_RESOURCE_MGMT_2
667		 * Set the number of threads used by the CS (aka LS) stage to
668		 * the maximum number of threads and set the number of threads
669		 * for the HS stage to 0. */
670		r600_store_value(cb, S_008C1C_NUM_LS_THREADS(num_threads));
671
672		/* R_008C20_SQ_STACK_RESOURCE_MGMT_1
673		 * Set the Control Flow stack entries to 0 for PS/VS stages */
674		r600_store_value(cb, 0);
675
676		/* R_008C24_SQ_STACK_RESOURCE_MGMT_2
677		 * Set the Control Flow stack entries to 0 for GS/ES stages */
678		r600_store_value(cb, 0);
679
680		/* R_008C28_SQ_STACK_RESOURCE_MGMT_3
681		 * Set the Contol Flow stack entries to 0 for the HS stage, and
682		 * set it to the maximum value for the CS (aka LS) stage. */
683		r600_store_value(cb,
684			S_008C28_NUM_LS_STACK_ENTRIES(num_stack_entries));
685	}
686
687	/* Context Registers */
688
689	if (ctx->chip_class < CAYMAN) {
690		/* workaround for hw issues with dyn gpr - must set all limits
691		 * to 240 instead of 0, 0x1e == 240 / 8
692		 */
693		r600_store_context_reg(cb, R_028838_SQ_DYN_GPR_RESOURCE_LIMIT_1,
694				S_028838_PS_GPRS(0x1e) |
695				S_028838_VS_GPRS(0x1e) |
696				S_028838_GS_GPRS(0x1e) |
697				S_028838_ES_GPRS(0x1e) |
698				S_028838_HS_GPRS(0x1e) |
699				S_028838_LS_GPRS(0x1e));
700	}
701
702	/* XXX: Investigate setting bit 15, which is FAST_COMPUTE_MODE */
703	r600_store_context_reg(cb, R_028A40_VGT_GS_MODE,
704		S_028A40_COMPUTE_MODE(1) | S_028A40_PARTIAL_THD_AT_EOI(1));
705
706	r600_store_context_reg(cb, R_028B54_VGT_SHADER_STAGES_EN, 2/*CS_ON*/);
707
708	r600_store_context_reg(cb, R_0286E8_SPI_COMPUTE_INPUT_CNTL,
709						S_0286E8_TID_IN_GROUP_ENA
710						| S_0286E8_TGID_ENA
711						| S_0286E8_DISABLE_INDEX_PACK)
712						;
713
714	/* The LOOP_CONST registers are an optimizations for loops that allows
715	 * you to store the initial counter, increment value, and maximum
716	 * counter value in a register so that hardware can calculate the
717	 * correct number of iterations for the loop, so that you don't need
718	 * to have the loop counter in your shader code.  We don't currently use
719	 * this optimization, so we must keep track of the counter in the
720	 * shader and use a break instruction to exit loops.  However, the
721	 * hardware will still uses this register to determine when to exit a
722	 * loop, so we need to initialize the counter to 0, set the increment
723	 * value to 1 and the maximum counter value to the 4095 (0xfff) which
724	 * is the maximum value allowed.  This gives us a maximum of 4096
725	 * iterations for our loops, but hopefully our break instruction will
726	 * execute before some time before the 4096th iteration.
727	 */
728	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0 + (160 * 4), 0x1000FFF);
729}
730
731void evergreen_init_compute_state_functions(struct r600_context *ctx)
732{
733	ctx->context.create_compute_state = evergreen_create_compute_state;
734	ctx->context.delete_compute_state = evergreen_delete_compute_state;
735	ctx->context.bind_compute_state = evergreen_bind_compute_state;
736//	 ctx->context.create_sampler_view = evergreen_compute_create_sampler_view;
737	ctx->context.set_compute_resources = evergreen_set_compute_resources;
738	ctx->context.set_compute_sampler_views = evergreen_set_cs_sampler_view;
739	ctx->context.bind_compute_sampler_states = evergreen_bind_compute_sampler_states;
740	ctx->context.set_global_binding = evergreen_set_global_binding;
741	ctx->context.launch_grid = evergreen_launch_grid;
742
743	/* We always use at least two vertex buffers for compute, one for
744         * parameters and one for global memory */
745	ctx->cs_vertex_buffer_state.enabled_mask =
746	ctx->cs_vertex_buffer_state.dirty_mask = 1 | 2;
747}
748
749
750struct pipe_resource *r600_compute_global_buffer_create(
751	struct pipe_screen *screen,
752	const struct pipe_resource *templ)
753{
754	assert(templ->target == PIPE_BUFFER);
755	assert(templ->bind & PIPE_BIND_GLOBAL);
756	assert(templ->array_size == 1 || templ->array_size == 0);
757	assert(templ->depth0 == 1 || templ->depth0 == 0);
758	assert(templ->height0 == 1 || templ->height0 == 0);
759
760	struct r600_resource_global* result = (struct r600_resource_global*)
761		CALLOC(sizeof(struct r600_resource_global), 1);
762	struct r600_screen* rscreen = (struct r600_screen*)screen;
763
764	COMPUTE_DBG("*** r600_compute_global_buffer_create\n");
765	COMPUTE_DBG("width = %u array_size = %u\n", templ->width0,
766			templ->array_size);
767
768	result->base.b.vtbl = &r600_global_buffer_vtbl;
769	result->base.b.b.screen = screen;
770	result->base.b.b = *templ;
771	pipe_reference_init(&result->base.b.b.reference, 1);
772
773	int size_in_dw = (templ->width0+3) / 4;
774
775	result->chunk = compute_memory_alloc(rscreen->global_pool, size_in_dw);
776
777	if (result->chunk == NULL)
778	{
779		free(result);
780		return NULL;
781	}
782
783	return &result->base.b.b;
784}
785
786void r600_compute_global_buffer_destroy(
787	struct pipe_screen *screen,
788	struct pipe_resource *res)
789{
790	assert(res->target == PIPE_BUFFER);
791	assert(res->bind & PIPE_BIND_GLOBAL);
792
793	struct r600_resource_global* buffer = (struct r600_resource_global*)res;
794	struct r600_screen* rscreen = (struct r600_screen*)screen;
795
796	compute_memory_free(rscreen->global_pool, buffer->chunk->id);
797
798	buffer->chunk = NULL;
799	free(res);
800}
801
802void* r600_compute_global_transfer_map(
803	struct pipe_context *ctx_,
804	struct pipe_transfer* transfer)
805{
806	assert(transfer->resource->target == PIPE_BUFFER);
807	assert(transfer->resource->bind & PIPE_BIND_GLOBAL);
808	assert(transfer->box.x >= 0);
809	assert(transfer->box.y == 0);
810	assert(transfer->box.z == 0);
811
812	struct r600_context *ctx = (struct r600_context *)ctx_;
813	struct r600_resource_global* buffer =
814		(struct r600_resource_global*)transfer->resource;
815
816	uint32_t* map;
817	///TODO: do it better, mapping is not possible if the pool is too big
818
819	if (!(map = ctx->ws->buffer_map(buffer->chunk->pool->bo->cs_buf,
820						ctx->cs, transfer->usage))) {
821		return NULL;
822	}
823
824	COMPUTE_DBG("buffer start: %lli\n", buffer->chunk->start_in_dw);
825	return ((char*)(map + buffer->chunk->start_in_dw)) + transfer->box.x;
826}
827
828void r600_compute_global_transfer_unmap(
829	struct pipe_context *ctx_,
830	struct pipe_transfer* transfer)
831{
832	assert(transfer->resource->target == PIPE_BUFFER);
833	assert(transfer->resource->bind & PIPE_BIND_GLOBAL);
834
835	struct r600_context *ctx = (struct r600_context *)ctx_;
836	struct r600_resource_global* buffer =
837		(struct r600_resource_global*)transfer->resource;
838
839	ctx->ws->buffer_unmap(buffer->chunk->pool->bo->cs_buf);
840}
841
842struct pipe_transfer * r600_compute_global_get_transfer(
843	struct pipe_context *ctx_,
844	struct pipe_resource *resource,
845	unsigned level,
846	unsigned usage,
847	const struct pipe_box *box)
848{
849	struct r600_context *ctx = (struct r600_context *)ctx_;
850	struct compute_memory_pool *pool = ctx->screen->global_pool;
851
852	compute_memory_finalize_pending(pool, ctx_);
853
854	assert(resource->target == PIPE_BUFFER);
855	struct r600_context *rctx = (struct r600_context*)ctx_;
856	struct pipe_transfer *transfer = util_slab_alloc(&rctx->pool_transfers);
857
858	transfer->resource = resource;
859	transfer->level = level;
860	transfer->usage = usage;
861	transfer->box = *box;
862	transfer->stride = 0;
863	transfer->layer_stride = 0;
864	transfer->data = NULL;
865
866	/* Note strides are zero, this is ok for buffers, but not for
867	* textures 2d & higher at least.
868	*/
869	return transfer;
870}
871
872void r600_compute_global_transfer_destroy(
873	struct pipe_context *ctx_,
874	struct pipe_transfer *transfer)
875{
876	struct r600_context *rctx = (struct r600_context*)ctx_;
877	util_slab_free(&rctx->pool_transfers, transfer);
878}
879
880void r600_compute_global_transfer_flush_region(
881	struct pipe_context *ctx_,
882	struct pipe_transfer *transfer,
883	const struct pipe_box *box)
884{
885	assert(0 && "TODO");
886}
887
888void r600_compute_global_transfer_inline_write(
889	struct pipe_context *pipe,
890	struct pipe_resource *resource,
891	unsigned level,
892	unsigned usage,
893	const struct pipe_box *box,
894	const void *data,
895	unsigned stride,
896	unsigned layer_stride)
897{
898	assert(0 && "TODO");
899}
900