Path: blob/21.2-virgl/src/gallium/drivers/nouveau/nv30/nv40_vertprog.h
4574 views
#ifndef __NV40_SHADER_H__1#define __NV40_SHADER_H__23/* Vertex programs instruction set4*5* The NV40 instruction set is very similar to NV30. Most fields are in6* a slightly different position in the instruction however.7*8* Merged instructions9* In some cases it is possible to put two instructions into one opcode10* slot. The rules for when this is OK is not entirely clear to me yet.11*12* There are separate writemasks and dest temp register fields for each13* grouping of instructions. There is however only one field with the14* ID of a result register. Writing to temp/result regs is selected by15* setting VEC_RESULT/SCA_RESULT.16*17* Temporary registers18* The source/dest temp register fields have been extended by 1 bit, to19* give a total of 32 temporary registers.20*21* Relative Addressing22* NV40 can use an address register to index into vertex attribute regs.23* This is done by putting the offset value into INPUT_SRC and setting24* the INDEX_INPUT flag.25*26* Conditional execution (see NV_vertex_program{2,3} for details)27* There is a second condition code register on NV40, it's use is enabled28* by setting the COND_REG_SELECT_1 flag.29*30* Texture lookup31* TODO32*/3334/* ---- OPCODE BITS 127:96 / data DWORD 0 --- */35#define NV40_VP_INST_VEC_RESULT (1 << 30)36/* uncertain.. */37#define NV40_VP_INST_COND_UPDATE_ENABLE ((1 << 14)|1<<29)38/* use address reg as index into attribs */39#define NV40_VP_INST_INDEX_INPUT (1 << 27)40#define NV40_VP_INST_SATURATE (1 << 26)41#define NV40_VP_INST_COND_REG_SELECT_1 (1 << 25)42#define NV40_VP_INST_ADDR_REG_SELECT_1 (1 << 24)43#define NV40_VP_INST_SRC2_ABS (1 << 23)44#define NV40_VP_INST_SRC1_ABS (1 << 22)45#define NV40_VP_INST_SRC0_ABS (1 << 21)46#define NV40_VP_INST_VEC_DEST_TEMP_SHIFT 1547#define NV40_VP_INST_VEC_DEST_TEMP_MASK (0x3F << 15)48#define NV40_VP_INST_COND_TEST_ENABLE (1 << 13)49#define NV40_VP_INST_COND_SHIFT 1050#define NV40_VP_INST_COND_MASK (0x7 << 10)51#define NV40_VP_INST_COND_SWZ_X_SHIFT 852#define NV40_VP_INST_COND_SWZ_X_MASK (3 << 8)53#define NV40_VP_INST_COND_SWZ_Y_SHIFT 654#define NV40_VP_INST_COND_SWZ_Y_MASK (3 << 6)55#define NV40_VP_INST_COND_SWZ_Z_SHIFT 456#define NV40_VP_INST_COND_SWZ_Z_MASK (3 << 4)57#define NV40_VP_INST_COND_SWZ_W_SHIFT 258#define NV40_VP_INST_COND_SWZ_W_MASK (3 << 2)59#define NV40_VP_INST_COND_SWZ_ALL_SHIFT 260#define NV40_VP_INST_COND_SWZ_ALL_MASK (0xFF << 2)61#define NV40_VP_INST_ADDR_SWZ_SHIFT 062#define NV40_VP_INST_ADDR_SWZ_MASK (0x03 << 0)63#define NV40_VP_INST0_KNOWN ( \64NV40_VP_INST_INDEX_INPUT | \65NV40_VP_INST_COND_REG_SELECT_1 | \66NV40_VP_INST_ADDR_REG_SELECT_1 | \67NV40_VP_INST_SRC2_ABS | \68NV40_VP_INST_SRC1_ABS | \69NV40_VP_INST_SRC0_ABS | \70NV40_VP_INST_VEC_DEST_TEMP_MASK | \71NV40_VP_INST_COND_TEST_ENABLE | \72NV40_VP_INST_COND_MASK | \73NV40_VP_INST_COND_SWZ_ALL_MASK | \74NV40_VP_INST_ADDR_SWZ_MASK)7576/* ---- OPCODE BITS 95:64 / data DWORD 1 --- */77#define NV40_VP_INST_VEC_OPCODE_SHIFT 2278#define NV40_VP_INST_VEC_OPCODE_MASK (0x1F << 22)79#define NV40_VP_INST_SCA_OPCODE_SHIFT 2780#define NV40_VP_INST_SCA_OPCODE_MASK (0x1F << 27)81#define NV40_VP_INST_CONST_SRC_SHIFT 1282#define NV40_VP_INST_CONST_SRC_MASK (0xFF << 12)83#define NV40_VP_INST_INPUT_SRC_SHIFT 884#define NV40_VP_INST_INPUT_SRC_MASK (0x0F << 8)85#define NV40_VP_INST_SRC0H_SHIFT 086#define NV40_VP_INST_SRC0H_MASK (0xFF << 0)87#define NV40_VP_INST1_KNOWN ( \88NV40_VP_INST_VEC_OPCODE_MASK | \89NV40_VP_INST_SCA_OPCODE_MASK | \90NV40_VP_INST_CONST_SRC_MASK | \91NV40_VP_INST_INPUT_SRC_MASK | \92NV40_VP_INST_SRC0H_MASK \93)9495/* ---- OPCODE BITS 63:32 / data DWORD 2 --- */96#define NV40_VP_INST_SRC0L_SHIFT 2397#define NV40_VP_INST_SRC0L_MASK (0x1FF << 23)98#define NV40_VP_INST_SRC1_SHIFT 699#define NV40_VP_INST_SRC1_MASK (0x1FFFF << 6)100#define NV40_VP_INST_SRC2H_SHIFT 0101#define NV40_VP_INST_SRC2H_MASK (0x3F << 0)102#define NV40_VP_INST_IADDRH_SHIFT 0103#define NV40_VP_INST_IADDRH_MASK (0x3F << 0)104105/* ---- OPCODE BITS 31:0 / data DWORD 3 --- */106#define NV40_VP_INST_IADDRL_SHIFT 29107#define NV40_VP_INST_IADDRL_MASK (7 << 29)108#define NV40_VP_INST_SRC2L_SHIFT 21109#define NV40_VP_INST_SRC2L_MASK (0x7FF << 21)110#define NV40_VP_INST_SCA_WRITEMASK_SHIFT 17111#define NV40_VP_INST_SCA_WRITEMASK_MASK (0xF << 17)112# define NV40_VP_INST_SCA_WRITEMASK_X (1 << 20)113# define NV40_VP_INST_SCA_WRITEMASK_Y (1 << 19)114# define NV40_VP_INST_SCA_WRITEMASK_Z (1 << 18)115# define NV40_VP_INST_SCA_WRITEMASK_W (1 << 17)116#define NV40_VP_INST_VEC_WRITEMASK_SHIFT 13117#define NV40_VP_INST_VEC_WRITEMASK_MASK (0xF << 13)118# define NV40_VP_INST_VEC_WRITEMASK_X (1 << 16)119# define NV40_VP_INST_VEC_WRITEMASK_Y (1 << 15)120# define NV40_VP_INST_VEC_WRITEMASK_Z (1 << 14)121# define NV40_VP_INST_VEC_WRITEMASK_W (1 << 13)122#define NV40_VP_INST_SCA_RESULT (1 << 12)123#define NV40_VP_INST_SCA_DEST_TEMP_SHIFT 7124#define NV40_VP_INST_SCA_DEST_TEMP_MASK (0x1F << 7)125#define NV40_VP_INST_DEST_SHIFT 2126#define NV40_VP_INST_DEST_MASK (31 << 2)127# define NV40_VP_INST_DEST_POS 0128# define NV40_VP_INST_DEST_COL0 1129# define NV40_VP_INST_DEST_COL1 2130# define NV40_VP_INST_DEST_BFC0 3131# define NV40_VP_INST_DEST_BFC1 4132# define NV40_VP_INST_DEST_FOGC 5133# define NV40_VP_INST_DEST_PSZ 6134# define NV40_VP_INST_DEST_TC0 7135# define NV40_VP_INST_DEST_TC(n) (7+n)136# define NV40_VP_INST_DEST_TEMP 0x1F137#define NV40_VP_INST_INDEX_CONST (1 << 1)138#define NV40_VP_INST3_KNOWN ( \139NV40_VP_INST_SRC2L_MASK |\140NV40_VP_INST_SCA_WRITEMASK_MASK |\141NV40_VP_INST_VEC_WRITEMASK_MASK |\142NV40_VP_INST_SCA_DEST_TEMP_MASK |\143NV40_VP_INST_DEST_MASK |\144NV40_VP_INST_INDEX_CONST)145146/* Useful to split the source selection regs into their pieces */147#define NV40_VP_SRC0_HIGH_SHIFT 9148#define NV40_VP_SRC0_HIGH_MASK 0x0001FE00149#define NV40_VP_SRC0_LOW_MASK 0x000001FF150#define NV40_VP_SRC2_HIGH_SHIFT 11151#define NV40_VP_SRC2_HIGH_MASK 0x0001F800152#define NV40_VP_SRC2_LOW_MASK 0x000007FF153154/* Source selection - these are the bits you fill NV40_VP_INST_SRCn with */155#define NV40_VP_SRC_NEGATE (1 << 16)156#define NV40_VP_SRC_SWZ_X_SHIFT 14157#define NV40_VP_SRC_SWZ_X_MASK (3 << 14)158#define NV40_VP_SRC_SWZ_Y_SHIFT 12159#define NV40_VP_SRC_SWZ_Y_MASK (3 << 12)160#define NV40_VP_SRC_SWZ_Z_SHIFT 10161#define NV40_VP_SRC_SWZ_Z_MASK (3 << 10)162#define NV40_VP_SRC_SWZ_W_SHIFT 8163#define NV40_VP_SRC_SWZ_W_MASK (3 << 8)164#define NV40_VP_SRC_SWZ_ALL_SHIFT 8165#define NV40_VP_SRC_SWZ_ALL_MASK (0xFF << 8)166#define NV40_VP_SRC_TEMP_SRC_SHIFT 2167#define NV40_VP_SRC_TEMP_SRC_MASK (0x1F << 2)168#define NV40_VP_SRC_REG_TYPE_SHIFT 0169#define NV40_VP_SRC_REG_TYPE_MASK (3 << 0)170# define NV40_VP_SRC_REG_TYPE_UNK0 0171# define NV40_VP_SRC_REG_TYPE_TEMP 1172# define NV40_VP_SRC_REG_TYPE_INPUT 2173# define NV40_VP_SRC_REG_TYPE_CONST 3174175#include "nv30/nvfx_shader.h"176177#endif178179180