1ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* 2ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Copyright 2012 Advanced Micro Devices, Inc. 3ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * 4ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Permission is hereby granted, free of charge, to any person obtaining a 5ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * copy of this software and associated documentation files (the "Software"), 6ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * to deal in the Software without restriction, including without limitation 7ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub 8ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * license, and/or sell copies of the Software, and to permit persons to whom 9ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * the Software is furnished to do so, subject to the following conditions: 10ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * 11ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * The above copyright notice and this permission notice (including the next 12ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * paragraph) shall be included in all copies or substantial portions of the 13ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Software. 14ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * 15ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE. 22ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * 23ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Authors: 24ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Christian König <christian.koenig@amd.com> 25ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */ 26ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 27ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_memory.h" 28ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_framebuffer.h" 29ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_blitter.h" 30ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "tgsi/tgsi_parse.h" 31ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "radeonsi_pipe.h" 32ce40e4726cf30196b87df387255c64ddc2a97638Christian König#include "radeonsi_shader.h" 33ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "si_state.h" 34ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "sid.h" 35ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 36ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* 37ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Shaders 38ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */ 39ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 40ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_pipe_shader_vs(struct pipe_context *ctx, struct si_pipe_shader *shader) 41ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 42ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct r600_context *rctx = (struct r600_context *)ctx; 43ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *pm4; 44ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned num_sgprs, num_user_sgprs; 45ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned nparams, i; 46ca9cf611b63e5576b596c21b73b1b639d250d649Christian König uint64_t va; 47ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 48ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (si_pipe_shader_create(ctx, shader)) 49ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return; 50ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 51ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_delete_state(rctx, vs, shader->pm4); 52ca9cf611b63e5576b596c21b73b1b639d250d649Christian König pm4 = shader->pm4 = CALLOC_STRUCT(si_pm4_state); 53ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 54ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_inval_shader_cache(pm4); 55ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 56ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Certain attributes (position, psize, etc.) don't count as params. 57ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * VS is required to export at least one param and r600_shader_from_tgsi() 58ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * takes care of adding a dummy export. 59ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */ 60ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (nparams = 0, i = 0 ; i < shader->shader.noutput; i++) { 61ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.output[i].name != TGSI_SEMANTIC_POSITION) 62ca9cf611b63e5576b596c21b73b1b639d250d649Christian König nparams++; 63ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 64ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (nparams < 1) 65ca9cf611b63e5576b596c21b73b1b639d250d649Christian König nparams = 1; 66ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 67ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_0286C4_SPI_VS_OUT_CONFIG, 68ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_0286C4_VS_EXPORT_COUNT(nparams - 1)); 69ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 70ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_02870C_SPI_SHADER_POS_FORMAT, 71ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_02870C_POS0_EXPORT_FORMAT(V_02870C_SPI_SHADER_4COMP) | 72ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_02870C_POS1_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE) | 73ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_02870C_POS2_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE) | 74ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_02870C_POS3_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE)); 75ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 76ca9cf611b63e5576b596c21b73b1b639d250d649Christian König va = r600_resource_va(ctx->screen, (void *)shader->bo); 77ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ); 78ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B120_SPI_SHADER_PGM_LO_VS, va >> 8); 79ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B124_SPI_SHADER_PGM_HI_VS, va >> 40); 80ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 81ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_user_sgprs = 8; 82ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs = shader->num_sgprs; 83ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (num_user_sgprs > num_sgprs) 84ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs = num_user_sgprs; 85ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Last 2 reserved SGPRs are used for VCC */ 86ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs += 2; 87ca9cf611b63e5576b596c21b73b1b639d250d649Christian König assert(num_sgprs <= 104); 88ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 89ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B128_SPI_SHADER_PGM_RSRC1_VS, 90ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B128_VGPRS((shader->num_vgprs - 1) / 4) | 91ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B128_SGPRS((num_sgprs - 1) / 8)); 92ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B12C_SPI_SHADER_PGM_RSRC2_VS, 93ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B12C_USER_SGPR(num_user_sgprs)); 94ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 95ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_bind_state(rctx, vs, shader->pm4); 96ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 97ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 98ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *shader) 99ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 100ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct r600_context *rctx = (struct r600_context *)ctx; 101ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *pm4; 102ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned i, exports_ps, num_cout, spi_ps_in_control, db_shader_control; 103ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned num_sgprs, num_user_sgprs; 104ca9cf611b63e5576b596c21b73b1b639d250d649Christian König int ninterp = 0; 105ca9cf611b63e5576b596c21b73b1b639d250d649Christian König boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE; 10607838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König unsigned spi_baryc_cntl, spi_ps_input_ena; 107ca9cf611b63e5576b596c21b73b1b639d250d649Christian König uint64_t va; 108ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 109ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (si_pipe_shader_create(ctx, shader)) 110ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return; 111ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 112ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_delete_state(rctx, ps, shader->pm4); 113ca9cf611b63e5576b596c21b73b1b639d250d649Christian König pm4 = shader->pm4 = CALLOC_STRUCT(si_pm4_state); 114ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 115ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_inval_shader_cache(pm4); 116ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 117ca9cf611b63e5576b596c21b73b1b639d250d649Christian König db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); 118ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (i = 0; i < shader->shader.ninput; i++) { 119ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ninterp++; 120ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* XXX: Flat shading hangs the GPU */ 121ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 122ca9cf611b63e5576b596c21b73b1b639d250d649Christian König (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_COLOR && 123ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->queued.named.rasterizer->flatshade)) 124ca9cf611b63e5576b596c21b73b1b639d250d649Christian König have_linear = TRUE; 125ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_LINEAR) 126ca9cf611b63e5576b596c21b73b1b639d250d649Christian König have_linear = TRUE; 127ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) 128ca9cf611b63e5576b596c21b73b1b639d250d649Christian König have_perspective = TRUE; 129ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.input[i].centroid) 130ca9cf611b63e5576b596c21b73b1b639d250d649Christian König have_centroid = TRUE; 131ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 132ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 133ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (i = 0; i < shader->shader.noutput; i++) { 134ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.output[i].name == TGSI_SEMANTIC_POSITION) 135ca9cf611b63e5576b596c21b73b1b639d250d649Christian König db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1); 136ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.output[i].name == TGSI_SEMANTIC_STENCIL) 137ca9cf611b63e5576b596c21b73b1b639d250d649Christian König db_shader_control |= 0; // XXX OP_VAL or TEST_VAL? 138ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 139ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.uses_kill) 140ca9cf611b63e5576b596c21b73b1b639d250d649Christian König db_shader_control |= S_02880C_KILL_ENABLE(1); 141ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 142ca9cf611b63e5576b596c21b73b1b639d250d649Christian König exports_ps = 0; 143ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_cout = 0; 144ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (i = 0; i < shader->shader.noutput; i++) { 145ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.output[i].name == TGSI_SEMANTIC_POSITION || 146ca9cf611b63e5576b596c21b73b1b639d250d649Christian König shader->shader.output[i].name == TGSI_SEMANTIC_STENCIL) 147ca9cf611b63e5576b596c21b73b1b639d250d649Christian König exports_ps |= 1; 148ca9cf611b63e5576b596c21b73b1b639d250d649Christian König else if (shader->shader.output[i].name == TGSI_SEMANTIC_COLOR) { 149ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (shader->shader.fs_write_all) 150ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_cout = shader->shader.nr_cbufs; 151ca9cf611b63e5576b596c21b73b1b639d250d649Christian König else 152ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_cout++; 153ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 154ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 155ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (!exports_ps) { 156ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* always at least export 1 component per pixel */ 157ca9cf611b63e5576b596c21b73b1b639d250d649Christian König exports_ps = 2; 158ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 159ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 160ca9cf611b63e5576b596c21b73b1b639d250d649Christian König spi_ps_in_control = S_0286D8_NUM_INTERP(ninterp); 161ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 162ca9cf611b63e5576b596c21b73b1b639d250d649Christian König spi_baryc_cntl = 0; 163ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (have_perspective) 164ca9cf611b63e5576b596c21b73b1b639d250d649Christian König spi_baryc_cntl |= have_centroid ? 165ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_0286E0_PERSP_CENTROID_CNTL(1) : S_0286E0_PERSP_CENTER_CNTL(1); 166ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (have_linear) 167ca9cf611b63e5576b596c21b73b1b639d250d649Christian König spi_baryc_cntl |= have_centroid ? 168ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_0286E0_LINEAR_CENTROID_CNTL(1) : S_0286E0_LINEAR_CENTER_CNTL(1); 169ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 170ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_0286E0_SPI_BARYC_CNTL, spi_baryc_cntl); 17107838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König spi_ps_input_ena = shader->spi_ps_input_ena; 17207838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König /* we need to enable at least one of them, otherwise we hang the GPU */ 173f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König if (!G_0286CC_PERSP_SAMPLE_ENA(spi_ps_input_ena) && 174f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena) && 175f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_PERSP_PULL_MODEL_ENA(spi_ps_input_ena) && 176f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_LINEAR_SAMPLE_ENA(spi_ps_input_ena) && 177f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena) && 178f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena) && 179f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König !G_0286CC_LINE_STIPPLE_TEX_ENA(spi_ps_input_ena)) { 180f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König 18107838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König spi_ps_input_ena |= S_0286CC_PERSP_SAMPLE_ENA(1); 18207838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König } 18307838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König si_pm4_set_reg(pm4, R_0286CC_SPI_PS_INPUT_ENA, spi_ps_input_ena); 18407838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König si_pm4_set_reg(pm4, R_0286D0_SPI_PS_INPUT_ADDR, spi_ps_input_ena); 185ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_0286D8_SPI_PS_IN_CONTROL, spi_ps_in_control); 186ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 187ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* XXX: Depends on Z buffer format? */ 188ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028710_SPI_SHADER_Z_FORMAT, 0); 189ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 190ca9cf611b63e5576b596c21b73b1b639d250d649Christian König va = r600_resource_va(ctx->screen, (void *)shader->bo); 191ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ); 192ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B020_SPI_SHADER_PGM_LO_PS, va >> 8); 193ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B024_SPI_SHADER_PGM_HI_PS, va >> 40); 194ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 195ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_user_sgprs = 6; 196ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs = shader->num_sgprs; 197ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (num_user_sgprs > num_sgprs) 198ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs = num_user_sgprs; 199ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Last 2 reserved SGPRs are used for VCC */ 200ca9cf611b63e5576b596c21b73b1b639d250d649Christian König num_sgprs += 2; 201ca9cf611b63e5576b596c21b73b1b639d250d649Christian König assert(num_sgprs <= 104); 202ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 203ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B028_SPI_SHADER_PGM_RSRC1_PS, 204ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B028_VGPRS((shader->num_vgprs - 1) / 4) | 205ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B028_SGPRS((num_sgprs - 1) / 8)); 206ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_00B02C_SPI_SHADER_PGM_RSRC2_PS, 207ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_00B02C_USER_SGPR(num_user_sgprs)); 208ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 209ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_02880C_DB_SHADER_CONTROL, db_shader_control); 210ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 211ca9cf611b63e5576b596c21b73b1b639d250d649Christian König shader->sprite_coord_enable = rctx->sprite_coord_enable; 212ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_bind_state(rctx, ps, shader->pm4); 213ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 214ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 215ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* 216ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Drawing 217ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */ 218ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 219ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic unsigned si_conv_pipe_prim(unsigned pprim) 220ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 221ca9cf611b63e5576b596c21b73b1b639d250d649Christian König static const unsigned prim_conv[] = { 222ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_POINTS] = V_008958_DI_PT_POINTLIST, 223ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_LINES] = V_008958_DI_PT_LINELIST, 224ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_LINE_LOOP] = V_008958_DI_PT_LINELOOP, 225ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_LINE_STRIP] = V_008958_DI_PT_LINESTRIP, 226ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_TRIANGLES] = V_008958_DI_PT_TRILIST, 227ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_TRIANGLE_STRIP] = V_008958_DI_PT_TRISTRIP, 228ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_TRIANGLE_FAN] = V_008958_DI_PT_TRIFAN, 229ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_QUADS] = V_008958_DI_PT_QUADLIST, 230ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_QUAD_STRIP] = V_008958_DI_PT_QUADSTRIP, 231ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_POLYGON] = V_008958_DI_PT_POLYGON, 232ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_LINES_ADJACENCY] = ~0, 233ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_LINE_STRIP_ADJACENCY] = ~0, 234ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_TRIANGLES_ADJACENCY] = ~0, 235ca9cf611b63e5576b596c21b73b1b639d250d649Christian König [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = ~0 236ca9cf611b63e5576b596c21b73b1b639d250d649Christian König }; 237ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned result = prim_conv[pprim]; 238ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (result == ~0) { 239ca9cf611b63e5576b596c21b73b1b639d250d649Christian König R600_ERR("unsupported primitive type %d\n", pprim); 240ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 241ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return result; 242ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 243ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 244ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic bool si_update_draw_info_state(struct r600_context *rctx, 245ca9cf611b63e5576b596c21b73b1b639d250d649Christian König const struct pipe_draw_info *info) 246ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 247ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 248ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned prim = si_conv_pipe_prim(info->mode); 249ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned ls_mask = 0; 250ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 251ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (pm4 == NULL) 252ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return false; 253ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 254ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (prim == ~0) { 255ca9cf611b63e5576b596c21b73b1b639d250d649Christian König FREE(pm4); 256ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return false; 257ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 258ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 259ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_008958_VGT_PRIMITIVE_TYPE, prim); 260ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028400_VGT_MAX_VTX_INDX, ~0); 261ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028404_VGT_MIN_VTX_INDX, 0); 2629f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_set_reg(pm4, R_028408_VGT_INDX_OFFSET, 2639f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König info->indexed ? info->index_bias : info->start); 264ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, info->restart_index); 265ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, info->primitive_restart); 266ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0 267ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0); 268ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_03CFF4_SQ_VTX_START_INST_LOC, info->start_instance); 269ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif 270ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 271ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (prim == V_008958_DI_PT_LINELIST) 272ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ls_mask = 1; 273ca9cf611b63e5576b596c21b73b1b639d250d649Christian König else if (prim == V_008958_DI_PT_LINESTRIP) 274ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ls_mask = 2; 275ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028A0C_PA_SC_LINE_STIPPLE, 276ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_028A0C_AUTO_RESET_CNTL(ls_mask) | 277ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->pa_sc_line_stipple); 278ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 279ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (info->mode == PIPE_PRIM_QUADS || info->mode == PIPE_PRIM_QUAD_STRIP || info->mode == PIPE_PRIM_POLYGON) { 280ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028814_PA_SU_SC_MODE_CNTL, 281ca9cf611b63e5576b596c21b73b1b639d250d649Christian König S_028814_PROVOKING_VTX_LAST(1) | rctx->pa_su_sc_mode_cntl); 282ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } else { 283ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028814_PA_SU_SC_MODE_CNTL, rctx->pa_su_sc_mode_cntl); 284ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 285ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_02881C_PA_CL_VS_OUT_CNTL, 286ca9cf611b63e5576b596c21b73b1b639d250d649Christian König prim == PIPE_PRIM_POINTS ? rctx->pa_cl_vs_out_cntl : 0 287ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /*| (rctx->rasterizer->clip_plane_enable & 288ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->vs_shader->shader.clip_dist_write)*/); 289ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028810_PA_CL_CLIP_CNTL, rctx->pa_cl_clip_cntl 290ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /*| (rctx->vs_shader->shader.clip_dist_write || 291ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->vs_shader->shader.vs_prohibit_ucps ? 292ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 0 : rctx->rasterizer->clip_plane_enable & 0x3F)*/); 293ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 294ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_state(rctx, draw_info, pm4); 295ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return true; 296ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 297ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 298ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_alpha_ref(struct r600_context *rctx) 299ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 300ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0 301ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned alpha_ref; 302ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct r600_pipe_state rstate; 303ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 304ca9cf611b63e5576b596c21b73b1b639d250d649Christian König alpha_ref = rctx->alpha_ref; 305ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rstate.nregs = 0; 306ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->export_16bpc) 307ca9cf611b63e5576b596c21b73b1b639d250d649Christian König alpha_ref &= ~0x1FFF; 308ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(&rstate, R_028438_SX_ALPHA_REF, alpha_ref); 309ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 310ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_state(rctx, TODO, pm4); 311ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->alpha_ref_dirty = false; 312ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif 313ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 314ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 315ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_spi_map(struct r600_context *rctx) 316ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 317d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_shader *ps = &rctx->ps_shader->current->shader; 318d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_shader *vs = &rctx->vs_shader->current->shader; 319ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 320ca9cf611b63e5576b596c21b73b1b639d250d649Christian König unsigned i, j, tmp; 321ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 322ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (i = 0; i < ps->ninput; i++) { 323ca9cf611b63e5576b596c21b73b1b639d250d649Christian König tmp = 0; 324ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 325ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0 326ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* XXX: Flat shading hangs the GPU */ 327ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (ps->input[i].name == TGSI_SEMANTIC_POSITION || 328ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ps->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 329ca9cf611b63e5576b596c21b73b1b639d250d649Christian König (ps->input[i].interpolate == TGSI_INTERPOLATE_COLOR && 330ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->rasterizer && rctx->rasterizer->flatshade)) { 331ca9cf611b63e5576b596c21b73b1b639d250d649Christian König tmp |= S_028644_FLAT_SHADE(1); 332ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 333ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif 334ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 335ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (ps->input[i].name == TGSI_SEMANTIC_GENERIC && 336ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->sprite_coord_enable & (1 << ps->input[i].sid)) { 337ca9cf611b63e5576b596c21b73b1b639d250d649Christian König tmp |= S_028644_PT_SPRITE_TEX(1); 338ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 339ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 340ca9cf611b63e5576b596c21b73b1b639d250d649Christian König for (j = 0; j < vs->noutput; j++) { 341ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (ps->input[i].name == vs->output[j].name && 342ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ps->input[i].sid == vs->output[j].sid) { 343ca9cf611b63e5576b596c21b73b1b639d250d649Christian König tmp |= S_028644_OFFSET(vs->output[j].param_offset); 344ca9cf611b63e5576b596c21b73b1b639d250d649Christian König break; 345ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 346ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 347ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 348ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (j == vs->noutput) { 349ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* No corresponding output found, load defaults into input */ 350ca9cf611b63e5576b596c21b73b1b639d250d649Christian König tmp |= S_028644_OFFSET(0x20); 351ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 352ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 353ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_reg(pm4, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp); 354ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 355ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 356ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_state(rctx, spi, pm4); 357ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 358ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 359ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_derived_state(struct r600_context *rctx) 360ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 361ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct pipe_context * ctx = (struct pipe_context*)rctx; 362d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned ps_dirty = 0; 363ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 364ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (!rctx->blitter->running) { 365ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->have_depth_fb || rctx->have_depth_texture) 3661b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer si_flush_depth_textures(rctx); 367ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 368ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 369d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_shader_select(ctx, rctx->ps_shader, &ps_dirty); 370ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 371ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->alpha_ref_dirty) { 372ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_update_alpha_ref(rctx); 373ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 374ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 375d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (!rctx->vs_shader->current->pm4) { 376d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pipe_shader_vs(ctx, rctx->vs_shader->current); 377ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 378ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 379d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (!rctx->ps_shader->current->pm4) { 380d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pipe_shader_ps(ctx, rctx->ps_shader->current); 381d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer ps_dirty = 0; 382ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 383d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (!rctx->ps_shader->current->bo) { 384d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (!rctx->dummy_pixel_shader->pm4) 38582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer si_pipe_shader_ps(ctx, rctx->dummy_pixel_shader); 386d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer else 38782cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4); 388d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 389d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer ps_dirty = 0; 390d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 391d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 392d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (ps_dirty) { 393d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_bind_state(rctx, ps, rctx->ps_shader->current->pm4); 394d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->shader_dirty = true; 39582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer } 396ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 397ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->shader_dirty) { 398ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_update_spi_map(rctx); 399ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->shader_dirty = false; 400ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 401ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 402ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 403ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_vertex_buffer_update(struct r600_context *rctx) 404ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 405ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct pipe_context *ctx = &rctx->context; 406ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 407b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König bool bound[PIPE_MAX_ATTRIBS] = {}; 408b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König unsigned i, count; 409ca9cf611b63e5576b596c21b73b1b639d250d649Christian König uint64_t va; 410ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 411ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_inval_vertex_cache(pm4); 412ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 413ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* bind vertex buffer once */ 414b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König count = rctx->vertex_elements->count; 415ca9cf611b63e5576b596c21b73b1b639d250d649Christian König assert(count <= 256 / 4); 416ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 41754de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_begin(pm4); 41854de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König for (i = 0 ; i < count; i++) { 419b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König struct pipe_vertex_element *ve = &rctx->vertex_elements->elements[i]; 420b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König struct pipe_vertex_buffer *vb; 421b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König struct si_resource *rbuffer; 422b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König unsigned offset; 423b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 424b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König if (ve->vertex_buffer_index >= rctx->nr_vertex_buffers) 425ca9cf611b63e5576b596c21b73b1b639d250d649Christian König continue; 426b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 427b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König vb = &rctx->vertex_buffer[ve->vertex_buffer_index]; 428b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König rbuffer = (struct si_resource*)vb->buffer; 429b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König if (rbuffer == NULL) 430b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König continue; 431b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 432b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König offset = 0; 433b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König offset += vb->buffer_offset; 434b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König offset += ve->src_offset; 435ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 436ca9cf611b63e5576b596c21b73b1b639d250d649Christian König va = r600_resource_va(ctx->screen, (void*)rbuffer); 437ca9cf611b63e5576b596c21b73b1b639d250d649Christian König va += offset; 438ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 439ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Fill in T# buffer resource description */ 44054de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_add(pm4, va & 0xFFFFFFFF); 44154de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_add(pm4, (S_008F04_BASE_ADDRESS_HI(va >> 32) | 44254de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König S_008F04_STRIDE(vb->stride))); 44354de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_add(pm4, (vb->buffer->width0 - offset) / 44454de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König MAX2(vb->stride, 1)); 44554de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_add(pm4, rctx->vertex_elements->rsrc_word3[i]); 446b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 447b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König if (!bound[ve->vertex_buffer_index]) { 448b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ); 449b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König bound[ve->vertex_buffer_index] = true; 450b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König } 451ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 45254de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König si_pm4_sh_data_end(pm4, R_00B148_SPI_SHADER_USER_DATA_VS_6); 453ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_set_state(rctx, vertex_buffers, pm4); 454ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 455ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 4569f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian Königstatic void si_state_draw(struct r600_context *rctx, 4579f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König const struct pipe_draw_info *info, 4589f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König const struct pipe_index_buffer *ib) 4599f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König{ 4609f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 4619f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4629f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König /* queries need some special values 4639f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König * (this is non-zero if any query is active) */ 4649f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if (rctx->num_cs_dw_queries_suspend) { 4659f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König struct si_state_dsa *dsa = rctx->queued.named.dsa; 4669f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4679f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_set_reg(pm4, R_028004_DB_COUNT_CONTROL, 4689f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König S_028004_PERFECT_ZPASS_COUNTS(1)); 4699f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, 4709f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König dsa->db_render_override | 4719f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König S_02800C_NOOP_CULL_DISABLE(1)); 4729f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } 4739f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4749f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König /* draw packet */ 4759f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_begin(pm4, PKT3_INDEX_TYPE); 4769f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if (ib->index_size == 4) { 4779f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, V_028A7C_VGT_INDEX_32 | (R600_BIG_ENDIAN ? 4789f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König V_028A7C_VGT_DMA_SWAP_32_BIT : 0)); 4799f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } else { 4809f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, V_028A7C_VGT_INDEX_16 | (R600_BIG_ENDIAN ? 4819f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König V_028A7C_VGT_DMA_SWAP_16_BIT : 0)); 4829f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } 4839f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_end(pm4, rctx->predicate_drawing); 4849f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4859f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_begin(pm4, PKT3_NUM_INSTANCES); 4869f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, info->instance_count); 4879f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_end(pm4, rctx->predicate_drawing); 4889f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4899f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if (info->indexed) { 4909f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König uint64_t va; 4919f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König va = r600_resource_va(&rctx->screen->screen, ib->buffer); 4929f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König va += ib->offset; 4939f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 4949f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_add_bo(pm4, (struct si_resource *)ib->buffer, RADEON_USAGE_READ); 4959f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_2); 4969f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, (ib->buffer->width0 - ib->offset) / 4979f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König rctx->index_buffer.index_size); 4989f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, va); 4999f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, (va >> 32UL) & 0xFF); 5009f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, info->count); 5019f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_DMA); 5029f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_end(pm4, rctx->predicate_drawing); 5039f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } else { 5049f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_AUTO); 5059f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, info->count); 5069f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_AUTO_INDEX | 5079f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König (info->count_from_stream_output ? 5089f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König S_0287F0_USE_OPAQUE(1) : 0)); 5099f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_cmd_end(pm4, rctx->predicate_drawing); 5109f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } 5119f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_pm4_set_state(rctx, draw, pm4); 5129f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König} 5139f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König 5149f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian Königvoid si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) 515ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{ 516ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct r600_context *rctx = (struct r600_context *)ctx; 517ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct pipe_index_buffer ib = {}; 518583c212115795bef65da92761180ce830fafc927Christian König uint32_t cp_coher_cntl; 519ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5209f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if ((!info->count && (info->indexed || !info->count_from_stream_output)) || 5219f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König (info->indexed && !rctx->index_buffer.buffer)) { 522ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return; 523ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 524ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 525ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (!rctx->ps_shader || !rctx->vs_shader) 526ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return; 527ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 528ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_update_derived_state(rctx); 529ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_vertex_buffer_update(rctx); 530ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5319f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if (info->indexed) { 532ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Initialize the index buffer struct. */ 533ca9cf611b63e5576b596c21b73b1b639d250d649Christian König pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer); 534ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ib.index_size = rctx->index_buffer.index_size; 5359f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König ib.offset = rctx->index_buffer.offset + info->start * ib.index_size; 536ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 537ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Translate or upload, if needed. */ 5389f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König r600_translate_index_buffer(rctx, &ib, info->count); 539ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 540ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (ib.user_buffer) { 5419f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König r600_upload_index_buffer(rctx, &ib, info->count); 542ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 543ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5449f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König } else if (info->count_from_stream_output) { 5459f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König r600_context_draw_opaque_count(rctx, (struct r600_so_target*)info->count_from_stream_output); 546ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 547ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 548d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->vs_shader_so_strides = rctx->vs_shader->current->so_strides; 549ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5509f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König if (!si_update_draw_info_state(rctx, info)) 551ca9cf611b63e5576b596c21b73b1b639d250d649Christian König return; 552ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5539f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König si_state_draw(rctx, info, &ib); 554ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 555583c212115795bef65da92761180ce830fafc927Christian König cp_coher_cntl = si_pm4_sync_flags(rctx); 556583c212115795bef65da92761180ce830fafc927Christian König if (cp_coher_cntl) { 557583c212115795bef65da92761180ce830fafc927Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 558583c212115795bef65da92761180ce830fafc927Christian König si_cmd_surface_sync(pm4, cp_coher_cntl); 559583c212115795bef65da92761180ce830fafc927Christian König si_pm4_set_state(rctx, sync, pm4); 560583c212115795bef65da92761180ce830fafc927Christian König } 561583c212115795bef65da92761180ce830fafc927Christian König 562ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Emit states. */ 563ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->pm4_dirty_cdwords += si_pm4_dirty_dw(rctx); 564ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 5651b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer si_need_cs_space(rctx, 0, TRUE); 566ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 567ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_emit_dirty(rctx); 568ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->pm4_dirty_cdwords = 0; 569ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 570303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0 571ca9cf611b63e5576b596c21b73b1b639d250d649Christian König /* Enable stream out if needed. */ 572ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->streamout_start) { 573ca9cf611b63e5576b596c21b73b1b639d250d649Christian König r600_context_streamout_begin(rctx); 574ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->streamout_start = FALSE; 575ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 576303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif 577ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 578ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 579696b6cf46609281711add5331b9c3e1d0240ecbcChristian König rctx->flags |= R600_CONTEXT_DST_CACHES_DIRTY; 580ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 581ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (rctx->framebuffer.zsbuf) 582ca9cf611b63e5576b596c21b73b1b639d250d649Christian König { 583ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct pipe_resource *tex = rctx->framebuffer.zsbuf->texture; 584ca9cf611b63e5576b596c21b73b1b639d250d649Christian König ((struct r600_resource_texture *)tex)->dirty_db = TRUE; 585ca9cf611b63e5576b596c21b73b1b639d250d649Christian König } 586ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 587ca9cf611b63e5576b596c21b73b1b639d250d649Christian König pipe_resource_reference(&ib.buffer, NULL); 588ca9cf611b63e5576b596c21b73b1b639d250d649Christian König} 589