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