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{ 4251d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer struct si_pm4_state *pm4; 4376660dfccede74782ac0d409da171ddbd61fae41Christian König struct si_state_blend *blend = rctx->queued.named.blend; 4476660dfccede74782ac0d409da171ddbd61fae41Christian König uint32_t mask; 4576660dfccede74782ac0d409da171ddbd61fae41Christian König 4651d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer if (blend == NULL) 4751d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer return; 4851d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer 4951d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer pm4 = CALLOC_STRUCT(si_pm4_state); 5051d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer if (pm4 == NULL) 5176660dfccede74782ac0d409da171ddbd61fae41Christian König return; 5276660dfccede74782ac0d409da171ddbd61fae41Christian König 5376660dfccede74782ac0d409da171ddbd61fae41Christian König mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1; 5476660dfccede74782ac0d409da171ddbd61fae41Christian König mask &= blend->cb_target_mask; 5576660dfccede74782ac0d409da171ddbd61fae41Christian König si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); 5676660dfccede74782ac0d409da171ddbd61fae41Christian König 5776660dfccede74782ac0d409da171ddbd61fae41Christian König si_pm4_set_state(rctx, fb_blend, pm4); 5876660dfccede74782ac0d409da171ddbd61fae41Christian König} 5976660dfccede74782ac0d409da171ddbd61fae41Christian König 6076660dfccede74782ac0d409da171ddbd61fae41Christian König/* 6163636ae52aefc275115d1f3daac4e75285583485Christian König * Blender functions 6263636ae52aefc275115d1f3daac4e75285583485Christian König */ 6363636ae52aefc275115d1f3daac4e75285583485Christian König 6463636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_function(int blend_func) 6563636ae52aefc275115d1f3daac4e75285583485Christian König{ 6663636ae52aefc275115d1f3daac4e75285583485Christian König switch (blend_func) { 6763636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_ADD: 6863636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_DST_PLUS_SRC; 6963636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_SUBTRACT: 7063636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_SRC_MINUS_DST; 7163636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_REVERSE_SUBTRACT: 7263636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_DST_MINUS_SRC; 7363636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_MIN: 7463636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_MIN_DST_SRC; 7563636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLEND_MAX: 7663636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_COMB_MAX_DST_SRC; 7763636ae52aefc275115d1f3daac4e75285583485Christian König default: 7863636ae52aefc275115d1f3daac4e75285583485Christian König R600_ERR("Unknown blend function %d\n", blend_func); 7963636ae52aefc275115d1f3daac4e75285583485Christian König assert(0); 8063636ae52aefc275115d1f3daac4e75285583485Christian König break; 8163636ae52aefc275115d1f3daac4e75285583485Christian König } 8263636ae52aefc275115d1f3daac4e75285583485Christian König return 0; 8363636ae52aefc275115d1f3daac4e75285583485Christian König} 8463636ae52aefc275115d1f3daac4e75285583485Christian König 8563636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_factor(int blend_fact) 8663636ae52aefc275115d1f3daac4e75285583485Christian König{ 8763636ae52aefc275115d1f3daac4e75285583485Christian König switch (blend_fact) { 8863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_ONE: 8963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE; 9063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_COLOR: 9163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_COLOR; 9263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_ALPHA: 9363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_ALPHA; 9463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_DST_ALPHA: 9563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_DST_ALPHA; 9663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_DST_COLOR: 9763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_DST_COLOR; 9863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 9963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC_ALPHA_SATURATE; 10063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_CONST_COLOR: 10163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_CONSTANT_COLOR; 10263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_CONST_ALPHA: 10363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_CONSTANT_ALPHA; 10463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_ZERO: 10563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ZERO; 10663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC_COLOR: 10763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_SRC_COLOR; 10863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 10963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_SRC_ALPHA; 11063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_DST_ALPHA: 11163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_DST_ALPHA; 11263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_DST_COLOR: 11363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_DST_COLOR; 11463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_CONST_COLOR: 11563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR; 11663636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 11763636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA; 11863636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC1_COLOR: 11963636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC1_COLOR; 12063636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_SRC1_ALPHA: 12163636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_SRC1_ALPHA; 12263636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 12363636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_INV_SRC1_COLOR; 12463636ae52aefc275115d1f3daac4e75285583485Christian König case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 12563636ae52aefc275115d1f3daac4e75285583485Christian König return V_028780_BLEND_INV_SRC1_ALPHA; 12663636ae52aefc275115d1f3daac4e75285583485Christian König default: 12763636ae52aefc275115d1f3daac4e75285583485Christian König R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 12863636ae52aefc275115d1f3daac4e75285583485Christian König assert(0); 12963636ae52aefc275115d1f3daac4e75285583485Christian König break; 13063636ae52aefc275115d1f3daac4e75285583485Christian König } 13163636ae52aefc275115d1f3daac4e75285583485Christian König return 0; 13263636ae52aefc275115d1f3daac4e75285583485Christian König} 13363636ae52aefc275115d1f3daac4e75285583485Christian König 13463636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void *si_create_blend_state(struct pipe_context *ctx, 13563636ae52aefc275115d1f3daac4e75285583485Christian König const struct pipe_blend_state *state) 13663636ae52aefc275115d1f3daac4e75285583485Christian König{ 13763636ae52aefc275115d1f3daac4e75285583485Christian König struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend); 13863636ae52aefc275115d1f3daac4e75285583485Christian König struct si_pm4_state *pm4 = &blend->pm4; 13963636ae52aefc275115d1f3daac4e75285583485Christian König 14063636ae52aefc275115d1f3daac4e75285583485Christian König uint32_t color_control; 14163636ae52aefc275115d1f3daac4e75285583485Christian König 14263636ae52aefc275115d1f3daac4e75285583485Christian König if (blend == NULL) 14363636ae52aefc275115d1f3daac4e75285583485Christian König return NULL; 14463636ae52aefc275115d1f3daac4e75285583485Christian König 14563636ae52aefc275115d1f3daac4e75285583485Christian König color_control = S_028808_MODE(V_028808_CB_NORMAL); 14663636ae52aefc275115d1f3daac4e75285583485Christian König if (state->logicop_enable) { 14763636ae52aefc275115d1f3daac4e75285583485Christian König color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4)); 14863636ae52aefc275115d1f3daac4e75285583485Christian König } else { 14963636ae52aefc275115d1f3daac4e75285583485Christian König color_control |= S_028808_ROP3(0xcc); 15063636ae52aefc275115d1f3daac4e75285583485Christian König } 15163636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control); 15263636ae52aefc275115d1f3daac4e75285583485Christian König 15363636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0); 15463636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0); 15563636ae52aefc275115d1f3daac4e75285583485Christian König 15663636ae52aefc275115d1f3daac4e75285583485Christian König blend->cb_target_mask = 0; 15763636ae52aefc275115d1f3daac4e75285583485Christian König for (int i = 0; i < 8; i++) { 15863636ae52aefc275115d1f3daac4e75285583485Christian König /* state->rt entries > 0 only written if independent blending */ 15963636ae52aefc275115d1f3daac4e75285583485Christian König const int j = state->independent_blend_enable ? i : 0; 16063636ae52aefc275115d1f3daac4e75285583485Christian König 16163636ae52aefc275115d1f3daac4e75285583485Christian König unsigned eqRGB = state->rt[j].rgb_func; 16263636ae52aefc275115d1f3daac4e75285583485Christian König unsigned srcRGB = state->rt[j].rgb_src_factor; 16363636ae52aefc275115d1f3daac4e75285583485Christian König unsigned dstRGB = state->rt[j].rgb_dst_factor; 16463636ae52aefc275115d1f3daac4e75285583485Christian König unsigned eqA = state->rt[j].alpha_func; 16563636ae52aefc275115d1f3daac4e75285583485Christian König unsigned srcA = state->rt[j].alpha_src_factor; 16663636ae52aefc275115d1f3daac4e75285583485Christian König unsigned dstA = state->rt[j].alpha_dst_factor; 16763636ae52aefc275115d1f3daac4e75285583485Christian König 16863636ae52aefc275115d1f3daac4e75285583485Christian König unsigned blend_cntl = 0; 16963636ae52aefc275115d1f3daac4e75285583485Christian König 17063636ae52aefc275115d1f3daac4e75285583485Christian König /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 17163636ae52aefc275115d1f3daac4e75285583485Christian König blend->cb_target_mask |= state->rt[j].colormask << (4 * i); 17263636ae52aefc275115d1f3daac4e75285583485Christian König 17363636ae52aefc275115d1f3daac4e75285583485Christian König if (!state->rt[j].blend_enable) { 17463636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 17563636ae52aefc275115d1f3daac4e75285583485Christian König continue; 17663636ae52aefc275115d1f3daac4e75285583485Christian König } 17763636ae52aefc275115d1f3daac4e75285583485Christian König 17863636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ENABLE(1); 17963636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB)); 18063636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB)); 18163636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB)); 18263636ae52aefc275115d1f3daac4e75285583485Christian König 18363636ae52aefc275115d1f3daac4e75285583485Christian König if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 18463636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1); 18563636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA)); 18663636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA)); 18763636ae52aefc275115d1f3daac4e75285583485Christian König blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA)); 18863636ae52aefc275115d1f3daac4e75285583485Christian König } 18963636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 19063636ae52aefc275115d1f3daac4e75285583485Christian König } 19163636ae52aefc275115d1f3daac4e75285583485Christian König 19263636ae52aefc275115d1f3daac4e75285583485Christian König return blend; 19363636ae52aefc275115d1f3daac4e75285583485Christian König} 19463636ae52aefc275115d1f3daac4e75285583485Christian König 19563636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_bind_blend_state(struct pipe_context *ctx, void *state) 19663636ae52aefc275115d1f3daac4e75285583485Christian König{ 19763636ae52aefc275115d1f3daac4e75285583485Christian König struct r600_context *rctx = (struct r600_context *)ctx; 19863636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state); 19976660dfccede74782ac0d409da171ddbd61fae41Christian König si_update_fb_blend_state(rctx); 20063636ae52aefc275115d1f3daac4e75285583485Christian König} 20163636ae52aefc275115d1f3daac4e75285583485Christian König 20263636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_delete_blend_state(struct pipe_context *ctx, void *state) 20363636ae52aefc275115d1f3daac4e75285583485Christian König{ 20463636ae52aefc275115d1f3daac4e75285583485Christian König struct r600_context *rctx = (struct r600_context *)ctx; 20563636ae52aefc275115d1f3daac4e75285583485Christian König si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state); 20663636ae52aefc275115d1f3daac4e75285583485Christian König} 20763636ae52aefc275115d1f3daac4e75285583485Christian König 2080a091a48242513e53a99976239405e8cb72d96beChristian Königstatic void si_set_blend_color(struct pipe_context *ctx, 2090a091a48242513e53a99976239405e8cb72d96beChristian König const struct pipe_blend_color *state) 2100a091a48242513e53a99976239405e8cb72d96beChristian König{ 2110a091a48242513e53a99976239405e8cb72d96beChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2120a091a48242513e53a99976239405e8cb72d96beChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2130a091a48242513e53a99976239405e8cb72d96beChristian König 2140a091a48242513e53a99976239405e8cb72d96beChristian König if (pm4 == NULL) 2150a091a48242513e53a99976239405e8cb72d96beChristian König return; 2160a091a48242513e53a99976239405e8cb72d96beChristian König 2170a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0])); 2180a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1])); 2190a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2])); 2200a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3])); 2210a091a48242513e53a99976239405e8cb72d96beChristian König 2220a091a48242513e53a99976239405e8cb72d96beChristian König si_pm4_set_state(rctx, blend_color, pm4); 2230a091a48242513e53a99976239405e8cb72d96beChristian König} 2240a091a48242513e53a99976239405e8cb72d96beChristian König 225835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 226835098a5290e59bb7b468eb987db67b0e1913c67Christian König * Clipping, scissors and viewport 227835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 228835098a5290e59bb7b468eb987db67b0e1913c67Christian König 2299cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian Königstatic void si_set_clip_state(struct pipe_context *ctx, 2309cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König const struct pipe_clip_state *state) 2319cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König{ 2329cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König struct r600_context *rctx = (struct r600_context *)ctx; 2339cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2349cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2359cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König if (pm4 == NULL) 2369cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König return; 2379cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2389cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König for (int i = 0; i < 6; i++) { 2399cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16, 2409cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][0])); 2419cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16, 2429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][1])); 2439cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16, 2449cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][2])); 2459cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16, 2469cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König fui(state->ucp[i][3])); 2479cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König } 2489cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2499cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König si_pm4_set_state(rctx, clip, pm4); 2509cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König} 2519cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 25243f414f7b76902a728d26231d4cc047b794df10bChristian Königstatic void si_set_scissor_state(struct pipe_context *ctx, 25343f414f7b76902a728d26231d4cc047b794df10bChristian König const struct pipe_scissor_state *state) 25443f414f7b76902a728d26231d4cc047b794df10bChristian König{ 25543f414f7b76902a728d26231d4cc047b794df10bChristian König struct r600_context *rctx = (struct r600_context *)ctx; 25643f414f7b76902a728d26231d4cc047b794df10bChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 25743f414f7b76902a728d26231d4cc047b794df10bChristian König uint32_t tl, br; 25843f414f7b76902a728d26231d4cc047b794df10bChristian König 25943f414f7b76902a728d26231d4cc047b794df10bChristian König if (pm4 == NULL) 26043f414f7b76902a728d26231d4cc047b794df10bChristian König return; 26143f414f7b76902a728d26231d4cc047b794df10bChristian König 26243f414f7b76902a728d26231d4cc047b794df10bChristian König tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny); 26343f414f7b76902a728d26231d4cc047b794df10bChristian König br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 26443f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl); 26543f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br); 26643f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl); 26743f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br); 26843f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl); 26943f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br); 27043f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl); 27143f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br); 27243f414f7b76902a728d26231d4cc047b794df10bChristian König 27343f414f7b76902a728d26231d4cc047b794df10bChristian König si_pm4_set_state(rctx, scissor, pm4); 27443f414f7b76902a728d26231d4cc047b794df10bChristian König} 27543f414f7b76902a728d26231d4cc047b794df10bChristian König 2767e011d92c9746ba4050890442db6e504fa42c4adChristian Königstatic void si_set_viewport_state(struct pipe_context *ctx, 2777e011d92c9746ba4050890442db6e504fa42c4adChristian König const struct pipe_viewport_state *state) 2787e011d92c9746ba4050890442db6e504fa42c4adChristian König{ 2797e011d92c9746ba4050890442db6e504fa42c4adChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2807e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport); 2817e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state *pm4 = &viewport->pm4; 2827e011d92c9746ba4050890442db6e504fa42c4adChristian König 2837e011d92c9746ba4050890442db6e504fa42c4adChristian König if (viewport == NULL) 2847e011d92c9746ba4050890442db6e504fa42c4adChristian König return; 2857e011d92c9746ba4050890442db6e504fa42c4adChristian König 2867e011d92c9746ba4050890442db6e504fa42c4adChristian König viewport->viewport = *state; 2877e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000); 2887e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000); 2897e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0])); 2907e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0])); 2917e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1])); 2927e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1])); 2937e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2])); 2947e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2])); 2957e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F); 2967e011d92c9746ba4050890442db6e504fa42c4adChristian König 2977e011d92c9746ba4050890442db6e504fa42c4adChristian König si_pm4_set_state(rctx, viewport, viewport); 2987e011d92c9746ba4050890442db6e504fa42c4adChristian König} 2997e011d92c9746ba4050890442db6e504fa42c4adChristian König 300835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 301bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König * inferred state between framebuffer and rasterizer 302bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König */ 303bd18a316e1495f501911d89c8b373382d1f8c8c2Christian Königstatic void si_update_fb_rs_state(struct r600_context *rctx) 304bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König{ 305bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König struct si_state_rasterizer *rs = rctx->queued.named.rasterizer; 30651d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer struct si_pm4_state *pm4; 307bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König unsigned offset_db_fmt_cntl = 0, depth; 308bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König float offset_units; 309bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 31051d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer if (!rs || !rctx->framebuffer.zsbuf) 311bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König return; 312bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 313bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units = rctx->queued.named.rasterizer->offset_units; 314bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König switch (rctx->framebuffer.zsbuf->texture->format) { 315bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z24X8_UNORM: 316bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 317bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -24; 318bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 2.0f; 319bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 320bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z32_FLOAT: 321bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 322bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -23; 323bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 1.0f; 324bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 325bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 326bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König case PIPE_FORMAT_Z16_UNORM: 327bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König depth = -16; 328bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_units *= 4.0f; 329bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König break; 330bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König default: 331bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König return; 332bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König } 333bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 33451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer pm4 = CALLOC_STRUCT(si_pm4_state); 335bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König /* FIXME some of those reg can be computed with cso */ 336bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 337bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE, 338bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König fui(rctx->queued.named.rasterizer->offset_scale)); 339bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units)); 340bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE, 341bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König fui(rctx->queued.named.rasterizer->offset_scale)); 342bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units)); 343bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl); 344bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 345bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_pm4_set_state(rctx, fb_rs, pm4); 346bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König} 347bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König 348bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König/* 349f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König * Rasterizer 350f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König */ 351f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 352f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic uint32_t si_translate_fill(uint32_t func) 353f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 354f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König switch(func) { 355f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_FILL: 356f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_TRIANGLES; 357f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_LINE: 358f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_LINES; 359f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König case PIPE_POLYGON_MODE_POINT: 360f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_POINTS; 361f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König default: 362f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König assert(0); 363f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return V_028814_X_DRAW_POINTS; 364f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 365f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 366f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 367f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void *si_create_rs_state(struct pipe_context *ctx, 368f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König const struct pipe_rasterizer_state *state) 369f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 370f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer); 371f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_pm4_state *pm4 = &rs->pm4; 372f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned tmp; 373f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned prov_vtx = 1, polygon_dual_mode; 374f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned clip_rule; 375f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König float psize_min, psize_max; 376f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 377f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (rs == NULL) { 378f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return NULL; 379f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 380f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 381f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 382f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König state->fill_back != PIPE_POLYGON_MODE_FILL); 383f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 384f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->flatshade_first) 385f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König prov_vtx = 0; 386f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 387f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->flatshade = state->flatshade; 388f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->sprite_coord_enable = state->sprite_coord_enable; 389f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_sc_line_stipple = state->line_stipple_enable ? 390f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 391f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 392f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_su_sc_mode_cntl = 393f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_PROVOKING_VTX_LAST(prov_vtx) | 394f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) | 395f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) | 396f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_FACE(!state->front_ccw) | 397f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 398f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 399f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 400f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLY_MODE(polygon_dual_mode) | 401f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) | 402f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back)); 403f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_cl_clip_cntl = 404f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_PS_UCP_MODE(3) | 405f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 406f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 407f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 408f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->pa_cl_vs_out_cntl = 409f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) | 410f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex); 411f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 412f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König clip_rule = state->scissor ? 0xAAAA : 0xFFFF; 413f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 414f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* offset */ 415f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->offset_units = state->offset_units; 416f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rs->offset_scale = state->offset_scale * 12.0f; 417f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 418f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* XXX: Flat shading hangs the GPU */ 419f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = S_0286D4_FLAT_SHADE_ENA(0); 420f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->sprite_coord_enable) { 421f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 422f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) | 423f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) | 424f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) | 425f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1); 426f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 427f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 428f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 429f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 430f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp); 431f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 432f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000); 433f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* point size 12.4 fixed point */ 434f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = (unsigned)(state->point_size * 8.0); 435f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp)); 436f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 437f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state->point_size_per_vertex) { 438f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_min = util_get_min_point_size(state); 439f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_max = 8192; 440f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } else { 441f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* Force the point size to be as if the vertex output was disabled. */ 442f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_min = state->point_size; 443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König psize_max = state->point_size; 444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König } 445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König /* Divide by two, because 0.5 = 1 pixel. */ 446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX, 447f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 448f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2))); 449f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 450f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König tmp = (unsigned)state->line_width * 8; 451f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp)); 452f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0, 453f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable)); 454f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 455f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400); 456f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL, 457f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König S_028BE4_PIX_CENTER(state->gl_rasterization_rules)); 458f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000); 459f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000); 460f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000); 461f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000); 462f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 463f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp)); 464f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule); 465f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 466f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return rs; 467f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 468f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 469f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_bind_rs_state(struct pipe_context *ctx, void *state) 470f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 471f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct r600_context *rctx = (struct r600_context *)ctx; 472f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state; 473f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 474f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König if (state == NULL) 475f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König return; 476f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 477f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König // TODO 478f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->sprite_coord_enable = rs->sprite_coord_enable; 479f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple; 480f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl; 481f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl; 482f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl; 483f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 484f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_bind_state(rctx, rasterizer, rs); 485bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_update_fb_rs_state(rctx); 486f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 487f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 488f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_delete_rs_state(struct pipe_context *ctx, void *state) 489f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{ 490f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct r600_context *rctx = (struct r600_context *)ctx; 491f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state); 492f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König} 493f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 494f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König/* 495e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König * infeered state between dsa and stencil ref 496e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König */ 497e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_update_dsa_stencil_ref(struct r600_context *rctx) 498e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{ 499e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 500e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct pipe_stencil_ref *ref = &rctx->stencil_ref; 501e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct si_state_dsa *dsa = rctx->queued.named.dsa; 502e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 503e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König if (pm4 == NULL) 504e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König return; 505e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 506e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK, 507e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILTESTVAL(ref->ref_value[0]) | 508e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILMASK(dsa->valuemask[0]) | 509e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028430_STENCILWRITEMASK(dsa->writemask[0])); 510e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF, 511e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) | 512e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILMASK_BF(dsa->valuemask[1]) | 513e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König S_028434_STENCILWRITEMASK_BF(dsa->writemask[1])); 514e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 515e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_pm4_set_state(rctx, dsa_stencil_ref, pm4); 516e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König} 517e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 518e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx, 519e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König const struct pipe_stencil_ref *state) 520e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{ 521e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct r600_context *rctx = (struct r600_context *)ctx; 522e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König rctx->stencil_ref = *state; 523e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_update_dsa_stencil_ref(rctx); 524e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König} 525e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 526e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König 527e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König/* 528b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König * DSA 529b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König */ 530b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 5317dace3a3cf894adb51a21ff6b08f58608ea33831Christian Königstatic uint32_t si_translate_stencil_op(int s_op) 532b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 5337dace3a3cf894adb51a21ff6b08f58608ea33831Christian König switch (s_op) { 5347dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_KEEP: 5357dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_KEEP; 5367dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_ZERO: 5377dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ZERO; 5387dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_REPLACE: 5397dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_REPLACE_TEST; 5407dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INCR: 5417dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ADD_CLAMP; 5427dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_DECR: 5437dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_SUB_CLAMP; 5447dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INCR_WRAP: 5457dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_ADD_WRAP; 5467dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_DECR_WRAP: 5477dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_SUB_WRAP; 5487dace3a3cf894adb51a21ff6b08f58608ea33831Christian König case PIPE_STENCIL_OP_INVERT: 5497dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return V_02842C_STENCIL_INVERT; 5507dace3a3cf894adb51a21ff6b08f58608ea33831Christian König default: 5517dace3a3cf894adb51a21ff6b08f58608ea33831Christian König R600_ERR("Unknown stencil op %d", s_op); 5527dace3a3cf894adb51a21ff6b08f58608ea33831Christian König assert(0); 5537dace3a3cf894adb51a21ff6b08f58608ea33831Christian König break; 5547dace3a3cf894adb51a21ff6b08f58608ea33831Christian König } 5557dace3a3cf894adb51a21ff6b08f58608ea33831Christian König return 0; 556b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 557b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 558b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_dsa_state(struct pipe_context *ctx, 559b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König const struct pipe_depth_stencil_alpha_state *state) 560b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 561b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa); 562b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_pm4_state *pm4 = &dsa->pm4; 563b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_depth_control, /* alpha_test_control, */ alpha_ref; 564b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_render_override, db_render_control; 5657dace3a3cf894adb51a21ff6b08f58608ea33831Christian König uint32_t db_stencil_control = 0; 566b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 567b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (dsa == NULL) { 568b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return NULL; 569b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 570b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 571b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->valuemask[0] = state->stencil[0].valuemask; 572b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->valuemask[1] = state->stencil[1].valuemask; 573b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->writemask[0] = state->stencil[0].writemask; 574b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->writemask[1] = state->stencil[1].writemask; 575b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 576b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 577b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 578b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028800_ZFUNC(state->depth.func); 579b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 580b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* stencil */ 581b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->stencil[0].enabled) { 582b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control |= S_028800_STENCIL_ENABLE(1); 5837dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); 5847dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op)); 5857dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op)); 5867dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op)); 587b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 588b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->stencil[1].enabled) { 589b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_depth_control |= S_028800_BACKFACE_ENABLE(1); 5907dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); 5917dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op)); 5927dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op)); 5937dace3a3cf894adb51a21ff6b08f58608ea33831Christian König db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op)); 594b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 595b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 596b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 597b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* alpha */ 598b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control = 0; 599b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König alpha_ref = 0; 600b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state->alpha.enabled) { 601b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 602b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 603b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König alpha_ref = fui(state->alpha.ref_value); 604b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König } 605b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->alpha_ref = alpha_ref; 606b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 607b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* misc */ 608b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_render_control = 0; 609b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) | 610b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) | 611b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE); 612b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König /* TODO db_render_override depends on query */ 613b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000); 614b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000); 615b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000); 616b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000); 617b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König //si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control); 618b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control); 619b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control); 620b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override); 6217dace3a3cf894adb51a21ff6b08f58608ea33831Christian König si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control); 622b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0); 623b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0); 624b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0); 625b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00); 626b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König dsa->db_render_override = db_render_override; 627b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 628b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return dsa; 629b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 630b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 631b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state) 632b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 633b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct r600_context *rctx = (struct r600_context *)ctx; 634b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *dsa = state; 635b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 636b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König if (state == NULL) 637b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return; 638b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 639b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_bind_state(rctx, dsa, dsa); 640e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König si_update_dsa_stencil_ref(rctx); 641b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 642b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König // TODO 643b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->alpha_ref = dsa->alpha_ref; 644b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->alpha_ref_dirty = true; 645b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 646b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 647b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state) 648b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 649b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct r600_context *rctx = (struct r600_context *)ctx; 650b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state); 651b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 652b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 653b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_db_flush_dsa(struct r600_context *rctx) 654b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{ 655b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct pipe_depth_stencil_alpha_state dsa; 656b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *state; 657b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 658b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König memset(&dsa, 0, sizeof(dsa)); 659b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 660b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 661b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL, 662b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_DEPTH_COPY(1) | 663b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_STENCIL_COPY(1) | 664b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König S_028000_COPY_CENTROID(1)); 665b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König return state; 666b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König} 667b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 668b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König/* 669835098a5290e59bb7b468eb987db67b0e1913c67Christian König * format translation 670835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 671835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorformat(enum pipe_format format) 672835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 673835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 674835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 675835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UNORM: 676835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UINT: 677835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_SINT: 678835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UNORM: 679835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UINT: 680835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_SINT: 681835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UNORM: 682835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UINT: 683835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SINT: 684835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SRGB: 685835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UNORM: 686835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SNORM: 687835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UINT: 688835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SINT: 689835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8; 690835098a5290e59bb7b468eb987db67b0e1913c67Christian König 691835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 692835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G6R5_UNORM: 693835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_5_6_5; 694835098a5290e59bb7b468eb987db67b0e1913c67Christian König 695835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5A1_UNORM: 696835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5X1_UNORM: 697835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_1_5_5_5; 698835098a5290e59bb7b468eb987db67b0e1913c67Christian König 699835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4A4_UNORM: 700835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4X4_UNORM: 701835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_4_4_4_4; 702835098a5290e59bb7b468eb987db67b0e1913c67Christian König 703835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UNORM: 704835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UINT: 705835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SINT: 706835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SRGB: 707835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UNORM: 708835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UINT: 709835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_SINT: 710835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_8; 711835098a5290e59bb7b468eb987db67b0e1913c67Christian König 712835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 713835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UNORM: 714835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UINT: 715835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_SINT: 716835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_FLOAT: 717835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_FLOAT: 718835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16; 719835098a5290e59bb7b468eb987db67b0e1913c67Christian König 720835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 721835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_SRGB: 722835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_UNORM: 723835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8R8G8B8_UNORM: 724835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_SRGB: 725835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_UNORM: 726835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8X8_UNORM: 727835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SNORM: 728835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UNORM: 729835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8X8_UNORM: 730835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 731835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8B8G8R8_UNORM: 732835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8R8G8B8_UNORM: 733835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8_UNORM: 734835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SSCALED: 735835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_USCALED: 736835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SINT: 737835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UINT: 738835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_8_8_8; 739835098a5290e59bb7b468eb987db67b0e1913c67Christian König 740835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10A2_UNORM: 741835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10X2_SNORM: 742835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UNORM: 743835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UINT: 744835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 745835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_2_10_10_10; 746835098a5290e59bb7b468eb987db67b0e1913c67Christian König 747835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 748835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 749835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_8_24; 750835098a5290e59bb7b468eb987db67b0e1913c67Christian König 751835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8Z24_UNORM: 752835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 753835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_24_8; 754835098a5290e59bb7b468eb987db67b0e1913c67Christian König 755835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 756835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_X24_8_32_FLOAT; 757835098a5290e59bb7b468eb987db67b0e1913c67Christian König 758835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_FLOAT: 759835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 760835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32; 761835098a5290e59bb7b468eb987db67b0e1913c67Christian König 762835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SSCALED: 763835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UNORM: 764835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UINT: 765835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SINT: 766835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16_16; 767835098a5290e59bb7b468eb987db67b0e1913c67Christian König 768835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R11G11B10_FLOAT: 769835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_10_11_11; 770835098a5290e59bb7b468eb987db67b0e1913c67Christian König 771835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 772835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_USCALED: 773835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_SSCALED: 774835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UINT: 775835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SINT: 776835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_USCALED: 777835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SSCALED: 778835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UNORM: 779835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SNORM: 780835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16_FLOAT: 781835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_FLOAT: 782835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_16_16_16_16; 783835098a5290e59bb7b468eb987db67b0e1913c67Christian König 784835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_FLOAT: 785835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_USCALED: 786835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SSCALED: 787835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SINT: 788835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_UINT: 789835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32_32; 790835098a5290e59bb7b468eb987db67b0e1913c67Christian König 791835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 792835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SNORM: 793835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UNORM: 794835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SSCALED: 795835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_USCALED: 796835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SINT: 797835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UINT: 798835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_FLOAT: 799835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_COLOR_32_32_32_32; 800835098a5290e59bb7b468eb987db67b0e1913c67Christian König 801835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* YUV buffers. */ 802835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_UYVY: 803835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_YUYV: 804835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 96-bit buffers. */ 805835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32_FLOAT: 806835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 807835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L4A4_UNORM: 808835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R4A4_UNORM: 809835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A4R4_UNORM: 810835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 811835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; /* Unsupported. */ 812835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 813835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 814835098a5290e59bb7b468eb987db67b0e1913c67Christian König 815835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorswap(enum pipe_format format) 816835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 817835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 818835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 819835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L4A4_UNORM: 820835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A4R4_UNORM: 821835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 822835098a5290e59bb7b468eb987db67b0e1913c67Christian König 823835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UNORM: 824835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_UINT: 825835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8_SINT: 826835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R4A4_UNORM: 827835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT_REV; 828835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UNORM: 829835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UNORM: 830835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_UINT: 831835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_I8_SINT: 832835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_UINT: 833835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SINT: 834835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8_SRGB: 835835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UNORM: 836835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SNORM: 837835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_UINT: 838835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8_SINT: 839835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 840835098a5290e59bb7b468eb987db67b0e1913c67Christian König 841835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 842835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G6R5_UNORM: 843835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 844835098a5290e59bb7b468eb987db67b0e1913c67Christian König 845835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5A1_UNORM: 846835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B5G5R5X1_UNORM: 847835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 848835098a5290e59bb7b468eb987db67b0e1913c67Christian König 849835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4A4_UNORM: 850835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B4G4R4X4_UNORM: 851835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 852835098a5290e59bb7b468eb987db67b0e1913c67Christian König 853835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 854835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 855835098a5290e59bb7b468eb987db67b0e1913c67Christian König 856835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UNORM: 857835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_UINT: 858835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SINT: 859835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_L8A8_SRGB: 860835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 861835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UNORM: 862835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_UINT: 863835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8_SINT: 864835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 865835098a5290e59bb7b468eb987db67b0e1913c67Christian König 866835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UNORM: 867835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_UINT: 868835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_SINT: 869835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16_FLOAT: 870835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 871835098a5290e59bb7b468eb987db67b0e1913c67Christian König 872835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 873835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_SRGB: 874835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 875835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_SRGB: 876835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 877835098a5290e59bb7b468eb987db67b0e1913c67Christian König 878835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8A8_UNORM: 879835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B8G8R8X8_UNORM: 880835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 881835098a5290e59bb7b468eb987db67b0e1913c67Christian König 882835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8R8G8B8_UNORM: 883835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8R8G8B8_UNORM: 884835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT_REV; 885835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SNORM: 886835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UNORM: 887835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SSCALED: 888835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_USCALED: 889835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_SINT: 890835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8A8_UINT: 891835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R8G8B8X8_UNORM: 892835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 893835098a5290e59bb7b468eb987db67b0e1913c67Christian König 894835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_A8B8G8R8_UNORM: 895835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8B8G8R8_UNORM: 896835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 897835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD_REV; 898835098a5290e59bb7b468eb987db67b0e1913c67Christian König 899835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 900835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 901835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 902835098a5290e59bb7b468eb987db67b0e1913c67Christian König 903835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_X8Z24_UNORM: 904835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 905835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 906835098a5290e59bb7b468eb987db67b0e1913c67Christian König 907835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10A2_UNORM: 908835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10G10B10X2_SNORM: 909835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 910835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 911835098a5290e59bb7b468eb987db67b0e1913c67Christian König 912835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UNORM: 913835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_B10G10R10A2_UINT: 914835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_ALT; 915835098a5290e59bb7b468eb987db67b0e1913c67Christian König 916835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R11G11B10_FLOAT: 917835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_FLOAT: 918835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_UINT: 919835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32_SINT: 920835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 921835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_FLOAT: 922835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UNORM: 923835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_UINT: 924835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16_SINT: 925835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 926835098a5290e59bb7b468eb987db67b0e1913c67Christian König 927835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 928835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_FLOAT: 929835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_UINT: 930835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32_SINT: 931835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UNORM: 932835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SNORM: 933835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_USCALED: 934835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SSCALED: 935835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_UINT: 936835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_SINT: 937835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R16G16B16A16_FLOAT: 938835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 939835098a5290e59bb7b468eb987db67b0e1913c67Christian König 940835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 941835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_FLOAT: 942835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SNORM: 943835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UNORM: 944835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SSCALED: 945835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_USCALED: 946835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_SINT: 947835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_R32G32B32A32_UINT: 948835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_SWAP_STD; 949835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 950835098a5290e59bb7b468eb987db67b0e1913c67Christian König R600_ERR("unsupported colorswap format %d\n", format); 951835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 952835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 953835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 954835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 955835098a5290e59bb7b468eb987db67b0e1913c67Christian König 956835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat) 957835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 958835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (R600_BIG_ENDIAN) { 959835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch(colorformat) { 960835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 8-bit buffers. */ 961835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8: 962835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; 963835098a5290e59bb7b468eb987db67b0e1913c67Christian König 964835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 16-bit buffers. */ 965835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_5_6_5: 966835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_1_5_5_5: 967835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_4_4_4_4: 968835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16: 969835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_8: 970835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN16; 971835098a5290e59bb7b468eb987db67b0e1913c67Christian König 972835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 32-bit buffers. */ 973835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_8_8_8: 974835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_2_10_10_10: 975835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_8_24: 976835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_24_8: 977835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16_16: 978835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 979835098a5290e59bb7b468eb987db67b0e1913c67Christian König 980835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 64-bit buffers. */ 981835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_16_16_16_16: 982835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN16; 983835098a5290e59bb7b468eb987db67b0e1913c67Christian König 984835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_32_32: 985835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 986835098a5290e59bb7b468eb987db67b0e1913c67Christian König 987835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* 128-bit buffers. */ 988835098a5290e59bb7b468eb987db67b0e1913c67Christian König case V_028C70_COLOR_32_32_32_32: 989835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_8IN32; 990835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 991835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; /* Unsupported. */ 992835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 993835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 994835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028C70_ENDIAN_NONE; 995835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 996835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 997835098a5290e59bb7b468eb987db67b0e1913c67Christian König 998f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer/* Returns the size in bits of the widest component of a CB format */ 999f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzerstatic unsigned si_colorformat_max_comp_size(uint32_t colorformat) 1000f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer{ 1001f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer switch(colorformat) { 1002f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_4_4_4_4: 1003f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 4; 1004f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1005f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_1_5_5_5: 1006f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_5_5_5_1: 1007f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 5; 1008f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1009f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_5_6_5: 1010f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 6; 1011f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1012f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_8: 1013f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_8_8: 1014f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_8_8_8_8: 1015f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 8; 1016f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1017f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_10_10_10_2: 1018f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_2_10_10_10: 1019f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 10; 1020f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1021f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_10_11_11: 1022f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_11_11_10: 1023f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 11; 1024f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1025f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_16: 1026f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_16_16: 1027f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_16_16_16_16: 1028f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 16; 1029f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1030f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_8_24: 1031f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_24_8: 1032f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 24; 1033f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1034f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_32: 1035f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_32_32: 1036f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_32_32_32_32: 1037f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer case V_028C70_COLOR_X24_8_32_FLOAT: 1038f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 32; 1039f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer } 1040f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1041f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer assert(!"Unknown maximum component size"); 1042f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer return 0; 1043f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer} 1044f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1045835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_dbformat(enum pipe_format format) 1046835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1047835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (format) { 1048835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z16_UNORM: 1049835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_16; 1050835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24X8_UNORM: 1051835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1052835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_24; /* XXX no longer supported on SI */ 1053835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT: 1054835098a5290e59bb7b468eb987db67b0e1913c67Christian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1055835098a5290e59bb7b468eb987db67b0e1913c67Christian König return V_028040_Z_32_FLOAT; 1056835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 1057835098a5290e59bb7b468eb987db67b0e1913c67Christian König return ~0U; 1058835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1059835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1060835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1061835098a5290e59bb7b468eb987db67b0e1913c67Christian König/* 106273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König * Texture translation 106373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König */ 106473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 106573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic uint32_t si_translate_texformat(struct pipe_screen *screen, 106673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König enum pipe_format format, 106773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct util_format_description *desc, 106873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int first_non_void) 106973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 107073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König boolean uniform = TRUE; 107173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int i; 107273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 107373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Colorspace (return non-RGB formats directly). */ 107473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->colorspace) { 107573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Depth stencil formats */ 107673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_ZS: 107773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (format) { 107873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z16_UNORM: 107973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16; 108073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_X24S8_UINT: 108173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z24X8_UNORM: 108273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z24_UNORM_S8_UINT: 108373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_24_8; 108473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8X24_UINT: 108573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_X8Z24_UNORM: 108673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8_UINT_Z24_UNORM: 108773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_24; 108873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_S8_UINT: 108973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8; 109073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z32_FLOAT: 109173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32; 109273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 109373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_X24_8_32; 109473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 109573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 109673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 109773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 109873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_YUV: 109973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; /* TODO */ 110073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 110173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_COLORSPACE_SRGB: 110273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 110373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 110473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 110573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 110673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 110773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 110873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* TODO compressed formats */ 110973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 111073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { 111173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_5_9_9_9; 111273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else if (format == PIPE_FORMAT_R11G11B10_FLOAT) { 111373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_10_11_11; 111473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 111573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 111673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* R8G8Bx_SNORM - TODO CxV8U8 */ 111773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 111873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* See whether the components are of the same size. */ 111973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König for (i = 1; i < desc->nr_channels; i++) { 112073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uniform = uniform && desc->channel[0].size == desc->channel[i].size; 112173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 112273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 112373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* Non-uniform formats. */ 112473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (!uniform) { 112573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch(desc->nr_channels) { 112673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 3: 112773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 5 && 112873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 6 && 112973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 5) { 113073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_5_6_5; 113173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 113273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 113373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 113473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 5 && 113573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 5 && 113673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 5 && 113773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[3].size == 1) { 113873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_1_5_5_5; 113973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 114073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (desc->channel[0].size == 10 && 114173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[1].size == 10 && 114273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[2].size == 10 && 114373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König desc->channel[3].size == 2) { 114473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_2_10_10_10; 114573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 114673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 114773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 114873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 114973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 115073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 115173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (first_non_void < 0 || first_non_void > 3) 115273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König goto out_unknown; 115373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 115473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* uniform formats */ 115573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->channel[first_non_void].size) { 115673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 115773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 115873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 115973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_4_4; 116073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 116173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_4_4_4_4; 116273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 116373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 116473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 8: 116573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 116673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 116773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8; 116873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 116973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_8; 117073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 117173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_8_8_8_8; 117273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 117373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 117473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 16: 117573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 117673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 117773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16; 117873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 117973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16_16; 118073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 118173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_16_16_16_16; 118273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 118373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 118473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 32: 118573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->nr_channels) { 118673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 118773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32; 118873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 118973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32; 119073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 3: 119173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32_32; 119273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 119373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F14_IMG_DATA_FORMAT_32_32_32_32; 119473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 119573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 119673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 119773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königout_unknown: 119873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */ 119973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return ~0; 120073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 120173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 120273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_wrap(unsigned wrap) 120373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 120473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (wrap) { 120573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 120673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_REPEAT: 120773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_WRAP; 120873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP: 120973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_HALF_BORDER; 121073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 121173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL; 121273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 121373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_CLAMP_BORDER; 121473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_REPEAT: 121573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR; 121673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP: 121773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER; 121873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 121973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL; 122073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 122173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER; 122273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 122373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 122473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 122573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_filter(unsigned filter) 122673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 122773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (filter) { 122873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 122973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_FILTER_NEAREST: 123073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_XY_FILTER_POINT; 123173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_FILTER_LINEAR: 123273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_XY_FILTER_BILINEAR; 123373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 123473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 123573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 123673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_mipfilter(unsigned filter) 123773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 123873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (filter) { 123973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_NEAREST: 124073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_POINT; 124173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_LINEAR: 124273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_LINEAR; 124373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 124473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEX_MIPFILTER_NONE: 124573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F38_SQ_TEX_Z_FILTER_NONE; 124673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 124773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 124873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 124973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_compare(unsigned compare) 125073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 125173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (compare) { 125273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 125373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_NEVER: 125473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER; 125573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_LESS: 125673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS; 125773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_EQUAL: 125873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL; 125973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_LEQUAL: 126073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL; 126173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_GREATER: 126273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER; 126373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_NOTEQUAL: 126473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL; 126573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_GEQUAL: 126673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL; 126773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_FUNC_ALWAYS: 126873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS; 126973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 127073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 127173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 127273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_dim(unsigned dim) 127373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 127473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (dim) { 127573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 127673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_1D: 127773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_1D; 127873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_1D_ARRAY: 127973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_1D_ARRAY; 128073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_2D: 128173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_RECT: 128273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_2D; 128373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_2D_ARRAY: 128473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_2D_ARRAY; 128573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_3D: 128673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_3D; 128773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case PIPE_TEXTURE_CUBE: 128873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return V_008F1C_SQ_RSRC_IMG_CUBE; 128973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 129073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 129173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 129273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König/* 129353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König * Format support testing 129453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König */ 129553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 129653d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 129753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 129853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_texformat(screen, format, util_format_description(format), 129953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König util_format_get_first_non_void_channel(format)) != ~0U; 130053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 130153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 1302b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian Königstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen, 1303b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König enum pipe_format format, 1304b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König const struct util_format_description *desc, 1305b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int first_non_void) 130653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 1307302c66ff813221998bbdcd56887a440aa3c60650Christian König unsigned type = desc->channel[first_non_void].type; 1308302c66ff813221998bbdcd56887a440aa3c60650Christian König int i; 1309302c66ff813221998bbdcd56887a440aa3c60650Christian König 1310302c66ff813221998bbdcd56887a440aa3c60650Christian König if (type == UTIL_FORMAT_TYPE_FIXED) 1311302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_INVALID; 131253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 1313302c66ff813221998bbdcd56887a440aa3c60650Christian König /* See whether the components are of the same size. */ 1314302c66ff813221998bbdcd56887a440aa3c60650Christian König for (i = 0; i < desc->nr_channels; i++) { 1315302c66ff813221998bbdcd56887a440aa3c60650Christian König if (desc->channel[first_non_void].size != desc->channel[i].size) 1316302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_INVALID; 1317302c66ff813221998bbdcd56887a440aa3c60650Christian König } 131853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 1319302c66ff813221998bbdcd56887a440aa3c60650Christian König switch (desc->channel[first_non_void].size) { 1320302c66ff813221998bbdcd56887a440aa3c60650Christian König case 8: 1321302c66ff813221998bbdcd56887a440aa3c60650Christian König switch (desc->nr_channels) { 1322302c66ff813221998bbdcd56887a440aa3c60650Christian König case 1: 1323302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_8; 1324302c66ff813221998bbdcd56887a440aa3c60650Christian König case 2: 1325302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_8_8; 1326302c66ff813221998bbdcd56887a440aa3c60650Christian König case 3: 1327302c66ff813221998bbdcd56887a440aa3c60650Christian König case 4: 1328302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_8_8_8_8; 1329302c66ff813221998bbdcd56887a440aa3c60650Christian König } 1330302c66ff813221998bbdcd56887a440aa3c60650Christian König break; 1331302c66ff813221998bbdcd56887a440aa3c60650Christian König case 16: 1332302c66ff813221998bbdcd56887a440aa3c60650Christian König switch (desc->nr_channels) { 1333302c66ff813221998bbdcd56887a440aa3c60650Christian König case 1: 1334302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_16; 1335302c66ff813221998bbdcd56887a440aa3c60650Christian König case 2: 1336302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_16_16; 1337302c66ff813221998bbdcd56887a440aa3c60650Christian König case 3: 1338302c66ff813221998bbdcd56887a440aa3c60650Christian König case 4: 1339302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_16_16_16_16; 1340302c66ff813221998bbdcd56887a440aa3c60650Christian König } 1341302c66ff813221998bbdcd56887a440aa3c60650Christian König break; 1342302c66ff813221998bbdcd56887a440aa3c60650Christian König case 32: 1343302c66ff813221998bbdcd56887a440aa3c60650Christian König if (type != UTIL_FORMAT_TYPE_FLOAT) 1344302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_INVALID; 1345302c66ff813221998bbdcd56887a440aa3c60650Christian König 1346302c66ff813221998bbdcd56887a440aa3c60650Christian König switch (desc->nr_channels) { 1347302c66ff813221998bbdcd56887a440aa3c60650Christian König case 1: 1348302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_32; 1349302c66ff813221998bbdcd56887a440aa3c60650Christian König case 2: 1350302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_32_32; 1351302c66ff813221998bbdcd56887a440aa3c60650Christian König case 3: 1352302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_32_32_32; 1353302c66ff813221998bbdcd56887a440aa3c60650Christian König case 4: 1354302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_32_32_32_32; 1355302c66ff813221998bbdcd56887a440aa3c60650Christian König } 1356302c66ff813221998bbdcd56887a440aa3c60650Christian König break; 1357302c66ff813221998bbdcd56887a440aa3c60650Christian König } 135853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 1359302c66ff813221998bbdcd56887a440aa3c60650Christian König return V_008F0C_BUF_DATA_FORMAT_INVALID; 136053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 136153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 136253d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format) 136353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 1364302c66ff813221998bbdcd56887a440aa3c60650Christian König const struct util_format_description *desc; 1365302c66ff813221998bbdcd56887a440aa3c60650Christian König int first_non_void; 1366302c66ff813221998bbdcd56887a440aa3c60650Christian König unsigned data_format; 1367302c66ff813221998bbdcd56887a440aa3c60650Christian König 1368302c66ff813221998bbdcd56887a440aa3c60650Christian König desc = util_format_description(format); 1369302c66ff813221998bbdcd56887a440aa3c60650Christian König first_non_void = util_format_get_first_non_void_channel(format); 1370302c66ff813221998bbdcd56887a440aa3c60650Christian König data_format = si_translate_vertexformat(screen, format, desc, first_non_void); 1371302c66ff813221998bbdcd56887a440aa3c60650Christian König return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID; 137253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 137353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 137453d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_colorbuffer_format_supported(enum pipe_format format) 137553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 137653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_colorformat(format) != ~0U && 137753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_translate_colorswap(format) != ~0U; 137853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 137953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 138053d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_zs_format_supported(enum pipe_format format) 138153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 138253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return si_translate_dbformat(format) != ~0U; 138353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 138453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 138553d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen, 138653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_format format, 138753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_texture_target target, 138853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned sample_count, 138953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned usage) 139053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{ 139153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned retval = 0; 139253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 139353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (target >= PIPE_MAX_TEXTURE_TYPES) { 139453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König R600_ERR("r600: unsupported texture type %d\n", target); 139553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 139653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 139753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 139853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (!util_format_is_supported(format, usage)) 139953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 140053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 140153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König /* Multisample */ 140253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (sample_count > 1) 140353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return FALSE; 140453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 140553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_SAMPLER_VIEW) && 140653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_sampler_format_supported(screen, format)) { 140753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_SAMPLER_VIEW; 140853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 140953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 141053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & (PIPE_BIND_RENDER_TARGET | 141153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_DISPLAY_TARGET | 141253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SCANOUT | 141353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SHARED)) && 141453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_colorbuffer_format_supported(format)) { 141553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= usage & 141653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König (PIPE_BIND_RENDER_TARGET | 141753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_DISPLAY_TARGET | 141853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SCANOUT | 141953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König PIPE_BIND_SHARED); 142053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 142153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 142253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_DEPTH_STENCIL) && 142353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_zs_format_supported(format)) { 142453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_DEPTH_STENCIL; 142553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 142653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 142753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if ((usage & PIPE_BIND_VERTEX_BUFFER) && 142853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König si_is_vertex_format_supported(screen, format)) { 142953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_VERTEX_BUFFER; 143053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König } 143153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 143253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (usage & PIPE_BIND_TRANSFER_READ) 143353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_TRANSFER_READ; 143453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König if (usage & PIPE_BIND_TRANSFER_WRITE) 143553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König retval |= PIPE_BIND_TRANSFER_WRITE; 143653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 143753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König return retval == usage; 143853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König} 143953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König 144053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König/* 1441835098a5290e59bb7b468eb987db67b0e1913c67Christian König * framebuffer handling 1442835098a5290e59bb7b468eb987db67b0e1913c67Christian König */ 1443835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1444835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4, 1445835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state, int cb) 1446835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1447835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_resource_texture *rtex; 1448835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_surface *surf; 1449835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned level = state->cbufs[cb]->u.tex.level; 1450835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned pitch, slice; 1451835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned color_info, color_attrib; 1452835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned format, swap, ntype, endian; 1453835098a5290e59bb7b468eb987db67b0e1913c67Christian König uint64_t offset; 1454835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned blocksize; 1455835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct util_format_description *desc; 1456835098a5290e59bb7b468eb987db67b0e1913c67Christian König int i; 1457835098a5290e59bb7b468eb987db67b0e1913c67Christian König unsigned blend_clamp = 0, blend_bypass = 0; 1458f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer unsigned max_comp_size; 1459835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1460835098a5290e59bb7b468eb987db67b0e1913c67Christian König surf = (struct r600_surface *)state->cbufs[cb]; 1461835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; 1462835098a5290e59bb7b468eb987db67b0e1913c67Christian König blocksize = util_format_get_blocksize(rtex->real_format); 1463835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1464835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->depth) 1465835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->have_depth_fb = TRUE; 1466835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1467835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->depth && !rtex->is_flushing_texture) { 1468835098a5290e59bb7b468eb987db67b0e1913c67Christian König r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE); 1469835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = rtex->flushed_depth_texture; 1470835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1471835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1472835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset = rtex->surface.level[level].offset; 1473835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1474835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset += rtex->surface.level[level].slice_size * 1475835098a5290e59bb7b468eb987db67b0e1913c67Christian König state->cbufs[cb]->u.tex.first_layer; 1476835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1477835098a5290e59bb7b468eb987db67b0e1913c67Christian König pitch = (rtex->surface.level[level].nblk_x) / 8 - 1; 1478835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1479835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (slice) { 1480835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = slice - 1; 1481835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1482835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1483835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(8); 1484835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (rtex->surface.level[level].mode) { 1485835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_LINEAR_ALIGNED: 1486835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(8); 1487835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1488835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_1D: 1489835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(9); 1490835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1491835098a5290e59bb7b468eb987db67b0e1913c67Christian König case RADEON_SURF_MODE_2D: 1492835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) { 1493835098a5290e59bb7b468eb987db67b0e1913c67Christian König switch (blocksize) { 1494835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 1: 1495835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(10); 1496835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1497835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 2: 1498835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(11); 1499835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1500835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 4: 1501835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(12); 1502835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1503835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1504835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1505835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else switch (blocksize) { 1506835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 1: 1507835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(14); 1508835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1509835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 2: 1510835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(15); 1511835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1512835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 4: 1513835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(16); 1514835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1515835098a5290e59bb7b468eb987db67b0e1913c67Christian König case 8: 1516835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(17); 1517835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1518835098a5290e59bb7b468eb987db67b0e1913c67Christian König default: 1519835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_attrib = S_028C74_TILE_MODE_INDEX(13); 1520835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1521835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1522835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1523835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1524835098a5290e59bb7b468eb987db67b0e1913c67Christian König desc = util_format_description(surf->base.format); 1525835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (i = 0; i < 4; i++) { 1526835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 1527835098a5290e59bb7b468eb987db67b0e1913c67Christian König break; 1528835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1529835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1530835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) { 1531835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_FLOAT; 1532835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1533835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UNORM; 1534835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 1535835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SRGB; 1536835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1537835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].normalized) 1538835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SNORM; 1539835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].pure_integer) 1540835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_SINT; 1541835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 1542835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (desc->channel[i].normalized) 1543835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UNORM; 1544835098a5290e59bb7b468eb987db67b0e1913c67Christian König else if (desc->channel[i].pure_integer) 1545835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype = V_028C70_NUMBER_UINT; 1546835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1547835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1548835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1549835098a5290e59bb7b468eb987db67b0e1913c67Christian König format = si_translate_colorformat(surf->base.format); 1550835098a5290e59bb7b468eb987db67b0e1913c67Christian König swap = si_translate_colorswap(surf->base.format); 1551835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { 1552835098a5290e59bb7b468eb987db67b0e1913c67Christian König endian = V_028C70_ENDIAN_NONE; 1553835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1554835098a5290e59bb7b468eb987db67b0e1913c67Christian König endian = si_colorformat_endian_swap(format); 1555835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1556835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1557835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* blend clamp should be set for all NORM/SRGB types */ 1558835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (ntype == V_028C70_NUMBER_UNORM || 1559835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype == V_028C70_NUMBER_SNORM || 1560835098a5290e59bb7b468eb987db67b0e1913c67Christian König ntype == V_028C70_NUMBER_SRGB) 1561835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_clamp = 1; 1562835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1563835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* set blend bypass according to docs if SINT/UINT or 1564835098a5290e59bb7b468eb987db67b0e1913c67Christian König 8/24 COLOR variants */ 1565835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT || 1566835098a5290e59bb7b468eb987db67b0e1913c67Christian König format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 || 1567835098a5290e59bb7b468eb987db67b0e1913c67Christian König format == V_028C70_COLOR_X24_8_32_FLOAT) { 1568835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_clamp = 0; 1569835098a5290e59bb7b468eb987db67b0e1913c67Christian König blend_bypass = 1; 1570835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1571835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1572835098a5290e59bb7b468eb987db67b0e1913c67Christian König color_info = S_028C70_FORMAT(format) | 1573835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_COMP_SWAP(swap) | 1574835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_BLEND_CLAMP(blend_clamp) | 1575835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_BLEND_BYPASS(blend_bypass) | 1576835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_NUMBER_TYPE(ntype) | 1577835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C70_ENDIAN(endian); 1578835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1579835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->alpha_ref_dirty = true; 1580835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1581835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture); 1582835098a5290e59bb7b468eb987db67b0e1913c67Christian König offset >>= 8; 1583835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1584835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* FIXME handle enabling of CB beyond BASE8 which has different offset */ 1585835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 1586835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset); 1587835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch)); 1588835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice)); 1589835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1590835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1591835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000); 1592835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1593835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1594835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) | 1595835098a5290e59bb7b468eb987db67b0e1913c67Christian König S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer)); 1596835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1597835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info); 1598835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib); 1599f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer 1600f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer /* Determine pixel shader export format */ 1601f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer max_comp_size = si_colorformat_max_comp_size(format); 1602f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer if (ntype == V_028C70_NUMBER_SRGB || 1603f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer ((ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM) && 1604f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer max_comp_size <= 10) || 1605f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer (ntype == V_028C70_NUMBER_FLOAT && max_comp_size <= 16)) { 1606f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->export_16bpc |= 1 << cb; 1607f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->spi_shader_col_format |= V_028714_SPI_SHADER_FP16_ABGR << (4 * cb); 1608f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer } else 1609f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->spi_shader_col_format |= V_028714_SPI_SHADER_32_ABGR << (4 * cb); 1610835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1611835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1612835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4, 1613835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state) 1614835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1615835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_resource_texture *rtex; 1616835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_surface *surf; 161786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König unsigned level, pitch, slice, format; 161886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König uint32_t z_info, s_info; 161986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König uint64_t z_offs, s_offs; 1620835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1621835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (state->zsbuf == NULL) { 1622835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1623835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 1624835098a5290e59bb7b468eb987db67b0e1913c67Christian König return; 1625835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1626835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1627835098a5290e59bb7b468eb987db67b0e1913c67Christian König surf = (struct r600_surface *)state->zsbuf; 1628835098a5290e59bb7b468eb987db67b0e1913c67Christian König level = surf->base.u.tex.level; 1629835098a5290e59bb7b468eb987db67b0e1913c67Christian König rtex = (struct r600_resource_texture*)surf->base.texture; 1630835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1631835098a5290e59bb7b468eb987db67b0e1913c67Christian König format = si_translate_dbformat(rtex->real_format); 1632835098a5290e59bb7b468eb987db67b0e1913c67Christian König 163386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 163486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs += rtex->surface.level[level].offset; 163586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 163686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 163786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs += rtex->surface.stencil_offset; 163886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs += rtex->surface.level[level].offset / 4; 163986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 164086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_offs >>= 8; 164186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_offs >>= 8; 164286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 1643835098a5290e59bb7b468eb987db67b0e1913c67Christian König pitch = (rtex->surface.level[level].nblk_x / 8) - 1; 1644835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1645835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (slice) { 1646835098a5290e59bb7b468eb987db67b0e1913c67Christian König slice = slice - 1; 1647835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1648835098a5290e59bb7b468eb987db67b0e1913c67Christian König 164986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info = S_028040_FORMAT(format); 165086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info = S_028044_FORMAT(1); 1651835098a5290e59bb7b468eb987db67b0e1913c67Christian König 165286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) { 165386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(4); 165486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(4); 1655835098a5290e59bb7b468eb987db67b0e1913c67Christian König 165686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) { 165786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König switch (format) { 165886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_16: 165986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(5); 166086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(5); 166186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König break; 166286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_24: 166386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König case V_028040_Z_32_FLOAT: 166486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(6); 166586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(6); 166686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König break; 166786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König default: 166886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König z_info |= S_028040_TILE_MODE_INDEX(7); 166986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König s_info |= S_028044_TILE_MODE_INDEX(7); 167086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } 1671835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1672835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 167386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König R600_ERR("Invalid DB tiling mode %d!\n", 167486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König rtex->surface.level[level].mode); 167586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1676835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 167786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König return; 1678835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1679835098a5290e59bb7b468eb987db67b0e1913c67Christian König 168086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW, 168186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) | 168286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer)); 168386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 168486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1); 1685835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (format != ~0U) { 168686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info); 1687835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1688835098a5290e59bb7b468eb987db67b0e1913c67Christian König } else { 1689835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1690835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 169186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 169286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König if (rtex->surface.flags & RADEON_SURF_SBUFFER) { 169386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info); 169486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } else { 169586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 169686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König } 169786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 169886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 169986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs); 170086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs); 170186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs); 170286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs); 170386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König 170486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch)); 170586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice)); 1706835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1707835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1708835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_set_framebuffer_state(struct pipe_context *ctx, 1709835098a5290e59bb7b468eb987db67b0e1913c67Christian König const struct pipe_framebuffer_state *state) 1710835098a5290e59bb7b468eb987db67b0e1913c67Christian König{ 1711835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct r600_context *rctx = (struct r600_context *)ctx; 1712835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 1713835098a5290e59bb7b468eb987db67b0e1913c67Christian König uint32_t shader_mask, tl, br; 1714835098a5290e59bb7b468eb987db67b0e1913c67Christian König int tl_x, tl_y, br_x, br_y; 1715835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1716835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (pm4 == NULL) 1717835098a5290e59bb7b468eb987db67b0e1913c67Christian König return; 1718835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1719835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_inval_fb_cache(pm4, state->nr_cbufs); 1720835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1721835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (state->zsbuf) 1722835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_inval_zsbuf_cache(pm4); 1723835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1724835098a5290e59bb7b468eb987db67b0e1913c67Christian König util_copy_framebuffer_state(&rctx->framebuffer, state); 1725835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1726835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* build states */ 1727835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->have_depth_fb = 0; 1728f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->export_16bpc = 0; 1729f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->spi_shader_col_format = 0; 1730835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (int i = 0; i < state->nr_cbufs; i++) { 1731835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_cb(rctx, pm4, state, i); 1732835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1733f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer assert(!(rctx->export_16bpc & ~0xff)); 1734835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_db(rctx, pm4, state); 1735835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1736835098a5290e59bb7b468eb987db67b0e1913c67Christian König shader_mask = 0; 1737835098a5290e59bb7b468eb987db67b0e1913c67Christian König for (int i = 0; i < state->nr_cbufs; i++) { 1738835098a5290e59bb7b468eb987db67b0e1913c67Christian König shader_mask |= 0xf << (i * 4); 1739835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1740835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_x = 0; 1741835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_y = 0; 1742835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_x = state->width; 1743835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_y = state->height; 1744835098a5290e59bb7b468eb987db67b0e1913c67Christian König#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */ 1745835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* EG hw workaround */ 1746835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_x == 0) 1747835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_x = 1; 1748835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_y == 0) 1749835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl_y = 1; 1750835098a5290e59bb7b468eb987db67b0e1913c67Christian König /* cayman hw workaround */ 1751835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (rctx->chip_class == CAYMAN) { 1752835098a5290e59bb7b468eb987db67b0e1913c67Christian König if (br_x == 1 && br_y == 1) 1753835098a5290e59bb7b468eb987db67b0e1913c67Christian König br_x = 2; 1754835098a5290e59bb7b468eb987db67b0e1913c67Christian König } 1755835098a5290e59bb7b468eb987db67b0e1913c67Christian König#endif 1756835098a5290e59bb7b468eb987db67b0e1913c67Christian König tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y); 1757835098a5290e59bb7b468eb987db67b0e1913c67Christian König br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y); 1758835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1759835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl); 1760835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br); 1761835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl); 1762835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br); 1763835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl); 1764835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br); 1765835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl); 1766835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br); 1767835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000); 1768835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA); 1769835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask); 1770f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer si_pm4_set_reg(pm4, R_028714_SPI_SHADER_COL_FORMAT, 1771f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer rctx->spi_shader_col_format); 1772835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000); 1773835098a5290e59bb7b468eb987db67b0e1913c67Christian König 1774835098a5290e59bb7b468eb987db67b0e1913c67Christian König si_pm4_set_state(rctx, framebuffer, pm4); 1775bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König si_update_fb_rs_state(rctx); 177676660dfccede74782ac0d409da171ddbd61fae41Christian König si_update_fb_blend_state(rctx); 1777835098a5290e59bb7b468eb987db67b0e1913c67Christian König} 1778835098a5290e59bb7b468eb987db67b0e1913c67Christian König 17793c09f11e5cefd437bb8185539430786dc245c96fChristian König/* 17803c09f11e5cefd437bb8185539430786dc245c96fChristian König * shaders 17813c09f11e5cefd437bb8185539430786dc245c96fChristian König */ 17823c09f11e5cefd437bb8185539430786dc245c96fChristian König 1783d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer/* Compute the key for the hw shader variant */ 1784d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic INLINE unsigned si_shader_selector_key(struct pipe_context *ctx, 1785d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel) 1786d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{ 1787d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct r600_context *rctx = (struct r600_context *)ctx; 1788d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned key = 0; 1789d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1790d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel->type == PIPE_SHADER_FRAGMENT) { 1791d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel->fs_write_all) 1792d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer key |= rctx->framebuffer.nr_cbufs; 1793f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer key |= rctx->export_16bpc << 4; 1794d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer /*if (rctx->queued.named.rasterizer) 1795f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer key |= rctx->queued.named.rasterizer->flatshade << 12;*/ 1796f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer /*key |== rctx->two_side << 13;*/ 1797d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1798d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1799d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return key; 1800d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer} 1801d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1802d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer/* Select the hw shader variant depending on the current state. 1803d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * (*dirty) is set to 1 if current variant was changed */ 1804d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerint si_shader_select(struct pipe_context *ctx, 1805d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel, 1806d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned *dirty) 1807d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{ 1808d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned key; 1809d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader * shader = NULL; 1810d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer int r; 1811d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1812d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer key = si_shader_selector_key(ctx, sel); 1813d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1814d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer /* Check if we don't need to change anything. 1815d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * This path is also used for most shaders that don't need multiple 1816d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * variants, it will cost just a computation of the key and this 1817d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * test. */ 1818d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (likely(sel->current && sel->current->key == key)) { 1819d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return 0; 1820d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1821d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1822d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer /* lookup if we have other variants in the list */ 1823d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel->num_shaders > 1) { 1824d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader *p = sel->current, *c = p->next_variant; 1825d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1826d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer while (c && c->key != key) { 1827d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer p = c; 1828d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer c = c->next_variant; 1829d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1830d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1831d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (c) { 1832d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer p->next_variant = c->next_variant; 1833d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader = c; 1834d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1835d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1836d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1837d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (unlikely(!shader)) { 1838d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader = CALLOC(1, sizeof(struct si_pipe_shader)); 1839d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader->selector = sel; 1840d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1841d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer r = si_pipe_shader_create(ctx, shader); 1842d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (unlikely(r)) { 1843d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n", 1844d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->type, key, r); 1845d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->current = NULL; 1846d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return r; 1847d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1848d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1849d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer /* We don't know the value of fs_write_all property until we built 1850d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * at least one variant, so we may need to recompute the key (include 1851d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * rctx->framebuffer.nr_cbufs) after building first variant. */ 1852d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel->type == PIPE_SHADER_FRAGMENT && 1853d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->num_shaders == 0 && 1854d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader->shader.fs_write_all) { 1855d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->fs_write_all = 1; 1856d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer key = si_shader_selector_key(ctx, sel); 1857d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1858d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1859d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader->key = key; 1860d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->num_shaders++; 1861d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1862d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1863d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (dirty) 1864d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer *dirty = 1; 1865d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1866d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer shader->next_variant = sel->current; 1867d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->current = shader; 1868d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1869d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return 0; 1870d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer} 1871d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 18723c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void *si_create_shader_state(struct pipe_context *ctx, 1873d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer const struct pipe_shader_state *state, 1874d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned pipe_shader_type) 18753c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 1876d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel = CALLOC_STRUCT(si_pipe_shader_selector); 1877d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer int r; 18783c09f11e5cefd437bb8185539430786dc245c96fChristian König 1879d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->type = pipe_shader_type; 1880d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->tokens = tgsi_dup_tokens(state->tokens); 1881d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer sel->so = state->stream_output; 1882d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1883d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer r = si_shader_select(ctx, sel, NULL); 1884d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (r) { 1885d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer free(sel); 1886d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return NULL; 1887d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1888d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1889d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return sel; 1890d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer} 1891d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1892d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void *si_create_fs_state(struct pipe_context *ctx, 1893d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer const struct pipe_shader_state *state) 1894d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{ 1895d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT); 1896d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer} 18973c09f11e5cefd437bb8185539430786dc245c96fChristian König 1898d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void *si_create_vs_state(struct pipe_context *ctx, 1899d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer const struct pipe_shader_state *state) 1900d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{ 1901d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer return si_create_shader_state(ctx, state, PIPE_SHADER_VERTEX); 19023c09f11e5cefd437bb8185539430786dc245c96fChristian König} 19033c09f11e5cefd437bb8185539430786dc245c96fChristian König 19043c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state) 19053c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 19063c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 1907d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel = state; 19083c09f11e5cefd437bb8185539430786dc245c96fChristian König 1909d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (rctx->vs_shader == sel) 19103c09f11e5cefd437bb8185539430786dc245c96fChristian König return; 19113c09f11e5cefd437bb8185539430786dc245c96fChristian König 19123c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->shader_dirty = true; 1913d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->vs_shader = sel; 19141fb8ee62faf081e6a5588e99620a9883e3788c46Christian König 1915d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel && sel->current) 1916d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_bind_state(rctx, vs, sel->current->pm4); 1917d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer else 1918d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4); 19193c09f11e5cefd437bb8185539430786dc245c96fChristian König} 19203c09f11e5cefd437bb8185539430786dc245c96fChristian König 19213c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state) 19223c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 19233c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 1924d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel = state; 19253c09f11e5cefd437bb8185539430786dc245c96fChristian König 1926d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (rctx->ps_shader == sel) 19273c09f11e5cefd437bb8185539430786dc245c96fChristian König return; 19283c09f11e5cefd437bb8185539430786dc245c96fChristian König 19293c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->shader_dirty = true; 1930d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->ps_shader = sel; 19311fb8ee62faf081e6a5588e99620a9883e3788c46Christian König 1932d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (sel && sel->current) 1933d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_bind_state(rctx, ps, sel->current->pm4); 1934d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer else 1935d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_bind_state(rctx, ps, rctx->dummy_pixel_shader->pm4); 19363c09f11e5cefd437bb8185539430786dc245c96fChristian König} 19373c09f11e5cefd437bb8185539430786dc245c96fChristian König 1938d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void si_delete_shader_selector(struct pipe_context *ctx, 1939d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel) 1940d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{ 1941d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct r600_context *rctx = (struct r600_context *)ctx; 1942d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader *p = sel->current, *c; 1943d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1944d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer while (p) { 1945d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer c = p->next_variant; 1946d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pm4_delete_state(rctx, vs, p->pm4); 1947d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_pipe_shader_destroy(ctx, p); 1948d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer free(p); 1949d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer p = c; 1950d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1951d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 1952d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer free(sel->tokens); 1953d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer free(sel); 1954d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer } 1955d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 19563c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state) 19573c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 19583c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 1959d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state; 19603c09f11e5cefd437bb8185539430786dc245c96fChristian König 1961d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (rctx->vs_shader == sel) { 19623c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->vs_shader = NULL; 19633c09f11e5cefd437bb8185539430786dc245c96fChristian König } 19643c09f11e5cefd437bb8185539430786dc245c96fChristian König 1965d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_delete_shader_selector(ctx, sel); 19663c09f11e5cefd437bb8185539430786dc245c96fChristian König} 19673c09f11e5cefd437bb8185539430786dc245c96fChristian König 19683c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state) 19693c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 19703c09f11e5cefd437bb8185539430786dc245c96fChristian König struct r600_context *rctx = (struct r600_context *)ctx; 1971d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state; 19723c09f11e5cefd437bb8185539430786dc245c96fChristian König 1973d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer if (rctx->ps_shader == sel) { 19743c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->ps_shader = NULL; 19753c09f11e5cefd437bb8185539430786dc245c96fChristian König } 19763c09f11e5cefd437bb8185539430786dc245c96fChristian König 1977d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer si_delete_shader_selector(ctx, sel); 19783c09f11e5cefd437bb8185539430786dc245c96fChristian König} 19793c09f11e5cefd437bb8185539430786dc245c96fChristian König 1980baf20397569fb499f736e5ad2350b008b8207fadChristian König/* 1981baf20397569fb499f736e5ad2350b008b8207fadChristian König * Samplers 1982baf20397569fb499f736e5ad2350b008b8207fadChristian König */ 1983baf20397569fb499f736e5ad2350b008b8207fadChristian König 198473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx, 198573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct pipe_resource *texture, 198673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct pipe_sampler_view *state) 198773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 198873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view); 198973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture; 199073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct util_format_description *desc = util_format_description(state->format); 199173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned blocksize = util_format_get_blocksize(tmp->real_format); 199273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned format, num_format, /*endian,*/ tiling_index; 199373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uint32_t pitch = 0; 199473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned char state_swizzle[4], swizzle[4]; 19959aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König unsigned height, depth, width, offset_level, last_level; 199673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König int first_non_void; 199773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König uint64_t va; 199873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 199973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (view == NULL) 200073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return NULL; 200173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 200273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* initialize base object */ 200373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base = *state; 200473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.texture = NULL; 200573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König pipe_reference(NULL, &texture->reference); 200673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.texture = texture; 200773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.reference.count = 1; 200873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->base.context = ctx; 200973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 201073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[0] = state->swizzle_r; 201173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[1] = state->swizzle_g; 201273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[2] = state->swizzle_b; 201373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König state_swizzle[3] = state->swizzle_a; 201473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle); 201573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 201673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König first_non_void = util_format_get_first_non_void_channel(state->format); 201773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (desc->channel[first_non_void].type) { 201873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_FLOAT: 201973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 202073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 202173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_SIGNED: 202273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_SNORM; 202373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 202473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case UTIL_FORMAT_TYPE_UNSIGNED: 202573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 202673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König num_format = V_008F14_IMG_NUM_FORMAT_UNORM; 202773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 202873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 202973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void); 203073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (format == ~0) { 203173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König format = 0; 203273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 203373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 203473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (tmp->depth && !tmp->is_flushing_texture) { 203573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König r600_texture_depth_flush(ctx, texture, TRUE); 203673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tmp = tmp->flushed_depth_texture; 203773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 203873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 203973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König /* not supported any more */ 204073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König //endian = si_colorformat_endian_swap(format); 204173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 20429aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König offset_level = state->u.tex.first_level; 20439aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König last_level = state->u.tex.last_level - offset_level; 20449aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König width = tmp->surface.level[offset_level].npix_x; 20459aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König height = tmp->surface.level[offset_level].npix_y; 20469aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König depth = tmp->surface.level[offset_level].npix_z; 20479aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format); 204873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 204973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 205073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König height = 1; 205173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König depth = texture->array_size; 205273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 205373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König depth = texture->array_size; 205473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 205573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 205673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 8; 205773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (tmp->surface.level[state->u.tex.first_level].mode) { 205873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_LINEAR_ALIGNED: 205973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 8; 206073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 206173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_1D: 206273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 9; 206373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 206473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case RADEON_SURF_MODE_2D: 206573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) { 206673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (blocksize) { 206773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 206873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 10; 206973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 207073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 207173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 11; 207273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 207373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 207473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 12; 207573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 207673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 207773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 207873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } else switch (blocksize) { 207973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 1: 208073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 14; 208173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 208273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 2: 208373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 15; 208473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 208573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 4: 208673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 16; 208773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 208873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 8: 208973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 17; 209073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 209173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: 209273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König tiling_index = 13; 209373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 209473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 209573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 209673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 209773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König va = r600_resource_va(ctx->screen, texture); 20989aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König va += tmp->surface.level[offset_level].offset; 20999aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König view->state[0] = va >> 8; 21009aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König view->state[1] = (S_008F14_BASE_ADDRESS_HI(va >> 40) | 210173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F14_DATA_FORMAT(format) | 210273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F14_NUM_FORMAT(num_format)); 210373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[2] = (S_008F18_WIDTH(width - 1) | 210473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F18_HEIGHT(height - 1)); 210573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) | 210673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) | 210773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) | 210873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) | 21099aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König S_008F1C_BASE_LEVEL(offset_level) | 21109aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König S_008F1C_LAST_LEVEL(last_level) | 211173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_TILING_INDEX(tiling_index) | 211273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F1C_TYPE(si_tex_dim(texture->target))); 211373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1)); 211473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) | 211573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F24_LAST_ARRAY(state->u.tex.last_layer)); 211673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[6] = 0; 211773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König view->state[7] = 0; 211873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 211973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return &view->base; 212073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 212173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 21229b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_sampler_view_destroy(struct pipe_context *ctx, 21239b213c871a080472660eff271c72a3fcc5d3f578Christian König struct pipe_sampler_view *state) 21249b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 21259b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state; 21269b213c871a080472660eff271c72a3fcc5d3f578Christian König 21279b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&state->texture, NULL); 21289b213c871a080472660eff271c72a3fcc5d3f578Christian König FREE(resource); 21299b213c871a080472660eff271c72a3fcc5d3f578Christian König} 21309b213c871a080472660eff271c72a3fcc5d3f578Christian König 213173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void *si_create_sampler_state(struct pipe_context *ctx, 213273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König const struct pipe_sampler_state *state) 213373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 213473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state); 213573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König union util_color uc; 213673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0; 213773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König unsigned border_color_type; 213873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 213973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (rstate == NULL) { 214073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return NULL; 214173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 214273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 214373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 214473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König switch (uc.ui) { 214573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0x000000FF: 214673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK; 214773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 214873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0x00000000: 214973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK; 215073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 215173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König case 0xFFFFFFFF: 215273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE; 215373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König break; 215473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König default: /* Use border color pointer */ 215573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER; 215673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 215773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 215873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) | 215973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) | 216073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) | 216173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König (state->max_anisotropy & 0x7) << 9 | /* XXX */ 216273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) | 216373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) | 216473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König aniso_flag_offset << 16 | /* XXX */ 216573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map)); 216673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) | 216773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8))); 216873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) | 216973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) | 217073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) | 217173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter))); 217273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type); 217373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 217473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#if 0 217573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König if (border_color_type == 3) { 217673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0])); 217773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1])); 217873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2])); 217973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3])); 218073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König } 218173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#endif 218273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König return rstate; 218373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 218473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 2185baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count, 2186baf20397569fb499f736e5ad2350b008b8207fadChristian König struct pipe_sampler_view **views) 2187baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2188baf20397569fb499f736e5ad2350b008b8207fadChristian König assert(count == 0); 2189baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2190baf20397569fb499f736e5ad2350b008b8207fadChristian König 2191baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count, 2192baf20397569fb499f736e5ad2350b008b8207fadChristian König struct pipe_sampler_view **views) 2193baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2194baf20397569fb499f736e5ad2350b008b8207fadChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2195baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views; 2196baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2197ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König int i, j; 2198baf20397569fb499f736e5ad2350b008b8207fadChristian König int has_depth = 0; 2199baf20397569fb499f736e5ad2350b008b8207fadChristian König 2200baf20397569fb499f736e5ad2350b008b8207fadChristian König if (!count) 2201baf20397569fb499f736e5ad2350b008b8207fadChristian König goto out; 2202baf20397569fb499f736e5ad2350b008b8207fadChristian König 2203baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_inval_texture_cache(pm4); 2204baf20397569fb499f736e5ad2350b008b8207fadChristian König 2205ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König si_pm4_sh_data_begin(pm4); 2206ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König for (i = 0; i < count; i++) { 2207baf20397569fb499f736e5ad2350b008b8207fadChristian König pipe_sampler_view_reference( 2208baf20397569fb499f736e5ad2350b008b8207fadChristian König (struct pipe_sampler_view **)&rctx->ps_samplers.views[i], 2209baf20397569fb499f736e5ad2350b008b8207fadChristian König views[i]); 2210baf20397569fb499f736e5ad2350b008b8207fadChristian König 22111a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer if (views[i]) { 22121a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer struct r600_resource_texture *tex = (void *)resource[i]->base.texture; 22131a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer 22141a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ); 2215ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 22161a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer for (j = 0; j < Elements(resource[i]->state); ++j) { 22171a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer si_pm4_sh_data_add(pm4, resource[i]->state[j]); 22181a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer } 2219ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König } 2220baf20397569fb499f736e5ad2350b008b8207fadChristian König } 2221baf20397569fb499f736e5ad2350b008b8207fadChristian König 2222baf20397569fb499f736e5ad2350b008b8207fadChristian König for (i = count; i < NUM_TEX_UNITS; i++) { 2223baf20397569fb499f736e5ad2350b008b8207fadChristian König if (rctx->ps_samplers.views[i]) 2224baf20397569fb499f736e5ad2350b008b8207fadChristian König pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL); 2225baf20397569fb499f736e5ad2350b008b8207fadChristian König } 2226baf20397569fb499f736e5ad2350b008b8207fadChristian König 2227ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König si_pm4_sh_data_end(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4); 2228baf20397569fb499f736e5ad2350b008b8207fadChristian König 2229baf20397569fb499f736e5ad2350b008b8207fadChristian Königout: 2230baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_state(rctx, ps_sampler_views, pm4); 2231baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->have_depth_texture = has_depth; 2232baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ps_samplers.n_views = count; 2233baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2234baf20397569fb499f736e5ad2350b008b8207fadChristian König 2235baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states) 2236baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2237ad15c8c0f199e293b5c49a9c614cfaa19edb9a62Christian König assert(count == 0); 2238baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2239baf20397569fb499f736e5ad2350b008b8207fadChristian König 2240baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states) 2241baf20397569fb499f736e5ad2350b008b8207fadChristian König{ 2242baf20397569fb499f736e5ad2350b008b8207fadChristian König struct r600_context *rctx = (struct r600_context *)ctx; 2243baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states; 2244baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2245cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König int i, j; 2246baf20397569fb499f736e5ad2350b008b8207fadChristian König 2247baf20397569fb499f736e5ad2350b008b8207fadChristian König if (!count) 2248baf20397569fb499f736e5ad2350b008b8207fadChristian König goto out; 2249baf20397569fb499f736e5ad2350b008b8207fadChristian König 2250baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_inval_texture_cache(pm4); 2251baf20397569fb499f736e5ad2350b008b8207fadChristian König 2252cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König si_pm4_sh_data_begin(pm4); 2253cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König for (i = 0; i < count; i++) { 2254cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König for (j = 0; j < Elements(rstates[i]->val); ++j) { 2255cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König si_pm4_sh_data_add(pm4, rstates[i]->val[j]); 2256cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König } 2257baf20397569fb499f736e5ad2350b008b8207fadChristian König } 2258cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König si_pm4_sh_data_end(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2); 2259baf20397569fb499f736e5ad2350b008b8207fadChristian König 2260baf20397569fb499f736e5ad2350b008b8207fadChristian König memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count); 2261baf20397569fb499f736e5ad2350b008b8207fadChristian König 2262baf20397569fb499f736e5ad2350b008b8207fadChristian Königout: 2263baf20397569fb499f736e5ad2350b008b8207fadChristian König si_pm4_set_state(rctx, ps_sampler, pm4); 2264baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->ps_samplers.n_samplers = count; 2265baf20397569fb499f736e5ad2350b008b8207fadChristian König} 2266baf20397569fb499f736e5ad2350b008b8207fadChristian König 226773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 226873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 226973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 227073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 227173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state) 227273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{ 227373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König free(state); 227473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König} 227573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 22760d6b0b512acadbc5d64039063b5649fc401b3367Christian König/* 22770d6b0b512acadbc5d64039063b5649fc401b3367Christian König * Constants 22780d6b0b512acadbc5d64039063b5649fc401b3367Christian König */ 22790d6b0b512acadbc5d64039063b5649fc401b3367Christian Königstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index, 22800d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct pipe_constant_buffer *cb) 22810d6b0b512acadbc5d64039063b5649fc401b3367Christian König{ 22820d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct r600_context *rctx = (struct r600_context *)ctx; 2283fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL; 228451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer struct si_pm4_state *pm4; 22850d6b0b512acadbc5d64039063b5649fc401b3367Christian König uint64_t va_offset; 22860d6b0b512acadbc5d64039063b5649fc401b3367Christian König uint32_t offset; 22870d6b0b512acadbc5d64039063b5649fc401b3367Christian König 22880d6b0b512acadbc5d64039063b5649fc401b3367Christian König /* Note that the state tracker can unbind constant buffers by 22890d6b0b512acadbc5d64039063b5649fc401b3367Christian König * passing NULL here. 22900d6b0b512acadbc5d64039063b5649fc401b3367Christian König */ 229151d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer if (cb == NULL) 22920d6b0b512acadbc5d64039063b5649fc401b3367Christian König return; 22930d6b0b512acadbc5d64039063b5649fc401b3367Christian König 229451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer pm4 = CALLOC_STRUCT(si_pm4_state); 22950d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_inval_shader_cache(pm4); 22960d6b0b512acadbc5d64039063b5649fc401b3367Christian König 22970d6b0b512acadbc5d64039063b5649fc401b3367Christian König if (cb->user_buffer) 22980d6b0b512acadbc5d64039063b5649fc401b3367Christian König r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset); 22990d6b0b512acadbc5d64039063b5649fc401b3367Christian König else 23000d6b0b512acadbc5d64039063b5649fc401b3367Christian König offset = 0; 23010d6b0b512acadbc5d64039063b5649fc401b3367Christian König va_offset = r600_resource_va(ctx->screen, (void*)rbuffer); 23020d6b0b512acadbc5d64039063b5649fc401b3367Christian König va_offset += offset; 23030d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23040d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ); 23050d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23060d6b0b512acadbc5d64039063b5649fc401b3367Christian König switch (shader) { 23070d6b0b512acadbc5d64039063b5649fc401b3367Christian König case PIPE_SHADER_VERTEX: 23080d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset); 23090d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32); 23100d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_state(rctx, vs_const, pm4); 23110d6b0b512acadbc5d64039063b5649fc401b3367Christian König break; 23120d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23130d6b0b512acadbc5d64039063b5649fc401b3367Christian König case PIPE_SHADER_FRAGMENT: 23140d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset); 23150d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32); 23160d6b0b512acadbc5d64039063b5649fc401b3367Christian König si_pm4_set_state(rctx, ps_const, pm4); 23170d6b0b512acadbc5d64039063b5649fc401b3367Christian König break; 23180d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23190d6b0b512acadbc5d64039063b5649fc401b3367Christian König default: 23200d6b0b512acadbc5d64039063b5649fc401b3367Christian König R600_ERR("unsupported %d\n", shader); 23210d6b0b512acadbc5d64039063b5649fc401b3367Christian König } 23220d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23230d6b0b512acadbc5d64039063b5649fc401b3367Christian König if (cb->buffer != &rbuffer->b.b) 2324fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König si_resource_reference(&rbuffer, NULL); 23250d6b0b512acadbc5d64039063b5649fc401b3367Christian König} 23260d6b0b512acadbc5d64039063b5649fc401b3367Christian König 23279b213c871a080472660eff271c72a3fcc5d3f578Christian König/* 23289b213c871a080472660eff271c72a3fcc5d3f578Christian König * Vertex elements & buffers 23299b213c871a080472660eff271c72a3fcc5d3f578Christian König */ 23309b213c871a080472660eff271c72a3fcc5d3f578Christian König 23319b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void *si_create_vertex_elements(struct pipe_context *ctx, 23329b213c871a080472660eff271c72a3fcc5d3f578Christian König unsigned count, 23339b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_vertex_element *elements) 23349b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 23359b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element); 2336b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int i; 23379b213c871a080472660eff271c72a3fcc5d3f578Christian König 2338b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König assert(count < PIPE_MAX_ATTRIBS); 23399b213c871a080472660eff271c72a3fcc5d3f578Christian König if (!v) 23409b213c871a080472660eff271c72a3fcc5d3f578Christian König return NULL; 23419b213c871a080472660eff271c72a3fcc5d3f578Christian König 23429b213c871a080472660eff271c72a3fcc5d3f578Christian König v->count = count; 2343b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König for (i = 0; i < count; ++i) { 2344b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König const struct util_format_description *desc; 2345b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König unsigned data_format, num_format; 2346b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König int first_non_void; 2347b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2348b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König desc = util_format_description(elements[i].src_format); 2349b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König first_non_void = util_format_get_first_non_void_channel(elements[i].src_format); 2350b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format, 2351b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König desc, first_non_void); 2352b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2353b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König switch (desc->channel[first_non_void].type) { 2354b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_FIXED: 2355b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */ 2356b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2357b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_SIGNED: 2358b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_SNORM; 2359b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2360b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_UNSIGNED: 2361b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F0C_BUF_NUM_FORMAT_UNORM; 2362b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König break; 2363b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König case UTIL_FORMAT_TYPE_FLOAT: 2364b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König default: 2365b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 2366b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König } 2367b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König 2368b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) | 2369b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) | 2370b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) | 2371b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) | 2372b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_NUM_FORMAT(num_format) | 2373b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König S_008F0C_DATA_FORMAT(data_format); 2374b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König } 23759b213c871a080472660eff271c72a3fcc5d3f578Christian König memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count); 23769b213c871a080472660eff271c72a3fcc5d3f578Christian König 23779b213c871a080472660eff271c72a3fcc5d3f578Christian König return v; 23789b213c871a080472660eff271c72a3fcc5d3f578Christian König} 23799b213c871a080472660eff271c72a3fcc5d3f578Christian König 23809b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state) 23819b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 23829b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 23839b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_vertex_element *v = (struct si_vertex_element*)state; 23849b213c871a080472660eff271c72a3fcc5d3f578Christian König 23859b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->vertex_elements = v; 23869b213c871a080472660eff271c72a3fcc5d3f578Christian König} 23879b213c871a080472660eff271c72a3fcc5d3f578Christian König 23889b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state) 23899b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 23909b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 23919b213c871a080472660eff271c72a3fcc5d3f578Christian König 23929b213c871a080472660eff271c72a3fcc5d3f578Christian König if (rctx->vertex_elements == state) 23939b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->vertex_elements = NULL; 23949b213c871a080472660eff271c72a3fcc5d3f578Christian König FREE(state); 23959b213c871a080472660eff271c72a3fcc5d3f578Christian König} 23969b213c871a080472660eff271c72a3fcc5d3f578Christian König 23979b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, 23989b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_vertex_buffer *buffers) 23999b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 24009b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 24019b213c871a080472660eff271c72a3fcc5d3f578Christian König 24029b213c871a080472660eff271c72a3fcc5d3f578Christian König util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count); 24039b213c871a080472660eff271c72a3fcc5d3f578Christian König} 24049b213c871a080472660eff271c72a3fcc5d3f578Christian König 24059b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_index_buffer(struct pipe_context *ctx, 24069b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_index_buffer *ib) 24079b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 24089b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 24099b213c871a080472660eff271c72a3fcc5d3f578Christian König 24109b213c871a080472660eff271c72a3fcc5d3f578Christian König if (ib) { 24119b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer); 24129b213c871a080472660eff271c72a3fcc5d3f578Christian König memcpy(&rctx->index_buffer, ib, sizeof(*ib)); 24139b213c871a080472660eff271c72a3fcc5d3f578Christian König } else { 24149b213c871a080472660eff271c72a3fcc5d3f578Christian König pipe_resource_reference(&rctx->index_buffer.buffer, NULL); 24159b213c871a080472660eff271c72a3fcc5d3f578Christian König } 24169b213c871a080472660eff271c72a3fcc5d3f578Christian König} 24179b213c871a080472660eff271c72a3fcc5d3f578Christian König 24189b213c871a080472660eff271c72a3fcc5d3f578Christian König/* 24199b213c871a080472660eff271c72a3fcc5d3f578Christian König * Misc 24209b213c871a080472660eff271c72a3fcc5d3f578Christian König */ 24219b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_polygon_stipple(struct pipe_context *ctx, 24229b213c871a080472660eff271c72a3fcc5d3f578Christian König const struct pipe_poly_stipple *state) 24239b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 24249b213c871a080472660eff271c72a3fcc5d3f578Christian König} 24259b213c871a080472660eff271c72a3fcc5d3f578Christian König 24269b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_texture_barrier(struct pipe_context *ctx) 24279b213c871a080472660eff271c72a3fcc5d3f578Christian König{ 24289b213c871a080472660eff271c72a3fcc5d3f578Christian König struct r600_context *rctx = (struct r600_context *)ctx; 24299b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 24309b213c871a080472660eff271c72a3fcc5d3f578Christian König 24319b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_inval_texture_cache(pm4); 24329b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs); 24339b213c871a080472660eff271c72a3fcc5d3f578Christian König si_pm4_set_state(rctx, texture_barrier, pm4); 24349b213c871a080472660eff271c72a3fcc5d3f578Christian König} 24359b213c871a080472660eff271c72a3fcc5d3f578Christian König 243663636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx) 243763636ae52aefc275115d1f3daac4e75285583485Christian König{ 243863636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.create_blend_state = si_create_blend_state; 243963636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.bind_blend_state = si_bind_blend_state; 244063636ae52aefc275115d1f3daac4e75285583485Christian König rctx->context.delete_blend_state = si_delete_blend_state; 24410a091a48242513e53a99976239405e8cb72d96beChristian König rctx->context.set_blend_color = si_set_blend_color; 24429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König 2443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.create_rasterizer_state = si_create_rs_state; 2444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.bind_rasterizer_state = si_bind_rs_state; 2445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König rctx->context.delete_rasterizer_state = si_delete_rs_state; 2446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 2447b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state; 2448b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state; 2449b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state; 2450b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx); 2451b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 24529cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König rctx->context.set_clip_state = si_set_clip_state; 245343f414f7b76902a728d26231d4cc047b794df10bChristian König rctx->context.set_scissor_state = si_set_scissor_state; 24547e011d92c9746ba4050890442db6e504fa42c4adChristian König rctx->context.set_viewport_state = si_set_viewport_state; 2455e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König rctx->context.set_stencil_ref = si_set_pipe_stencil_ref; 2456835098a5290e59bb7b468eb987db67b0e1913c67Christian König 2457835098a5290e59bb7b468eb987db67b0e1913c67Christian König rctx->context.set_framebuffer_state = si_set_framebuffer_state; 24583c09f11e5cefd437bb8185539430786dc245c96fChristian König 2459d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->context.create_vs_state = si_create_vs_state; 2460d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer rctx->context.create_fs_state = si_create_fs_state; 24613c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.bind_vs_state = si_bind_vs_shader; 24623c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.bind_fs_state = si_bind_ps_shader; 24633c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.delete_vs_state = si_delete_vs_shader; 24643c09f11e5cefd437bb8185539430786dc245c96fChristian König rctx->context.delete_fs_state = si_delete_ps_shader; 2465baf20397569fb499f736e5ad2350b008b8207fadChristian König 246673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.create_sampler_state = si_create_sampler_state; 2467baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler; 2468baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler; 246973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.delete_sampler_state = si_delete_sampler_state; 2470baf20397569fb499f736e5ad2350b008b8207fadChristian König 247173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.create_sampler_view = si_create_sampler_view; 2472baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view; 2473baf20397569fb499f736e5ad2350b008b8207fadChristian König rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view; 24749b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.sampler_view_destroy = si_sampler_view_destroy; 24750d6b0b512acadbc5d64039063b5649fc401b3367Christian König 247673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König rctx->context.set_sample_mask = si_set_sample_mask; 247773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König 24780d6b0b512acadbc5d64039063b5649fc401b3367Christian König rctx->context.set_constant_buffer = si_set_constant_buffer; 2479ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 24809b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.create_vertex_elements_state = si_create_vertex_elements; 24819b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.bind_vertex_elements_state = si_bind_vertex_elements; 24829b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.delete_vertex_elements_state = si_delete_vertex_element; 24839b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_vertex_buffers = si_set_vertex_buffers; 24849b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_index_buffer = si_set_index_buffer; 24859b213c871a080472660eff271c72a3fcc5d3f578Christian König 24869b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.create_stream_output_target = si_create_so_target; 24879b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.stream_output_target_destroy = si_so_target_destroy; 24889b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_stream_output_targets = si_set_so_targets; 24899b213c871a080472660eff271c72a3fcc5d3f578Christian König 24909b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.texture_barrier = si_texture_barrier; 24919b213c871a080472660eff271c72a3fcc5d3f578Christian König rctx->context.set_polygon_stipple = si_set_polygon_stipple; 24929b213c871a080472660eff271c72a3fcc5d3f578Christian König 2493ca9cf611b63e5576b596c21b73b1b639d250d649Christian König rctx->context.draw_vbo = si_draw_vbo; 249463636ae52aefc275115d1f3daac4e75285583485Christian König} 2495e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König 2496840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx) 2497840f05da6b92ba5266385836533842b9a9fc5da9Christian König{ 2498840f05da6b92ba5266385836533842b9a9fc5da9Christian König struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2499840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2500708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König si_pm4_cmd_begin(pm4, PKT3_CONTEXT_CONTROL); 2501708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König si_pm4_cmd_add(pm4, 0x80000000); 2502708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König si_pm4_cmd_add(pm4, 0x80000000); 2503708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König si_pm4_cmd_end(pm4, false); 2504708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König 2505840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0); 2506840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2507840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0); 2508840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0); 2509840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0); 2510840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0); 2511840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0); 2512840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0); 2513840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0); 2514840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0); 2515840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0); 2516840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0); 2517840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0); 2518840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0); 2519840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0); 2520840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0); 2521840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0); 2522840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0); 2523840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0); 2524840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM, 2525840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_SWITCH_ON_EOP(1) | 2526840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_PARTIAL_VS_WAVE_ON(1) | 2527840f05da6b92ba5266385836533842b9a9fc5da9Christian König S_028AA8_PRIMGROUP_SIZE(63)); 2528840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000); 2529840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0); 2530840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1); 2531840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2532840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0); 2533840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210); 2534840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98); 2535840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2536840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000); 2537840f05da6b92ba5266385836533842b9a9fc5da9Christian König 2538840f05da6b92ba5266385836533842b9a9fc5da9Christian König si_pm4_set_state(rctx, init, pm4); 2539840f05da6b92ba5266385836533842b9a9fc5da9Christian König} 2540