1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2012 Advanced Micro Devices, Inc. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Christian König <christian.koenig@amd.com> 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_framebuffer.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blitter.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeonsi_pipe.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeonsi_shader.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "si_state.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sid.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * inferred framebuffer and blender state 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_fb_blend_state(struct r600_context *rctx) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_blend *blend = rctx->queued.named.blend; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t mask; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend == NULL) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pm4 = CALLOC_STRUCT(si_pm4_state); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= blend->cb_target_mask; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, fb_blend, pm4); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Blender functions 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_blend_function(int blend_func) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (blend_func) { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_ADD: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_COMB_DST_PLUS_SRC; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_SUBTRACT: 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_COMB_SRC_MINUS_DST; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_REVERSE_SUBTRACT: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_COMB_DST_MINUS_SRC; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MIN: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_COMB_MIN_DST_SRC; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLEND_MAX: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_COMB_MAX_DST_SRC; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Unknown blend function %d\n", blend_func); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_blend_factor(int blend_fact) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (blend_fact) { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ONE: 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_SRC_COLOR; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_SRC_ALPHA; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_DST_ALPHA; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_DST_COLOR; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_SRC_ALPHA_SATURATE; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_CONSTANT_COLOR; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_CONSTANT_ALPHA; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_ZERO: 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ZERO; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_SRC_COLOR; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_SRC_ALPHA; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_DST_ALPHA; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_DST_COLOR; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_COLOR: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_SRC1_COLOR; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_SRC1_ALPHA: 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_SRC1_ALPHA; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_INV_SRC1_COLOR; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028780_BLEND_INV_SRC1_ALPHA; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_blend_state(struct pipe_context *ctx, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_state *state) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = &blend->pm4; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t color_control; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend == NULL) 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_control = S_028808_MODE(V_028808_CB_NORMAL); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->logicop_enable) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4)); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_control |= S_028808_ROP3(0xcc); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->cb_target_mask = 0; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 8; i++) { 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state->rt entries > 0 only written if independent blending */ 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int j = state->independent_blend_enable ? i : 0; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned eqRGB = state->rt[j].rgb_func; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned srcRGB = state->rt[j].rgb_src_factor; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstRGB = state->rt[j].rgb_dst_factor; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned eqA = state->rt[j].alpha_func; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned srcA = state->rt[j].alpha_src_factor; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstA = state->rt[j].alpha_dst_factor; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blend_cntl = 0; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend->cb_target_mask |= state->rt[j].colormask << (4 * i); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->rt[j].blend_enable) { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_ENABLE(1); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB)); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB)); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB)); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA)); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA)); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA)); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return blend; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_blend_state(struct pipe_context *ctx, void *state) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_fb_blend_state(rctx); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_blend_state(struct pipe_context *ctx, void *state) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_blend_color(struct pipe_context *ctx, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_color *state) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0])); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1])); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2])); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3])); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, blend_color, pm4); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clipping, scissors and viewport 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_clip_state(struct pipe_context *ctx, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_clip_state *state) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 6; i++) { 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(state->ucp[i][0])); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(state->ucp[i][1])); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(state->ucp[i][2])); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16, 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(state->ucp[i][3])); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, clip, pm4); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_scissor_state(struct pipe_context *ctx, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_scissor_state *state) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tl, br; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, scissor, pm4); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_viewport_state(struct pipe_context *ctx, 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_viewport_state *state) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = &viewport->pm4; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (viewport == NULL) 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport->viewport = *state; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0])); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0])); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1])); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1])); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2])); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2])); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, viewport, viewport); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * inferred state between framebuffer and rasterizer 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_fb_rs_state(struct r600_context *rctx) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_rasterizer *rs = rctx->queued.named.rasterizer; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset_db_fmt_cntl = 0, depth; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float offset_units; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rs || !rctx->framebuffer.zsbuf) 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_units = rctx->queued.named.rasterizer->offset_units; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rctx->framebuffer.zsbuf->texture->format) { 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = -24; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_units *= 2.0f; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT: 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = -23; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_units *= 1.0f; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = -16; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_units *= 4.0f; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pm4 = CALLOC_STRUCT(si_pm4_state); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME some of those reg can be computed with cso */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(rctx->queued.named.rasterizer->offset_scale)); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units)); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE, 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fui(rctx->queued.named.rasterizer->offset_scale)); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units)); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, fb_rs, pm4); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rasterizer 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_fill(uint32_t func) 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(func) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_FILL: 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028814_X_DRAW_TRIANGLES; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_LINE: 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028814_X_DRAW_LINES; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_POINT: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028814_X_DRAW_POINTS; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028814_X_DRAW_POINTS; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_rs_state(struct pipe_context *ctx, 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *state) 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = &rs->pm4; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tmp; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prov_vtx = 1, polygon_dual_mode; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned clip_rule; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float psize_min, psize_max; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rs == NULL) { 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->fill_back != PIPE_POLYGON_MODE_FILL); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->flatshade_first) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prov_vtx = 0; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->flatshade = state->flatshade; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->sprite_coord_enable = state->sprite_coord_enable; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->pa_sc_line_stipple = state->line_stipple_enable ? 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->pa_su_sc_mode_cntl = 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_PROVOKING_VTX_LAST(prov_vtx) | 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) | 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) | 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_FACE(!state->front_ccw) | 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLY_MODE(polygon_dual_mode) | 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) | 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back)); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->pa_cl_clip_cntl = 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028810_PS_UCP_MODE(3) | 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->pa_cl_vs_out_cntl = 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) | 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip_rule = state->scissor ? 0xAAAA : 0xFFFF; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* offset */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->offset_units = state->offset_units; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->offset_scale = state->offset_scale * 12.0f; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Flat shading hangs the GPU */ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = S_0286D4_FLAT_SHADE_ENA(0); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->sprite_coord_enable) { 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) | 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) | 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) | 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* point size 12.4 fixed point */ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = (unsigned)(state->point_size * 8.0); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp)); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->point_size_per_vertex) { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize_min = util_get_min_point_size(state); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize_max = 8192; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Force the point size to be as if the vertex output was disabled. */ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize_min = state->point_size; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize_max = state->point_size; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Divide by two, because 0.5 = 1 pixel. */ 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX, 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2))); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = (unsigned)state->line_width * 8; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp)); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0, 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable)); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028BE4_PIX_CENTER(state->gl_rasterization_rules)); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp)); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rs; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_rs_state(struct pipe_context *ctx, void *state) 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state == NULL) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->sprite_coord_enable = rs->sprite_coord_enable; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, rasterizer, rs); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_fb_rs_state(rctx); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_rs_state(struct pipe_context *ctx, void *state) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * infeered state between dsa and stencil ref 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_dsa_stencil_ref(struct r600_context *rctx) 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref *ref = &rctx->stencil_ref; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_dsa *dsa = rctx->queued.named.dsa; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK, 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028430_STENCILTESTVAL(ref->ref_value[0]) | 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028430_STENCILMASK(dsa->valuemask[0]) | 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028430_STENCILWRITEMASK(dsa->writemask[0])); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF, 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) | 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028434_STENCILMASK_BF(dsa->valuemask[1]) | 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028434_STENCILWRITEMASK_BF(dsa->writemask[1])); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, dsa_stencil_ref, pm4); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx, 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_stencil_ref *state) 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->stencil_ref = *state; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_dsa_stencil_ref(rctx); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DSA 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_stencil_op(int s_op) 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (s_op) { 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_KEEP: 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_KEEP; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_ZERO: 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_ZERO; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_REPLACE: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_REPLACE_TEST; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_INCR: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_ADD_CLAMP; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_DECR: 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_SUB_CLAMP; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_INCR_WRAP: 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_ADD_WRAP; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_DECR_WRAP: 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_SUB_WRAP; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_STENCIL_OP_INVERT: 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_02842C_STENCIL_INVERT; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Unknown stencil op %d", s_op); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_dsa_state(struct pipe_context *ctx, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_depth_stencil_alpha_state *state) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa); 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = &dsa->pm4; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned db_depth_control, /* alpha_test_control, */ alpha_ref; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned db_render_override, db_render_control; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t db_stencil_control = 0; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dsa == NULL) { 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->valuemask[0] = state->stencil[0].valuemask; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->valuemask[1] = state->stencil[1].valuemask; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->writemask[0] = state->stencil[0].writemask; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->writemask[1] = state->stencil[1].writemask; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028800_ZFUNC(state->depth.func); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* stencil */ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->stencil[0].enabled) { 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_depth_control |= S_028800_STENCIL_ENABLE(1); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op)); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op)); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op)); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->stencil[1].enabled) { 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_depth_control |= S_028800_BACKFACE_ENABLE(1); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op)); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op)); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op)); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* alpha */ 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org //alpha_test_control = 0; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_ref = 0; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->alpha.enabled) { 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org //alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org //alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_ref = fui(state->alpha.ref_value); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->alpha_ref = alpha_ref; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* misc */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_render_control = 0; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) | 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) | 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO db_render_override depends on query */ 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org //si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0); 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0); 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->db_render_override = db_render_override; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dsa; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state) 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_dsa *dsa = state; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state == NULL) 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, dsa, dsa); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_dsa_stencil_ref(rctx); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->alpha_ref = dsa->alpha_ref; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->alpha_ref_dirty = true; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_db_flush_dsa(struct r600_context *rctx) 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_state_dsa *state; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&dsa, 0, sizeof(dsa)); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028000_DEPTH_COPY(1) | 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028000_STENCIL_COPY(1) | 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028000_COPY_CENTROID(1)); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return state; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format translation 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_colorformat(enum pipe_format format) 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8-bit buffers. */ 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_UNORM: 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_UINT: 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_SINT: 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_UNORM: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_UINT: 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_SINT: 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_UNORM: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_UINT: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_SINT: 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_SRGB: 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_UNORM: 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_SNORM: 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_UINT: 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_SINT: 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_8; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 16-bit buffers. */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G6R5_UNORM: 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_5_6_5; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G5R5A1_UNORM: 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G5R5X1_UNORM: 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_1_5_5_5; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B4G4R4A4_UNORM: 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B4G4R4X4_UNORM: 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_4_4_4_4; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_UNORM: 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_UINT: 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_SINT: 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_SRGB: 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_UNORM: 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_UINT: 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_SINT: 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_8_8; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_UNORM: 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_UINT: 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_SINT: 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_FLOAT: 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_FLOAT: 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_16; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 32-bit buffers. */ 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_SRGB: 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_UNORM: 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8R8G8B8_UNORM: 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_SRGB: 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_UNORM: 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8X8_UNORM: 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SNORM: 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_UNORM: 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8X8_UNORM: 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8B8G8R8_UNORM: 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8R8G8B8_UNORM: 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8_UNORM: 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SSCALED: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_USCALED: 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SINT: 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_UINT: 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_8_8_8_8; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10G10B10A2_UNORM: 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10G10B10X2_SNORM: 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B10G10R10A2_UNORM: 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B10G10R10A2_UINT: 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_2_10_10_10; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_8_24; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8Z24_UNORM: 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_24_8; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_X24_8_32_FLOAT; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32_FLOAT: 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_32; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_SSCALED: 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_UNORM: 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_UINT: 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_SINT: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_16_16; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R11G11B10_FLOAT: 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_10_11_11; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 64-bit buffers. */ 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16_USCALED: 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16_SSCALED: 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_UINT: 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SINT: 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_USCALED: 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SSCALED: 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_UNORM: 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SNORM: 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16_FLOAT: 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_FLOAT: 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_16_16_16_16; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_FLOAT: 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_USCALED: 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_SSCALED: 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_SINT: 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_UINT: 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_32_32; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 128-bit buffers. */ 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SNORM: 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_UNORM: 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SSCALED: 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_USCALED: 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SINT: 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_UINT: 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_FLOAT: 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_COLOR_32_32_32_32; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* YUV buffers. */ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_UYVY: 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_YUYV: 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 96-bit buffers. */ 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32_FLOAT: 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8-bit buffers. */ 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L4A4_UNORM: 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R4A4_UNORM: 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A4R4_UNORM: 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ~0U; /* Unsupported. */ 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_colorswap(enum pipe_format format) 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8-bit buffers. */ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L4A4_UNORM: 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A4R4_UNORM: 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_UNORM: 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_UINT: 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8_SINT: 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R4A4_UNORM: 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT_REV; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_UNORM: 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_UNORM: 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_UINT: 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_I8_SINT: 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_UINT: 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_SINT: 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_SRGB: 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_UNORM: 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_SNORM: 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_UINT: 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8_SINT: 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 16-bit buffers. */ 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G6R5_UNORM: 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD_REV; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G5R5A1_UNORM: 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G5R5X1_UNORM: 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B4G4R4A4_UNORM: 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B4G4R4X4_UNORM: 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_UNORM: 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_UINT: 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_SINT: 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_SRGB: 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_UNORM: 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_UINT: 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8_SINT: 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_UNORM: 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_UINT: 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_SINT: 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16_FLOAT: 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 32-bit buffers. */ 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_SRGB: 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD_REV; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_SRGB: 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_UNORM: 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8X8_UNORM: 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8R8G8B8_UNORM: 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8R8G8B8_UNORM: 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT_REV; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SNORM: 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_UNORM: 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SSCALED: 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_USCALED: 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_SINT: 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_UINT: 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8X8_UNORM: 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_UNORM: 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8B8G8R8_UNORM: 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD_REV; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8Z24_UNORM: 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10G10B10A2_UNORM: 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10G10B10X2_SNORM: 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B10G10R10A2_UNORM: 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B10G10R10A2_UINT: 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_ALT; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R11G11B10_FLOAT: 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32_FLOAT: 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32_UINT: 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32_SINT: 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT: 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_FLOAT: 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_UNORM: 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_UINT: 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16_SINT: 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 64-bit buffers. */ 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_FLOAT: 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_UINT: 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_SINT: 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_UNORM: 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SNORM: 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_USCALED: 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SSCALED: 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_UINT: 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_SINT: 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R16G16B16A16_FLOAT: 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 128-bit buffers. */ 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_FLOAT: 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SNORM: 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_UNORM: 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SSCALED: 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_USCALED: 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_SINT: 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_UINT: 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_SWAP_STD; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported colorswap format %d\n", format); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ~0U; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ~0U; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat) 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R600_BIG_ENDIAN) { 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(colorformat) { 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8-bit buffers. */ 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8: 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_NONE; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 16-bit buffers. */ 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_5_6_5: 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_1_5_5_5: 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_4_4_4_4: 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16: 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_8: 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_8IN16; 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 32-bit buffers. */ 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_8_8_8: 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_2_10_10_10: 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_24: 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_24_8: 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16_16: 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_8IN32; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 64-bit buffers. */ 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16_16_16_16: 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_8IN16; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_32_32: 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_8IN32; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 128-bit buffers. */ 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_32_32_32_32: 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_8IN32; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_NONE; /* Unsupported. */ 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028C70_ENDIAN_NONE; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Returns the size in bits of the widest component of a CB format */ 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_colorformat_max_comp_size(uint32_t colorformat) 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(colorformat) { 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_4_4_4_4: 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_1_5_5_5: 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_5_5_5_1: 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 5; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_5_6_5: 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 6; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8: 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_8: 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_8_8_8: 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_10_10_10_2: 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_2_10_10_10: 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 10; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_10_11_11: 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_11_11_10: 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 11; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16: 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16_16: 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_16_16_16_16: 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 16; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_8_24: 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_24_8: 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 24; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_32: 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_32_32: 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_32_32_32_32: 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028C70_COLOR_X24_8_32_FLOAT: 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 32; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unknown maximum component size"); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_dbformat(enum pipe_format format) 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028040_Z_16; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028040_Z_24; /* XXX no longer supported on SI */ 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT: 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_028040_Z_32_FLOAT; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ~0U; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture translation 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_texformat(struct pipe_screen *screen, 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format, 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc, 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int first_non_void) 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean uniform = TRUE; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Colorspace (return non-RGB formats directly). */ 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->colorspace) { 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Depth stencil formats */ 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_ZS: 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_16; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X24S8_UINT: 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_24_8; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8X24_UINT: 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8Z24_UNORM: 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_8_24; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT: 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_8; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT: 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_32; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_X24_8_32; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_YUV: 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; /* TODO */ 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_SRGB: 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO compressed formats */ 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_5_9_9_9; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (format == PIPE_FORMAT_R11G11B10_FLOAT) { 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_10_11_11; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R8G8Bx_SNORM - TODO CxV8U8 */ 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See whether the components are of the same size. */ 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1; i < desc->nr_channels; i++) { 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uniform = uniform && desc->channel[0].size == desc->channel[i].size; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Non-uniform formats. */ 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!uniform) { 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(desc->nr_channels) { 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].size == 5 && 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[1].size == 6 && 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[2].size == 5) { 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_5_6_5; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].size == 5 && 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[1].size == 5 && 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[2].size == 5 && 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[3].size == 1) { 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_1_5_5_5; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].size == 10 && 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[1].size == 10 && 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[2].size == 10 && 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[3].size == 2) { 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_2_10_10_10; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first_non_void < 0 || first_non_void > 3) 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_unknown; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* uniform formats */ 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->channel[first_non_void].size) { 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_4_4; 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_4_4_4_4; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_8; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_8_8; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_8_8_8_8; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_16; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_16_16; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_16_16_16_16; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_32; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_32_32; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_32_32_32; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F14_IMG_DATA_FORMAT_32_32_32_32; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout_unknown: 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */ 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ~0; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_wrap(unsigned wrap) 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (wrap) { 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_REPEAT: 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_WRAP; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_CLAMP_HALF_BORDER; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL; 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_CLAMP_BORDER; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_REPEAT: 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_MIRROR; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP: 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER; 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_filter(unsigned filter) 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (filter) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_FILTER_NEAREST: 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F38_SQ_TEX_XY_FILTER_POINT; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_FILTER_LINEAR: 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F38_SQ_TEX_XY_FILTER_BILINEAR; 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_mipfilter(unsigned filter) 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (filter) { 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_NEAREST: 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F38_SQ_TEX_Z_FILTER_POINT; 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_LINEAR: 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F38_SQ_TEX_Z_FILTER_LINEAR; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_NONE: 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F38_SQ_TEX_Z_FILTER_NONE; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_compare(unsigned compare) 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (compare) { 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_NEVER: 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER; 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_LESS: 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_EQUAL: 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_LEQUAL: 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL; 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_GREATER: 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER; 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_NOTEQUAL: 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_GEQUAL: 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL; 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FUNC_ALWAYS: 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS; 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_dim(unsigned dim) 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dim) { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_1D; 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_1D_ARRAY; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_2D; 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_2D_ARRAY; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_3D; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F1C_SQ_RSRC_IMG_CUBE; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format support testing 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return si_translate_texformat(screen, format, util_format_description(format), 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_get_first_non_void_channel(format)) != ~0U; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen, 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format, 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc, 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int first_non_void) 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned type = desc->channel[first_non_void].type; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == UTIL_FORMAT_TYPE_FIXED) 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_INVALID; 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See whether the components are of the same size. */ 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < desc->nr_channels; i++) { 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[first_non_void].size != desc->channel[i].size) 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_INVALID; 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->channel[first_non_void].size) { 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_8; 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_8_8; 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_8_8_8_8; 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_16; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_16_16; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_16_16_16_16; 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type != UTIL_FORMAT_TYPE_FLOAT) 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_INVALID; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->nr_channels) { 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_32; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_32_32; 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_32_32_32; 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_32_32_32_32; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return V_008F0C_BUF_DATA_FORMAT_INVALID; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format) 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int first_non_void; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned data_format; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(format); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_non_void = util_format_get_first_non_void_channel(format); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_format = si_translate_vertexformat(screen, format, desc, first_non_void); 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID; 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_colorbuffer_format_supported(enum pipe_format format) 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return si_translate_colorformat(format) != ~0U && 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_translate_colorswap(format) != ~0U; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_zs_format_supported(enum pipe_format format) 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return si_translate_dbformat(format) != ~0U; 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool si_is_format_supported(struct pipe_screen *screen, 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format, 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_texture_target target, 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_count, 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage) 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned retval = 0; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target >= PIPE_MAX_TEXTURE_TYPES) { 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("r600: unsupported texture type %d\n", target); 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!util_format_is_supported(format, usage)) 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Multisample */ 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sample_count > 1) 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((usage & PIPE_BIND_SAMPLER_VIEW) && 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_is_sampler_format_supported(screen, format)) { 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= PIPE_BIND_SAMPLER_VIEW; 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((usage & (PIPE_BIND_RENDER_TARGET | 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_DISPLAY_TARGET | 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_SCANOUT | 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_SHARED)) && 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_is_colorbuffer_format_supported(format)) { 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= usage & 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (PIPE_BIND_RENDER_TARGET | 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_DISPLAY_TARGET | 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_SCANOUT | 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_SHARED); 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((usage & PIPE_BIND_DEPTH_STENCIL) && 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_is_zs_format_supported(format)) { 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= PIPE_BIND_DEPTH_STENCIL; 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((usage & PIPE_BIND_VERTEX_BUFFER) && 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_is_vertex_format_supported(screen, format)) { 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= PIPE_BIND_VERTEX_BUFFER; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & PIPE_BIND_TRANSFER_READ) 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= PIPE_BIND_TRANSFER_READ; 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & PIPE_BIND_TRANSFER_WRITE) 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retval |= PIPE_BIND_TRANSFER_WRITE; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return retval == usage; 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * framebuffer handling 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4, 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *state, int cb) 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_resource_texture *rtex; 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_surface *surf; 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level = state->cbufs[cb]->u.tex.level; 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pitch, slice; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned color_info, color_attrib; 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned format, swap, ntype, endian; 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t offset; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blocksize; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blend_clamp = 0, blend_bypass = 0; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_comp_size; 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = (struct r600_surface *)state->cbufs[cb]; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocksize = util_format_get_blocksize(rtex->real_format); 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->depth) 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->have_depth_fb = TRUE; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->depth && !rtex->is_flushing_texture) { 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE); 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtex = rtex->flushed_depth_texture; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = rtex->surface.level[level].offset; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += rtex->surface.level[level].slice_size * 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->cbufs[cb]->u.tex.first_layer; 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch = (rtex->surface.level[level].nblk_x) / 8 - 1; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (slice) { 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slice = slice - 1; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(8); 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rtex->surface.level[level].mode) { 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_LINEAR_ALIGNED: 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(8); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_1D: 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(9); 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_2D: 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) { 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (blocksize) { 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(10); 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(11); 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(12); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else switch (blocksize) { 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(14); 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(15); 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(16); 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(17); 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_attrib = S_028C74_TILE_MODE_INDEX(13); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(surf->base.format); 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) { 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_FLOAT; 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_UNORM; 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_SRGB; 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[i].normalized) 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_SNORM; 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (desc->channel[i].pure_integer) 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_SINT; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[i].normalized) 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_UNORM; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (desc->channel[i].pure_integer) 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype = V_028C70_NUMBER_UINT; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = si_translate_colorformat(surf->base.format); 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap = si_translate_colorswap(surf->base.format); 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org endian = V_028C70_ENDIAN_NONE; 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org endian = si_colorformat_endian_swap(format); 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend clamp should be set for all NORM/SRGB types */ 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ntype == V_028C70_NUMBER_UNORM || 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype == V_028C70_NUMBER_SNORM || 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ntype == V_028C70_NUMBER_SRGB) 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_clamp = 1; 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set blend bypass according to docs if SINT/UINT or 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8/24 COLOR variants */ 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT || 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 || 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format == V_028C70_COLOR_X24_8_32_FLOAT) { 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_clamp = 0; 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_bypass = 1; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color_info = S_028C70_FORMAT(format) | 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C70_COMP_SWAP(swap) | 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C70_BLEND_CLAMP(blend_clamp) | 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C70_BLEND_BYPASS(blend_bypass) | 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C70_NUMBER_TYPE(ntype) | 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C70_ENDIAN(endian); 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->alpha_ref_dirty = true; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture); 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset >>= 8; 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME handle enabling of CB beyond BASE8 which has different offset */ 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset); 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch)); 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice)); 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000); 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) | 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer)); 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Determine pixel shader export format */ 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_comp_size = si_colorformat_max_comp_size(format); 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ntype == V_028C70_NUMBER_SRGB || 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM) && 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_comp_size <= 10) || 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ntype == V_028C70_NUMBER_FLOAT && max_comp_size <= 16)) { 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->export_16bpc |= 1 << cb; 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->spi_shader_col_format |= V_028714_SPI_SHADER_FP16_ABGR << (4 * cb); 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->spi_shader_col_format |= V_028714_SPI_SHADER_32_ABGR << (4 * cb); 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4, 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *state) 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_resource_texture *rtex; 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_surface *surf; 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, pitch, slice, format; 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t z_info, s_info; 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t z_offs, s_offs; 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->zsbuf == NULL) { 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = (struct r600_surface *)state->zsbuf; 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level = surf->base.u.tex.level; 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtex = (struct r600_resource_texture*)surf->base.texture; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = si_translate_dbformat(rtex->real_format); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_offs += rtex->surface.level[level].offset; 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_offs = r600_resource_va(rctx->context.screen, surf->base.texture); 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_offs += rtex->surface.stencil_offset; 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_offs += rtex->surface.level[level].offset / 4; 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_offs >>= 8; 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_offs >>= 8; 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch = (rtex->surface.level[level].nblk_x / 8) - 1; 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (slice) { 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slice = slice - 1; 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_info = S_028040_FORMAT(format); 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_info = S_028044_FORMAT(1); 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) { 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_info |= S_028040_TILE_MODE_INDEX(4); 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_info |= S_028044_TILE_MODE_INDEX(4); 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) { 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028040_Z_16: 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_info |= S_028040_TILE_MODE_INDEX(5); 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_info |= S_028044_TILE_MODE_INDEX(5); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028040_Z_24: 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case V_028040_Z_32_FLOAT: 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_info |= S_028040_TILE_MODE_INDEX(6); 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_info |= S_028044_TILE_MODE_INDEX(6); 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_info |= S_028040_TILE_MODE_INDEX(7); 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_info |= S_028044_TILE_MODE_INDEX(7); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Invalid DB tiling mode %d!\n", 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtex->surface.level[level].mode); 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW, 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) | 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer)); 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1); 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format != ~0U) { 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info); 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0); 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rtex->surface.flags & RADEON_SURF_SBUFFER) { 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info); 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0); 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE); 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs); 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs); 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs); 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs); 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch)); 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice)); 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_framebuffer_state(struct pipe_context *ctx, 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *state) 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t shader_mask, tl, br; 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tl_x, tl_y, br_x, br_y; 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pm4 == NULL) 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_fb_cache(pm4, state->nr_cbufs); 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->zsbuf) 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_zsbuf_cache(pm4); 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_framebuffer_state(&rctx->framebuffer, state); 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* build states */ 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->have_depth_fb = 0; 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->export_16bpc = 0; 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->spi_shader_col_format = 0; 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < state->nr_cbufs; i++) { 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_cb(rctx, pm4, state, i); 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(rctx->export_16bpc & ~0xff)); 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_db(rctx, pm4, state); 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_mask = 0; 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < state->nr_cbufs; i++) { 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_mask |= 0xf << (i * 4); 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl_x = 0; 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl_y = 0; 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br_x = state->width; 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br_y = state->height; 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */ 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EG hw workaround */ 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (br_x == 0) 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl_x = 1; 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (br_y == 0) 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl_y = 1; 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cayman hw workaround */ 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->chip_class == CAYMAN) { 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (br_x == 1 && br_y == 1) 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br_x = 2; 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y); 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y); 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl); 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br); 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl); 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br); 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl); 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br); 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl); 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br); 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA); 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask); 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028714_SPI_SHADER_COL_FORMAT, 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->spi_shader_col_format); 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000); 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, framebuffer, pm4); 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_fb_rs_state(rctx); 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_update_fb_blend_state(rctx); 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shaders 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Compute the key for the hw shader variant */ 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned si_shader_selector_key(struct pipe_context *ctx, 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel) 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key = 0; 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel->type == PIPE_SHADER_FRAGMENT) { 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel->fs_write_all) 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key |= rctx->framebuffer.nr_cbufs; 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key |= rctx->export_16bpc << 4; 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*if (rctx->queued.named.rasterizer) 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key |= rctx->queued.named.rasterizer->flatshade << 12;*/ 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*key |== rctx->two_side << 13;*/ 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return key; 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Select the hw shader variant depending on the current state. 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (*dirty) is set to 1 if current variant was changed */ 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint si_shader_select(struct pipe_context *ctx, 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel, 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *dirty) 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key; 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader * shader = NULL; 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key = si_shader_selector_key(ctx, sel); 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check if we don't need to change anything. 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This path is also used for most shaders that don't need multiple 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * variants, it will cost just a computation of the key and this 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * test. */ 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(sel->current && sel->current->key == key)) { 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* lookup if we have other variants in the list */ 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel->num_shaders > 1) { 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader *p = sel->current, *c = p->next_variant; 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (c && c->key != key) { 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = c; 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = c->next_variant; 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c) { 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->next_variant = c->next_variant; 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = c; 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(!shader)) { 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = CALLOC(1, sizeof(struct si_pipe_shader)); 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->selector = sel; 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = si_pipe_shader_create(ctx, shader); 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(r)) { 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n", 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->type, key, r); 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->current = NULL; 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't know the value of fs_write_all property until we built 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * at least one variant, so we may need to recompute the key (include 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rctx->framebuffer.nr_cbufs) after building first variant. */ 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel->type == PIPE_SHADER_FRAGMENT && 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->num_shaders == 0 && 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->shader.fs_write_all) { 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->fs_write_all = 1; 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key = si_shader_selector_key(ctx, sel); 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->key = key; 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->num_shaders++; 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty) 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dirty = 1; 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->next_variant = sel->current; 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->current = shader; 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_shader_state(struct pipe_context *ctx, 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *state, 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pipe_shader_type) 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel = CALLOC_STRUCT(si_pipe_shader_selector); 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->type = pipe_shader_type; 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->tokens = tgsi_dup_tokens(state->tokens); 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->so = state->stream_output; 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = si_shader_select(ctx, sel, NULL); 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) { 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(sel); 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sel; 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_fs_state(struct pipe_context *ctx, 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *state) 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT); 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_vs_state(struct pipe_context *ctx, 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *state) 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return si_create_shader_state(ctx, state, PIPE_SHADER_VERTEX); 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state) 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel = state; 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->vs_shader == sel) 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->shader_dirty = true; 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->vs_shader = sel; 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel && sel->current) 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, vs, sel->current->pm4); 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4); 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state) 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel = state; 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->ps_shader == sel) 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->shader_dirty = true; 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->ps_shader = sel; 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel && sel->current) 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, ps, sel->current->pm4); 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_bind_state(rctx, ps, rctx->dummy_pixel_shader->pm4); 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_shader_selector(struct pipe_context *ctx, 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel) 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader *p = sel->current, *c; 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (p) { 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = p->next_variant; 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_delete_state(rctx, vs, p->pm4); 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pipe_shader_destroy(ctx, p); 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(p); 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = c; 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(sel->tokens); 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(sel); 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state) 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state; 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->vs_shader == sel) { 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->vs_shader = NULL; 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_delete_shader_selector(ctx, sel); 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state) 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state; 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->ps_shader == sel) { 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->ps_shader = NULL; 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_delete_shader_selector(ctx, sel); 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Samplers 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx, 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *texture, 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_view *state) 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view); 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture; 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(state->format); 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blocksize = util_format_get_blocksize(tmp->real_format); 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned format, num_format, /*endian,*/ tiling_index; 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pitch = 0; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char state_swizzle[4], swizzle[4]; 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned height, depth, width, offset_level, last_level; 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int first_non_void; 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t va; 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (view == NULL) 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize base object */ 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base = *state; 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.texture = NULL; 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_reference(NULL, &texture->reference); 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.texture = texture; 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.reference.count = 1; 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->base.context = ctx; 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_swizzle[0] = state->swizzle_r; 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_swizzle[1] = state->swizzle_g; 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_swizzle[2] = state->swizzle_b; 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_swizzle[3] = state->swizzle_a; 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle); 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_non_void = util_format_get_first_non_void_channel(state->format); 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->channel[first_non_void].type) { 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_FLOAT: 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_SIGNED: 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F14_IMG_NUM_FORMAT_SNORM; 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_UNSIGNED: 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F14_IMG_NUM_FORMAT_UNORM; 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void); 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == ~0) { 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = 0; 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tmp->depth && !tmp->is_flushing_texture) { 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_texture_depth_flush(ctx, texture, TRUE); 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = tmp->flushed_depth_texture; 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* not supported any more */ 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org //endian = si_colorformat_endian_swap(format); 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_level = state->u.tex.first_level; 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org last_level = state->u.tex.last_level - offset_level; 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = tmp->surface.level[offset_level].npix_x; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = tmp->surface.level[offset_level].npix_y; 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = tmp->surface.level[offset_level].npix_z; 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format); 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = 1; 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = texture->array_size; 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = texture->array_size; 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 8; 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tmp->surface.level[state->u.tex.first_level].mode) { 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_LINEAR_ALIGNED: 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 8; 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_1D: 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 9; 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RADEON_SURF_MODE_2D: 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) { 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (blocksize) { 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 10; 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 11; 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 12; 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else switch (blocksize) { 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 14; 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 15; 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 16; 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 17; 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tiling_index = 13; 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va = r600_resource_va(ctx->screen, texture); 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va += tmp->surface.level[offset_level].offset; 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[0] = va >> 8; 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[1] = (S_008F14_BASE_ADDRESS_HI(va >> 40) | 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F14_DATA_FORMAT(format) | 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F14_NUM_FORMAT(num_format)); 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[2] = (S_008F18_WIDTH(width - 1) | 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F18_HEIGHT(height - 1)); 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) | 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) | 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) | 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) | 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_BASE_LEVEL(offset_level) | 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_LAST_LEVEL(last_level) | 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_TILING_INDEX(tiling_index) | 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F1C_TYPE(si_tex_dim(texture->target))); 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1)); 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) | 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F24_LAST_ARRAY(state->u.tex.last_layer)); 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[6] = 0; 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->state[7] = 0; 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &view->base; 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_sampler_view_destroy(struct pipe_context *ctx, 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *state) 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state; 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&state->texture, NULL); 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(resource); 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_sampler_state(struct pipe_context *ctx, 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state *state) 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state); 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union util_color uc; 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0; 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned border_color_type; 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rstate == NULL) { 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (uc.ui) { 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x000000FF: 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK; 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x00000000: 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK; 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xFFFFFFFF: 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE; 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: /* Use border color pointer */ 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) | 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) | 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) | 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (state->max_anisotropy & 0x7) << 9 | /* XXX */ 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) | 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) | 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aniso_flag_offset << 16 | /* XXX */ 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map)); 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) | 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8))); 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) | 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) | 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) | 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter))); 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type); 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border_color_type == 3) { 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0])); 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1])); 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2])); 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3])); 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rstate; 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count, 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(count == 0); 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count, 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views; 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j; 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int has_depth = 0; 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count) 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_texture_cache(pm4); 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_begin(pm4); 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference( 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_sampler_view **)&rctx->ps_samplers.views[i], 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org views[i]); 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (views[i]) { 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_resource_texture *tex = (void *)resource[i]->base.texture; 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ); 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < Elements(resource[i]->state); ++j) { 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_add(pm4, resource[i]->state[j]); 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = count; i < NUM_TEX_UNITS; i++) { 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->ps_samplers.views[i]) 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL); 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_end(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4); 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout: 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, ps_sampler_views, pm4); 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->have_depth_texture = has_depth; 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->ps_samplers.n_views = count; 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states) 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(count == 0); 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states) 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states; 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j; 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!count) 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_texture_cache(pm4); 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_begin(pm4); 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < Elements(rstates[i]->val); ++j) { 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_add(pm4, rstates[i]->val[j]); 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_sh_data_end(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2); 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count); 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout: 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, ps_sampler, pm4); 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->ps_samplers.n_samplers = count; 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state) 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(state); 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Constants 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index, 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_constant_buffer *cb) 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL; 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4; 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t va_offset; 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note that the state tracker can unbind constant buffers by 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * passing NULL here. 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cb == NULL) 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pm4 = CALLOC_STRUCT(si_pm4_state); 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_shader_cache(pm4); 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cb->user_buffer) 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset); 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = 0; 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_offset = r600_resource_va(ctx->screen, (void*)rbuffer); 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_offset += offset; 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ); 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader) { 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset); 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32); 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, vs_const, pm4); 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset); 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32); 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, ps_const, pm4); 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported %d\n", shader); 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cb->buffer != &rbuffer->b.b) 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_resource_reference(&rbuffer, NULL); 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Vertex elements & buffers 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_vertex_elements(struct pipe_context *ctx, 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_element *elements) 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element); 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(count < PIPE_MAX_ATTRIBS); 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!v) 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->count = count; 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; ++i) { 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned data_format, num_format; 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int first_non_void; 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(elements[i].src_format); 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_non_void = util_format_get_first_non_void_channel(elements[i].src_format); 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format, 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc, first_non_void); 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->channel[first_non_void].type) { 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_FIXED: 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */ 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_SIGNED: 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F0C_BUF_NUM_FORMAT_SNORM; 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_UNSIGNED: 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F0C_BUF_NUM_FORMAT_UNORM; 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_TYPE_FLOAT: 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) | 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) | 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) | 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) | 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F0C_NUM_FORMAT(num_format) | 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_008F0C_DATA_FORMAT(data_format); 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count); 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return v; 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state) 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_vertex_element *v = (struct si_vertex_element*)state; 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->vertex_elements = v; 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state) 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->vertex_elements == state) 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->vertex_elements = NULL; 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_buffer *buffers) 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count); 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_index_buffer(struct pipe_context *ctx, 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_index_buffer *ib) 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib) { 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer); 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&rctx->index_buffer, ib, sizeof(*ib)); 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&rctx->index_buffer.buffer, NULL); 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Misc 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_polygon_stipple(struct pipe_context *ctx, 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_poly_stipple *state) 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_texture_barrier(struct pipe_context *ctx) 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_texture_cache(pm4); 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs); 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, texture_barrier, pm4); 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_init_state_functions(struct r600_context *rctx) 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_blend_state = si_create_blend_state; 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_blend_state = si_bind_blend_state; 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_blend_state = si_delete_blend_state; 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_blend_color = si_set_blend_color; 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_rasterizer_state = si_create_rs_state; 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_rasterizer_state = si_bind_rs_state; 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_rasterizer_state = si_delete_rs_state; 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state; 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state; 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state; 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx); 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_clip_state = si_set_clip_state; 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_scissor_state = si_set_scissor_state; 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_viewport_state = si_set_viewport_state; 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_stencil_ref = si_set_pipe_stencil_ref; 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_framebuffer_state = si_set_framebuffer_state; 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_vs_state = si_create_vs_state; 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_fs_state = si_create_fs_state; 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_vs_state = si_bind_vs_shader; 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_fs_state = si_bind_ps_shader; 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_vs_state = si_delete_vs_shader; 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_fs_state = si_delete_ps_shader; 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_sampler_state = si_create_sampler_state; 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler; 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler; 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_sampler_state = si_delete_sampler_state; 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_sampler_view = si_create_sampler_view; 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view; 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view; 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.sampler_view_destroy = si_sampler_view_destroy; 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_sample_mask = si_set_sample_mask; 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_constant_buffer = si_set_constant_buffer; 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_vertex_elements_state = si_create_vertex_elements; 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.bind_vertex_elements_state = si_bind_vertex_elements; 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.delete_vertex_elements_state = si_delete_vertex_element; 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_vertex_buffers = si_set_vertex_buffers; 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_index_buffer = si_set_index_buffer; 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.create_stream_output_target = si_create_so_target; 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.stream_output_target_destroy = si_so_target_destroy; 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_stream_output_targets = si_set_so_targets; 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.texture_barrier = si_texture_barrier; 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.set_polygon_stipple = si_set_polygon_stipple; 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->context.draw_vbo = si_draw_vbo; 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_init_config(struct r600_context *rctx) 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state); 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_cmd_begin(pm4, PKT3_CONTEXT_CONTROL); 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_cmd_add(pm4, 0x80000000); 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_cmd_add(pm4, 0x80000000); 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_cmd_end(pm4, false); 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0); 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0); 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0); 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0); 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0); 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0); 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0); 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0); 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0); 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0); 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0); 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0); 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0); 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0); 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0); 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0); 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0); 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0); 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM, 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028AA8_SWITCH_ON_EOP(1) | 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028AA8_PARTIAL_VS_WAVE_ON(1) | 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org S_028AA8_PRIMGROUP_SIZE(63)); 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000); 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0); 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1); 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0); 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210); 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98); 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000); 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si_pm4_set_state(rctx, init, pm4); 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2540