16a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/*
26a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Copyright 2011 Adam Rak <adam.rak@streamnovation.com>
36a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *
46a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Permission is hereby granted, free of charge, to any person obtaining a
56a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * copy of this software and associated documentation files (the "Software"),
66a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * to deal in the Software without restriction, including without limitation
76a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * on the rights to use, copy, modify, merge, publish, distribute, sub
86a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * license, and/or sell copies of the Software, and to permit persons to whom
96a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * the Software is furnished to do so, subject to the following conditions:
106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *
116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * The above copyright notice and this permission notice (including the next
126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * paragraph) shall be included in all copies or substantial portions of the
136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Software.
146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *
156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * USE OR OTHER DEALINGS IN THE SOFTWARE.
226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *
236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * Authors:
246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *      Adam Rak <adam.rak@streamnovation.com>
256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */
266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include <stdio.h>
286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include <errno.h>
296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_defines.h"
306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_state.h"
316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipe/p_context.h"
326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_blitter.h"
336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_double_list.h"
346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_transfer.h"
356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_surface.h"
366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_pack_color.h"
376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_memory.h"
386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_inlines.h"
396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "util/u_framebuffer.h"
406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "pipebuffer/pb_buffer.h"
416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600.h"
426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "evergreend.h"
436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_resource.h"
446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_shader.h"
456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_pipe.h"
466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_formats.h"
476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "evergreen_compute.h"
486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "r600_hw_context_priv.h"
496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "evergreen_compute_internal.h"
506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "compute_memory_pool.h"
516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL
526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "llvm_wrapper.h"
536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif
546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/**
566a829a1b724ca0d960decee217d260b4de8a5463Adam RakRAT0 is for global binding write
576a829a1b724ca0d960decee217d260b4de8a5463Adam RakVTX1 is for global binding read
586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
596a829a1b724ca0d960decee217d260b4de8a5463Adam Rakfor wrting images RAT1...
606a829a1b724ca0d960decee217d260b4de8a5463Adam Rakfor reading images TEX2...
616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  TEX2-RAT1 is paired
626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
636a829a1b724ca0d960decee217d260b4de8a5463Adam RakTEX2... consumes the same fetch resources, that VTX2... would consume
646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
656a829a1b724ca0d960decee217d260b4de8a5463Adam RakCONST0 and VTX0 is for parameters
666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  CONST0 is binding smaller input parameter buffer, and for constant indexing,
676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  also constant cached
686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  VTX0 is for indirect/non-constant indexing, or if the input is bigger than
696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  the constant cache can handle
706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
716a829a1b724ca0d960decee217d260b4de8a5463Adam RakRAT-s are limited to 12, so we can only bind at most 11 texture for writing
726a829a1b724ca0d960decee217d260b4de8a5463Adam Rakbecause we reserve RAT0 for global bindings. With byteaddressing enabled,
736a829a1b724ca0d960decee217d260b4de8a5463Adam Rakwe should reserve another one too.=> 10 image binding for writing max.
746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
756a829a1b724ca0d960decee217d260b4de8a5463Adam Rakfrom Nvidia OpenCL:
766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  CL_DEVICE_MAX_READ_IMAGE_ARGS:        128
776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak  CL_DEVICE_MAX_WRITE_IMAGE_ARGS:       8
786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
796a829a1b724ca0d960decee217d260b4de8a5463Adam Rakso 10 for writing is enough. 176 is the max for reading according to the docs
806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
816a829a1b724ca0d960decee217d260b4de8a5463Adam Rakwritable images should be listed first < 10, so their id corresponds to RAT(id+1)
826a829a1b724ca0d960decee217d260b4de8a5463Adam Rakwritable images will consume TEX slots, VTX slots too because of linear indexing
836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak*/
856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
869b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellardstatic void evergreen_cs_set_vertex_buffer(
879b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	struct r600_context * rctx,
889b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	unsigned vb_index,
899b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	unsigned offset,
909b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	struct pipe_resource * buffer)
919b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard{
92585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	struct r600_vertexbuf_state *state = &rctx->cs_vertex_buffer_state;
93585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	struct pipe_vertex_buffer *vb = &state->vb[vb_index];
949b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	vb->stride = 1;
959b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	vb->buffer_offset = offset;
969b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	vb->buffer = buffer;
979b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	vb->user_buffer = NULL;
989b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
999b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	r600_inval_vertex_cache(rctx);
100585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	state->enabled_mask |= 1 << vb_index;
101c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	state->dirty_mask |= 1 << vb_index;
102c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	r600_atom_dirty(rctx, &state->atom);
1039b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard}
1049b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
1056a829a1b724ca0d960decee217d260b4de8a5463Adam Rakconst struct u_resource_vtbl r600_global_buffer_vtbl =
1066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
1076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	u_default_resource_get_handle, /* get_handle */
1086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_buffer_destroy, /* resource_destroy */
1096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_get_transfer, /* get_transfer */
1106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_transfer_destroy, /* transfer_destroy */
1116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_transfer_map, /* transfer_map */
1126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_transfer_flush_region,/* transfer_flush_region */
1136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_transfer_unmap, /* transfer_unmap */
1146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_global_transfer_inline_write /* transfer_inline_write */
1156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak};
1166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1186a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid *evergreen_create_compute_state(
1196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
1206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const const struct pipe_compute_state *cso)
1216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
1226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
123d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute);
124d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	void *p;
1256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL
1276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const struct pipe_llvm_program_header * header;
1286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const unsigned char * code;
1296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
130d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("*** evergreen_create_compute_state\n");
131d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
1326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	header = cso->prog;
1336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	code = cso->prog + sizeof(struct pipe_llvm_program_header);
1346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif
1356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->ctx = (struct r600_context*)ctx;
1376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->resources = (struct evergreen_compute_resource*)
1386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			CALLOC(sizeof(struct evergreen_compute_resource),
1396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			get_compute_resource_num());
1406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->local_size = cso->req_local_mem; ///TODO: assert it
1416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->private_size = cso->req_private_mem;
1426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->input_size = cso->req_input_mem;
1436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL
1456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader->mod = llvm_parse_bitcode(code, header->num_bytes);
1466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_compute_shader_create(ctx_, shader->mod, &shader->bc);
1486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif
149d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	shader->shader_code_bo = r600_compute_buffer_alloc_vram(ctx->screen,
150d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard							shader->bc.ndw * 4);
151d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
152d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	p = ctx->ws->buffer_map(shader->shader_code_bo->cs_buf, ctx->cs,
153d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard							PIPE_TRANSFER_WRITE);
154d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
155d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4);
156d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	ctx->ws->buffer_unmap(shader->shader_code_bo->cs_buf);
1576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return shader;
1586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
1596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1606a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid evergreen_delete_compute_state(struct pipe_context *ctx, void* state)
1616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
1626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_pipe_compute *shader = (struct r600_pipe_compute *)state;
1636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	free(shader->resources);
1656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	free(shader);
1666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
1676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1686a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_bind_compute_state(struct pipe_context *ctx_, void *state)
1696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
1706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
1716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
172d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("*** evergreen_bind_compute_state\n");
173d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
174d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	ctx->cs_shader_state.shader = (struct r600_pipe_compute *)state;
1756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
1766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
1776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/* The kernel parameters are stored a vtx buffer (ID=0), besides the explicit
1786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * kernel parameters there are inplicit parameters that need to be stored
1796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * in the vertex buffer as well.  Here is how these parameters are organized in
1806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * the buffer:
1816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *
1826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DWORDS 0-2: Number of work groups in each dimension (x,y,z)
1836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DWORDS 3-5: Number of global work items in each dimension (x,y,z)
1846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DWORDS 6-8: Number of work items within each work group in each dimension
1856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak *             (x,y,z)
1866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak * DWORDS 9+ : Kernel parameters
1876a829a1b724ca0d960decee217d260b4de8a5463Adam Rak */
1886a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid evergreen_compute_upload_input(
1896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
1906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const uint *block_layout,
1916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const uint *grid_layout,
1926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const void *input)
1936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
1946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
195d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct r600_pipe_compute *shader = ctx->cs_shader_state.shader;
1966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int i;
1976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned kernel_parameters_offset_bytes = 36;
1986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t * num_work_groups_start;
1996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t * global_size_start;
2006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t * local_size_start;
2016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t * kernel_parameters_start;
2026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
203d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	if (shader->input_size == 0) {
2046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		return;
2056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
207d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	if (!shader->kernel_param) {
208d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		unsigned buffer_size = shader->input_size;
2096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		/* Add space for the grid dimensions */
2116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		buffer_size += kernel_parameters_offset_bytes * sizeof(uint);
212d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		shader->kernel_param = r600_compute_buffer_alloc_vram(
213d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						ctx->screen, buffer_size);
2146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	num_work_groups_start = ctx->ws->buffer_map(
217d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		shader->kernel_param->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
2186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	global_size_start = num_work_groups_start + (3 * (sizeof(uint) /4));
2196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	local_size_start = global_size_start + (3 * (sizeof(uint)) / 4);
2206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	kernel_parameters_start = local_size_start + (3 * (sizeof(uint)) / 4);
2216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	/* Copy the work group size */
2236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	memcpy(num_work_groups_start, grid_layout, 3 * sizeof(uint));
2246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	/* Copy the global size */
2266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < 3; i++) {
2276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		global_size_start[i] = grid_layout[i] * block_layout[i];
2286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	/* Copy the local dimensions */
2316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	memcpy(local_size_start, block_layout, 3 * sizeof(uint));
2326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	/* Copy the kernel inputs */
234d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	memcpy(kernel_parameters_start, input, shader->input_size);
2356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < (kernel_parameters_offset_bytes / 4) +
237d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					(shader->input_size / 4); i++) {
2386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		COMPUTE_DBG("input %i : %i\n", i,
2396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			((unsigned*)num_work_groups_start)[i]);
2406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
242d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	ctx->ws->buffer_unmap(shader->kernel_param->cs_buf);
2436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	///ID=0 is reserved for the parameters
2459b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	evergreen_cs_set_vertex_buffer(ctx, 0, 0,
246d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			(struct pipe_resource*)shader->kernel_param);
2476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	///ID=0 is reserved for parameters
248d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	evergreen_set_const_cache(shader, 0, shader->kernel_param,
249d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						shader->input_size, 0);
2506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
2516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
252fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellardstatic void evergreen_emit_direct_dispatch(
253fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard		struct r600_context *rctx,
2546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		const uint *block_layout, const uint *grid_layout)
2556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
2566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int i;
257fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	struct radeon_winsys_cs *cs = rctx->cs;
258fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	unsigned num_waves;
259fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	unsigned num_pipes = rctx->screen->info.r600_max_pipes;
260fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	unsigned wave_divisor = (16 * num_pipes);
2616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int group_size = 1;
2626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int grid_size = 1;
263fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* XXX: Enable lds and get size from cs_shader_state */
264fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	unsigned lds_size = 0;
2656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
266fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* Calculate group_size/grid_size */
2676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < 3; i++) {
2686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		group_size *= block_layout[i];
2696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < 3; i++)	{
2726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		grid_size *= grid_layout[i];
2736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
275fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* num_waves = ceil((tg_size.x * tg_size.y, tg_size.z) / (16 * num_pipes)) */
276fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	num_waves = (block_layout[0] * block_layout[1] * block_layout[2] +
277fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard			wave_divisor - 1) / wave_divisor;
278fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
279fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	COMPUTE_DBG("Using %u pipes, there are %u wavefronts per thread block\n",
280fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard							num_pipes, num_waves);
2816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
282fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* XXX: Partition the LDS between PS/CS.  By default half (4096 dwords
283fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 * on Evergreen) oes to Pixel Shaders and half goes to Compute Shaders.
284fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 * We may need to allocat the entire LDS space for Compute Shaders.
285fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 *
286fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 * EG: R_008E2C_SQ_LDS_RESOURCE_MGMT := S_008E2C_NUM_LS_LDS(lds_dwords)
287fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 * CM: CM_R_0286FC_SPI_LDS_MGMT :=  S_0286FC_NUM_LS_LDS(lds_dwords)
288fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	 */
289fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
290fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_config_reg(cs, R_008970_VGT_NUM_INDICES, group_size);
291fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
292fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_config_reg_seq(cs, R_00899C_VGT_COMPUTE_START_X, 3);
293fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, 0); /* R_00899C_VGT_COMPUTE_START_X */
294fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, 0); /* R_0089A0_VGT_COMPUTE_START_Y */
295fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, 0); /* R_0089A4_VGT_COMPUTE_START_Z */
296fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
297fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_config_reg(cs, R_0089AC_VGT_COMPUTE_THREAD_GROUP_SIZE,
298fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard								group_size);
299fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
300fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_compute_context_reg_seq(cs, R_0286EC_SPI_COMPUTE_NUM_THREAD_X, 3);
301fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, block_layout[0]); /* R_0286EC_SPI_COMPUTE_NUM_THREAD_X */
302fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, block_layout[1]); /* R_0286F0_SPI_COMPUTE_NUM_THREAD_Y */
303fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, block_layout[2]); /* R_0286F4_SPI_COMPUTE_NUM_THREAD_Z */
304fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
305fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_compute_context_reg(cs, CM_R_0288E8_SQ_LDS_ALLOC,
306fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard					lds_size | (num_waves << 14));
307fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
308fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* Dispatch packet */
309fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, PKT3C(PKT3_DISPATCH_DIRECT, 3, 0));
310fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, grid_layout[0]);
311fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, grid_layout[1]);
312fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, grid_layout[2]);
313fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* VGT_DISPATCH_INITIATOR = COMPUTE_SHADER_EN */
314fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_value(cs, 1);
3156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
3166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
317fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellardstatic void compute_emit_cs(struct r600_context *ctx, const uint *block_layout,
318fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard		const uint *grid_layout)
3196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
3206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct radeon_winsys_cs *cs = ctx->cs;
3216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int i;
3226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
3235016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	struct r600_resource *onebo = NULL;
324da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard	struct r600_pipe_state *cb_state;
325d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct evergreen_compute_resource *resources =
326d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					ctx->cs_shader_state.shader->resources;
3275016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
32859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	/* Initialize all the compute-related registers.
3295016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	 *
3305016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	 * See evergreen_init_atom_start_compute_cs() in this file for the list
33159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	 * of registers initialized by the start_compute_cs_cmd atom.
3325016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	 */
3335016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	r600_emit_atom(ctx, &ctx->start_compute_cs_cmd.atom);
3346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
335da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard	/* Emit cb_state */
336da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard        cb_state = ctx->states[R600_PIPE_STATE_FRAMEBUFFER];
337da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard	r600_context_pipe_state_emit(ctx, cb_state, RADEON_CP_PACKET3_COMPUTE_MODE);
338da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard
339fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* Set CB_TARGET_MASK  XXX: Use cb_misc_state */
340fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	r600_write_compute_context_reg(cs, R_028238_CB_TARGET_MASK,
341fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard					ctx->compute_cb_target_mask);
342fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
343fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
3449b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	/* Emit vertex buffer state */
345585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	ctx->cs_vertex_buffer_state.atom.num_dw = 12 * util_bitcount(ctx->cs_vertex_buffer_state.dirty_mask);
346c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	r600_emit_atom(ctx, &ctx->cs_vertex_buffer_state.atom);
3479b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
348d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	/* Emit compute shader state */
349d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_emit_atom(ctx, &ctx->cs_shader_state.atom);
350d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
3516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < get_compute_resource_num(); i++) {
352d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		if (resources[i].enabled) {
3536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			int j;
3546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			COMPUTE_DBG("resnum: %i, cdw: %i\n", i, cs->cdw);
3556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
356d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			for (j = 0; j < resources[i].cs_end; j++) {
357d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				if (resources[i].do_reloc[j]) {
358d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					assert(resources[i].bo);
3596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak					evergreen_emit_ctx_reloc(ctx,
360d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						resources[i].bo,
361d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						resources[i].usage);
3626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				}
3636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
364d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				cs->buf[cs->cdw++] = resources[i].cs[j];
3656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			}
3666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
367d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			if (resources[i].bo) {
368d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				onebo = resources[i].bo;
3696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				evergreen_emit_ctx_reloc(ctx,
370d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					resources[i].bo,
371d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					resources[i].usage);
3726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
3736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				///special case for textures
374d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				if (resources[i].do_reloc
375d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					[resources[i].cs_end] == 2) {
3766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak					evergreen_emit_ctx_reloc(ctx,
377d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						resources[i].bo,
378d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard						resources[i].usage);
3796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				}
3806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			}
3816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		}
3826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
3836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
384fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	/* Emit dispatch state and dispatch packet */
385fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	evergreen_emit_direct_dispatch(ctx, block_layout, grid_layout);
386fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard
387ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	/* r600_flush_framebuffer() updates the cb_flush_flags and then
388ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 * calls r600_emit_atom() on the ctx->surface_sync_cmd.atom, which emits
389ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 * a SURFACE_SYNC packet via r600_emit_surface_sync().
390ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 *
391ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 * XXX r600_emit_surface_sync() hardcodes the CP_COHER_SIZE to
392ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 * 0xffffffff, so we will need to add a field to struct
393ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 * r600_surface_sync_cmd if we want to manually set this value.
394ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	 */
395ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard	r600_flush_framebuffer(ctx, true /* Flush now */);
396ff2b417245e8e62b546e27771e36460acc666a8eTom Stellard
3976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#if 0
3986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	COMPUTE_DBG("cdw: %i\n", cs->cdw);
3996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (i = 0; i < cs->cdw; i++) {
4006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		COMPUTE_DBG("%4i : 0x%08X\n", i, ctx->cs->buf[i]);
4016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
4026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif
4036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
40492af184690995d3b16731518f7becfaac3538edbChristian König	ctx->ws->cs_flush(ctx->cs, RADEON_FLUSH_ASYNC | RADEON_FLUSH_COMPUTE);
4056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->pm4_dirty_cdwords = 0;
4076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->flags = 0;
4086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	COMPUTE_DBG("shader started\n");
4106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->ws->buffer_wait(onebo->buf, 0);
4126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	COMPUTE_DBG("...\n");
4146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->streamout_start = TRUE;
4166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->streamout_append_bitmask = ~0;
4176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
4196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
420d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
421d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard/**
422d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard * Emit function for r600_cs_shader_state atom
423d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard */
424d3b013049126fb44d65a0a67001b04acbe778613Tom Stellardvoid evergreen_emit_cs_shader(
425d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		struct r600_context *rctx,
426d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard		struct r600_atom *atom)
427d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard{
428d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct r600_cs_shader_state *state =
429d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard					(struct r600_cs_shader_state*)atom;
430d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct r600_pipe_compute *shader = state->shader;
431d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	struct radeon_winsys_cs *cs = rctx->cs;
432d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	uint64_t va;
433d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
434d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	va = r600_resource_va(&rctx->screen->screen, &shader->shader_code_bo->b.b);
435d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
436d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_compute_context_reg_seq(cs, R_0288D0_SQ_PGM_START_LS, 3);
437d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_value(cs, va >> 8); /* R_0288D0_SQ_PGM_START_LS */
438d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_value(cs,           /* R_0288D4_SQ_PGM_RESOURCES_LS */
439d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			S_0288D4_NUM_GPRS(shader->bc.ngpr)
440d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			| S_0288D4_STACK_SIZE(shader->bc.nstack));
441d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_value(cs, 0);	/* R_0288D8_SQ_PGM_RESOURCES_LS_2 */
442d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
443d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_value(cs, PKT3C(PKT3_NOP, 0, 0));
444d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_write_value(cs, r600_context_bo_reloc(rctx, shader->shader_code_bo,
445d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard							RADEON_USAGE_READ));
446d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
447d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_inval_shader_cache(rctx);
448d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard}
449d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard
4506a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_launch_grid(
4516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		struct pipe_context *ctx_,
4526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		const uint *block_layout, const uint *grid_layout,
4536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		uint32_t pc, const void *input)
4546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
4556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
4566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
457fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	COMPUTE_DBG("PC: %i\n", pc);
4586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	evergreen_compute_upload_input(ctx_, block_layout, grid_layout, input);
460fdd8df20e4a730f80bf4c331012d832bffd7072eTom Stellard	compute_emit_cs(ctx, block_layout, grid_layout);
4616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
4626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4636a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_set_compute_resources(struct pipe_context * ctx_,
4646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		unsigned start, unsigned count,
4656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		struct pipe_surface ** surfaces)
4666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
4676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
4686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_surface **resources = (struct r600_surface **)surfaces;
469d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
470d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("*** evergreen_set_compute_resources: start = %u count = %u\n",
471d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard			start, count);
472d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
4736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (int i = 0; i < count; i++)	{
4749b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard		/* The First two vertex buffers are reserved for parameters and
4759b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard		 * global buffers. */
4769b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard		unsigned vtx_id = 2 + i;
4776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		if (resources[i]) {
4786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			struct r600_resource_global *buffer =
4799b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard				(struct r600_resource_global*)
4809b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard				resources[i]->base.texture;
4816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			if (resources[i]->base.writable) {
4826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				assert(i+1 < 12);
4836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
484d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				evergreen_set_rat(ctx->cs_shader_state.shader, i+1,
4856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				(struct r600_resource *)resources[i]->base.texture,
4866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				buffer->chunk->start_in_dw*4,
4876a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				resources[i]->base.texture->width0);
4886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			}
4896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4909b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard			evergreen_cs_set_vertex_buffer(ctx, vtx_id,
4919b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard					buffer->chunk->start_in_dw * 4,
4929b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard					resources[i]->base.texture);
4936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		}
4946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
4956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
4966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
4976a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
4986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		unsigned start_slot, unsigned count,
4996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		struct pipe_sampler_view **views)
5006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
5016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
5026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_pipe_sampler_view **resource =
5036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		(struct r600_pipe_sampler_view **)views;
5046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (int i = 0; i < count; i++)	{
5066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		if (resource[i]) {
5076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			assert(i+1 < 12);
5086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			///FETCH0 = VTX0 (param buffer),
5096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak			//FETCH1 = VTX1 (global buffer pool), FETCH2... = TEX
510d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			evergreen_set_tex_resource(ctx->cs_shader_state.shader, resource[i], i+2);
5116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		}
5126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
5136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
5146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5156a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_bind_compute_sampler_states(
5166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
5176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned start_slot,
5186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned num_samplers,
5196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	void **samplers_)
5206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
5216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
5226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct compute_sampler_state ** samplers =
5236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		(struct compute_sampler_state **)samplers_;
5246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (int i = 0; i < num_samplers; i++) {
5266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		if (samplers[i]) {
527d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard			evergreen_set_sampler_resource(
528d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard				ctx->cs_shader_state.shader, samplers[i], i);
5296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		}
5306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
5316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
5326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5336a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void evergreen_set_global_binding(
5346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_, unsigned first, unsigned n,
5356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_resource **resources,
5366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t **handles)
5376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
5386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
5396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct compute_memory_pool *pool = ctx->screen->global_pool;
5406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_resource_global **buffers =
5416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		(struct r600_resource_global **)resources;
5426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
543d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("*** evergreen_set_global_binding first = %u n = %u\n",
544d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard			first, n);
545d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
5466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (!resources) {
5476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		/* XXX: Unset */
5486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		return;
5496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
5506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	compute_memory_finalize_pending(pool, ctx_);
5526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	for (int i = 0; i < n; i++)
5546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	{
5556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		assert(resources[i]->target == PIPE_BUFFER);
5566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		assert(resources[i]->bind & PIPE_BIND_GLOBAL);
5576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		*(handles[i]) = buffers[i]->chunk->start_in_dw * 4;
5596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
5606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
561d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	evergreen_set_rat(ctx->cs_shader_state.shader, 0, pool->bo, 0, pool->size_in_dw * 4);
5629b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	evergreen_cs_set_vertex_buffer(ctx, 1, 0,
5639b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard				(struct pipe_resource*)pool->bo);
5646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
5656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5665016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard/**
5675016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * This function initializes all the compute specific registers that need to
5685016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * be initialized for each compute command stream.  Registers that are common
5695016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * to both compute and 3D will be initialized at the beginning of each compute
5705016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * command stream by the start_cs_cmd atom.  However, since the SET_CONTEXT_REG
5715016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * packet requires that the shader type bit be set, we must initialize all
5725016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * context registers needed for compute in this function.  The registers
5735016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * intialized by the start_cs_cmd atom can be found in evereen_state.c in the
5745016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * functions evergreen_init_atom_start_cs or cayman_init_atom_start_cs depending
5755016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard * on the GPU family.
5765016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard */
5775016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellardvoid evergreen_init_atom_start_compute_cs(struct r600_context *ctx)
5786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
5795016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	struct r600_command_buffer *cb = &ctx->start_compute_cs_cmd;
5806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int num_threads;
5816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int num_stack_entries;
5826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
58359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	/* since all required registers are initialised in the
58459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	 * start_compute_cs_cmd atom, we can EMIT_EARLY here.
5855016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	 */
58659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_init_command_buffer(cb, 256, EMIT_EARLY);
5875016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	cb->pkt_flags = RADEON_CP_PACKET3_COMPUTE_MODE;
5886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
5895016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	switch (ctx->family) {
5906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_CEDAR:
5916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	default:
5926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
5936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
5946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
5956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_REDWOOD:
5966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
5976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
5986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
5996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_JUNIPER:
6006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 512;
6026a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_CYPRESS:
6046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_HEMLOCK:
6056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 512;
6076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_PALM:
6096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
6116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_SUMO:
6136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
6156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_SUMO2:
6176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 512;
6196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_BARTS:
6216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 512;
6236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_TURKS:
6256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
6276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	case CHIP_CAICOS:
6296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_threads = 128;
6306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		num_stack_entries = 256;
6316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		break;
6326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
6336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
6345016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	/* Config Registers */
63559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	evergreen_init_common_regs(cb, ctx->chip_class
63659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald			, ctx->family, ctx->screen->info.drm_minor);
637dc0b8a46289d0e6b10c542df0856d51a0aabf9b0Tom Stellard
638dc0b8a46289d0e6b10c542df0856d51a0aabf9b0Tom Stellard	/* The primitive type always needs to be POINTLIST for compute. */
639dc0b8a46289d0e6b10c542df0856d51a0aabf9b0Tom Stellard	r600_store_config_reg(cb, R_008958_VGT_PRIMITIVE_TYPE,
640dc0b8a46289d0e6b10c542df0856d51a0aabf9b0Tom Stellard						V_008958_DI_PT_POINTLIST);
641dc0b8a46289d0e6b10c542df0856d51a0aabf9b0Tom Stellard
6420c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	if (ctx->chip_class < CAYMAN) {
6435016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6445016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* These registers control which simds can be used by each stage.
6455016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * The default for these registers is 0xffffffff, which means
6465016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * all simds are available for each stage.  It's possible we may
6475016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * want to play around with these in the future, but for now
6485016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * the default value is fine.
6495016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 *
6505016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * R_008E20_SQ_STATIC_THREAD_MGMT1
6515016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * R_008E24_SQ_STATIC_THREAD_MGMT2
6525016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * R_008E28_SQ_STATIC_THREAD_MGMT3
6535016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 */
6545016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6555016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* XXX: We may need to adjust the thread and stack resouce
6565016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * values for 3D/compute interop */
6575016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6585016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_config_reg_seq(cb, R_008C18_SQ_THREAD_RESOURCE_MGMT_1, 5);
6595016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6605016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* R_008C18_SQ_THREAD_RESOURCE_MGMT_1
6615016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * Set the number of threads used by the PS/VS/GS/ES stage to
6625016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * 0.
6635016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 */
6645016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_value(cb, 0);
6655016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6665016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* R_008C1C_SQ_THREAD_RESOURCE_MGMT_2
6675016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * Set the number of threads used by the CS (aka LS) stage to
6685016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * the maximum number of threads and set the number of threads
6695016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * for the HS stage to 0. */
6705016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_value(cb, S_008C1C_NUM_LS_THREADS(num_threads));
6715016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6725016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* R_008C20_SQ_STACK_RESOURCE_MGMT_1
6735016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * Set the Control Flow stack entries to 0 for PS/VS stages */
6745016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_value(cb, 0);
6755016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6765016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* R_008C24_SQ_STACK_RESOURCE_MGMT_2
6775016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * Set the Control Flow stack entries to 0 for GS/ES stages */
6785016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_value(cb, 0);
6795016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6805016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* R_008C28_SQ_STACK_RESOURCE_MGMT_3
6815016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * Set the Contol Flow stack entries to 0 for the HS stage, and
6825016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * set it to the maximum value for the CS (aka LS) stage. */
6835016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_value(cb,
6845016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard			S_008C28_NUM_LS_STACK_ENTRIES(num_stack_entries));
6850c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	}
6860c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard
6875016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	/* Context Registers */
6885016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
6890c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	if (ctx->chip_class < CAYMAN) {
6905016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		/* workaround for hw issues with dyn gpr - must set all limits
6915016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 * to 240 instead of 0, 0x1e == 240 / 8
6925016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		 */
6935016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		r600_store_context_reg(cb, R_028838_SQ_DYN_GPR_RESOURCE_LIMIT_1,
6940c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_PS_GPRS(0x1e) |
6950c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_VS_GPRS(0x1e) |
6960c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_GS_GPRS(0x1e) |
6970c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_ES_GPRS(0x1e) |
6980c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_HS_GPRS(0x1e) |
6990c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard				S_028838_LS_GPRS(0x1e));
7000c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	}
7016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7025016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	/* XXX: Investigate setting bit 15, which is FAST_COMPUTE_MODE */
7035016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	r600_store_context_reg(cb, R_028A40_VGT_GS_MODE,
7045016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard		S_028A40_COMPUTE_MODE(1) | S_028A40_PARTIAL_THD_AT_EOI(1));
7050c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard
7065016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	r600_store_context_reg(cb, R_028B54_VGT_SHADER_STAGES_EN, 2/*CS_ON*/);
7075016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard
7085016fe2d47a08ce2cd7c597e67862086e7d63b64Tom Stellard	r600_store_context_reg(cb, R_0286E8_SPI_COMPUTE_INPUT_CNTL,
7096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak						S_0286E8_TID_IN_GROUP_ENA
7106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak						| S_0286E8_TGID_ENA
7116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak						| S_0286E8_DISABLE_INDEX_PACK)
7126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak						;
71325145de03e980a182b656efce75c33a6129def06Tom Stellard
71425145de03e980a182b656efce75c33a6129def06Tom Stellard	/* The LOOP_CONST registers are an optimizations for loops that allows
71525145de03e980a182b656efce75c33a6129def06Tom Stellard	 * you to store the initial counter, increment value, and maximum
71625145de03e980a182b656efce75c33a6129def06Tom Stellard	 * counter value in a register so that hardware can calculate the
71725145de03e980a182b656efce75c33a6129def06Tom Stellard	 * correct number of iterations for the loop, so that you don't need
71825145de03e980a182b656efce75c33a6129def06Tom Stellard	 * to have the loop counter in your shader code.  We don't currently use
71925145de03e980a182b656efce75c33a6129def06Tom Stellard	 * this optimization, so we must keep track of the counter in the
72025145de03e980a182b656efce75c33a6129def06Tom Stellard	 * shader and use a break instruction to exit loops.  However, the
72125145de03e980a182b656efce75c33a6129def06Tom Stellard	 * hardware will still uses this register to determine when to exit a
72225145de03e980a182b656efce75c33a6129def06Tom Stellard	 * loop, so we need to initialize the counter to 0, set the increment
72325145de03e980a182b656efce75c33a6129def06Tom Stellard	 * value to 1 and the maximum counter value to the 4095 (0xfff) which
72425145de03e980a182b656efce75c33a6129def06Tom Stellard	 * is the maximum value allowed.  This gives us a maximum of 4096
72525145de03e980a182b656efce75c33a6129def06Tom Stellard	 * iterations for our loops, but hopefully our break instruction will
72625145de03e980a182b656efce75c33a6129def06Tom Stellard	 * execute before some time before the 4096th iteration.
72725145de03e980a182b656efce75c33a6129def06Tom Stellard	 */
72825145de03e980a182b656efce75c33a6129def06Tom Stellard	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0 + (160 * 4), 0x1000FFF);
7296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
7306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7316a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid evergreen_init_compute_state_functions(struct r600_context *ctx)
7326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
7336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.create_compute_state = evergreen_create_compute_state;
7346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.delete_compute_state = evergreen_delete_compute_state;
7356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.bind_compute_state = evergreen_bind_compute_state;
7366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak//	 ctx->context.create_sampler_view = evergreen_compute_create_sampler_view;
7376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.set_compute_resources = evergreen_set_compute_resources;
7386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.set_compute_sampler_views = evergreen_set_cs_sampler_view;
7396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.bind_compute_sampler_states = evergreen_bind_compute_sampler_states;
7406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.set_global_binding = evergreen_set_global_binding;
7416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->context.launch_grid = evergreen_launch_grid;
7429b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
7439b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard	/* We always use at least two vertex buffers for compute, one for
7449b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard         * parameters and one for global memory */
745585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	ctx->cs_vertex_buffer_state.enabled_mask =
746585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	ctx->cs_vertex_buffer_state.dirty_mask = 1 | 2;
7476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
7486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7506a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstruct pipe_resource *r600_compute_global_buffer_create(
7516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_screen *screen,
7526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const struct pipe_resource *templ)
7536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
7546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(templ->target == PIPE_BUFFER);
7556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(templ->bind & PIPE_BIND_GLOBAL);
7566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(templ->array_size == 1 || templ->array_size == 0);
7576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(templ->depth0 == 1 || templ->depth0 == 0);
7586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(templ->height0 == 1 || templ->height0 == 0);
7596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_resource_global* result = (struct r600_resource_global*)
7616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		CALLOC(sizeof(struct r600_resource_global), 1);
7626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_screen* rscreen = (struct r600_screen*)screen;
7636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
764d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("*** r600_compute_global_buffer_create\n");
765d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard	COMPUTE_DBG("width = %u array_size = %u\n", templ->width0,
766d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard			templ->array_size);
767d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard
7686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	result->base.b.vtbl = &r600_global_buffer_vtbl;
7696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	result->base.b.b.screen = screen;
7706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	result->base.b.b = *templ;
7716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	pipe_reference_init(&result->base.b.b.reference, 1);
7726a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	int size_in_dw = (templ->width0+3) / 4;
7746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	result->chunk = compute_memory_alloc(rscreen->global_pool, size_in_dw);
7766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (result->chunk == NULL)
7786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	{
7796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		free(result);
7806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		return NULL;
7816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
7826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return &result->base.b.b;
7846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
7856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7866a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid r600_compute_global_buffer_destroy(
7876a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_screen *screen,
7886a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_resource *res)
7896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
7906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(res->target == PIPE_BUFFER);
7916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(res->bind & PIPE_BIND_GLOBAL);
7926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_resource_global* buffer = (struct r600_resource_global*)res;
7946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_screen* rscreen = (struct r600_screen*)screen;
7956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	compute_memory_free(rscreen->global_pool, buffer->chunk->id);
7976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
7986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	buffer->chunk = NULL;
7996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	free(res);
8006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8016a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8026a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid* r600_compute_global_transfer_map(
8036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
8046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_transfer* transfer)
8056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->resource->target == PIPE_BUFFER);
8076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->resource->bind & PIPE_BIND_GLOBAL);
8086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->box.x >= 0);
8096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->box.y == 0);
8106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->box.z == 0);
8116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
8136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_resource_global* buffer =
8146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		(struct r600_resource_global*)transfer->resource;
8156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	uint32_t* map;
8176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	///TODO: do it better, mapping is not possible if the pool is too big
8186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (!(map = ctx->ws->buffer_map(buffer->chunk->pool->bo->cs_buf,
8206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak						ctx->cs, transfer->usage))) {
8216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		return NULL;
8226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
8236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	COMPUTE_DBG("buffer start: %lli\n", buffer->chunk->start_in_dw);
8256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return ((char*)(map + buffer->chunk->start_in_dw)) + transfer->box.x;
8266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8286a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid r600_compute_global_transfer_unmap(
8296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
8306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_transfer* transfer)
8316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->resource->target == PIPE_BUFFER);
8336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(transfer->resource->bind & PIPE_BIND_GLOBAL);
8346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
8366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_resource_global* buffer =
8376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		(struct r600_resource_global*)transfer->resource;
8386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	ctx->ws->buffer_unmap(buffer->chunk->pool->bo->cs_buf);
8406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8426a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstruct pipe_transfer * r600_compute_global_get_transfer(
8436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
8446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_resource *resource,
8456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned level,
8466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned usage,
8476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const struct pipe_box *box)
8486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *ctx = (struct r600_context *)ctx_;
8506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct compute_memory_pool *pool = ctx->screen->global_pool;
8516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	compute_memory_finalize_pending(pool, ctx_);
8536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(resource->target == PIPE_BUFFER);
8556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *rctx = (struct r600_context*)ctx_;
8566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_transfer *transfer = util_slab_alloc(&rctx->pool_transfers);
8576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->resource = resource;
8596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->level = level;
8606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->usage = usage;
8616a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->box = *box;
8626a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->stride = 0;
8636a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->layer_stride = 0;
8646a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	transfer->data = NULL;
8656a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8666a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	/* Note strides are zero, this is ok for buffers, but not for
8676a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	* textures 2d & higher at least.
8686a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	*/
8696a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return transfer;
8706a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8716a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8726a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid r600_compute_global_transfer_destroy(
8736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
8746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_transfer *transfer)
8756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8766a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *rctx = (struct r600_context*)ctx_;
8776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	util_slab_free(&rctx->pool_transfers, transfer);
8786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8806a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid r600_compute_global_transfer_flush_region(
8816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *ctx_,
8826a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_transfer *transfer,
8836a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const struct pipe_box *box)
8846a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8856a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(0 && "TODO");
8866a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
8876a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
8886a829a1b724ca0d960decee217d260b4de8a5463Adam Rakvoid r600_compute_global_transfer_inline_write(
8896a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_context *pipe,
8906a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct pipe_resource *resource,
8916a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned level,
8926a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned usage,
8936a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const struct pipe_box *box,
8946a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	const void *data,
8956a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned stride,
8966a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned layer_stride)
8976a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
8986a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	assert(0 && "TODO");
8996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
900