docs: Update status of GL 3.x related extensions
[mesa.git] / src / gallium / drivers / nvfx / nvfx_shader.h
index 59a439fc600d3bd98ce78423513950e77dfa9338..46406b27940740a4d8dc404d525207a967b5ff77 100644 (file)
@@ -1,6 +1,10 @@
 #ifndef __NVFX_SHADER_H__
 #define __NVFX_SHADER_H__
 
+#include <stdint.h>
+
+#include "pipe/p_compiler.h"
+
 #define NVFX_SWZ_IDENTITY ((3 << 6) | (2 << 4) | (1 << 2) | (0 << 0))
 
 /* this will resolve to either the NV30 or the NV40 version
 
 /* NV40 only fragment program opcodes */
 #define NVFX_FP_OP_OPCODE_TXL_NV40 0x2F
+#define NVFX_FP_OP_OPCODE_LITEX2_NV40 0x3C
 
 /* The use of these instructions appears to be indicated by bit 31 of DWORD 2.*/
 #define NV40_FP_OP_BRA_OPCODE_BRK                                    0x0
 #define NVFXSR_OUTPUT  1
 #define NVFXSR_INPUT   2
 #define NVFXSR_TEMP    3
-#define NVFXSR_CONST   4
-#define NVFXSR_RELOCATED       5
+#define NVFXSR_CONST   5
+#define NVFXSR_IMM     6
+#define NVFXSR_RELOCATED       7
 
 #define NVFX_COND_FL  0
 #define NVFX_COND_LT  1
 #define NVFX_SWZ_Z 2
 #define NVFX_SWZ_W 3
 
-#define swz(s,x,y,z,w) nvfx_sr_swz((s), NVFX_SWZ_##x, NVFX_SWZ_##y, NVFX_SWZ_##z, NVFX_SWZ_##w)
-#define neg(s) nvfx_sr_neg((s))
-#define abs(s) nvfx_sr_abs((s))
-#define scale(s,v) nvfx_sr_scale((s), NVFX_FP_OP_DST_SCALE_##v)
+#define swz(s,x,y,z,w) nvfx_src_swz((s), NVFX_SWZ_##x, NVFX_SWZ_##y, NVFX_SWZ_##z, NVFX_SWZ_##w)
+#define neg(s) nvfx_src_neg((s))
+#define abs(s) nvfx_src_abs((s))
 
-struct nvfx_sreg {
-       int type;
-       int index;
+struct nvfx_reg {
+       int8_t type;
+       uint32_t index;
+};
 
-       int dst_scale;
+struct nvfx_src {
+       struct nvfx_reg reg;
 
-       int negate;
-       int abs;
-       int swz[4];
+       uint8_t indirect : 1;
+       uint8_t indirect_reg : 1;
+       uint8_t indirect_swz : 2;
+       uint8_t negate : 1;
+       uint8_t abs : 1;
+       uint8_t swz[4];
+};
 
-       int cc_update;
-       int cc_update_reg;
-       int cc_test;
-       int cc_test_reg;
-       int cc_swz[4];
+struct nvfx_insn
+{
+       uint8_t op;
+       char scale;
+       int8_t unit;
+       uint8_t mask;
+       uint8_t cc_swz[4];
+
+       uint8_t sat : 1;
+       uint8_t cc_update : 1;
+       uint8_t cc_update_reg : 1;
+       uint8_t cc_test : 3;
+       uint8_t cc_test_reg : 1;
+
+       struct nvfx_reg dst;
+       struct nvfx_src src[3];
 };
 
-static INLINE struct nvfx_sreg
-nvfx_sr(int type, int index)
+static INLINE struct nvfx_insn
+nvfx_insn(boolean sat, unsigned op, int unit, struct nvfx_reg dst, unsigned mask, struct nvfx_src s0, struct nvfx_src s1, struct nvfx_src s2)
 {
-       struct nvfx_sreg temp = {
-               .type = type,
-               .index = index,
-               .dst_scale = 0,
-               .abs = 0,
-               .negate = 0,
-               .swz = { 0, 1, 2, 3 },
+       struct nvfx_insn insn = {
+               .op = op,
+               .scale = 0,
+               .unit = unit,
+               .sat = sat,
+               .mask = mask,
                .cc_update = 0,
                .cc_update_reg = 0,
                .cc_test = NVFX_COND_TR,
                .cc_test_reg = 0,
                .cc_swz = { 0, 1, 2, 3 },
+               .dst = dst,
+               .src = {s0, s1, s2}
+       };
+       return insn;
+}
+
+static INLINE struct nvfx_reg
+nvfx_reg(int type, int index)
+{
+       struct nvfx_reg temp = {
+               .type = type,
+               .index = index,
+       };
+       return temp;
+}
+
+static INLINE struct nvfx_src
+nvfx_src(struct nvfx_reg reg)
+{
+       struct nvfx_src temp = {
+               .reg = reg,
+               .abs = 0,
+               .negate = 0,
+               .swz = { 0, 1, 2, 3 },
+               .indirect = 0,
        };
        return temp;
 }
 
-static INLINE struct nvfx_sreg
-nvfx_sr_swz(struct nvfx_sreg src, int x, int y, int z, int w)
+static INLINE struct nvfx_src
+nvfx_src_swz(struct nvfx_src src, int x, int y, int z, int w)
 {
-       struct nvfx_sreg dst = src;
+       struct nvfx_src dst = src;
 
        dst.swz[NVFX_SWZ_X] = src.swz[x];
        dst.swz[NVFX_SWZ_Y] = src.swz[y];
@@ -458,25 +504,23 @@ nvfx_sr_swz(struct nvfx_sreg src, int x, int y, int z, int w)
        return dst;
 }
 
-static INLINE struct nvfx_sreg
-nvfx_sr_neg(struct nvfx_sreg src)
+static INLINE struct nvfx_src
+nvfx_src_neg(struct nvfx_src src)
 {
        src.negate = !src.negate;
        return src;
 }
 
-static INLINE struct nvfx_sreg
-nvfx_sr_abs(struct nvfx_sreg src)
+static INLINE struct nvfx_src
+nvfx_src_abs(struct nvfx_src src)
 {
        src.abs = 1;
        return src;
 }
 
-static INLINE struct nvfx_sreg
-nvfx_sr_scale(struct nvfx_sreg src, int scale)
-{
-       src.dst_scale = scale;
-       return src;
-}
+struct nvfx_relocation {
+        unsigned location;
+        unsigned target;
+};
 
 #endif