1de2362d3Smrg/* 2de2362d3Smrg * RadeonHD R6xx, R7xx DRI driver 3de2362d3Smrg * 4de2362d3Smrg * Copyright (C) 2008-2009 Alexander Deucher 5de2362d3Smrg * Copyright (C) 2008-2009 Matthias Hopf 6de2362d3Smrg * 7de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8de2362d3Smrg * copy of this software and associated documentation files (the "Software"), 9de2362d3Smrg * to deal in the Software without restriction, including without limitation 10de2362d3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11de2362d3Smrg * and/or sell copies of the Software, and to permit persons to whom the 12de2362d3Smrg * Software is furnished to do so, subject to the following conditions: 13de2362d3Smrg * 14de2362d3Smrg * The above copyright notice and this permission notice shall be included 15de2362d3Smrg * in all copies or substantial portions of the Software. 16de2362d3Smrg * 17de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18de2362d3Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19de2362d3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20de2362d3Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21de2362d3Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22de2362d3Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23de2362d3Smrg */ 24de2362d3Smrg 25de2362d3Smrg/* 26de2362d3Smrg * Shader macros 27de2362d3Smrg */ 28de2362d3Smrg 29de2362d3Smrg#ifndef __SHADER_H__ 30de2362d3Smrg#define __SHADER_H__ 31de2362d3Smrg 32de2362d3Smrg#include "radeon.h" 33de2362d3Smrg 34de2362d3Smrg/* Restrictions of ALU instructions 35de2362d3Smrg * order of scalar ops is always x,y,z,w,t(rans), last to be indicated by last==1. 36de2362d3Smrg * max of 3 different src GPRs per instr. 37de2362d3Smrg * max of 4 different cfile constant components per instr. 38de2362d3Smrg * max of 2 (different) constants (any type) for t. 39de2362d3Smrg * bank swizzle (see below). 40de2362d3Smrg * GPR write stalls read of same register. Auto-replaced by PV/PS, NOP needed if registers are relative to 41de2362d3Smrg * different indices (gpr,loop,nothing). 42de2362d3Smrg * may use constant registers or constant cache, but not both. 43de2362d3Smrg */ 44de2362d3Smrg 45de2362d3Smrg/* Bank_swizzle: (pp. 297ff) 46de2362d3Smrg * Only one of each x,y,z,w GPR component can be loaded per cycle (3 cycles per instr, called 0-2). 47de2362d3Smrg * per scalar instruction bank_swizzle can select which cycle each operand comes from. e.g.: 48de2362d3Smrg * SRC0 SRC1 SRC2 SWIZZLE cycle0 cycle1 cycle2 49de2362d3Smrg * 1.x 2.x 012 1.x 2.x - 50de2362d3Smrg * 3.x 1.y 201 1.y - 3.x 51de2362d3Smrg * 2.x 1.y 102 (1.y) (2.x) - 52de2362d3Smrg * If data is read in a cycle, multiple scalar instructions can reference it. 53de2362d3Smrg * Special case: square() - i.e. same component in src0+src1 doesn't need read port -> ignores swizzle for src1. 54de2362d3Smrg * No restrictions for constants or PV/PS. 55de2362d3Smrg * t can load multiple components in a single cycle slot, but has to share cycles with xyzw. 560a1d3ae0Smrg * t with single constant may not load GPRs or PV/PS in cycle 0 (careful with ALU_TRANS_210). 57de2362d3Smrg * t with two constants may only load GPRs or PV/PS in cycle 2. 58de2362d3Smrg */ 59de2362d3Smrg 60de2362d3Smrg 610a1d3ae0Smrg/* Order of instructions: All CF, All ALU, All Tex/Vtx fetches */ 62de2362d3Smrg 63de2362d3Smrg 64de2362d3Smrg// CF insts 65de2362d3Smrg// addr 66de2362d3Smrg#define ADDR(x) (x) 67de2362d3Smrg// pc 68de2362d3Smrg#define POP_COUNT(x) (x) 69de2362d3Smrg// const 70de2362d3Smrg#define CF_CONST(x) (x) 71de2362d3Smrg// cond 72de2362d3Smrg#define COND(x) (x) // SQ_COND_* 73de2362d3Smrg// count 74de2362d3Smrg#define I_COUNT(x) ((x) ? ((x) - 1) : 0) 75de2362d3Smrg//r7xx 76de2362d3Smrg#define COUNT_3(x) (x) 77de2362d3Smrg// call count 78de2362d3Smrg#define CALL_COUNT(x) (x) 79de2362d3Smrg// eop 80de2362d3Smrg#define END_OF_PROGRAM(x) (x) 81de2362d3Smrg// vpm 82de2362d3Smrg#define VALID_PIXEL_MODE(x) (x) 83de2362d3Smrg// cf inst 84de2362d3Smrg#define CF_INST(x) (x) // SQ_CF_INST_* 85de2362d3Smrg 86de2362d3Smrg// wqm 87de2362d3Smrg#define WHOLE_QUAD_MODE(x) (x) 88de2362d3Smrg// barrier 89de2362d3Smrg#define BARRIER(x) (x) 90de2362d3Smrg//kb0 91de2362d3Smrg#define KCACHE_BANK0(x) (x) 92de2362d3Smrg//kb1 93de2362d3Smrg#define KCACHE_BANK1(x) (x) 94de2362d3Smrg// km0/1 95de2362d3Smrg#define KCACHE_MODE0(x) (x) 96de2362d3Smrg#define KCACHE_MODE1(x) (x) // SQ_CF_KCACHE_* 97de2362d3Smrg// 98de2362d3Smrg#define KCACHE_ADDR0(x) (x) 99de2362d3Smrg#define KCACHE_ADDR1(x) (x) 100de2362d3Smrg// uw 101de2362d3Smrg#define USES_WATERFALL(x) (x) 102de2362d3Smrg 103de2362d3Smrg#define ARRAY_BASE(x) (x) 104de2362d3Smrg// export pixel 105de2362d3Smrg#define CF_PIXEL_MRT0 0 106de2362d3Smrg#define CF_PIXEL_MRT1 1 107de2362d3Smrg#define CF_PIXEL_MRT2 2 108de2362d3Smrg#define CF_PIXEL_MRT3 3 109de2362d3Smrg#define CF_PIXEL_MRT4 4 110de2362d3Smrg#define CF_PIXEL_MRT5 5 111de2362d3Smrg#define CF_PIXEL_MRT6 6 112de2362d3Smrg#define CF_PIXEL_MRT7 7 113de2362d3Smrg// *_FOG: r6xx only 114de2362d3Smrg#define CF_PIXEL_MRT0_FOG 16 115de2362d3Smrg#define CF_PIXEL_MRT1_FOG 17 116de2362d3Smrg#define CF_PIXEL_MRT2_FOG 18 117de2362d3Smrg#define CF_PIXEL_MRT3_FOG 19 118de2362d3Smrg#define CF_PIXEL_MRT4_FOG 20 119de2362d3Smrg#define CF_PIXEL_MRT5_FOG 21 120de2362d3Smrg#define CF_PIXEL_MRT6_FOG 22 121de2362d3Smrg#define CF_PIXEL_MRT7_FOG 23 122de2362d3Smrg#define CF_PIXEL_Z 61 123de2362d3Smrg// export pos 124de2362d3Smrg#define CF_POS0 60 125de2362d3Smrg#define CF_POS1 61 126de2362d3Smrg#define CF_POS2 62 127de2362d3Smrg#define CF_POS3 63 128de2362d3Smrg// export param 129de2362d3Smrg// 0...31 130de2362d3Smrg#define TYPE(x) (x) // SQ_EXPORT_* 131de2362d3Smrg#if 0 132de2362d3Smrg// type export 133de2362d3Smrg#define SQ_EXPORT_PIXEL 0 134de2362d3Smrg#define SQ_EXPORT_POS 1 135de2362d3Smrg#define SQ_EXPORT_PARAM 2 136de2362d3Smrg// reserved 3 137de2362d3Smrg// type mem 138de2362d3Smrg#define SQ_EXPORT_WRITE 0 139de2362d3Smrg#define SQ_EXPORT_WRITE_IND 1 140de2362d3Smrg#define SQ_EXPORT_WRITE_ACK 2 141de2362d3Smrg#define SQ_EXPORT_WRITE_IND_ACK 3 142de2362d3Smrg#endif 143de2362d3Smrg 144de2362d3Smrg#define RW_GPR(x) (x) 145de2362d3Smrg#define RW_REL(x) (x) 146de2362d3Smrg#define ABSOLUTE 0 147de2362d3Smrg#define RELATIVE 1 148de2362d3Smrg#define INDEX_GPR(x) (x) 149de2362d3Smrg#define ELEM_SIZE(x) (x ? (x - 1) : 0) 150de2362d3Smrg#define COMP_MASK(x) (x) 151de2362d3Smrg#define R6xx_ELEM_LOOP(x) (x) 152de2362d3Smrg#define BURST_COUNT(x) (x ? (x - 1) : 0) 153de2362d3Smrg 154de2362d3Smrg// swiz 155de2362d3Smrg#define SRC_SEL_X(x) (x) // SQ_SEL_* each 156de2362d3Smrg#define SRC_SEL_Y(x) (x) 157de2362d3Smrg#define SRC_SEL_Z(x) (x) 158de2362d3Smrg#define SRC_SEL_W(x) (x) 159de2362d3Smrg 160de2362d3Smrg#define CF_DWORD0(addr) cpu_to_le32((addr)) 161de2362d3Smrg// R7xx has another entry (COUNT3), but that is only used for adding a bit to count. 162de2362d3Smrg// We allow one more bit for count in the argument of the macro on R7xx instead. 163de2362d3Smrg// R6xx: [0,7] R7xx: [1,16] 164de2362d3Smrg#define CF_DWORD1(pc, cf_const, cond, count, call_count, eop, vpm, cf_inst, wqm, b) \ 165de2362d3Smrg cpu_to_le32((((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | (((count) & 7) << 10) | (((count) >> 3) << 19) | \ 166de2362d3Smrg ((call_count) << 13) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31))) 167de2362d3Smrg 168de2362d3Smrg#define CF_ALU_DWORD0(addr, kb0, kb1, km0) cpu_to_le32((((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30))) 169de2362d3Smrg#define CF_ALU_DWORD1(km1, kcache_addr0, kcache_addr1, count, uw, cf_inst, wqm, b) \ 170de2362d3Smrg cpu_to_le32((((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ 171de2362d3Smrg ((count) << 18) | ((uw) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31))) 172de2362d3Smrg 173de2362d3Smrg#define CF_ALLOC_IMP_EXP_DWORD0(array_base, type, rw_gpr, rr, index_gpr, es) \ 174de2362d3Smrg cpu_to_le32((((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | ((index_gpr) << 23) | \ 175de2362d3Smrg ((es) << 30))) 176de2362d3Smrg// R7xx apparently doesn't have the ELEM_LOOP entry any more 1770a1d3ae0Smrg// We still expose it, but ELEM_LOOP is explicitly R6xx now. 178de2362d3Smrg// TODO: is this just forgotten in the docs, or really not available any more? 179de2362d3Smrg#define CF_ALLOC_IMP_EXP_DWORD1_BUF(array_size, comp_mask, el, bc, eop, vpm, cf_inst, wqm, b) \ 180de2362d3Smrg cpu_to_le32((((array_size) << 0) | ((comp_mask) << 12) | ((el) << 16) | ((bc) << 17) | \ 181de2362d3Smrg ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31))) 182de2362d3Smrg#define CF_ALLOC_IMP_EXP_DWORD1_SWIZ(sel_x, sel_y, sel_z, sel_w, el, bc, eop, vpm, cf_inst, wqm, b) \ 183de2362d3Smrg cpu_to_le32((((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | ((el) << 16) | \ 184de2362d3Smrg ((bc) << 17) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | \ 185de2362d3Smrg ((wqm) << 30) | ((b) << 31))) 186de2362d3Smrg 187de2362d3Smrg// ALU clause insts 188de2362d3Smrg#define SRC0_SEL(x) (x) 189de2362d3Smrg#define SRC1_SEL(x) (x) 190de2362d3Smrg#define SRC2_SEL(x) (x) 191de2362d3Smrg// src[0-2]_sel 192de2362d3Smrg// 0-127 GPR 193de2362d3Smrg// 128-159 kcache constants bank 0 194de2362d3Smrg// 160-191 kcache constants bank 1 195de2362d3Smrg// 248-255 special SQ_ALU_SRC_* (0, 1, etc.) 196de2362d3Smrg#define ALU_SRC_GPR_BASE 0 197de2362d3Smrg#define ALU_SRC_KCACHE0_BASE 128 198de2362d3Smrg#define ALU_SRC_KCACHE1_BASE 160 199de2362d3Smrg#define ALU_SRC_CFILE_BASE 256 200de2362d3Smrg 201de2362d3Smrg#define SRC0_REL(x) (x) 202de2362d3Smrg#define SRC1_REL(x) (x) 203de2362d3Smrg#define SRC2_REL(x) (x) 204de2362d3Smrg// elem 205de2362d3Smrg#define SRC0_ELEM(x) (x) 206de2362d3Smrg#define SRC1_ELEM(x) (x) 207de2362d3Smrg#define SRC2_ELEM(x) (x) 208de2362d3Smrg#define ELEM_X 0 209de2362d3Smrg#define ELEM_Y 1 210de2362d3Smrg#define ELEM_Z 2 211de2362d3Smrg#define ELEM_W 3 212de2362d3Smrg// neg 213de2362d3Smrg#define SRC0_NEG(x) (x) 214de2362d3Smrg#define SRC1_NEG(x) (x) 215de2362d3Smrg#define SRC2_NEG(x) (x) 216de2362d3Smrg// im 217de2362d3Smrg#define INDEX_MODE(x) (x) // SQ_INDEX_* 218de2362d3Smrg// ps 219de2362d3Smrg#define PRED_SEL(x) (x) // SQ_PRED_SEL_* 220de2362d3Smrg// last 221de2362d3Smrg#define LAST(x) (x) 222de2362d3Smrg// abs 223de2362d3Smrg#define SRC0_ABS(x) (x) 224de2362d3Smrg#define SRC1_ABS(x) (x) 225de2362d3Smrg// uem 226de2362d3Smrg#define UPDATE_EXECUTE_MASK(x) (x) 227de2362d3Smrg// up 228de2362d3Smrg#define UPDATE_PRED(x) (x) 229de2362d3Smrg// wm 230de2362d3Smrg#define WRITE_MASK(x) (x) 231de2362d3Smrg// fm 232de2362d3Smrg#define FOG_MERGE(x) (x) 233de2362d3Smrg// omod 234de2362d3Smrg#define OMOD(x) (x) // SQ_ALU_OMOD_* 235de2362d3Smrg// alu inst 236de2362d3Smrg#define ALU_INST(x) (x) // SQ_ALU_INST_* 237de2362d3Smrg//bs 238de2362d3Smrg#define BANK_SWIZZLE(x) (x) // SQ_ALU_VEC_* 239de2362d3Smrg#define DST_GPR(x) (x) 240de2362d3Smrg#define DST_REL(x) (x) 241de2362d3Smrg#define DST_ELEM(x) (x) 242de2362d3Smrg#define CLAMP(x) (x) 243de2362d3Smrg 244de2362d3Smrg#define ALU_DWORD0(src0_sel, s0r, s0e, s0n, src1_sel, s1r, s1e, s1n, im, ps, last) \ 245de2362d3Smrg cpu_to_le32((((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ 246de2362d3Smrg ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ 247de2362d3Smrg ((im) << 26) | ((ps) << 29) | ((last) << 31))) 248de2362d3Smrg// R7xx has alu_inst at a different slot, and no fog merge any more (no fix function fog any more) 249de2362d3Smrg#define R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ 250de2362d3Smrg cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ 251de2362d3Smrg ((fm) << 5) | ((omod) << 6) | ((alu_inst) << 8) | ((bs) << 18) | ((dst_gpr) << 21) | \ 252de2362d3Smrg ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) 253de2362d3Smrg#define R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ 254de2362d3Smrg cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ 255de2362d3Smrg ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ 256de2362d3Smrg ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) 257de2362d3Smrg// This is a general chipset macro, but due to selection by chipid typically not usable in static arrays 258de2362d3Smrg// Fog is NOT USED on R7xx, even if specified. 259de2362d3Smrg#define ALU_DWORD1_OP2(chipfamily, s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ 260de2362d3Smrg ((chipfamily) < CHIP_FAMILY_RV770 ? \ 261de2362d3Smrg R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) : \ 262de2362d3Smrg R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp)) 263de2362d3Smrg#define ALU_DWORD1_OP3(src2_sel, s2r, s2e, s2n, alu_inst, bs, dst_gpr, dr, de, clamp) \ 264de2362d3Smrg cpu_to_le32((((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ 265de2362d3Smrg ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ 266de2362d3Smrg ((de) << 29) | ((clamp) << 31))) 267de2362d3Smrg 268de2362d3Smrg// VTX clause insts 269de2362d3Smrg// vxt insts 270de2362d3Smrg#define VTX_INST(x) (x) // SQ_VTX_INST_* 271de2362d3Smrg 272de2362d3Smrg// fetch type 273de2362d3Smrg#define FETCH_TYPE(x) (x) // SQ_VTX_FETCH_* 274de2362d3Smrg 275de2362d3Smrg#define FETCH_WHOLE_QUAD(x) (x) 276de2362d3Smrg#define BUFFER_ID(x) (x) 277de2362d3Smrg#define SRC_GPR(x) (x) 278de2362d3Smrg#define SRC_REL(x) (x) 279de2362d3Smrg#define MEGA_FETCH_COUNT(x) ((x) ? ((x) - 1) : 0) 280de2362d3Smrg 281de2362d3Smrg#define SEMANTIC_ID(x) (x) 282de2362d3Smrg#define DST_SEL_X(x) (x) 283de2362d3Smrg#define DST_SEL_Y(x) (x) 284de2362d3Smrg#define DST_SEL_Z(x) (x) 285de2362d3Smrg#define DST_SEL_W(x) (x) 286de2362d3Smrg#define USE_CONST_FIELDS(x) (x) 287de2362d3Smrg#define DATA_FORMAT(x) (x) 288de2362d3Smrg// num format 289de2362d3Smrg#define NUM_FORMAT_ALL(x) (x) // SQ_NUM_FORMAT_* 290de2362d3Smrg// format comp 291de2362d3Smrg#define FORMAT_COMP_ALL(x) (x) // SQ_FORMAT_COMP_* 292de2362d3Smrg// sma 293de2362d3Smrg#define SRF_MODE_ALL(x) (x) 294de2362d3Smrg#define SRF_MODE_ZERO_CLAMP_MINUS_ONE 0 295de2362d3Smrg#define SRF_MODE_NO_ZERO 1 296de2362d3Smrg#define OFFSET(x) (x) 297de2362d3Smrg// endian swap 298de2362d3Smrg#define ENDIAN_SWAP(x) (x) // SQ_ENDIAN_* 299de2362d3Smrg#define CONST_BUF_NO_STRIDE(x) (x) 300de2362d3Smrg// mf 301de2362d3Smrg#define MEGA_FETCH(x) (x) 302de2362d3Smrg 303de2362d3Smrg#define VTX_DWORD0(vtx_inst, ft, fwq, buffer_id, src_gpr, sr, ssx, mfc) \ 304de2362d3Smrg cpu_to_le32((((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ 305de2362d3Smrg ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((mfc) << 26))) 306de2362d3Smrg#define VTX_DWORD1_SEM(semantic_id, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ 307de2362d3Smrg cpu_to_le32((((semantic_id) << 0) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ 308de2362d3Smrg ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) 309de2362d3Smrg#define VTX_DWORD1_GPR(dst_gpr, dr, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ 310de2362d3Smrg cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ 311de2362d3Smrg ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) 312de2362d3Smrg#define VTX_DWORD2(offset, es, cbns, mf) \ 313de2362d3Smrg cpu_to_le32((((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((mf) << 19))) 314de2362d3Smrg#define VTX_DWORD_PAD cpu_to_le32(0x00000000) 315de2362d3Smrg 316de2362d3Smrg// TEX clause insts 317de2362d3Smrg// tex insts 318de2362d3Smrg#define TEX_INST(x) (x) // SQ_TEX_INST_* 319de2362d3Smrg 320de2362d3Smrg#define BC_FRAC_MODE(x) (x) 321de2362d3Smrg#define FETCH_WHOLE_QUAD(x) (x) 322de2362d3Smrg#define RESOURCE_ID(x) (x) 323de2362d3Smrg#define R7xx_ALT_CONST(x) (x) 324de2362d3Smrg 325de2362d3Smrg#define LOD_BIAS(x) (x) 326de2362d3Smrg//ct 327de2362d3Smrg#define COORD_TYPE_X(x) (x) 328de2362d3Smrg#define COORD_TYPE_Y(x) (x) 329de2362d3Smrg#define COORD_TYPE_Z(x) (x) 330de2362d3Smrg#define COORD_TYPE_W(x) (x) 331de2362d3Smrg#define TEX_UNNORMALIZED 0 332de2362d3Smrg#define TEX_NORMALIZED 1 333de2362d3Smrg#define OFFSET_X(x) (((int)(x) * 2) & 0x1f) /* 4:1-bits 2's-complement fixed-point: [-8.0..7.5] */ 334de2362d3Smrg#define OFFSET_Y(x) (((int)(x) * 2) & 0x1f) 335de2362d3Smrg#define OFFSET_Z(x) (((int)(x) * 2) & 0x1f) 336de2362d3Smrg#define SAMPLER_ID(x) (x) 337de2362d3Smrg 338de2362d3Smrg// R7xx has an additional parameter ALT_CONST. We always expose it, but ALT_CONST is R7xx only 339de2362d3Smrg#define TEX_DWORD0(tex_inst, bfm, fwq, resource_id, src_gpr, sr, ac) \ 340de2362d3Smrg cpu_to_le32((((tex_inst) << 0) | ((bfm) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ 341de2362d3Smrg ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24))) 342de2362d3Smrg#define TEX_DWORD1(dst_gpr, dr, dsx, dsy, dsz, dsw, lod_bias, ctx, cty, ctz, ctw) \ 343de2362d3Smrg cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ 344de2362d3Smrg ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31))) 345de2362d3Smrg#define TEX_DWORD2(offset_x, offset_y, offset_z, sampler_id, ssx, ssy, ssz, ssw) \ 346de2362d3Smrg cpu_to_le32((((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ 347de2362d3Smrg ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29))) 348de2362d3Smrg#define TEX_DWORD_PAD cpu_to_le32(0x00000000) 349de2362d3Smrg 350de2362d3Smrgextern int R600_solid_vs(RADEONChipFamily ChipSet, uint32_t* vs); 351de2362d3Smrgextern int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* ps); 352de2362d3Smrg 353de2362d3Smrgextern int R600_copy_vs(RADEONChipFamily ChipSet, uint32_t* vs); 354de2362d3Smrgextern int R600_copy_ps(RADEONChipFamily ChipSet, uint32_t* ps); 355de2362d3Smrg 356de2362d3Smrgextern int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader); 357de2362d3Smrgextern int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader); 358de2362d3Smrg 359de2362d3Smrgextern int R600_comp_vs(RADEONChipFamily ChipSet, uint32_t* vs); 360de2362d3Smrgextern int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* ps); 361de2362d3Smrg 362de2362d3Smrg#endif 363