si_state.c revision ce40e4726cf30196b87df387255c64ddc2a97638
1bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König/* 2bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Copyright 2012 Advanced Micro Devices, Inc. 3bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 4bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Permission is hereby granted, free of charge, to any person obtaining a 5bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * copy of this software and associated documentation files (the "Software"), 6bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * to deal in the Software without restriction, including without limitation 7bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub 8bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * license, and/or sell copies of the Software, and to permit persons to whom 9bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * the Software is furnished to do so, subject to the following conditions: 10bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 11bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * The above copyright notice and this permission notice (including the next 12bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * paragraph) shall be included in all copies or substantial portions of the 13bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Software. 14bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 15bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE. 22bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 23bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Authors: 24bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Christian König <christian.koenig@amd.com> 25bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König */ 26bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 2763636ae52aefc275115d1f3daac4e75285583485Christian König#include "util/u_memory.h" 28835098a5290e59bb7b468eb987db67b0e1913c67Christian König#include "util/u_framebuffer.h" 29ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_blitter.h" 3073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#include "util/u_pack_color.h" 313c09f11e5cefd437bb8185539430786dc245c96fChristian König#include "tgsi/tgsi_parse.h" 3263636ae52aefc275115d1f3daac4e75285583485Christian König#include "radeonsi_pipe.h" 33ce40e4726cf30196b87df387255c64ddc2a97638Christian König#include "radeonsi_shader.h" 34bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#include "si_state.h" 3563636ae52aefc275115d1f3daac4e75285583485Christian König#include "sid.h" 3663636ae52aefc275115d1f3daac4e75285583485Christian König 3763636ae52aefc275115d1f3daac4e75285583485Christian König/* 3876660dfccede74782ac0d409da171ddbd61fae41Christian König * inferred framebuffer and blender state 3976660dfccede74782ac0d409da171ddbd61fae41Christian König */ 4076660dfccede74782ac0d409da171ddbd61fae41Christian Königstatic void si_update_fb_blend_state(struct r600_context *rctx) 4176660dfccede74782ac0d409da171ddbd61fae41Christian König{ 4276660dfccede74782ac0d409da171ddbd61fae41Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 4376660dfccede74782ac0d409da171ddbd61fae41Christian König struct si_state_blend *blend = rctx->queued.named.blend; 4476660dfccede74782ac0d409da171ddbd61fae41Christian König uint32_t mask; 4576660dfccede74782ac0d409da171ddbd61fae41Christian König 4676660dfccede74782ac0d409da171ddbd61fae41Christian König if (pm4 == NULL || blend == NULL) 4776660dfccede74782ac0d409da171ddbd61fae41Christian König return; 4876660dfccede74782ac0d409da171ddbd61fae41Christian König 4976660dfccede74782ac0d409da171ddbd61fae41Christian König mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1; 5076660dfccede74782ac0d409da171ddbd61fae41Christian König mask &= blend->cb_target_mask; 5176660dfccede74782ac0d409da171ddbd61fae41Christian König si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); 5276660dfccede74782ac0d409da171ddbd61fae41Christian König 5376660dfccede74782ac0d409da171ddbd61fae41Christian König si_pm4_set_state(rctx, fb_blend, pm4); 5476660dfccede74782ac0d409da171ddbd61fae41Christian König} 5576660dfccede74782ac0d409da171ddbd61fae41Christian König 5676660dfccede74782ac0d409da171ddbd61fae41Christian König/* 5763636ae52aefc275115d1f3daac4e75285583485Christian König * Blender functions 5863636ae52aefc275115d1f3daac4e75285583485Christian König */ 5963636ae52aefc275115d1f3daac4e75285583485Christian König 6063636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_function(int blend_func) 6163636ae52aefc275115d1f3daac4e75285583485Christian König{ 6263636ae52aefc275115d1f3daac4e75285583485Christian König switch (blend_func) { 6363636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_ADD: 6463636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_DST_PLUS_SRC; 6563636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_SUBTRACT: 6663636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_SRC_MINUS_DST; 6763636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_REVERSE_SUBTRACT: 6863636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_DST_MINUS_SRC; 6963636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_MIN: 7063636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_MIN_DST_SRC; 7163636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_MAX: 7263636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_MAX_DST_SRC; 7363636ae52aefc275115d1f3daac4e75285583485Christian König default: 7463636ae52aefc275115d1f3daac4e75285583485Christian König R600_ERR("Unknown blend function %d\n", blend_func); 7563636ae52aefc275115d1f3daac4e75285583485Christian König assert(0); 7663636ae52aefc275115d1f3daac4e75285583485Christian König break; 7763636ae52aefc275115d1f3daac4e75285583485Christian König } 7863636ae52aefc275115d1f3daac4e75285583485Christian König return 0; 7963636ae52aefc275115d1f3daac4e75285583485Christian König} 8063636ae52aefc275115d1f3daac4e75285583485Christian König 8163636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_factor(int blend_fact) 8263636ae52aefc275115d1f3daac4e75285583485Christian König{ 8363636ae52aefc275115d1f3daac4e75285583485Christian König switch (blend_fact) { 8463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_ONE: 8563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE; 8663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_COLOR: 8763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_COLOR; 8863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_ALPHA: 8963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_ALPHA; 9063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_DST_ALPHA: 9163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_DST_ALPHA; 9263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_DST_COLOR: 9363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_DST_COLOR; 9463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 9563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_ALPHA_SATURATE; 9663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_CONST_COLOR: 9763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_CONSTANT_COLOR; 9863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_CONST_ALPHA: 9963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_CONSTANT_ALPHA; 10063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_ZERO: 10163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ZERO; 10263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC_COLOR: 10363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_SRC_COLOR; 10463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 10563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_SRC_ALPHA; 10663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_DST_ALPHA: 10763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_DST_ALPHA; 10863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_DST_COLOR: 10963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_DST_COLOR; 11063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_CONST_COLOR: 11163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR; 11263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 11363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA; 11463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC1_COLOR: 11563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC1_COLOR; 11663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC1_ALPHA: 11763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC1_ALPHA; 11863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 11963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_INV_SRC1_COLOR; 12063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 12163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_INV_SRC1_ALPHA; 12263636ae52aefc275115d1f3daac4e75285583485Christian König default: 12363636ae52aefc275115d1f3daac4e75285583485Christian König R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 12463636ae52aefc275115d1f3daac4e75285583485Christian König assert(0); 12563636ae52aefc275115d1f3daac4e75285583485Christian König break; 12663636ae52aefc275115d1f3daac4e75285583485Christian König } 12763636ae52aefc275115d1f3daac4e75285583485Christian König return 0; 12863636ae52aefc275115d1f3daac4e75285583485Christian König} 12963636ae52aefc275115d1f3daac4e75285583485Christian König 13063636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void *si_create_blend_state(struct pipe_context *ctx, 13163636ae52aefc275115d1f3daac4e75285583485Christian König const struct pipe_blend_state *state) 13263636ae52aefc275115d1f3daac4e75285583485Christian König{ 13363636ae52aefc275115d1f3daac4e75285583485Christian König struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend); 13463636ae52aefc275115d1f3daac4e75285583485Christian König struct si_pm4_state *pm4 = &blend->pm4; 13563636ae52aefc275115d1f3daac4e75285583485Christian König 13663636ae52aefc275115d1f3daac4e75285583485Christian König uint32_t color_control; 13763636ae52aefc275115d1f3daac4e75285583485Christian König 13863636ae52aefc275115d1f3daac4e75285583485Christian König if (blend == NULL) 13963636ae52aefc275115d1f3daac4e75285583485Christian König return NULL; 14063636ae52aefc275115d1f3daac4e75285583485Christian König 14163636ae52aefc275115d1f3daac4e75285583485Christian König color_control = S_028808_MODE(V_028808_CB_NORMAL); 14263636ae52aefc275115d1f3daac4e75285583485Christian König if (state->logicop_enable) { 14363636ae52aefc275115d1f3daac4e75285583485Christian König color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4)); 14463636ae52aefc275115d1f3daac4e75285583485Christian König } else { 14563636ae52aefc275115d1f3daac4e75285583485Christian König color_control |= S_028808_ROP3(0xcc); 14663636ae52aefc275115d1f3daac4e75285583485Christian König } 14763636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control); 14863636ae52aefc275115d1f3daac4e75285583485Christian König 14963636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0); 15063636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0); 15163636ae52aefc275115d1f3daac4e75285583485Christian König 15263636ae52aefc275115d1f3daac4e75285583485Christian König blend->cb_target_mask = 0; 15363636ae52aefc275115d1f3daac4e75285583485Christian König for (int i = 0; i < 8; i++) { 15463636ae52aefc275115d1f3daac4e75285583485Christian König /* state->rt entries > 0 only written if independent blending */ 15563636ae52aefc275115d1f3daac4e75285583485Christian König const int j = state->independent_blend_enable ? i : 0; 15663636ae52aefc275115d1f3daac4e75285583485Christian König 15763636ae52aefc275115d1f3daac4e75285583485Christian König unsigned eqRGB = state->rt[j].rgb_func; 15863636ae52aefc275115d1f3daac4e75285583485Christian König unsigned srcRGB = state->rt[j].rgb_src_factor; 15963636ae52aefc275115d1f3daac4e75285583485Christian König unsigned dstRGB = state->rt[j].rgb_dst_factor; 16063636ae52aefc275115d1f3daac4e75285583485Christian König unsigned eqA = state->rt[j].alpha_func; 16163636ae52aefc275115d1f3daac4e75285583485Christian König unsigned srcA = state->rt[j].alpha_src_factor; 16263636ae52aefc275115d1f3daac4e75285583485Christian König unsigned dstA = state->rt[j].alpha_dst_factor; 16363636ae52aefc275115d1f3daac4e75285583485Christian König 16463636ae52aefc275115d1f3daac4e75285583485Christian König unsigned blend_cntl = 0; 16563636ae52aefc275115d1f3daac4e75285583485Christian König 16663636ae52aefc275115d1f3daac4e75285583485Christian König /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 16763636ae52aefc275115d1f3daac4e75285583485Christian König blend->cb_target_mask |= state->rt[j].colormask << (4 * i); 16863636ae52aefc275115d1f3daac4e75285583485Christian König 16963636ae52aefc275115d1f3daac4e75285583485Christian König if (!state->rt[j].blend_enable) { 17063636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 17163636ae52aefc275115d1f3daac4e75285583485Christian König continue; 17263636ae52aefc275115d1f3daac4e75285583485Christian König } 17363636ae52aefc275115d1f3daac4e75285583485Christian König 17463636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ENABLE(1); 17563636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB)); 17663636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB)); 17763636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB)); 17863636ae52aefc275115d1f3daac4e75285583485Christian König 17963636ae52aefc275115d1f3daac4e75285583485Christian König if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 18063636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1); 18163636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA)); 18263636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA)); 18363636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA)); 18463636ae52aefc275115d1f3daac4e75285583485Christian König } 18563636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 18663636ae52aefc275115d1f3daac4e75285583485Christian König } 18763636ae52aefc275115d1f3daac4e75285583485Christian König 18863636ae52aefc275115d1f3daac4e75285583485Christian König return blend; 18963636ae52aefc275115d1f3daac4e75285583485Christian König} 19063636ae52aefc275115d1f3daac4e75285583485Christian König 19163636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_bind_blend_state(struct pipe_context *ctx, void *state) 19263636ae52aefc275115d1f3daac4e75285583485Christian König{ 19363636ae52aefc275115d1f3daac4e75285583485Christian König struct r600_context *rctx = (struct r600_context *)ctx; 19463636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state); 19576660dfccede74782ac0d409da171ddbd61fae41Christian König si_update_fb_blend_state(rctx); 19663636ae52aefc275115d1f3daac4e75285583485Christian König} 19763636ae52aefc275115d1f3daac4e75285583485Christian König 19863636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_delete_blend_state(struct pipe_context *ctx, void *state) 19963636ae52aefc275115d1f3daac4e75285583485Christian König{ 20063636ae52aefc275115d1f3daac4e75285583485Christian König struct r600_context *rctx = (struct r600_context *)ctx; 20163636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state); 20263636ae52aefc275115d1f3daac4e75285583485Christian König} 20363636ae52aefc275115d1f3daac4e75285583485Christian König 2040a091a48242513e53a99976239405e8cb72d96beChristian Königstatic void si_set_blend_color(struct pipe_context *ctx, 2050a091a48242513e53a99976239405e8cb72d96beChristian König const struct pipe_blend_color *state) 2060a091a48242513e53a99976239405e8cb72d96beChristian König{ 2070a091a48242513e53a99976239405e8cb72d96beChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2080a091a48242513e53a99976239405e8cb72d96beChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2090a091a48242513e53a99976239405e8cb72d96beChristian König 2100a091a48242513e53a99976239405e8cb72d96beChristian König if (pm4 == NULL) 2110a091a48242513e53a99976239405e8cb72d96beChristian König return; 2120a091a48242513e53a99976239405e8cb72d96beChristian König 2130a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0])); 2140a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1])); 2150a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2])); 2160a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3])); 2170a091a48242513e53a99976239405e8cb72d96beChristian König 2180a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_state(rctx, blend_color, pm4); 2190a091a48242513e53a99976239405e8cb72d96beChristian König} 2200a091a48242513e53a99976239405e8cb72d96beChristian König 221835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 222835098a5290e59bb7b468eb987db67b0e1913c67Christian König * Clipping, scissors and viewport 223835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 224835098a5290e59bb7b468eb987db67b0e1913c67Christian König 2259cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian Königstatic void si_set_clip_state(struct pipe_context *ctx, 2269cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König const struct pipe_clip_state *state) 2279cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König{ 2289cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König struct r600_context *rctx = (struct r600_context *)ctx; 2299cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2309cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2319cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König if (pm4 == NULL) 2329cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König return; 2339cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2349cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König for (int i = 0; i < 6; i++) { 2359cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16, 2369cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][0])); 2379cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16, 2389cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][1])); 2399cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16, 2409cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][2])); 2419cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16, 2429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][3])); 2439cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König } 2449cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2459cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_state(rctx, clip, pm4); 2469cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König} 2479cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 24843f414f7b76902a728d26231d4cc047b794df10bChristian Königstatic void si_set_scissor_state(struct pipe_context *ctx, 24943f414f7b76902a728d26231d4cc047b794df10bChristian König const struct pipe_scissor_state *state) 25043f414f7b76902a728d26231d4cc047b794df10bChristian König{ 25143f414f7b76902a728d26231d4cc047b794df10bChristian König struct r600_context *rctx = (struct r600_context *)ctx; 25243f414f7b76902a728d26231d4cc047b794df10bChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 25343f414f7b76902a728d26231d4cc047b794df10bChristian König uint32_t tl, br; 25443f414f7b76902a728d26231d4cc047b794df10bChristian König 25543f414f7b76902a728d26231d4cc047b794df10bChristian König if (pm4 == NULL) 25643f414f7b76902a728d26231d4cc047b794df10bChristian König return; 25743f414f7b76902a728d26231d4cc047b794df10bChristian König 25843f414f7b76902a728d26231d4cc047b794df10bChristian König tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny); 25943f414f7b76902a728d26231d4cc047b794df10bChristian König br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 26043f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl); 26143f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br); 26243f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl); 26343f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br); 26443f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl); 26543f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br); 26643f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl); 26743f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br); 26843f414f7b76902a728d26231d4cc047b794df10bChristian König 26943f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_state(rctx, scissor, pm4); 27043f414f7b76902a728d26231d4cc047b794df10bChristian König} 27143f414f7b76902a728d26231d4cc047b794df10bChristian König 2727e011d92c9746ba4050890442db6e504fa42c4adChristian Königstatic void si_set_viewport_state(struct pipe_context *ctx, 2737e011d92c9746ba4050890442db6e504fa42c4adChristian König const struct pipe_viewport_state *state) 2747e011d92c9746ba4050890442db6e504fa42c4adChristian König{ 2757e011d92c9746ba4050890442db6e504fa42c4adChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2767e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport); 2777e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state *pm4 = &viewport->pm4; 2787e011d92c9746ba4050890442db6e504fa42c4adChristian König 2797e011d92c9746ba4050890442db6e504fa42c4adChristian König if (viewport == NULL) 2807e011d92c9746ba4050890442db6e504fa42c4adChristian König return; 2817e011d92c9746ba4050890442db6e504fa42c4adChristian König 2827e011d92c9746ba4050890442db6e504fa42c4adChristian König viewport->viewport = *state; 2837e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000); 2847e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000); 2857e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028350_PA_SC_RASTER_CONFIG, 0x00000000); 2867e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0])); 2877e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0])); 2887e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1])); 2897e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1])); 2907e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2])); 2917e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2])); 2927e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F); 2937e011d92c9746ba4050890442db6e504fa42c4adChristian König 2947e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_state(rctx, viewport, viewport); 2957e011d92c9746ba4050890442db6e504fa42c4adChristian König} 2967e011d92c9746ba4050890442db6e504fa42c4adChristian König 297835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 298bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König * inferred state between framebuffer and rasterizer 299bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König */ 300bd18a316e1495f501911d89c8b373382d1f8c8c2Christian Königstatic void si_update_fb_rs_state(struct r600_context *rctx) 301bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König{ 302bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König struct si_state_rasterizer *rs = rctx->queued.named.rasterizer; 303bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 304bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König unsigned offset_db_fmt_cntl = 0, depth; 305bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König float offset_units; 306bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 307bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König if (!rs || !rctx->framebuffer.zsbuf) { 308bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König FREE(pm4); 309bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König return; 310bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König } 311bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 312bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units = rctx->queued.named.rasterizer->offset_units; 313bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König switch (rctx->framebuffer.zsbuf->texture->format) { 314bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z24X8_UNORM: 315bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 316bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -24; 317bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 2.0f; 318bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 319bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z32_FLOAT: 320bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 321bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -23; 322bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 1.0f; 323bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 324bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 325bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z16_UNORM: 326bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -16; 327bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 4.0f; 328bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 329bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König default: 330bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König return; 331bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König } 332bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 333bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König /* FIXME some of those reg can be computed with cso */ 334bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 335bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE, 336bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König fui(rctx->queued.named.rasterizer->offset_scale)); 337bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units)); 338bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE, 339bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König fui(rctx->queued.named.rasterizer->offset_scale)); 340bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units)); 341bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl); 342bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 343bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_state(rctx, fb_rs, pm4); 344bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König} 345bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 346bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König/* 347f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König * Rasterizer 348f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König */ 349f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 350f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic uint32_t si_translate_fill(uint32_t func) 351f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 352f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König switch(func) { 353f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_FILL: 354f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_TRIANGLES; 355f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_LINE: 356f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_LINES; 357f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_POINT: 358f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_POINTS; 359f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König default: 360f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König assert(0); 361f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_POINTS; 362f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 363f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 364f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 365f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void *si_create_rs_state(struct pipe_context *ctx, 366f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König const struct pipe_rasterizer_state *state) 367f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 368f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer); 369f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_pm4_state *pm4 = &rs->pm4; 370f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned tmp; 371f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned prov_vtx = 1, polygon_dual_mode; 372f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned clip_rule; 373f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König float psize_min, psize_max; 374f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 375f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (rs == NULL) { 376f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return NULL; 377f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 378f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 379f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 380f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König state->fill_back != PIPE_POLYGON_MODE_FILL); 381f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 382f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->flatshade_first) 383f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König prov_vtx = 0; 384f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 385f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->flatshade = state->flatshade; 386f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->sprite_coord_enable = state->sprite_coord_enable; 387f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_sc_line_stipple = state->line_stipple_enable ? 388f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 389f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 390f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_su_sc_mode_cntl = 391f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_PROVOKING_VTX_LAST(prov_vtx) | 392f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) | 393f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) | 394f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_FACE(!state->front_ccw) | 395f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 396f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 397f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 398f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_MODE(polygon_dual_mode) | 399f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) | 400f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back)); 401f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_cl_clip_cntl = 402f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_PS_UCP_MODE(3) | 403f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 404f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 405f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 406f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_cl_vs_out_cntl = 407f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) | 408f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex); 409f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 410f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König clip_rule = state->scissor ? 0xAAAA : 0xFFFF; 411f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 412f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* offset */ 413f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->offset_units = state->offset_units; 414f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->offset_scale = state->offset_scale * 12.0f; 415f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 416f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* XXX: Flat shading hangs the GPU */ 417f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = S_0286D4_FLAT_SHADE_ENA(0); 418f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->sprite_coord_enable) { 419f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 420f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) | 421f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) | 422f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) | 423f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1); 424f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 425f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 426f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 427f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 428f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp); 429f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 430f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000); 431f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* point size 12.4 fixed point */ 432f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = (unsigned)(state->point_size * 8.0); 433f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp)); 434f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 435f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->point_size_per_vertex) { 436f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_min = util_get_min_point_size(state); 437f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_max = 8192; 438f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } else { 439f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* Force the point size to be as if the vertex output was disabled. */ 440f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_min = state->point_size; 441f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_max = state->point_size; 442f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* Divide by two, because 0.5 = 1 pixel. */ 444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX, 445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2))); 447f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 448f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = (unsigned)state->line_width * 8; 449f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp)); 450f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0, 451f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable)); 452f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 453f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400); 454f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL, 455f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028BE4_PIX_CENTER(state->gl_rasterization_rules)); 456f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000); 457f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000); 458f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000); 459f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000); 460f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 461f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp)); 462f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule); 463f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 464f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return rs; 465f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 466f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 467f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_bind_rs_state(struct pipe_context *ctx, void *state) 468f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 469f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct r600_context *rctx = (struct r600_context *)ctx; 470f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state; 471f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 472f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state == NULL) 473f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return; 474f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 475f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König // TODO 476f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->sprite_coord_enable = rs->sprite_coord_enable; 477f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple; 478f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl; 479f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl; 480f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl; 481f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 482f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_bind_state(rctx, rasterizer, rs); 483bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_update_fb_rs_state(rctx); 484f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 485f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 486f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_delete_rs_state(struct pipe_context *ctx, void *state) 487f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 488f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct r600_context *rctx = (struct r600_context *)ctx; 489f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state); 490f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 491f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 492f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König/* 493e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König * infeered state between dsa and stencil ref 494e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König */ 495e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_update_dsa_stencil_ref(struct r600_context *rctx) 496e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{ 497e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 498e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct pipe_stencil_ref *ref = &rctx->stencil_ref; 499e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct si_state_dsa *dsa = rctx->queued.named.dsa; 500e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 501e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König if (pm4 == NULL) 502e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König return; 503e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 504e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK, 505e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILTESTVAL(ref->ref_value[0]) | 506e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILMASK(dsa->valuemask[0]) | 507e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILWRITEMASK(dsa->writemask[0])); 508e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF, 509e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) | 510e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILMASK_BF(dsa->valuemask[1]) | 511e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILWRITEMASK_BF(dsa->writemask[1])); 512e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 513e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_state(rctx, dsa_stencil_ref, pm4); 514e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König} 515e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 516e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx, 517e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König const struct pipe_stencil_ref *state) 518e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{ 519e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct r600_context *rctx = (struct r600_context *)ctx; 520e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König rctx->stencil_ref = *state; 521e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_update_dsa_stencil_ref(rctx); 522e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König} 523e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 524e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 525e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König/* 526b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König * DSA 527b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König */ 528b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 5297dace3a3cf894adb51a21ff6b08f58608ea33831Christian Königstatic uint32_t si_translate_stencil_op(int s_op) 530b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 5317dace3a3cf894adb51a21ff6b08f58608ea33831Christian König switch (s_op) { 5327dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_KEEP: 5337dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_KEEP; 5347dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_ZERO: 5357dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ZERO; 5367dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_REPLACE: 5377dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_REPLACE_TEST; 5387dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INCR: 5397dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ADD_CLAMP; 5407dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_DECR: 5417dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_SUB_CLAMP; 5427dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INCR_WRAP: 5437dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ADD_WRAP; 5447dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_DECR_WRAP: 5457dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_SUB_WRAP; 5467dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INVERT: 5477dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_INVERT; 5487dace3a3cf894adb51a21ff6b08f58608ea33831Christian König default: 5497dace3a3cf894adb51a21ff6b08f58608ea33831Christian König R600_ERR("Unknown stencil op %d", s_op); 5507dace3a3cf894adb51a21ff6b08f58608ea33831Christian König assert(0); 5517dace3a3cf894adb51a21ff6b08f58608ea33831Christian König break; 5527dace3a3cf894adb51a21ff6b08f58608ea33831Christian König } 5537dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return 0; 554b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 555b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 556b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_dsa_state(struct pipe_context *ctx, 557b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König const struct pipe_depth_stencil_alpha_state *state) 558b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 559b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa); 560b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_pm4_state *pm4 = &dsa->pm4; 561b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_depth_control, /* alpha_test_control, */ alpha_ref; 562b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_render_override, db_render_control; 5637dace3a3cf894adb51a21ff6b08f58608ea33831Christian König uint32_t db_stencil_control = 0; 564b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 565b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (dsa == NULL) { 566b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return NULL; 567b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 568b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 569b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->valuemask[0] = state->stencil[0].valuemask; 570b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->valuemask[1] = state->stencil[1].valuemask; 571b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->writemask[0] = state->stencil[0].writemask; 572b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->writemask[1] = state->stencil[1].writemask; 573b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 574b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 575b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 576b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028800_ZFUNC(state->depth.func); 577b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 578b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* stencil */ 579b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->stencil[0].enabled) { 580b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control |= S_028800_STENCIL_ENABLE(1); 5817dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); 5827dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op)); 5837dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op)); 5847dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op)); 585b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 586b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->stencil[1].enabled) { 587b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control |= S_028800_BACKFACE_ENABLE(1); 5887dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); 5897dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op)); 5907dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op)); 5917dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op)); 592b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 593b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 594b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 595b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* alpha */ 596b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control = 0; 597b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König alpha_ref = 0; 598b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->alpha.enabled) { 599b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 600b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 601b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König alpha_ref = fui(state->alpha.ref_value); 602b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 603b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->alpha_ref = alpha_ref; 604b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 605b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* misc */ 606b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_render_control = 0; 607b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) | 608b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) | 609b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE); 610b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* TODO db_render_override depends on query */ 611b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000); 612b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000); 613b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000); 614b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000); 615b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control); 616b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control); 617b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control); 618b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override); 6197dace3a3cf894adb51a21ff6b08f58608ea33831Christian König si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control); 620b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0); 621b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0); 622b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0); 623b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00); 624b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->db_render_override = db_render_override; 625b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 626b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return dsa; 627b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 628b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 629b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state) 630b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 631b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct r600_context *rctx = (struct r600_context *)ctx; 632b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *dsa = state; 633b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 634b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state == NULL) 635b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return; 636b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 637b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_bind_state(rctx, dsa, dsa); 638e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_update_dsa_stencil_ref(rctx); 639b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 640b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König // TODO 641b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->alpha_ref = dsa->alpha_ref; 642b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->alpha_ref_dirty = true; 643b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 644b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 645b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state) 646b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 647b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct r600_context *rctx = (struct r600_context *)ctx; 648b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state); 649b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 650b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 651b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_db_flush_dsa(struct r600_context *rctx) 652b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 653b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct pipe_depth_stencil_alpha_state dsa; 654b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *state; 655b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 656b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König memset(&dsa, 0, sizeof(dsa)); 657b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 658b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 659b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL, 660b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_DEPTH_COPY(1) | 661b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_STENCIL_COPY(1) | 662b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_COPY_CENTROID(1)); 663b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return state; 664b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 665b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 666b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König/* 667835098a5290e59bb7b468eb987db67b0e1913c67Christian König * format translation 668835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 669835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorformat(enum pipe_format format) 670835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 671835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 672835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 673835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UNORM: 674835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UINT: 675835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_SINT: 676835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UNORM: 677835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UINT: 678835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_SINT: 679835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UNORM: 680835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UINT: 681835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SINT: 682835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SRGB: 683835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UNORM: 684835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SNORM: 685835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UINT: 686835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SINT: 687835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8; 688835098a5290e59bb7b468eb987db67b0e1913c67Christian König 689835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 690835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G6R5_UNORM: 691835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_5_6_5; 692835098a5290e59bb7b468eb987db67b0e1913c67Christian König 693835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5A1_UNORM: 694835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5X1_UNORM: 695835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_1_5_5_5; 696835098a5290e59bb7b468eb987db67b0e1913c67Christian König 697835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4A4_UNORM: 698835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4X4_UNORM: 699835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_4_4_4_4; 700835098a5290e59bb7b468eb987db67b0e1913c67Christian König 701835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UNORM: 702835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UINT: 703835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SINT: 704835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SRGB: 705835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UNORM: 706835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UINT: 707835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_SINT: 708835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_8; 709835098a5290e59bb7b468eb987db67b0e1913c67Christian König 710835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 711835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UNORM: 712835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UINT: 713835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_SINT: 714835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_FLOAT: 715835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_FLOAT: 716835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16; 717835098a5290e59bb7b468eb987db67b0e1913c67Christian König 718835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 719835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_SRGB: 720835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_UNORM: 721835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8R8G8B8_UNORM: 722835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_SRGB: 723835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_UNORM: 724835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8X8_UNORM: 725835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SNORM: 726835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UNORM: 727835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8X8_UNORM: 728835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 729835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8B8G8R8_UNORM: 730835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8R8G8B8_UNORM: 731835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8_UNORM: 732835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SSCALED: 733835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_USCALED: 734835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SINT: 735835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UINT: 736835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_8_8_8; 737835098a5290e59bb7b468eb987db67b0e1913c67Christian König 738835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10A2_UNORM: 739835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10X2_SNORM: 740835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UNORM: 741835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UINT: 742835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 743835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_2_10_10_10; 744835098a5290e59bb7b468eb987db67b0e1913c67Christian König 745835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 746835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 747835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_24; 748835098a5290e59bb7b468eb987db67b0e1913c67Christian König 749835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8Z24_UNORM: 750835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 751835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_24_8; 752835098a5290e59bb7b468eb987db67b0e1913c67Christian König 753835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 754835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_X24_8_32_FLOAT; 755835098a5290e59bb7b468eb987db67b0e1913c67Christian König 756835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_FLOAT: 757835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 758835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32; 759835098a5290e59bb7b468eb987db67b0e1913c67Christian König 760835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SSCALED: 761835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UNORM: 762835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UINT: 763835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SINT: 764835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16_16; 765835098a5290e59bb7b468eb987db67b0e1913c67Christian König 766835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R11G11B10_FLOAT: 767835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_10_11_11; 768835098a5290e59bb7b468eb987db67b0e1913c67Christian König 769835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 770835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_USCALED: 771835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_SSCALED: 772835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UINT: 773835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SINT: 774835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_USCALED: 775835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SSCALED: 776835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UNORM: 777835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SNORM: 778835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_FLOAT: 779835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_FLOAT: 780835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16_16_16_16; 781835098a5290e59bb7b468eb987db67b0e1913c67Christian König 782835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_FLOAT: 783835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_USCALED: 784835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SSCALED: 785835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SINT: 786835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_UINT: 787835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32_32; 788835098a5290e59bb7b468eb987db67b0e1913c67Christian König 789835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 790835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SNORM: 791835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UNORM: 792835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SSCALED: 793835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_USCALED: 794835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SINT: 795835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UINT: 796835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_FLOAT: 797835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32_32_32_32; 798835098a5290e59bb7b468eb987db67b0e1913c67Christian König 799835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* YUV buffers. */ 800835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_UYVY: 801835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_YUYV: 802835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 96-bit buffers. */ 803835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32_FLOAT: 804835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 805835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L4A4_UNORM: 806835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R4A4_UNORM: 807835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A4R4_UNORM: 808835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 809835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; /* Unsupported. */ 810835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 811835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 812835098a5290e59bb7b468eb987db67b0e1913c67Christian König 813835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorswap(enum pipe_format format) 814835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 815835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 816835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 817835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L4A4_UNORM: 818835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A4R4_UNORM: 819835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 820835098a5290e59bb7b468eb987db67b0e1913c67Christian König 821835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UNORM: 822835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UINT: 823835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_SINT: 824835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R4A4_UNORM: 825835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT_REV; 826835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UNORM: 827835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UNORM: 828835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UINT: 829835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_SINT: 830835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UINT: 831835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SINT: 832835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SRGB: 833835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UNORM: 834835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SNORM: 835835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UINT: 836835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SINT: 837835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 838835098a5290e59bb7b468eb987db67b0e1913c67Christian König 839835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 840835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G6R5_UNORM: 841835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 842835098a5290e59bb7b468eb987db67b0e1913c67Christian König 843835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5A1_UNORM: 844835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5X1_UNORM: 845835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 846835098a5290e59bb7b468eb987db67b0e1913c67Christian König 847835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4A4_UNORM: 848835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4X4_UNORM: 849835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 850835098a5290e59bb7b468eb987db67b0e1913c67Christian König 851835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 852835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 853835098a5290e59bb7b468eb987db67b0e1913c67Christian König 854835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UNORM: 855835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UINT: 856835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SINT: 857835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SRGB: 858835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 859835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UNORM: 860835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UINT: 861835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_SINT: 862835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 863835098a5290e59bb7b468eb987db67b0e1913c67Christian König 864835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UNORM: 865835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UINT: 866835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_SINT: 867835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_FLOAT: 868835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 869835098a5290e59bb7b468eb987db67b0e1913c67Christian König 870835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 871835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_SRGB: 872835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 873835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_SRGB: 874835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 875835098a5290e59bb7b468eb987db67b0e1913c67Christian König 876835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_UNORM: 877835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8X8_UNORM: 878835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 879835098a5290e59bb7b468eb987db67b0e1913c67Christian König 880835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8R8G8B8_UNORM: 881835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8R8G8B8_UNORM: 882835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT_REV; 883835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SNORM: 884835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UNORM: 885835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SSCALED: 886835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_USCALED: 887835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SINT: 888835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UINT: 889835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8X8_UNORM: 890835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 891835098a5290e59bb7b468eb987db67b0e1913c67Christian König 892835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_UNORM: 893835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8B8G8R8_UNORM: 894835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 895835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 896835098a5290e59bb7b468eb987db67b0e1913c67Christian König 897835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 898835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 899835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 900835098a5290e59bb7b468eb987db67b0e1913c67Christian König 901835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8Z24_UNORM: 902835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 903835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 904835098a5290e59bb7b468eb987db67b0e1913c67Christian König 905835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10A2_UNORM: 906835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10X2_SNORM: 907835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 908835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 909835098a5290e59bb7b468eb987db67b0e1913c67Christian König 910835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UNORM: 911835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UINT: 912835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 913835098a5290e59bb7b468eb987db67b0e1913c67Christian König 914835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R11G11B10_FLOAT: 915835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_FLOAT: 916835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_UINT: 917835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_SINT: 918835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 919835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_FLOAT: 920835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UNORM: 921835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UINT: 922835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SINT: 923835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 924835098a5290e59bb7b468eb987db67b0e1913c67Christian König 925835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 926835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_FLOAT: 927835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_UINT: 928835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SINT: 929835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UNORM: 930835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SNORM: 931835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_USCALED: 932835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SSCALED: 933835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UINT: 934835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SINT: 935835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_FLOAT: 936835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 937835098a5290e59bb7b468eb987db67b0e1913c67Christian König 938835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 939835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_FLOAT: 940835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SNORM: 941835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UNORM: 942835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SSCALED: 943835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_USCALED: 944835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SINT: 945835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UINT: 946835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 947835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 948835098a5290e59bb7b468eb987db67b0e1913c67Christian König R600_ERR("unsupported colorswap format %d\n", format); 949835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 950835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 951835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 952835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 953835098a5290e59bb7b468eb987db67b0e1913c67Christian König 954835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat) 955835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 956835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (R600_BIG_ENDIAN) { 957835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch(colorformat) { 958835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 959835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8: 960835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; 961835098a5290e59bb7b468eb987db67b0e1913c67Christian König 962835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 963835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_5_6_5: 964835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_1_5_5_5: 965835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_4_4_4_4: 966835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16: 967835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_8: 968835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN16; 969835098a5290e59bb7b468eb987db67b0e1913c67Christian König 970835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 971835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_8_8_8: 972835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_2_10_10_10: 973835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_24: 974835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_24_8: 975835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16_16: 976835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 977835098a5290e59bb7b468eb987db67b0e1913c67Christian König 978835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 979835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16_16_16_16: 980835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN16; 981835098a5290e59bb7b468eb987db67b0e1913c67Christian König 982835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_32_32: 983835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 984835098a5290e59bb7b468eb987db67b0e1913c67Christian König 985835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 986835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_32_32_32_32: 987835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 988835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 989835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; /* Unsupported. */ 990835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 991835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 992835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; 993835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 994835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 995835098a5290e59bb7b468eb987db67b0e1913c67Christian König 996835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_dbformat(enum pipe_format format) 997835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 998835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 999835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 1000835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_16; 1001835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 1002835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1003835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_24; /* XXX no longer supported on SI */ 1004835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 1005835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1006835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_32_FLOAT; 1007835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 1008835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 1009835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1010835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1011835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1012835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 101373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König * Texture translation 101473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König */ 101573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 101673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic uint32_t si_translate_texformat(struct pipe_screen *screen, 101773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König enum pipe_format format, 101873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct util_format_description *desc, 101973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int first_non_void) 102073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 102173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König boolean uniform = TRUE; 102273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int i; 102373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 102473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Colorspace (return non-RGB formats directly). */ 102573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->colorspace) { 102673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Depth stencil formats */ 102773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_ZS: 102873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (format) { 102973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z16_UNORM: 103073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16; 103173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_X24S8_UINT: 103273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z24X8_UNORM: 103373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 103473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_24_8; 103573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8X24_UINT: 103673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_X8Z24_UNORM: 103773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 103873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_24; 103973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8_UINT: 104073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8; 104173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z32_FLOAT: 104273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32; 104373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 104473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_X24_8_32; 104573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 104673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 104773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 104873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 104973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_YUV: 105073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; /* TODO */ 105173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 105273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_SRGB: 105373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 105473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 105573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 105673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 105773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 105873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 105973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* TODO compressed formats */ 106073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 106173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { 106273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_5_9_9_9; 106373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else if (format == PIPE_FORMAT_R11G11B10_FLOAT) { 106473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_10_11_11; 106573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 106673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 106773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* R8G8Bx_SNORM - TODO CxV8U8 */ 106873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 106973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* See whether the components are of the same size. */ 107073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König for (i = 1; i < desc->nr_channels; i++) { 107173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uniform = uniform && desc->channel[0].size == desc->channel[i].size; 107273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 107373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 107473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Non-uniform formats. */ 107573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (!uniform) { 107673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch(desc->nr_channels) { 107773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 3: 107873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 5 && 107973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 6 && 108073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 5) { 108173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_5_6_5; 108273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 108373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 108473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 108573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 5 && 108673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 5 && 108773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 5 && 108873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[3].size == 1) { 108973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_1_5_5_5; 109073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 109173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 10 && 109273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 10 && 109373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 10 && 109473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[3].size == 2) { 109573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_2_10_10_10; 109673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 109773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 109873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 109973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 110073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 110173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 110273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (first_non_void < 0 || first_non_void > 3) 110373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 110473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 110573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* uniform formats */ 110673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->channel[first_non_void].size) { 110773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 110873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 110973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 111073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_4_4; 111173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 111273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_4_4_4_4; 111373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 111473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 111573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 8: 111673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 111773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 111873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8; 111973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 112073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_8; 112173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 112273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_8_8_8; 112373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 112473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 112573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 16: 112673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 112773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 112873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16; 112973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 113073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16_16; 113173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 113273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16_16_16_16; 113373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 113473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 113573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 32: 113673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 113773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 113873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32; 113973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 114073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32; 114173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 3: 114273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32_32; 114373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 114473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32_32_32; 114573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 114673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 114773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 114873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königout_unknown: 114973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */ 115073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return ~0; 115173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 115273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 115373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_wrap(unsigned wrap) 115473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 115573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (wrap) { 115673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 115773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_REPEAT: 115873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_WRAP; 115973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP: 116073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_HALF_BORDER; 116173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 116273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL; 116373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 116473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_BORDER; 116573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_REPEAT: 116673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR; 116773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP: 116873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER; 116973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 117073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL; 117173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 117273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER; 117373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 117473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 117573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 117673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_filter(unsigned filter) 117773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 117873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (filter) { 117973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 118073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_FILTER_NEAREST: 118173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_XY_FILTER_POINT; 118273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_FILTER_LINEAR: 118373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_XY_FILTER_BILINEAR; 118473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 118573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 118673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 118773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_mipfilter(unsigned filter) 118873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 118973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (filter) { 119073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_NEAREST: 119173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_POINT; 119273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_LINEAR: 119373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_LINEAR; 119473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 119573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_NONE: 119673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_NONE; 119773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 119873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 119973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 120073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_compare(unsigned compare) 120173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 120273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (compare) { 120373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 120473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_NEVER: 120573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER; 120673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_LESS: 120773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS; 120873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_EQUAL: 120973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL; 121073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_LEQUAL: 121173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL; 121273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_GREATER: 121373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER; 121473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_NOTEQUAL: 121573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL; 121673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_GEQUAL: 121773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL; 121873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_ALWAYS: 121973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS; 122073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 122173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 122273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 122373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_dim(unsigned dim) 122473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 122573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (dim) { 122673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 122773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_1D: 122873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_1D; 122973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_1D_ARRAY: 123073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_1D_ARRAY; 123173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_2D: 123273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_RECT: 123373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_2D; 123473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_2D_ARRAY: 123573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_2D_ARRAY; 123673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_3D: 123773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_3D; 123873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_CUBE: 123973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_CUBE; 124073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 124173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 124273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 124373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König/* 124453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König * Format support testing 124553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König */ 124653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 124753d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 124853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 124953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_texformat(screen, format, util_format_description(format), 125053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König util_format_get_first_non_void_channel(format)) != ~0U; 125153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 125253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 1253b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian Königstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen, 1254b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König enum pipe_format format, 1255b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König const struct util_format_description *desc, 1256b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int first_non_void) 125753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 125853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König uint32_t result; 125953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 126053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_FIXED) 126153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return ~0; 126253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 126353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König result = si_translate_texformat(screen, format, desc, first_non_void); 126453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (result == V_008F0C_BUF_DATA_FORMAT_INVALID || 126553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König result > V_008F0C_BUF_DATA_FORMAT_32_32_32_32) 126653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König result = ~0; 126753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 126853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return result; 126953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 127053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 127153d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format) 127253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 127353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_vertexformat(screen, format, util_format_description(format), 127453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König util_format_get_first_non_void_channel(format)) != ~0U; 127553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 127653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 127753d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_colorbuffer_format_supported(enum pipe_format format) 127853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 127953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_colorformat(format) != ~0U && 128053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_translate_colorswap(format) != ~0U; 128153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 128253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 128353d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_zs_format_supported(enum pipe_format format) 128453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 128553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_dbformat(format) != ~0U; 128653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 128753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 128853d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen, 128953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_format format, 129053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_texture_target target, 129153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned sample_count, 129253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned usage) 129353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 129453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned retval = 0; 129553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 129653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (target >= PIPE_MAX_TEXTURE_TYPES) { 129753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König R600_ERR("r600: unsupported texture type %d\n", target); 129853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 129953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 130053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 130153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (!util_format_is_supported(format, usage)) 130253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 130353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 130453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König /* Multisample */ 130553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (sample_count > 1) 130653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 130753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 130853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_SAMPLER_VIEW) && 130953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_sampler_format_supported(screen, format)) { 131053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_SAMPLER_VIEW; 131153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 131253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 131353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & (PIPE_BIND_RENDER_TARGET | 131453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_DISPLAY_TARGET | 131553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SCANOUT | 131653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SHARED)) && 131753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_colorbuffer_format_supported(format)) { 131853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= usage & 131953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König (PIPE_BIND_RENDER_TARGET | 132053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_DISPLAY_TARGET | 132153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SCANOUT | 132253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SHARED); 132353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 132453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 132553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_DEPTH_STENCIL) && 132653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_zs_format_supported(format)) { 132753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_DEPTH_STENCIL; 132853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 132953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 133053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_VERTEX_BUFFER) && 133153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_vertex_format_supported(screen, format)) { 133253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_VERTEX_BUFFER; 133353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 133453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 133553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (usage & PIPE_BIND_TRANSFER_READ) 133653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_TRANSFER_READ; 133753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (usage & PIPE_BIND_TRANSFER_WRITE) 133853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_TRANSFER_WRITE; 133953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 134053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return retval == usage; 134153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 134253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 134353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König/* 1344835098a5290e59bb7b468eb987db67b0e1913c67Christian König * framebuffer handling 1345835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 1346835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1347835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4, 1348835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state, int cb) 1349835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1350835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_resource_texture *rtex; 1351835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_surface *surf; 1352835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned level = state->cbufs[cb]->u.tex.level; 1353835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned pitch, slice; 1354835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned color_info, color_attrib; 1355835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned format, swap, ntype, endian; 1356835098a5290e59bb7b468eb987db67b0e1913c67Christian König uint64_t offset; 1357835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned blocksize; 1358835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct util_format_description *desc; 1359835098a5290e59bb7b468eb987db67b0e1913c67Christian König int i; 1360835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned blend_clamp = 0, blend_bypass = 0; 1361835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1362835098a5290e59bb7b468eb987db67b0e1913c67Christian König surf = (struct r600_surface *)state->cbufs[cb]; 1363835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; 1364835098a5290e59bb7b468eb987db67b0e1913c67Christian König blocksize = util_format_get_blocksize(rtex->real_format); 1365835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1366835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->depth) 1367835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->have_depth_fb = TRUE; 1368835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1369835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->depth && !rtex->is_flushing_texture) { 1370835098a5290e59bb7b468eb987db67b0e1913c67Christian König r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE); 1371835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = rtex->flushed_depth_texture; 1372835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1373835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1374835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset = rtex->surface.level[level].offset; 1375835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1376835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset += rtex->surface.level[level].slice_size * 1377835098a5290e59bb7b468eb987db67b0e1913c67Christian König state->cbufs[cb]->u.tex.first_layer; 1378835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1379835098a5290e59bb7b468eb987db67b0e1913c67Christian König pitch = (rtex->surface.level[level].nblk_x) / 8 - 1; 1380835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1381835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (slice) { 1382835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = slice - 1; 1383835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1384835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1385835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(8); 1386835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (rtex->surface.level[level].mode) { 1387835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_LINEAR_ALIGNED: 1388835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(8); 1389835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1390835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_1D: 1391835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(9); 1392835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1393835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_2D: 1394835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) { 1395835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (blocksize) { 1396835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 1: 1397835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(10); 1398835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1399835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 2: 1400835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(11); 1401835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1402835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 4: 1403835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(12); 1404835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1405835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1406835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1407835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else switch (blocksize) { 1408835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 1: 1409835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(14); 1410835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1411835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 2: 1412835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(15); 1413835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1414835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 4: 1415835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(16); 1416835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1417835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 8: 1418835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(17); 1419835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1420835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 1421835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(13); 1422835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1423835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1424835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1425835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1426835098a5290e59bb7b468eb987db67b0e1913c67Christian König desc = util_format_description(surf->base.format); 1427835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (i = 0; i < 4; i++) { 1428835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 1429835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1430835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1431835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1432835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) { 1433835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_FLOAT; 1434835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1435835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UNORM; 1436835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 1437835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SRGB; 1438835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1439835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].normalized) 1440835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SNORM; 1441835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].pure_integer) 1442835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SINT; 1443835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 1444835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].normalized) 1445835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UNORM; 1446835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].pure_integer) 1447835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UINT; 1448835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1449835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1450835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1451835098a5290e59bb7b468eb987db67b0e1913c67Christian König format = si_translate_colorformat(surf->base.format); 1452835098a5290e59bb7b468eb987db67b0e1913c67Christian König swap = si_translate_colorswap(surf->base.format); 1453835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { 1454835098a5290e59bb7b468eb987db67b0e1913c67Christian König endian = V_028C70_ENDIAN_NONE; 1455835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1456835098a5290e59bb7b468eb987db67b0e1913c67Christian König endian = si_colorformat_endian_swap(format); 1457835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1458835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1459835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* blend clamp should be set for all NORM/SRGB types */ 1460835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (ntype == V_028C70_NUMBER_UNORM || 1461835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype == V_028C70_NUMBER_SNORM || 1462835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype == V_028C70_NUMBER_SRGB) 1463835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_clamp = 1; 1464835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1465835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* set blend bypass according to docs if SINT/UINT or 1466835098a5290e59bb7b468eb987db67b0e1913c67Christian König 8/24 COLOR variants */ 1467835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT || 1468835098a5290e59bb7b468eb987db67b0e1913c67Christian König format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 || 1469835098a5290e59bb7b468eb987db67b0e1913c67Christian König format == V_028C70_COLOR_X24_8_32_FLOAT) { 1470835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_clamp = 0; 1471835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_bypass = 1; 1472835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1473835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1474835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_info = S_028C70_FORMAT(format) | 1475835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_COMP_SWAP(swap) | 1476835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_BLEND_CLAMP(blend_clamp) | 1477835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_BLEND_BYPASS(blend_bypass) | 1478835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_NUMBER_TYPE(ntype) | 1479835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_ENDIAN(endian); 1480835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1481835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->alpha_ref_dirty = true; 1482835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1483835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture); 1484835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset >>= 8; 1485835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1486835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* FIXME handle enabling of CB beyond BASE8 which has different offset */ 1487835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 1488835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset); 1489835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch)); 1490835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice)); 1491835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1492835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1493835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000); 1494835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1495835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1496835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) | 1497835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer)); 1498835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1499835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info); 1500835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib); 1501835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1502835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1503835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4, 1504835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state) 1505835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1506835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_resource_texture *rtex; 1507835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_surface *surf; 150886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König unsigned level, pitch, slice, format; 150986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König uint32_t z_info, s_info; 151086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König uint64_t z_offs, s_offs; 1511835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1512835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (state->zsbuf == NULL) { 1513835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1514835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 1515835098a5290e59bb7b468eb987db67b0e1913c67Christian König return; 1516835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1517835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1518835098a5290e59bb7b468eb987db67b0e1913c67Christian König surf = (struct r600_surface *)state->zsbuf; 1519835098a5290e59bb7b468eb987db67b0e1913c67Christian König level = surf->base.u.tex.level; 1520835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = (struct r600_resource_texture*)surf->base.texture; 1521835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1522835098a5290e59bb7b468eb987db67b0e1913c67Christian König format = si_translate_dbformat(rtex->real_format); 1523835098a5290e59bb7b468eb987db67b0e1913c67Christian König 152486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 152586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs += rtex->surface.level[level].offset; 152686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 152786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 152886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs += rtex->surface.stencil_offset; 152986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs += rtex->surface.level[level].offset / 4; 153086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 153186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs >>= 8; 153286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs >>= 8; 153386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 1534835098a5290e59bb7b468eb987db67b0e1913c67Christian König pitch = (rtex->surface.level[level].nblk_x / 8) - 1; 1535835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1536835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (slice) { 1537835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = slice - 1; 1538835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1539835098a5290e59bb7b468eb987db67b0e1913c67Christian König 154086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info = S_028040_FORMAT(format); 154186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info = S_028044_FORMAT(1); 1542835098a5290e59bb7b468eb987db67b0e1913c67Christian König 154386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) { 154486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(4); 154586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(4); 1546835098a5290e59bb7b468eb987db67b0e1913c67Christian König 154786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) { 154886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König switch (format) { 154986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_16: 155086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(5); 155186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(5); 155286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König break; 155386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_24: 155486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_32_FLOAT: 155586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(6); 155686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(6); 155786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König break; 155886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König default: 155986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(7); 156086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(7); 156186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } 1562835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1563835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 156486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König R600_ERR("Invalid DB tiling mode %d!\n", 156586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König rtex->surface.level[level].mode); 156686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1567835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 156886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König return; 1569835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1570835098a5290e59bb7b468eb987db67b0e1913c67Christian König 157186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW, 157286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) | 157386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer)); 157486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 157586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1); 1576835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (format != ~0U) { 157786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info); 1578835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1579835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1580835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1581835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 158286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 158386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König if (rtex->surface.flags & RADEON_SURF_SBUFFER) { 158486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info); 158586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } else { 158686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 158786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } 158886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 158986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 159086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs); 159186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs); 159286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs); 159386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs); 159486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 159586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch)); 159686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice)); 1597835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1598835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1599835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_set_framebuffer_state(struct pipe_context *ctx, 1600835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state) 1601835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1602835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_context *rctx = (struct r600_context *)ctx; 1603835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 1604835098a5290e59bb7b468eb987db67b0e1913c67Christian König uint32_t shader_mask, tl, br; 1605835098a5290e59bb7b468eb987db67b0e1913c67Christian König int tl_x, tl_y, br_x, br_y; 1606835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1607835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (pm4 == NULL) 1608835098a5290e59bb7b468eb987db67b0e1913c67Christian König return; 1609835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1610835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_inval_fb_cache(pm4, state->nr_cbufs); 1611835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1612835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (state->zsbuf) 1613835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_inval_zsbuf_cache(pm4); 1614835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1615835098a5290e59bb7b468eb987db67b0e1913c67Christian König util_copy_framebuffer_state(&rctx->framebuffer, state); 1616835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1617835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* build states */ 1618835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->have_depth_fb = 0; 1619835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (int i = 0; i < state->nr_cbufs; i++) { 1620835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_cb(rctx, pm4, state, i); 1621835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1622835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_db(rctx, pm4, state); 1623835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1624835098a5290e59bb7b468eb987db67b0e1913c67Christian König shader_mask = 0; 1625835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (int i = 0; i < state->nr_cbufs; i++) { 1626835098a5290e59bb7b468eb987db67b0e1913c67Christian König shader_mask |= 0xf << (i * 4); 1627835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1628835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_x = 0; 1629835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_y = 0; 1630835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_x = state->width; 1631835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_y = state->height; 1632835098a5290e59bb7b468eb987db67b0e1913c67Christian König#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */ 1633835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* EG hw workaround */ 1634835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_x == 0) 1635835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_x = 1; 1636835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_y == 0) 1637835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_y = 1; 1638835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* cayman hw workaround */ 1639835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rctx->chip_class == CAYMAN) { 1640835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_x == 1 && br_y == 1) 1641835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_x = 2; 1642835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1643835098a5290e59bb7b468eb987db67b0e1913c67Christian König#endif 1644835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y); 1645835098a5290e59bb7b468eb987db67b0e1913c67Christian König br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y); 1646835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1647835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl); 1648835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br); 1649835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl); 1650835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br); 1651835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl); 1652835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br); 1653835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl); 1654835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br); 1655835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000); 1656835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA); 1657835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask); 1658835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000); 1659835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1660835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_state(rctx, framebuffer, pm4); 1661bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_update_fb_rs_state(rctx); 166276660dfccede74782ac0d409da171ddbd61fae41Christian König si_update_fb_blend_state(rctx); 1663835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1664835098a5290e59bb7b468eb987db67b0e1913c67Christian König 16653c09f11e5cefd437bb8185539430786dc245c96fChristian König/* 16663c09f11e5cefd437bb8185539430786dc245c96fChristian König * shaders 16673c09f11e5cefd437bb8185539430786dc245c96fChristian König */ 16683c09f11e5cefd437bb8185539430786dc245c96fChristian König 16693c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void *si_create_shader_state(struct pipe_context *ctx, 16703c09f11e5cefd437bb8185539430786dc245c96fChristian König const struct pipe_shader_state *state) 16713c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 16723c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pipe_shader *shader = CALLOC_STRUCT(si_pipe_shader); 16733c09f11e5cefd437bb8185539430786dc245c96fChristian König 16743c09f11e5cefd437bb8185539430786dc245c96fChristian König shader->tokens = tgsi_dup_tokens(state->tokens); 16753c09f11e5cefd437bb8185539430786dc245c96fChristian König shader->so = state->stream_output; 16763c09f11e5cefd437bb8185539430786dc245c96fChristian König 16773c09f11e5cefd437bb8185539430786dc245c96fChristian König return shader; 16783c09f11e5cefd437bb8185539430786dc245c96fChristian König} 16793c09f11e5cefd437bb8185539430786dc245c96fChristian König 16803c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state) 16813c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 16823c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 16833c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pipe_shader *shader = state; 16843c09f11e5cefd437bb8185539430786dc245c96fChristian König 16853c09f11e5cefd437bb8185539430786dc245c96fChristian König if (rctx->vs_shader == state) 16863c09f11e5cefd437bb8185539430786dc245c96fChristian König return; 16873c09f11e5cefd437bb8185539430786dc245c96fChristian König 16883c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->shader_dirty = true; 16893c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->vs_shader = shader; 16901fb8ee62faf081e6a5588e99620a9883e3788c46Christian König 16911fb8ee62faf081e6a5588e99620a9883e3788c46Christian König if (shader) { 16921fb8ee62faf081e6a5588e99620a9883e3788c46Christian König si_pm4_bind_state(rctx, vs, shader->pm4); 16931fb8ee62faf081e6a5588e99620a9883e3788c46Christian König } 16943c09f11e5cefd437bb8185539430786dc245c96fChristian König} 16953c09f11e5cefd437bb8185539430786dc245c96fChristian König 16963c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state) 16973c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 16983c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 16993c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pipe_shader *shader = state; 17003c09f11e5cefd437bb8185539430786dc245c96fChristian König 17013c09f11e5cefd437bb8185539430786dc245c96fChristian König if (rctx->ps_shader == state) 17023c09f11e5cefd437bb8185539430786dc245c96fChristian König return; 17033c09f11e5cefd437bb8185539430786dc245c96fChristian König 17043c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->shader_dirty = true; 17053c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->ps_shader = shader; 17061fb8ee62faf081e6a5588e99620a9883e3788c46Christian König 17071fb8ee62faf081e6a5588e99620a9883e3788c46Christian König if (shader) { 17081fb8ee62faf081e6a5588e99620a9883e3788c46Christian König si_pm4_bind_state(rctx, ps, shader->pm4); 17091fb8ee62faf081e6a5588e99620a9883e3788c46Christian König } 17103c09f11e5cefd437bb8185539430786dc245c96fChristian König} 17113c09f11e5cefd437bb8185539430786dc245c96fChristian König 17123c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state) 17133c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 17143c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 17153c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pipe_shader *shader = (struct si_pipe_shader *)state; 17163c09f11e5cefd437bb8185539430786dc245c96fChristian König 17173c09f11e5cefd437bb8185539430786dc245c96fChristian König if (rctx->vs_shader == shader) { 17183c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->vs_shader = NULL; 17193c09f11e5cefd437bb8185539430786dc245c96fChristian König } 17203c09f11e5cefd437bb8185539430786dc245c96fChristian König 17213c09f11e5cefd437bb8185539430786dc245c96fChristian König si_pm4_delete_state(rctx, vs, shader->pm4); 17223c09f11e5cefd437bb8185539430786dc245c96fChristian König free(shader->tokens); 17233c09f11e5cefd437bb8185539430786dc245c96fChristian König si_pipe_shader_destroy(ctx, shader); 17243c09f11e5cefd437bb8185539430786dc245c96fChristian König free(shader); 17253c09f11e5cefd437bb8185539430786dc245c96fChristian König} 17263c09f11e5cefd437bb8185539430786dc245c96fChristian König 17273c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state) 17283c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 17293c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 17303c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pipe_shader *shader = (struct si_pipe_shader *)state; 17313c09f11e5cefd437bb8185539430786dc245c96fChristian König 17323c09f11e5cefd437bb8185539430786dc245c96fChristian König if (rctx->ps_shader == shader) { 17333c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->ps_shader = NULL; 17343c09f11e5cefd437bb8185539430786dc245c96fChristian König } 17353c09f11e5cefd437bb8185539430786dc245c96fChristian König 17363c09f11e5cefd437bb8185539430786dc245c96fChristian König si_pm4_delete_state(rctx, ps, shader->pm4); 17373c09f11e5cefd437bb8185539430786dc245c96fChristian König free(shader->tokens); 17383c09f11e5cefd437bb8185539430786dc245c96fChristian König si_pipe_shader_destroy(ctx, shader); 17393c09f11e5cefd437bb8185539430786dc245c96fChristian König free(shader); 17403c09f11e5cefd437bb8185539430786dc245c96fChristian König} 17413c09f11e5cefd437bb8185539430786dc245c96fChristian König 1742baf20397569fb499f736e5ad2350b008b8207fadChristian König/* 1743baf20397569fb499f736e5ad2350b008b8207fadChristian König * Samplers 1744baf20397569fb499f736e5ad2350b008b8207fadChristian König */ 1745baf20397569fb499f736e5ad2350b008b8207fadChristian König 174673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx, 174773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct pipe_resource *texture, 174873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct pipe_sampler_view *state) 174973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 175073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view); 175173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture; 175273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct util_format_description *desc = util_format_description(state->format); 175373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned blocksize = util_format_get_blocksize(tmp->real_format); 175473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned format, num_format, /*endian,*/ tiling_index; 175573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uint32_t pitch = 0; 175673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned char state_swizzle[4], swizzle[4]; 175773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned height, depth, width; 175873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int first_non_void; 175973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uint64_t va; 176073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 176173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (view == NULL) 176273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return NULL; 176373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 176473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* initialize base object */ 176573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base = *state; 176673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.texture = NULL; 176773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König pipe_reference(NULL, &texture->reference); 176873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.texture = texture; 176973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.reference.count = 1; 177073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.context = ctx; 177173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 177273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[0] = state->swizzle_r; 177373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[1] = state->swizzle_g; 177473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[2] = state->swizzle_b; 177573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[3] = state->swizzle_a; 177673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle); 177773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 177873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König first_non_void = util_format_get_first_non_void_channel(state->format); 177973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->channel[first_non_void].type) { 178073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_FLOAT: 178173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 178273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 178373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_SIGNED: 178473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_SNORM; 178573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 178673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_UNSIGNED: 178773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 178873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_UNORM; 178973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 179073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 179173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void); 179273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (format == ~0) { 179373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König format = 0; 179473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 179573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 179673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (tmp->depth && !tmp->is_flushing_texture) { 179773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König r600_texture_depth_flush(ctx, texture, TRUE); 179873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tmp = tmp->flushed_depth_texture; 179973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 180073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 180173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* not supported any more */ 180273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König //endian = si_colorformat_endian_swap(format); 180373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 180473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König height = texture->height0; 180573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König depth = texture->depth0; 180673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König width = texture->width0; 180773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König pitch = align(tmp->pitch_in_blocks[0] * 180873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König util_format_get_blockwidth(state->format), 8); 180973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 181073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 181173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König height = 1; 181273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König depth = texture->array_size; 181373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 181473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König depth = texture->array_size; 181573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 181673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 181773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 8; 181873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (tmp->surface.level[state->u.tex.first_level].mode) { 181973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_LINEAR_ALIGNED: 182073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 8; 182173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 182273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_1D: 182373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 9; 182473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 182573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_2D: 182673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) { 182773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (blocksize) { 182873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 182973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 10; 183073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 183173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 183273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 11; 183373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 183473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 183573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 12; 183673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 183773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 183873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 183973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else switch (blocksize) { 184073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 184173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 14; 184273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 184373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 184473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 15; 184573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 184673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 184773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 16; 184873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 184973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 8: 185073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 17; 185173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 185273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 185373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 13; 185473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 185573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 185673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 185773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 185873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König va = r600_resource_va(ctx->screen, texture); 185973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (state->u.tex.last_level) { 186073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[0] = (va + tmp->offset[1]) >> 8; 186173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else { 186273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[0] = (va + tmp->offset[0]) >> 8; 186373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 186473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[1] = (S_008F14_BASE_ADDRESS_HI((va + tmp->offset[0]) >> 40) | 186573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F14_DATA_FORMAT(format) | 186673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F14_NUM_FORMAT(num_format)); 186773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[2] = (S_008F18_WIDTH(width - 1) | 186873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F18_HEIGHT(height - 1)); 186973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) | 187073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) | 187173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) | 187273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) | 187373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_BASE_LEVEL(state->u.tex.first_level) | 187473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_LAST_LEVEL(state->u.tex.last_level) | 187573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_TILING_INDEX(tiling_index) | 187673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_TYPE(si_tex_dim(texture->target))); 187773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1)); 187873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) | 187973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F24_LAST_ARRAY(state->u.tex.last_layer)); 188073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[6] = 0; 188173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[7] = 0; 188273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 188373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return &view->base; 188473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 188573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 18869b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_sampler_view_destroy(struct pipe_context *ctx, 18879b213c871a080472660eff271c72a3fcc5d3f578Christian König struct pipe_sampler_view *state) 18889b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 18899b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state; 18909b213c871a080472660eff271c72a3fcc5d3f578Christian König 18919b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&state->texture, NULL); 18929b213c871a080472660eff271c72a3fcc5d3f578Christian König FREE(resource); 18939b213c871a080472660eff271c72a3fcc5d3f578Christian König} 18949b213c871a080472660eff271c72a3fcc5d3f578Christian König 189573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void *si_create_sampler_state(struct pipe_context *ctx, 189673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct pipe_sampler_state *state) 189773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 189873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state); 189973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König union util_color uc; 190073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0; 190173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned border_color_type; 190273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 190373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (rstate == NULL) { 190473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return NULL; 190573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 190673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 190773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 190873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (uc.ui) { 190973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0x000000FF: 191073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK; 191173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 191273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0x00000000: 191373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK; 191473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 191573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0xFFFFFFFF: 191673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE; 191773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 191873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: /* Use border color pointer */ 191973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER; 192073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 192173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 192273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) | 192373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) | 192473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) | 192573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König (state->max_anisotropy & 0x7) << 9 | /* XXX */ 192673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) | 192773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) | 192873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König aniso_flag_offset << 16 | /* XXX */ 192973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map)); 193073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) | 193173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8))); 193273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) | 193373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) | 193473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) | 193573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter))); 193673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type); 193773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 193873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#if 0 193973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (border_color_type == 3) { 194073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0])); 194173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1])); 194273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2])); 194373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3])); 194473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 194573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#endif 194673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return rstate; 194773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 194873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 1949baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count, 1950baf20397569fb499f736e5ad2350b008b8207fadChristian König struct pipe_sampler_view **views) 1951baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 1952baf20397569fb499f736e5ad2350b008b8207fadChristian König assert(count == 0); 1953baf20397569fb499f736e5ad2350b008b8207fadChristian König} 1954baf20397569fb499f736e5ad2350b008b8207fadChristian König 1955baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count, 1956baf20397569fb499f736e5ad2350b008b8207fadChristian König struct pipe_sampler_view **views) 1957baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 1958baf20397569fb499f736e5ad2350b008b8207fadChristian König struct r600_context *rctx = (struct r600_context *)ctx; 1959baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views; 1960baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 1961fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König struct si_resource *bo; 1962baf20397569fb499f736e5ad2350b008b8207fadChristian König int i; 1963baf20397569fb499f736e5ad2350b008b8207fadChristian König int has_depth = 0; 1964baf20397569fb499f736e5ad2350b008b8207fadChristian König uint64_t va; 1965baf20397569fb499f736e5ad2350b008b8207fadChristian König char *ptr; 1966baf20397569fb499f736e5ad2350b008b8207fadChristian König 1967baf20397569fb499f736e5ad2350b008b8207fadChristian König if (!count) 1968baf20397569fb499f736e5ad2350b008b8207fadChristian König goto out; 1969baf20397569fb499f736e5ad2350b008b8207fadChristian König 1970baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_inval_texture_cache(pm4); 1971baf20397569fb499f736e5ad2350b008b8207fadChristian König 1972fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE, 1973fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König count * sizeof(resource[0]->state)); 1974baf20397569fb499f736e5ad2350b008b8207fadChristian König ptr = rctx->ws->buffer_map(bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE); 1975baf20397569fb499f736e5ad2350b008b8207fadChristian König 1976baf20397569fb499f736e5ad2350b008b8207fadChristian König for (i = 0; i < count; i++, ptr += sizeof(resource[0]->state)) { 1977ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct r600_resource_texture *tex = (void *)resource[i]->base.texture; 1978ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 1979baf20397569fb499f736e5ad2350b008b8207fadChristian König pipe_sampler_view_reference( 1980baf20397569fb499f736e5ad2350b008b8207fadChristian König (struct pipe_sampler_view **)&rctx->ps_samplers.views[i], 1981baf20397569fb499f736e5ad2350b008b8207fadChristian König views[i]); 1982baf20397569fb499f736e5ad2350b008b8207fadChristian König 1983ca9cf611b63e5576b596c21b73b1b639d250d649Christian König si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ); 1984ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 1985baf20397569fb499f736e5ad2350b008b8207fadChristian König if (resource[i]) { 1986ca9cf611b63e5576b596c21b73b1b639d250d649Christian König if (tex->depth) 1987baf20397569fb499f736e5ad2350b008b8207fadChristian König has_depth = 1; 1988baf20397569fb499f736e5ad2350b008b8207fadChristian König 1989baf20397569fb499f736e5ad2350b008b8207fadChristian König memcpy(ptr, resource[i]->state, sizeof(resource[0]->state)); 1990baf20397569fb499f736e5ad2350b008b8207fadChristian König } else 1991baf20397569fb499f736e5ad2350b008b8207fadChristian König memset(ptr, 0, sizeof(resource[0]->state)); 1992baf20397569fb499f736e5ad2350b008b8207fadChristian König } 1993baf20397569fb499f736e5ad2350b008b8207fadChristian König 1994baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ws->buffer_unmap(bo->cs_buf); 1995baf20397569fb499f736e5ad2350b008b8207fadChristian König 1996baf20397569fb499f736e5ad2350b008b8207fadChristian König for (i = count; i < NUM_TEX_UNITS; i++) { 1997baf20397569fb499f736e5ad2350b008b8207fadChristian König if (rctx->ps_samplers.views[i]) 1998baf20397569fb499f736e5ad2350b008b8207fadChristian König pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL); 1999baf20397569fb499f736e5ad2350b008b8207fadChristian König } 2000baf20397569fb499f736e5ad2350b008b8207fadChristian König 2001baf20397569fb499f736e5ad2350b008b8207fadChristian König va = r600_resource_va(ctx->screen, (void *)bo); 2002baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_add_bo(pm4, bo, RADEON_USAGE_READ); 2003baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_reg(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4, va); 2004baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_reg(pm4, R_00B044_SPI_SHADER_USER_DATA_PS_5, va >> 32); 2005baf20397569fb499f736e5ad2350b008b8207fadChristian König 2006baf20397569fb499f736e5ad2350b008b8207fadChristian Königout: 2007baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_state(rctx, ps_sampler_views, pm4); 2008baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->have_depth_texture = has_depth; 2009baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ps_samplers.n_views = count; 2010baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2011baf20397569fb499f736e5ad2350b008b8207fadChristian König 2012baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states) 2013baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2014ad15c8c0f199e293b5c49a9c614cfaa19edb9a62Christian König assert(count == 0); 2015baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2016baf20397569fb499f736e5ad2350b008b8207fadChristian König 2017baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states) 2018baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2019baf20397569fb499f736e5ad2350b008b8207fadChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2020baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states; 2021baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2022fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König struct si_resource *bo; 2023baf20397569fb499f736e5ad2350b008b8207fadChristian König uint64_t va; 2024baf20397569fb499f736e5ad2350b008b8207fadChristian König char *ptr; 2025baf20397569fb499f736e5ad2350b008b8207fadChristian König int i; 2026baf20397569fb499f736e5ad2350b008b8207fadChristian König 2027baf20397569fb499f736e5ad2350b008b8207fadChristian König if (!count) 2028baf20397569fb499f736e5ad2350b008b8207fadChristian König goto out; 2029baf20397569fb499f736e5ad2350b008b8207fadChristian König 2030baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_inval_texture_cache(pm4); 2031baf20397569fb499f736e5ad2350b008b8207fadChristian König 2032fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE, 2033fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König count * sizeof(rstates[0]->val)); 2034baf20397569fb499f736e5ad2350b008b8207fadChristian König ptr = rctx->ws->buffer_map(bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE); 2035baf20397569fb499f736e5ad2350b008b8207fadChristian König 2036baf20397569fb499f736e5ad2350b008b8207fadChristian König for (i = 0; i < count; i++, ptr += sizeof(rstates[0]->val)) { 2037baf20397569fb499f736e5ad2350b008b8207fadChristian König memcpy(ptr, rstates[i]->val, sizeof(rstates[0]->val)); 2038baf20397569fb499f736e5ad2350b008b8207fadChristian König } 2039baf20397569fb499f736e5ad2350b008b8207fadChristian König 2040baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ws->buffer_unmap(bo->cs_buf); 2041baf20397569fb499f736e5ad2350b008b8207fadChristian König 2042baf20397569fb499f736e5ad2350b008b8207fadChristian König memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count); 2043baf20397569fb499f736e5ad2350b008b8207fadChristian König 2044baf20397569fb499f736e5ad2350b008b8207fadChristian König va = r600_resource_va(ctx->screen, (void *)bo); 2045baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_add_bo(pm4, bo, RADEON_USAGE_READ); 2046baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_reg(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2, va); 2047baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_reg(pm4, R_00B03C_SPI_SHADER_USER_DATA_PS_3, va >> 32); 2048baf20397569fb499f736e5ad2350b008b8207fadChristian König 2049baf20397569fb499f736e5ad2350b008b8207fadChristian Königout: 2050baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_state(rctx, ps_sampler, pm4); 2051baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ps_samplers.n_samplers = count; 2052baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2053baf20397569fb499f736e5ad2350b008b8207fadChristian König 205473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 205573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 205673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 205773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 205873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state) 205973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 206073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König free(state); 206173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 206273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 20630d6b0b512acadbc5d64039063b5649fc401b3367Christian König/* 20640d6b0b512acadbc5d64039063b5649fc401b3367Christian König * Constants 20650d6b0b512acadbc5d64039063b5649fc401b3367Christian König */ 20660d6b0b512acadbc5d64039063b5649fc401b3367Christian Königstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index, 20670d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct pipe_constant_buffer *cb) 20680d6b0b512acadbc5d64039063b5649fc401b3367Christian König{ 20690d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct r600_context *rctx = (struct r600_context *)ctx; 2070fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL; 20710d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 20720d6b0b512acadbc5d64039063b5649fc401b3367Christian König uint64_t va_offset; 20730d6b0b512acadbc5d64039063b5649fc401b3367Christian König uint32_t offset; 20740d6b0b512acadbc5d64039063b5649fc401b3367Christian König 20750d6b0b512acadbc5d64039063b5649fc401b3367Christian König /* Note that the state tracker can unbind constant buffers by 20760d6b0b512acadbc5d64039063b5649fc401b3367Christian König * passing NULL here. 20770d6b0b512acadbc5d64039063b5649fc401b3367Christian König */ 20780d6b0b512acadbc5d64039063b5649fc401b3367Christian König if (cb == NULL) { 20790d6b0b512acadbc5d64039063b5649fc401b3367Christian König FREE(pm4); 20800d6b0b512acadbc5d64039063b5649fc401b3367Christian König return; 20810d6b0b512acadbc5d64039063b5649fc401b3367Christian König } 20820d6b0b512acadbc5d64039063b5649fc401b3367Christian König 20830d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_inval_shader_cache(pm4); 20840d6b0b512acadbc5d64039063b5649fc401b3367Christian König 20850d6b0b512acadbc5d64039063b5649fc401b3367Christian König if (cb->user_buffer) 20860d6b0b512acadbc5d64039063b5649fc401b3367Christian König r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset); 20870d6b0b512acadbc5d64039063b5649fc401b3367Christian König else 20880d6b0b512acadbc5d64039063b5649fc401b3367Christian König offset = 0; 20890d6b0b512acadbc5d64039063b5649fc401b3367Christian König va_offset = r600_resource_va(ctx->screen, (void*)rbuffer); 20900d6b0b512acadbc5d64039063b5649fc401b3367Christian König va_offset += offset; 20910d6b0b512acadbc5d64039063b5649fc401b3367Christian König 20920d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ); 20930d6b0b512acadbc5d64039063b5649fc401b3367Christian König 20940d6b0b512acadbc5d64039063b5649fc401b3367Christian König switch (shader) { 20950d6b0b512acadbc5d64039063b5649fc401b3367Christian König case PIPE_SHADER_VERTEX: 20960d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset); 20970d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32); 20980d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_state(rctx, vs_const, pm4); 20990d6b0b512acadbc5d64039063b5649fc401b3367Christian König break; 21000d6b0b512acadbc5d64039063b5649fc401b3367Christian König 21010d6b0b512acadbc5d64039063b5649fc401b3367Christian König case PIPE_SHADER_FRAGMENT: 21020d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset); 21030d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32); 21040d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_state(rctx, ps_const, pm4); 21050d6b0b512acadbc5d64039063b5649fc401b3367Christian König break; 21060d6b0b512acadbc5d64039063b5649fc401b3367Christian König 21070d6b0b512acadbc5d64039063b5649fc401b3367Christian König default: 21080d6b0b512acadbc5d64039063b5649fc401b3367Christian König R600_ERR("unsupported %d\n", shader); 21090d6b0b512acadbc5d64039063b5649fc401b3367Christian König return; 21100d6b0b512acadbc5d64039063b5649fc401b3367Christian König } 21110d6b0b512acadbc5d64039063b5649fc401b3367Christian König 21120d6b0b512acadbc5d64039063b5649fc401b3367Christian König if (cb->buffer != &rbuffer->b.b) 2113fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König si_resource_reference(&rbuffer, NULL); 21140d6b0b512acadbc5d64039063b5649fc401b3367Christian König} 21150d6b0b512acadbc5d64039063b5649fc401b3367Christian König 21169b213c871a080472660eff271c72a3fcc5d3f578Christian König/* 21179b213c871a080472660eff271c72a3fcc5d3f578Christian König * Vertex elements & buffers 21189b213c871a080472660eff271c72a3fcc5d3f578Christian König */ 21199b213c871a080472660eff271c72a3fcc5d3f578Christian König 21209b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void *si_create_vertex_elements(struct pipe_context *ctx, 21219b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned count, 21229b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_vertex_element *elements) 21239b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21249b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element); 2125b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int i; 21269b213c871a080472660eff271c72a3fcc5d3f578Christian König 2127b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König assert(count < PIPE_MAX_ATTRIBS); 21289b213c871a080472660eff271c72a3fcc5d3f578Christian König if (!v) 21299b213c871a080472660eff271c72a3fcc5d3f578Christian König return NULL; 21309b213c871a080472660eff271c72a3fcc5d3f578Christian König 21319b213c871a080472660eff271c72a3fcc5d3f578Christian König v->count = count; 2132b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König for (i = 0; i < count; ++i) { 2133b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König const struct util_format_description *desc; 2134b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König unsigned data_format, num_format; 2135b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int first_non_void; 2136b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2137b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König desc = util_format_description(elements[i].src_format); 2138b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König first_non_void = util_format_get_first_non_void_channel(elements[i].src_format); 2139b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format, 2140b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König desc, first_non_void); 2141b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2142b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König switch (desc->channel[first_non_void].type) { 2143b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_FIXED: 2144b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */ 2145b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2146b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_SIGNED: 2147b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_SNORM; 2148b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2149b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_UNSIGNED: 2150b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_UNORM; 2151b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2152b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_FLOAT: 2153b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König default: 2154b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 2155b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König } 2156b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2157b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) | 2158b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) | 2159b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) | 2160b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) | 2161b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_NUM_FORMAT(num_format) | 2162b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DATA_FORMAT(data_format); 2163b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König } 21649b213c871a080472660eff271c72a3fcc5d3f578Christian König memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count); 21659b213c871a080472660eff271c72a3fcc5d3f578Christian König 21669b213c871a080472660eff271c72a3fcc5d3f578Christian König return v; 21679b213c871a080472660eff271c72a3fcc5d3f578Christian König} 21689b213c871a080472660eff271c72a3fcc5d3f578Christian König 21699b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state) 21709b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21719b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 21729b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_vertex_element *v = (struct si_vertex_element*)state; 21739b213c871a080472660eff271c72a3fcc5d3f578Christian König 21749b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->vertex_elements = v; 21759b213c871a080472660eff271c72a3fcc5d3f578Christian König} 21769b213c871a080472660eff271c72a3fcc5d3f578Christian König 21779b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state) 21789b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21799b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 21809b213c871a080472660eff271c72a3fcc5d3f578Christian König 21819b213c871a080472660eff271c72a3fcc5d3f578Christian König if (rctx->vertex_elements == state) 21829b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->vertex_elements = NULL; 21839b213c871a080472660eff271c72a3fcc5d3f578Christian König FREE(state); 21849b213c871a080472660eff271c72a3fcc5d3f578Christian König} 21859b213c871a080472660eff271c72a3fcc5d3f578Christian König 21869b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, 21879b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_vertex_buffer *buffers) 21889b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21899b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 21909b213c871a080472660eff271c72a3fcc5d3f578Christian König 21919b213c871a080472660eff271c72a3fcc5d3f578Christian König util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count); 21929b213c871a080472660eff271c72a3fcc5d3f578Christian König} 21939b213c871a080472660eff271c72a3fcc5d3f578Christian König 21949b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_index_buffer(struct pipe_context *ctx, 21959b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_index_buffer *ib) 21969b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21979b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 21989b213c871a080472660eff271c72a3fcc5d3f578Christian König 21999b213c871a080472660eff271c72a3fcc5d3f578Christian König if (ib) { 22009b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer); 22019b213c871a080472660eff271c72a3fcc5d3f578Christian König memcpy(&rctx->index_buffer, ib, sizeof(*ib)); 22029b213c871a080472660eff271c72a3fcc5d3f578Christian König } else { 22039b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&rctx->index_buffer.buffer, NULL); 22049b213c871a080472660eff271c72a3fcc5d3f578Christian König } 22059b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22069b213c871a080472660eff271c72a3fcc5d3f578Christian König 22079b213c871a080472660eff271c72a3fcc5d3f578Christian König/* 22089b213c871a080472660eff271c72a3fcc5d3f578Christian König * Stream out 22099b213c871a080472660eff271c72a3fcc5d3f578Christian König */ 22109b213c871a080472660eff271c72a3fcc5d3f578Christian König 22119b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic struct pipe_stream_output_target * 22129b213c871a080472660eff271c72a3fcc5d3f578Christian Königsi_create_so_target(struct pipe_context *ctx, 22139b213c871a080472660eff271c72a3fcc5d3f578Christian König struct pipe_resource *buffer, 22149b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned buffer_offset, 22159b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned buffer_size) 22169b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 22179b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 22189b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_so_target *t; 22199b213c871a080472660eff271c72a3fcc5d3f578Christian König void *ptr; 22209b213c871a080472660eff271c72a3fcc5d3f578Christian König 22219b213c871a080472660eff271c72a3fcc5d3f578Christian König t = CALLOC_STRUCT(r600_so_target); 22229b213c871a080472660eff271c72a3fcc5d3f578Christian König if (!t) { 22239b213c871a080472660eff271c72a3fcc5d3f578Christian König return NULL; 22249b213c871a080472660eff271c72a3fcc5d3f578Christian König } 22259b213c871a080472660eff271c72a3fcc5d3f578Christian König 22269b213c871a080472660eff271c72a3fcc5d3f578Christian König t->b.reference.count = 1; 22279b213c871a080472660eff271c72a3fcc5d3f578Christian König t->b.context = ctx; 22289b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&t->b.buffer, buffer); 22299b213c871a080472660eff271c72a3fcc5d3f578Christian König t->b.buffer_offset = buffer_offset; 22309b213c871a080472660eff271c72a3fcc5d3f578Christian König t->b.buffer_size = buffer_size; 22319b213c871a080472660eff271c72a3fcc5d3f578Christian König 2232fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König t->filled_size = si_resource_create_custom(ctx->screen, PIPE_USAGE_STATIC, 4); 22339b213c871a080472660eff271c72a3fcc5d3f578Christian König ptr = rctx->ws->buffer_map(t->filled_size->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE); 22349b213c871a080472660eff271c72a3fcc5d3f578Christian König memset(ptr, 0, t->filled_size->buf->size); 22359b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->ws->buffer_unmap(t->filled_size->cs_buf); 22369b213c871a080472660eff271c72a3fcc5d3f578Christian König 22379b213c871a080472660eff271c72a3fcc5d3f578Christian König return &t->b; 22389b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22399b213c871a080472660eff271c72a3fcc5d3f578Christian König 22409b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_so_target_destroy(struct pipe_context *ctx, 22419b213c871a080472660eff271c72a3fcc5d3f578Christian König struct pipe_stream_output_target *target) 22429b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 22439b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_so_target *t = (struct r600_so_target*)target; 22449b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&t->b.buffer, NULL); 2245fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König si_resource_reference(&t->filled_size, NULL); 22469b213c871a080472660eff271c72a3fcc5d3f578Christian König FREE(t); 22479b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22489b213c871a080472660eff271c72a3fcc5d3f578Christian König 22499b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_so_targets(struct pipe_context *ctx, 22509b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned num_targets, 22519b213c871a080472660eff271c72a3fcc5d3f578Christian König struct pipe_stream_output_target **targets, 22529b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned append_bitmask) 22539b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 22549b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 22559b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned i; 22569b213c871a080472660eff271c72a3fcc5d3f578Christian König 22579b213c871a080472660eff271c72a3fcc5d3f578Christian König /* Stop streamout. */ 22589b213c871a080472660eff271c72a3fcc5d3f578Christian König if (rctx->num_so_targets) { 22599b213c871a080472660eff271c72a3fcc5d3f578Christian König r600_context_streamout_end(rctx); 22609b213c871a080472660eff271c72a3fcc5d3f578Christian König } 22619b213c871a080472660eff271c72a3fcc5d3f578Christian König 22629b213c871a080472660eff271c72a3fcc5d3f578Christian König /* Set the new targets. */ 22639b213c871a080472660eff271c72a3fcc5d3f578Christian König for (i = 0; i < num_targets; i++) { 22649b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], targets[i]); 22659b213c871a080472660eff271c72a3fcc5d3f578Christian König } 22669b213c871a080472660eff271c72a3fcc5d3f578Christian König for (; i < rctx->num_so_targets; i++) { 22679b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], NULL); 22689b213c871a080472660eff271c72a3fcc5d3f578Christian König } 22699b213c871a080472660eff271c72a3fcc5d3f578Christian König 22709b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->num_so_targets = num_targets; 22719b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->streamout_start = num_targets != 0; 22729b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->streamout_append_bitmask = append_bitmask; 22739b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22749b213c871a080472660eff271c72a3fcc5d3f578Christian König 22759b213c871a080472660eff271c72a3fcc5d3f578Christian König/* 22769b213c871a080472660eff271c72a3fcc5d3f578Christian König * Misc 22779b213c871a080472660eff271c72a3fcc5d3f578Christian König */ 22789b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_polygon_stipple(struct pipe_context *ctx, 22799b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_poly_stipple *state) 22809b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 22819b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22829b213c871a080472660eff271c72a3fcc5d3f578Christian König 22839b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_texture_barrier(struct pipe_context *ctx) 22849b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 22859b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 22869b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 22879b213c871a080472660eff271c72a3fcc5d3f578Christian König 22889b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_inval_texture_cache(pm4); 22899b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs); 22909b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_set_state(rctx, texture_barrier, pm4); 22919b213c871a080472660eff271c72a3fcc5d3f578Christian König} 22929b213c871a080472660eff271c72a3fcc5d3f578Christian König 229363636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx) 229463636ae52aefc275115d1f3daac4e75285583485Christian König{ 229563636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.create_blend_state = si_create_blend_state; 229663636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.bind_blend_state = si_bind_blend_state; 229763636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.delete_blend_state = si_delete_blend_state; 22980a091a48242513e53a99976239405e8cb72d96beChristian König rctx->context.set_blend_color = si_set_blend_color; 22999cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2300f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.create_rasterizer_state = si_create_rs_state; 2301f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.bind_rasterizer_state = si_bind_rs_state; 2302f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.delete_rasterizer_state = si_delete_rs_state; 2303f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 2304b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state; 2305b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state; 2306b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state; 2307b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx); 2308b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 23099cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König rctx->context.set_clip_state = si_set_clip_state; 231043f414f7b76902a728d26231d4cc047b794df10bChristian König rctx->context.set_scissor_state = si_set_scissor_state; 23117e011d92c9746ba4050890442db6e504fa42c4adChristian König rctx->context.set_viewport_state = si_set_viewport_state; 2312e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König rctx->context.set_stencil_ref = si_set_pipe_stencil_ref; 2313835098a5290e59bb7b468eb987db67b0e1913c67Christian König 2314835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->context.set_framebuffer_state = si_set_framebuffer_state; 23153c09f11e5cefd437bb8185539430786dc245c96fChristian König 23163c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.create_vs_state = si_create_shader_state; 23173c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.create_fs_state = si_create_shader_state; 23183c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.bind_vs_state = si_bind_vs_shader; 23193c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.bind_fs_state = si_bind_ps_shader; 23203c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.delete_vs_state = si_delete_vs_shader; 23213c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.delete_fs_state = si_delete_ps_shader; 2322baf20397569fb499f736e5ad2350b008b8207fadChristian König 232373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.create_sampler_state = si_create_sampler_state; 2324baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler; 2325baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler; 232673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.delete_sampler_state = si_delete_sampler_state; 2327baf20397569fb499f736e5ad2350b008b8207fadChristian König 232873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.create_sampler_view = si_create_sampler_view; 2329baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view; 2330baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view; 23319b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.sampler_view_destroy = si_sampler_view_destroy; 23320d6b0b512acadbc5d64039063b5649fc401b3367Christian König 233373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.set_sample_mask = si_set_sample_mask; 233473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 23350d6b0b512acadbc5d64039063b5649fc401b3367Christian König rctx->context.set_constant_buffer = si_set_constant_buffer; 2336ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 23379b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.create_vertex_elements_state = si_create_vertex_elements; 23389b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.bind_vertex_elements_state = si_bind_vertex_elements; 23399b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.delete_vertex_elements_state = si_delete_vertex_element; 23409b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_vertex_buffers = si_set_vertex_buffers; 23419b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_index_buffer = si_set_index_buffer; 23429b213c871a080472660eff271c72a3fcc5d3f578Christian König 23439b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.create_stream_output_target = si_create_so_target; 23449b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.stream_output_target_destroy = si_so_target_destroy; 23459b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_stream_output_targets = si_set_so_targets; 23469b213c871a080472660eff271c72a3fcc5d3f578Christian König 23479b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.texture_barrier = si_texture_barrier; 23489b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_polygon_stipple = si_set_polygon_stipple; 23499b213c871a080472660eff271c72a3fcc5d3f578Christian König 2350ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->context.draw_vbo = si_draw_vbo; 235163636ae52aefc275115d1f3daac4e75285583485Christian König} 2352e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König 2353840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx) 2354840f05da6b92ba5266385836533842b9a9fc5da9Christian König{ 2355840f05da6b92ba5266385836533842b9a9fc5da9Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2356840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2357840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0); 2358840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2359840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0); 2360840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0); 2361840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0); 2362840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0); 2363840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0); 2364840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0); 2365840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0); 2366840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0); 2367840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0); 2368840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0); 2369840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0); 2370840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0); 2371840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0); 2372840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0); 2373840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0); 2374840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0); 2375840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0); 2376840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM, 2377840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_SWITCH_ON_EOP(1) | 2378840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_PARTIAL_VS_WAVE_ON(1) | 2379840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_PRIMGROUP_SIZE(63)); 2380840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000); 2381840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0); 2382840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1); 2383840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2384840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0); 2385840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210); 2386840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98); 2387840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2388840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000); 2389840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2390840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_state(rctx, init, pm4); 2391840f05da6b92ba5266385836533842b9a9fc5da9Christian König} 2392