Mesa (nvc0): nvc0: rewrite the 9097 GRAPH macros

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Tue Jan 4 15:19:44 UTC 2011


Module: Mesa
Branch: nvc0
Commit: 997f84ff4efb62779a19f6bd0441cbae1b7bad70
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=997f84ff4efb62779a19f6bd0441cbae1b7bad70

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Tue Jan  4 16:13:42 2011 +0100

nvc0: rewrite the 9097 GRAPH macros

---

 src/gallium/drivers/nvc0/nvc0_graph_macros.h |  365 +++++++++++++------------
 src/gallium/drivers/nvc0/nvc0_vbo.c          |    4 +-
 2 files changed, 192 insertions(+), 177 deletions(-)

diff --git a/src/gallium/drivers/nvc0/nvc0_graph_macros.h b/src/gallium/drivers/nvc0/nvc0_graph_macros.h
index 7db0928..8da963a 100644
--- a/src/gallium/drivers/nvc0/nvc0_graph_macros.h
+++ b/src/gallium/drivers/nvc0/nvc0_graph_macros.h
@@ -2,68 +2,75 @@
 #ifndef __NVC0_PGRAPH_MACROS_H__
 #define __NVC0_PGRAPH_MACROS_H__
 
+/* 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
+ */
+
+/* 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];
+ */
 static const uint32_t nvc0_9097_blend_enables[] =
 {
-   0x05360021, /* maddr [0x1360, increment = 0x4] */
-   0x00404042, /* sendbf $r1 0 0x1 */
-   0x00424042, /* sendbf $r1 1 0x1 */
-   0x00444042, /* sendbf $r1 2 0x1 */
-   0x00464042, /* sendbf $r1 3 0x1 */
-   0x00484042, /* sendbf $r1 4 0x1 */
-   0x004a4042, /* sendbf $r1 5 0x1 */
-   0x004c4042, /* sendbf $r1 6 0x1 */
-   0x004e4042, /* sendbf $r1 7 0x1 */
-   0x01534215, /* read $r2 0x1534 */
-   0x03428021, /* maddr [0x3428] */
-   0x00000841, /* send $r1 */
-   0x00d9c021, /* maddr [0x0d9c] */
-   0x00014807, /* braz $r1 0x5 */
-   0x00000311, /* mov $r3 0 */
-   0x00009027, /* braz annul $r2 0x2 */
-   0x0342c315, /* read $r3 [0x342c] */
-   0x00000011, /* mov $r0 0 */
-   0x000018c1, /* exit send $r3 */
-   0x00000011  /* mov $r0 0, delay slot */
+   0x05360021, /* 0x00: maddr [NVC0_3D_BLEND_ENABLE(0), increment = 4] */
+   0x00404042, /* 0x01: send extrinsrt 0 $r1 0 0x1 0 */
+   0x00424042, /* 0x02: send extrinsrt 0 $r1 0x1 0x1 0 */
+   0x00444042, /* 0x03: send extrinsrt 0 $r1 0x2 0x1 0 */
+   0x00464042, /* 0x04: send extrinsrt 0 $r1 0x3 0x1 0 */
+   0x00484042, /* 0x05: send extrinsrt 0 $r1 0x4 0x1 0 */
+   0x004a4042, /* 0x06: send extrinsrt 0 $r1 0x5 0x1 0 */
+   0x004c40c2, /* 0x07: exit send extrinsrt 0 $r1 0x6 0x1 0 */
+   0x004e4042, /* 0x08: send extrinsrt 0 $r1 0x7 0x1 0 */
 };
 
 /*
- * if (limit == 0) {
- *    LIMIT = 0;
- *    START = 1;
+ * uint64 limit = (parm(0) << 32) | parm(1);
+ * uint64 start = (parm(2) << 32);
+ *
+ * if (limit) {
+ *    start |= parm(3);
+ *    --limit;
  * } else {
- *    LIMIT = limit - 1;
- *    START = start;
+ *    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;
  */
 static const uint32_t nvc0_9097_vertex_array_select[] =
 {
-   0x00000301,
-   0x00000401,
-   0x00000701,
-   0x00131d10,
-   0x0001a807,
-   0x00000601,
-   0x00004211,
-   0x0004a410,
-   0x0000c007,
-   0x00061b10,
-   0x00004611,
-   0x11004512,
-   0x01c06d11,
-   0x00004211,
-   0x6180a822,
-   0x0201c042,
-   0x00003041,
-   0x09004512,
-   0x01f02d11,
-   0x6180a822,
-   0x0200c0c2,
-   0x00002041
+   0x00000201, /* 0x00: parm $r2 */
+   0x00000301, /* 0x01: parm $r3 */
+   0x00000401, /* 0x02: parm $r4 */
+   0x00000501, /* 0x03: parm $r5 */
+   0x11004612, /* 0x04: mov $r6 extrinsrt 0 $r1 0 4 2 */
+   0x09004712, /* 0x05: mov $r7 extrinsrt 0 $r1 0 4 1 */
+   0x05c07621, /* 0x06: maddr $r6 add $6 0x1701 */
+   0x00002041, /* 0x07: send $r4 */
+   0x00002841, /* 0x08: send $r5 */
+   0x05f03f21, /* 0x09: maddr $r7 add $7 0x17c0 */
+   0x000010c1, /* 0x0a: exit send $r2 */
+   0x00001841, /* 0x0b: send $r3 */
 };
 
 static const uint32_t nvc0_9097_color_mask_brdc[] =
 {
-   0x05a00021, /* maddr [0x1a00, increment = 4] */
+   0x05a00021, /* maddr [NVC0_3D_COLOR_MASK(0), increment = 4] */
    0x00000841, /* send $r1 */
    0x00000841, /* send $r1 */
    0x00000841, /* send $r1 */
@@ -74,147 +81,155 @@ static const uint32_t nvc0_9097_color_mask_brdc[] =
    0x00000841, /* send $r1 */
 };
 
+/*
+ * [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;
+ */
 static const uint32_t nvc0_9097_poly_mode_front[] =
 {
-   0x03410615,
-   0x00db0515,
-   0x22018312,
-   0x02100415,
-   0x00dac021,
-   0x00000841,
-   0x06c04211,
-   0x0004aa10,
-   0x00009037,
-   0x22118312,
-   0x020c0515,
-   0x06c04211,
-   0x00048a10,
-   0x00009037,
-   0x22118312,
-   0x007f8612,
-   0x0000f037,
-   0x01a24021,
-   0x1cd4c041,
-   0x00104211,
-   0x0004a210,
-   0x00009037,
-   0x00000311,
-   0x000c4211,
-   0x0004aa10,
-   0x00009037,
-   0x00000311,
-   0x002ec0a1,
-   0x00001841
+   0x00db0215, /* 0x00: read $r2 [NVC0_3D_POLYGON_MODE_BACK] */
+   0x020c0315, /* 0x01: read $r3 [NVC0_3D_SP_SELECT(3)] */
+   0x00128f10, /* 0x02: mov $r7 or $r1 $r2 */
+   0x02100415, /* 0x03: read $r4 [NVC0_3D_SP_SELECT(4)] */
+   0x00004211, /* 0x04: mov $r2 0x1 */
+   0x00180611, /* 0x05: mov $r6 0x60 */
+   0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x07: braz $r7 0xa */
+   0x00dac021, /* 0x08: maddr 0x36b */
+   0x00800611, /* 0x09: mov $r6 0x200 */
+   0x00131f10, /* 0x0a: mov $r7 or $r3 $r4 */
+   0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x0c: braz $r7 0xf */
+   0x00000841, /* 0x0d: send $r1 */
+   0x00000611, /* 0x0e: mov $r6 0 */
+   0x002ec0a1, /* 0x0f: exit maddr [02ec] */
+   0x00003041  /* 0x10: 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
+ */
 static const uint32_t nvc0_9097_poly_mode_back[] =
 {
-   0x03410615,
-   0x00dac515,
-   0x22018312,
-   0x02100415,
-   0x00db0021,
-   0x00000841,
-   0x06c04211,
-   0x0004aa10,
-   0x00009037,
-   0x22118312,
-   0x020c0515,
-   0x06c04211,
-   0x00048a10,
-   0x00009037,
-   0x22118312,
-   0x007f8612,
-   0x0000f037,
-   0x01a24021,
-   0x1cd4c041,
-   0x00104211,
-   0x0004a210,
-   0x00009037,
-   0x00000311,
-   0x000c4211,
-   0x0004aa10,
-   0x00009037,
-   0x00000311,
-   0x002ec0a1,
-   0x00001841
+   0x00dac215, /* 0x00: read $r2 [NVC0_3D_POLYGON_MODE_FRONT] */
+   0x020c0315, /* 0x01: read $r3 [NVC0_3D_SP_SELECT(3)] */
+   0x00128f10, /* 0x02: mov $r7 or $r1 $r2 */
+   0x02100415, /* 0x03: read $r4 [NVC0_3D_SP_SELECT(4)] */
+   0x00004211, /* 0x04: mov $r2 0x1 */
+   0x00180611, /* 0x05: mov $r6 0x60 */
+   0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x07: braz $r7 0xa */
+   0x00dac021, /* 0x08: maddr 0x36b */
+   0x00800611, /* 0x09: mov $r6 0x200 */
+   0x00131f10, /* 0x0a: mov $r7 or $r3 $r4 */
+   0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x0c: braz $r7 0xf */
+   0x00000841, /* 0x0d: send $r1 */
+   0x00000611, /* 0x0e: mov $r6 0 */
+   0x002ec0a1, /* 0x0f: exit maddr [02ec] */
+   0x00003041  /* 0x10: 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
+ */
 static const uint32_t nvc0_9097_gp_select[] = /* 0x0f */
 {
-   0x03410615, /* 0x00: read $r6 [0x3410] */
-   0x00dac515, /* 0x01: read $r5 [NVC0_3D_POLYGON_MODE_FRONT] */
-   0x22018312, /* 0x02: mov $r3 extrinsrt 0 $r6 0 0x8 0x4 */
-   0x00db0415, /* 0x03: read $r4 [NVC0_3D_POLYGON_MODE_BACK] */
-   0x02100021, /* 0x04: maddr [NVC0_3D_SP_SELECT(4)] */
-   0x00000841, /* 0x05: send $r1 */
-   0x06c04211, /* 0x06: mov $r2 GL_POLYGON_MODE_LINE */
-   0x0004aa10, /* 0x07: mov $r2 sub $r5 $r2 */
-   0x00009037, /* 0x08: branz annul $r2 0xa */
-   0x22118312, /* 0x09: mov $r3 extrinsrt 0 $r6 0x8 0x8 0x4 */
-   0x020c0515, /* 0x0a: read $r5 [NVC0_3D_SP_SELECT(3)] */
-   0x06c04211, /* 0x0b: mov $r2 GL_POLYGON_MODE_LINE */
-   0x0004a210, /* 0x0c: mov $r2 sub $r4 $r2 */
-   0x00009037, /* 0x0d: branz annul $r2 0xf */
-   0x22118312, /* 0x0e: mov $r3 extrinsrt 0 $r6 0x8 0x8 0x4 */
-   0x007f8612, /* 0x0f: mov $r6 extrinsrt 0 $r6 0x1f 0x1 0 */
-   0x0000f037, /* 0x10: branz annul $r6 0x13 */
-   0x01a24021, /* 0x11: maddr [0x1a24] */
-   0x1cd4c041, /* 0x12: send 0x7353 */
-   0x00104211, /* 0x13: mov $r2 0x41 */
-   0x00048a10, /* 0x14: mov $r2 sub $r1 $r2 */
-   0x00009037, /* 0x15: branz annul $r2 0x17 */
-   0x00000311, /* 0x16: mov $r3 0 */
-   0x000c4211, /* 0x17: mov $r2 0x31 */
-   0x0004aa10, /* 0x18: mov $r2 sub $r5 $r2 */
-   0x00009037, /* 0x19: branz annul $r2 0x1b */
-   0x00000311, /* 0x1a: mov $r3 0 */
-   0x002ec0a1, /* 0x1b: exit maddr [0x02ec] */
-   0x00001841  /* 0x1c: send $r3 */
+   0x00dac215, /* 0x00: read $r2 0x36b */
+   0x00db0315, /* 0x01: read $r3 0x36c */
+   0x0012d710, /* 0x02: mov $r7 or $r2 $r3 */
+   0x020c0415, /* 0x03: read $r4 0x830 */
+   0x00004211, /* 0x04: mov $r2 0x1 */
+   0x00180611, /* 0x05: mov $r6 0x60 */
+   0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x07: braz $r7 0xa */
+   0x02100021, /* 0x08: maddr 0x840 */
+   0x00800611, /* 0x09: mov $r6 0x200 */
+   0x00130f10, /* 0x0a: mov $r7 or $r1 $r4 */
+   0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x0c: braz $r7 0xf */
+   0x00000841, /* 0x0d: send $r1 */
+   0x00000611, /* 0x0e: mov $r6 0 */
+   0x002ec0a1, /* 0x0f: exit maddr 0xbb */
+   0x00003041, /* 0x10: 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;
+ */
 static const uint32_t nvc0_9097_tep_select[] = /* 0x10 */
 {
-   0x03410615, /* 0x00: read $r6 [0x3410] */
-   0x00dac515, /* 0x01: read $r5 [NVC0_3D_POLYGON_MODE_FRONT] */
-   0x22018312, /* 0x02: mov $r3 extrinsrt 0 $r6 0 0x8 0x4 */
-   0x00db0415, /* 0x03: read $r4 [NVC0_3D_POLYGON_MODE_BACK] */
-   0x020c0021, /* 0x04: maddr [NVC0_3D_SP_SELECT(3), increment = 0] */
-   0x00000841, /* 0x05: send $r1 */
-   0x06c04211, /* 0x06: mov $r2 GL_POLYGON_MODE_LINE */
-   0x0004aa10, /* 0x07: mov $r2 sub $r5 $r2 */
-   0x00009037, /* 0x08: branz annul $r2 0xa */
-   0x22118312, /* 0x09: mov $r3 extrinsrt 0 $r6 0x8 0x8 0x4 */
-   0x02100515, /* 0x0a: read $r5 [NVC0_3D_SP_SELECT(4)] */
-   0x06c04211, /* 0x0b: mov $r2 GL_POLYGON_MODE_LINE */
-   0x0004a210, /* 0x0c: mov $r2 sub $r4 $r2 */
-   0x00009037, /* 0x0d: branz annul $r2 0xf */
-   0x22118312, /* 0x0e: mov $r3 extrinsrt 0 $r6 0x8 0x8 0x4 */
-   0x007f8612, /* 0x0f: mov $r6 extrinsrt 0 $r6 0x1f 0x1 0 */
-   0x0000f037, /* 0x10: branz annul $r6 */
-   0x01a24021, /* 0x11: maddr [0x1a24] */
-   0x1cd4c041, /* 0x12: send 0x7353 */
-   0x00104211, /* 0x13: mov $r2 0x41 */
-   0x0004aa10, /* 0x14: mov $r2 sub $r5 $r2 */
-   0x00009037, /* 0x15: branz annul $r2 0x17 */
-   0x00000311, /* 0x16: mov $r3 0 */
-   0x000c4211, /* 0x17: mov $r2 0x31 */
-   0x00048a10, /* 0x18: mov $r2 sub $r1 $r2 */
-   0x00035037, /* 0x19: branz annul $r2 0x26 */
-   0x00000311, /* 0x1a: mov $r3 0 */
-   0x03430415, /* 0x1b: read $r4 [0x3430] */
-   0x00450512, /* 0x1c: mov $r5 extrinsrt 0 $r4 0x2 0x1 0 */
-   0x00004211, /* 0x1d: mov $r2 0x1 */
-   0x0004aa10, /* 0x1e: mov $r2 sub $r5 $r2 */
-   0x00019037, /* 0x1f: branz annul $r2 0x25 */
-   0x0003c211, /* 0x20: mov $r2 0xf */
-   0x01a2c021, /* 0x21: maddr [0x1a2c] */
-   0xffffd211, /* 0x22: mov $r2 add $r2 -0x1 */
-   0xffff9017, /* 0x23: branz $r2 add $r2 */
-   0x00000041, /* 0x24: send 0 */
-   0x00000011, /* 0x25: nop */
-   0x002ec0a1, /* 0x26: exit maddr [0x02ec] */
-   0x00001841  /* 0x27: send $r3 */
+   0x00dac215, /* 0x00: read $r2 0x36b */
+   0x00db0315, /* 0x01: read $r3 0x36c */
+   0x0012d710, /* 0x02: mov $r7 or $r2 $r3 */
+   0x02100415, /* 0x03: read $r4 0x840 */
+   0x00004211, /* 0x04: mov $r2 0x1 */
+   0x00180611, /* 0x05: mov $r6 0x60 */
+   0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x07: braz $r7 0xa */
+   0x020c0021, /* 0x08: maddr 0x830 */
+   0x00800611, /* 0x09: mov $r6 0x200 */
+   0x00130f10, /* 0x0a: mov $r7 or $r1 $r4 */
+   0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
+   0x0000f807, /* 0x0c: braz $r7 0xf */
+   0x00000841, /* 0x0d: send $r1 */
+   0x00000611, /* 0x0e: mov $r6 0 */
+   0x002ec0a1, /* 0x0f: exit maddr 0xbb */
+   0x00003041, /* 0x10: send $r6 */
 };
 
 #endif
diff --git a/src/gallium/drivers/nvc0/nvc0_vbo.c b/src/gallium/drivers/nvc0/nvc0_vbo.c
index 0a3f1aa..15a4397 100644
--- a/src/gallium/drivers/nvc0/nvc0_vbo.c
+++ b/src/gallium/drivers/nvc0/nvc0_vbo.c
@@ -224,8 +224,8 @@ nvc0_vertex_arrays_validate(struct nvc0_context *nvc0)
       OUT_RING  (chan, (1 << 12) | vb->stride);
       BEGIN_RING_1I(chan, RING_3D(VERTEX_ARRAY_SELECT), 5);
       OUT_RING  (chan, i);
-      OUT_RESRCh(chan, res, size, NOUVEAU_BO_RD);
-      OUT_RESRCl(chan, res, size, NOUVEAU_BO_RD);
+      OUT_RESRCh(chan, res, size - 1, NOUVEAU_BO_RD);
+      OUT_RESRCl(chan, res, size - 1, NOUVEAU_BO_RD);
       OUT_RESRCh(chan, res, offset, NOUVEAU_BO_RD);
       OUT_RESRCl(chan, res, offset, NOUVEAU_BO_RD);
    }




More information about the mesa-commit mailing list