summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nouveau/nvc0/mme
diff options
context:
space:
mode:
authorBen Skeggs <[email protected]>2014-05-09 15:55:44 +1000
committerBen Skeggs <[email protected]>2014-05-15 09:53:56 +1000
commit737477dac33d68b00b34019258d663945fbfeb56 (patch)
tree93690a4ca3e6374369ea8f94ea5a8571fa7f4871 /src/gallium/drivers/nouveau/nvc0/mme
parente48054d0364cfc4c92120ea90b6f526c3527230a (diff)
nvc0: properly distribute macros in source form
Signed-off-by: Ben Skeggs <[email protected]> Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nouveau/nvc0/mme')
-rw-r--r--src/gallium/drivers/nouveau/nvc0/mme/Makefile7
-rw-r--r--src/gallium/drivers/nouveau/nvc0/mme/com9097.mme225
-rw-r--r--src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h125
3 files changed, 357 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/Makefile b/src/gallium/drivers/nouveau/nvc0/mme/Makefile
new file mode 100644
index 00000000000..1c0f5835973
--- /dev/null
+++ b/src/gallium/drivers/nouveau/nvc0/mme/Makefile
@@ -0,0 +1,7 @@
+ENVYAS?=envyas
+TARGETS=com9097.mme.h
+
+all: $(TARGETS)
+
+$(TARGETS): %.mme.h: %.mme
+ $(ENVYAS) -a -w -mmacro $< -o $@
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme
new file mode 100644
index 00000000000..da9975b5eb1
--- /dev/null
+++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme
@@ -0,0 +1,225 @@
+/* extrinsrt r1, r2, src, size, dst: replace bits [dst:dst+size) in r1
+ * with bits [src:src+size) in r2
+ *
+ * bra(n)z annul: no delay slot
+ */
+
+/* Bitfield version of NVC0_3D_VERTEX_ARRAY_PER_INSTANCE[].
+ * Args: size, bitfield
+ */
+.section #mme9097_per_instance_bf
+ parm $r3
+ mov $r2 0x0
+ maddr 0x1620
+loop:
+ mov $r1 (add $r1 -1)
+ send (extrshl $r3 $r2 0x1 0x0)
+ exit branz $r1 #loop
+ mov $r2 (add $r2 0x1)
+
+/* The comments above the macros describe what they *should* be doing,
+ * but we use less functionality for now.
+ */
+
+/*
+ * for (i = 0; i < 8; ++i)
+ * [NVC0_3D_BLEND_ENABLE(i)] = BIT(i of arg);
+ *
+ * [3428] = arg;
+ *
+ * if (arg == 0 || [NVC0_3D_MULTISAMPLE_ENABLE] == 0)
+ * [0d9c] = 0;
+ * else
+ * [0d9c] = [342c];
+ */
+.section #mme9097_blend_enables
+ maddr 0x14d8
+ send (extrinsrt 0x0 $r1 0x0 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x1 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x2 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x3 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x4 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x5 0x1 0x0)
+ exit send (extrinsrt 0x0 $r1 0x6 0x1 0x0)
+ send (extrinsrt 0x0 $r1 0x7 0x1 0x0)
+
+/*
+ * uint64 limit = (parm(0) << 32) | parm(1);
+ * uint64 start = (parm(2) << 32);
+ *
+ * if (limit) {
+ * start |= parm(3);
+ * --limit;
+ * } else {
+ * start |= 1;
+ * }
+ *
+ * [0x1c04 + (arg & 0xf) * 16 + 0] = (start >> 32) & 0xff;
+ * [0x1c04 + (arg & 0xf) * 16 + 4] = start & 0xffffffff;
+ * [0x1f00 + (arg & 0xf) * 8 + 0] = (limit >> 32) & 0xff;
+ * [0x1f00 + (arg & 0xf) * 8 + 4] = limit & 0xffffffff;
+ */
+.section #mme9097_vertex_array_select
+ parm $r2
+ parm $r3
+ parm $r4
+ parm $r5
+ mov $r6 (extrinsrt 0x0 $r1 0x0 0x4 0x2)
+ mov $r7 (extrinsrt 0x0 $r1 0x0 0x4 0x1)
+ maddr $r6 (add $r6 0x1701)
+ send $r4
+ send $r5
+ maddr $r7 (add $r7 0x17c0)
+ exit send $r2
+ send $r3
+
+/*
+ * [GL_POLYGON_MODE_FRONT] = arg;
+ *
+ * if (BIT(31 of [0x3410]))
+ * [1a24] = 0x7353;
+ *
+ * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
+ * [02ec] = 0;
+ * else
+ * if ([GL_POLYGON_MODE_BACK] == GL_LINE || arg == GL_LINE)
+ * [02ec] = BYTE(1 of [0x3410]) << 4;
+ * else
+ * [02ec] = BYTE(0 of [0x3410]) << 4;
+ */
+.section #mme9097_poly_mode_front
+ read $r2 0x36c
+ read $r3 0x830
+ mov $r7 (or $r1 $r2)
+ read $r4 0x840
+ mov $r2 0x1
+ mov $r6 0x60
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0a_pmf
+ maddr 0x36b
+ mov $r6 0x200
+locn_0a_pmf:
+ mov $r7 (or $r3 $r4)
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0f_pmf
+ send $r1
+ mov $r6 0x0
+locn_0f_pmf:
+ exit maddr 0xbb
+ send $r6
+
+/*
+ * [GL_POLYGON_MODE_BACK] = arg;
+ *
+ * if (BIT(31 of [0x3410]))
+ * [1a24] = 0x7353;
+ *
+ * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
+ * [02ec] = 0;
+ * else
+ * if ([GL_POLYGON_MODE_FRONT] == GL_LINE || arg == GL_LINE)
+ * [02ec] = BYTE(1 of [0x3410]) << 4;
+ * else
+ * [02ec] = BYTE(0 of [0x3410]) << 4;
+ */
+/* NOTE: 0x3410 = 0x80002006 by default,
+ * POLYGON_MODE == GL_LINE check replaced by (MODE & 1)
+ * SP_SELECT(i) == (i << 4) | 1 check replaced by SP_SELECT(i) & 1
+ */
+.section #mme9097_poly_mode_back
+ read $r2 0x36b
+ read $r3 0x830
+ mov $r7 (or $r1 $r2)
+ read $r4 0x840
+ mov $r2 0x1
+ mov $r6 0x60
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0a_pmb
+ maddr 0x36c
+ mov $r6 0x200
+locn_0a_pmb:
+ mov $r7 (or $r3 $r4)
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0f_pmb
+ send $r1
+ mov $r6 0x0
+locn_0f_pmb:
+ exit maddr 0xbb
+ send $r6
+
+/*
+ * [NVC0_3D_SP_SELECT(4)] = arg
+ *
+ * if BIT(31 of [0x3410]) == 0
+ * [1a24] = 0x7353;
+ *
+ * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || arg == 0x41)
+ * [02ec] = 0
+ * else
+ * if (any POLYGON MODE == LINE)
+ * [02ec] = BYTE(1 of [3410]) << 4;
+ * else
+ * [02ec] = BYTE(0 of [3410]) << 4; // 02ec valid bits are 0xff1
+ */
+.section #mme9097_gp_select
+ read $r2 0x36b
+ read $r3 0x36c
+ mov $r7 (or $r2 $r3)
+ read $r4 0x830
+ mov $r2 0x1
+ mov $r6 0x60
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0a_gs
+ maddr 0x840
+ mov $r6 0x200
+locn_0a_gs:
+ mov $r7 (or $r1 $r4)
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0f_gs
+ send $r1
+ mov $r6 0x0
+locn_0f_gs:
+ exit maddr 0xbb
+ send $r6
+
+/*
+ * [NVC0_3D_SP_SELECT(3)] = arg
+ *
+ * if BIT(31 of [0x3410]) == 0
+ * [1a24] = 0x7353;
+ *
+ * if (arg == 0x31) {
+ * if (BIT(2 of [0x3430])) {
+ * int i = 15; do { --i; } while(i);
+ * [0x1a2c] = 0;
+ * }
+ * }
+ *
+ * if ([NVC0_3D_SP_SELECT(4)] == 0x41 || arg == 0x31)
+ * [02ec] = 0
+ * else
+ * if ([any POLYGON_MODE] == GL_LINE)
+ * [02ec] = BYTE(1 of [3410]) << 4;
+ * else
+ * [02ec] = BYTE(0 of [3410]) << 4;
+ */
+.section #mme9097_tep_select
+ read $r2 0x36b
+ read $r3 0x36c
+ mov $r7 (or $r2 $r3)
+ read $r4 0x840
+ mov $r2 0x1
+ mov $r6 0x60
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0a_ts
+ maddr 0x830
+ mov $r6 0x200
+locn_0a_ts:
+ mov $r7 (or $r1 $r4)
+ mov $r7 (and $r7 $r2)
+ braz $r7 #locn_0f_ts
+ send $r1
+ mov $r6 0x0
+locn_0f_ts:
+ exit maddr 0xbb
+ send $r6
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h
new file mode 100644
index 00000000000..fd81a2f130e
--- /dev/null
+++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h
@@ -0,0 +1,125 @@
+uint32_t mme9097_per_instance_bf[] = {
+/* 0x0003: loop */
+ 0x00000301,
+ 0x00000211,
+ 0x05880021,
+ 0xffffc911,
+ 0x0040d043,
+ 0xffff8897,
+ 0x00005211,
+};
+
+uint32_t mme9097_blend_enables[] = {
+ 0x05360021,
+ 0x00404042,
+ 0x00424042,
+ 0x00444042,
+ 0x00464042,
+ 0x00484042,
+ 0x004a4042,
+ 0x004c40c2,
+ 0x004e4042,
+};
+
+uint32_t mme9097_vertex_array_select[] = {
+ 0x00000201,
+ 0x00000301,
+ 0x00000401,
+ 0x00000501,
+ 0x11004612,
+ 0x09004712,
+ 0x05c07621,
+ 0x00002041,
+ 0x00002841,
+ 0x05f03f21,
+ 0x000010c1,
+ 0x00001841,
+};
+
+uint32_t mme9097_poly_mode_front[] = {
+ 0x00db0215,
+ 0x020c0315,
+/* 0x000a: locn_0a_pmf */
+ 0x00128f10,
+/* 0x000f: locn_0f_pmf */
+ 0x02100415,
+ 0x00004211,
+ 0x00180611,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00dac021,
+ 0x00800611,
+ 0x00131f10,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00000841,
+ 0x00000611,
+ 0x002ec0a1,
+ 0x00003041,
+};
+
+uint32_t mme9097_poly_mode_back[] = {
+ 0x00dac215,
+ 0x020c0315,
+/* 0x000a: locn_0a_pmb */
+ 0x00128f10,
+/* 0x000f: locn_0f_pmb */
+ 0x02100415,
+ 0x00004211,
+ 0x00180611,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00db0021,
+ 0x00800611,
+ 0x00131f10,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00000841,
+ 0x00000611,
+ 0x002ec0a1,
+ 0x00003041,
+};
+
+uint32_t mme9097_gp_select[] = {
+ 0x00dac215,
+ 0x00db0315,
+/* 0x000a: locn_0a_gs */
+ 0x0012d710,
+/* 0x000f: locn_0f_gs */
+ 0x020c0415,
+ 0x00004211,
+ 0x00180611,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x02100021,
+ 0x00800611,
+ 0x00130f10,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00000841,
+ 0x00000611,
+ 0x002ec0a1,
+ 0x00003041,
+};
+
+uint32_t mme9097_tep_select[] = {
+ 0x00dac215,
+ 0x00db0315,
+/* 0x000a: locn_0a_ts */
+ 0x0012d710,
+/* 0x000f: locn_0f_ts */
+ 0x02100415,
+ 0x00004211,
+ 0x00180611,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x020c0021,
+ 0x00800611,
+ 0x00130f10,
+ 0x0014bf10,
+ 0x0000f807,
+ 0x00000841,
+ 0x00000611,
+ 0x002ec0a1,
+ 0x00003041,
+};