Playing with lines, some trivial/*-unfilled-* demos works, tri-unfilled-smooth
renders wrong (as one big smooth tri, not as small smooth tre inside unfilled
one). Also, clipping is wrong, as show by tri-unfilled-clip.
This is more playground, hwen i'll have 6 or 8 optimized polygon rendering
functions, it will be much less fun to code all those fixups in driver, so,
t_dd_tritmp.h calling .....
From 1848ef2fc2b25a49e555c5f23694b9df590756b2 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <rand...@mail.ru>
Date: Tue, 9 Mar 2010 06:24:16 +0000
Subject: [PATCH 1/4] nouveau/nv04: very primitive line/point render
---
src/mesa/drivers/dri/nouveau/nv04_render.c | 156 ++++++++++++++++++++++++++++
1 files changed, 156 insertions(+), 0 deletions(-)
diff --git a/src/mesa/drivers/dri/nouveau/nv04_render.c b/src/mesa/drivers/dri/nouveau/nv04_render.c
index b5943d9..633fbb1 100644
--- a/src/mesa/drivers/dri/nouveau/nv04_render.c
+++ b/src/mesa/drivers/dri/nouveau/nv04_render.c
@@ -36,6 +36,18 @@
#define NUM_VERTEX_ATTRS 6
+typedef struct
+{
+ float ScreenX;
+ float ScreenY;
+ float ScreenZ;
+ float EyeM;
+ unsigned int Color;
+ unsigned int Specular;
+ float TextureS;
+ float TextureT;
+} NV_HW_Vertex;
+
static void
swtnl_update_viewport(GLcontext *ctx)
{
@@ -148,11 +160,155 @@ swtnl_reset_stipple(GLcontext *ctx)
static void
swtnl_points(GLcontext *ctx, GLuint first, GLuint last)
{
+ int i;
+
+ GLfloat pointSize = ctx->Point.Size * 0.5; // was 0.75
+ GLfloat dx, dy, z, z1;
+ GLfloat x,y;
+ NV_HW_Vertex vertex_four[4];
+
+
+for (i=first;i<=last;i++)
+ {
+
+
+ x = ((float *) _tnl_get_vertex( ctx, i ))[0];
+ y = ((float *) _tnl_get_vertex( ctx, i ))[1];
+
+/* Populate NV_HW_vertex */
+ vertex_four[0].ScreenX = x - pointSize;
+ vertex_four[0].ScreenY = y + pointSize;
+ vertex_four[0].ScreenZ = ((float *) _tnl_get_vertex( ctx, i ))[2];
+ vertex_four[0].EyeM = ((float *) _tnl_get_vertex( ctx, i ))[3];
+ vertex_four[0].Color = ((unsigned int *) _tnl_get_vertex( ctx, i ))[4];
+ vertex_four[0].Specular = ((unsigned int *) _tnl_get_vertex( ctx, i ))[5];
+ vertex_four[0].TextureS = ((float *) _tnl_get_vertex( ctx, i ))[6];
+ vertex_four[0].TextureT = ((float *) _tnl_get_vertex( ctx, i ))[7];
+
+ vertex_four[1].ScreenX = x - pointSize;
+ vertex_four[1].ScreenY = y - pointSize;
+ vertex_four[1].ScreenZ = ((float *) _tnl_get_vertex( ctx, i ))[2];
+ vertex_four[1].EyeM = ((float *) _tnl_get_vertex( ctx, i ))[3];
+ vertex_four[1].Color = ((unsigned int *) _tnl_get_vertex( ctx, i ))[4];
+ vertex_four[1].Specular = ((unsigned int *) _tnl_get_vertex( ctx, i ))[5];
+ vertex_four[1].TextureS = ((float *) _tnl_get_vertex( ctx, i ))[6];
+ vertex_four[1].TextureT = ((float *) _tnl_get_vertex( ctx, i ))[7];
+
+ vertex_four[2].ScreenX = x + pointSize;
+ vertex_four[2].ScreenY = y - pointSize;
+ vertex_four[2].ScreenZ = ((float *) _tnl_get_vertex( ctx, i ))[2];
+ vertex_four[2].EyeM = ((float *) _tnl_get_vertex( ctx, i ))[3];
+ vertex_four[2].Color = ((unsigned int *) _tnl_get_vertex( ctx, i ))[4];
+ vertex_four[2].Specular = ((unsigned int *) _tnl_get_vertex( ctx, i ))[5];
+ vertex_four[2].TextureS = ((float *) _tnl_get_vertex( ctx, i ))[6];
+ vertex_four[2].TextureT = ((float *) _tnl_get_vertex( ctx, i ))[7];
+
+ vertex_four[3].ScreenX = x + pointSize;
+ vertex_four[3].ScreenY = y + pointSize;
+ vertex_four[3].ScreenZ = ((float *) _tnl_get_vertex( ctx, i ))[2];
+ vertex_four[3].EyeM = ((float *) _tnl_get_vertex( ctx, i ))[3];
+ vertex_four[3].Color = ((unsigned int *) _tnl_get_vertex( ctx, i ))[4];
+ vertex_four[3].Specular = ((unsigned int *) _tnl_get_vertex( ctx, i ))[5];
+ vertex_four[3].TextureS = ((float *) _tnl_get_vertex( ctx, i ))[6];
+ vertex_four[3].TextureT = ((float *) _tnl_get_vertex( ctx, i ))[7];
+
+
+ BEGIN_PRIMITIVE(4);
+ OUT_RINGp(chan, &vertex_four[0], vertex_len);
+ OUT_RINGp(chan, &vertex_four[1], vertex_len);
+ OUT_RINGp(chan, &vertex_four[2], vertex_len);
+ OUT_RINGp(chan, &vertex_four[3], vertex_len);
+ END_PRIMITIVE(0x320210);
+ }
}
+
static void
swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
{
+ GLfloat LineWidth;
+ GLfloat dx, dy, z, z1;
+ GLfloat x1,x2,y1,y2;
+ NV_HW_Vertex vertex_four[4];
+
+ GLfloat pos_tmp1[4]; /*x,y,z,w */
+ GLfloat pos_tmp2[4]; /*x,y,z,w */
+
+ LineWidth = ctx->Line.Width * 0.5F;
+
+ /*
+ * Get line extents.
+ */
+
+ x1 = ((float *) _tnl_get_vertex( ctx, v1 ))[0];
+ x2 = ((float *) _tnl_get_vertex( ctx, v2 ))[0];
+ y1 = ((float *) _tnl_get_vertex( ctx, v1 ))[1];
+ y2 = ((float *) _tnl_get_vertex( ctx, v2 ))[1];
+
+/*
+* Determine major and minor axis.
+*/
+
+ dx = x2 - x1; dy = y2 - y1;
+ if (fabs(dx) > fabs(dy))
+ {
+ dy = LineWidth;
+ dx = 0.0F;
+ }
+ else
+ {
+ dx = LineWidth;
+ dy = 0.0F;
+ }
+
+ // z = ((float *) _tnl_get_vertex( ctx, v1 ))[2] + ctx->LineOffset;
+
+
+/* Populate NV_HW_vertex */
+ vertex_four[0].ScreenX = x1 - dx;
+ vertex_four[0].ScreenY = y1 - dy;
+ vertex_four[0].ScreenZ = ((float *) _tnl_get_vertex( ctx, v1 ))[2];
+ vertex_four[0].EyeM = ((float *) _tnl_get_vertex( ctx, v1 ))[3];
+ vertex_four[0].Color = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[4];
+ vertex_four[0].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[5];
+ vertex_four[0].TextureS = ((float *) _tnl_get_vertex( ctx, v1 ))[6];
+ vertex_four[0].TextureT = ((float *) _tnl_get_vertex( ctx, v1 ))[7];
+
+ vertex_four[1].ScreenX = x1 + dx;
+ vertex_four[1].ScreenY = y1 + dy;
+ vertex_four[1].ScreenZ = ((float *) _tnl_get_vertex( ctx, v1 ))[2];
+ vertex_four[1].EyeM = ((float *) _tnl_get_vertex( ctx, v1 ))[3];
+ vertex_four[1].Color = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[4];
+ vertex_four[1].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[5];
+ vertex_four[1].TextureS = ((float *) _tnl_get_vertex( ctx, v1 ))[6];
+ vertex_four[1].TextureT = ((float *) _tnl_get_vertex( ctx, v1 ))[7];
+
+ vertex_four[2].ScreenX = x2 + dx;
+ vertex_four[2].ScreenY = y2 + dy;
+ vertex_four[2].ScreenZ = ((float *) _tnl_get_vertex( ctx, v2 ))[2];
+ vertex_four[2].EyeM = ((float *) _tnl_get_vertex( ctx, v2 ))[3];
+ vertex_four[2].Color = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[4];
+ vertex_four[2].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[5];
+ vertex_four[2].TextureS = ((float *) _tnl_get_vertex( ctx, v2 ))[6];
+ vertex_four[2].TextureT = ((float *) _tnl_get_vertex( ctx, v2 ))[7];
+
+ vertex_four[3].ScreenX = x2 - dx;
+ vertex_four[3].ScreenY = y2 - dy;
+ vertex_four[3].ScreenZ = ((float *) _tnl_get_vertex( ctx, v2 ))[2];
+ vertex_four[3].EyeM = ((float *) _tnl_get_vertex( ctx, v2 ))[3];
+ vertex_four[3].Color = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[4];
+ vertex_four[3].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[5];
+ vertex_four[3].TextureS = ((float *) _tnl_get_vertex( ctx, v2 ))[6];
+ vertex_four[3].TextureT = ((float *) _tnl_get_vertex( ctx, v2 ))[7];
+
+
+ BEGIN_PRIMITIVE(4);
+ OUT_RINGp(chan, &vertex_four[0], vertex_len);
+ OUT_RINGp(chan, &vertex_four[1], vertex_len);
+ OUT_RINGp(chan, &vertex_four[2], vertex_len);
+ OUT_RINGp(chan, &vertex_four[3], vertex_len);
+ END_PRIMITIVE(0x320210);
+
}
static void
--
1.6.5.4
From cd13cef14e83cc08a5688d84402dfacb55d39634 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <rand...@mail.ru>
Date: Tue, 9 Mar 2010 07:00:10 +0000
Subject: [PATCH 2/4] nouveau/nv04: small cleanup + fix for lines, uses nv05's vertex cache feature
---
src/mesa/drivers/dri/nouveau/nv04_render.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/mesa/drivers/dri/nouveau/nv04_render.c b/src/mesa/drivers/dri/nouveau/nv04_render.c
index 633fbb1..b1fce55 100644
--- a/src/mesa/drivers/dri/nouveau/nv04_render.c
+++ b/src/mesa/drivers/dri/nouveau/nv04_render.c
@@ -163,7 +163,6 @@ swtnl_points(GLcontext *ctx, GLuint first, GLuint last)
int i;
GLfloat pointSize = ctx->Point.Size * 0.5; // was 0.75
- GLfloat dx, dy, z, z1;
GLfloat x,y;
NV_HW_Vertex vertex_four[4];
@@ -301,14 +300,13 @@ swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
vertex_four[3].TextureS = ((float *) _tnl_get_vertex( ctx, v2 ))[6];
vertex_four[3].TextureT = ((float *) _tnl_get_vertex( ctx, v2 ))[7];
-
BEGIN_PRIMITIVE(4);
OUT_RINGp(chan, &vertex_four[0], vertex_len);
OUT_RINGp(chan, &vertex_four[1], vertex_len);
OUT_RINGp(chan, &vertex_four[2], vertex_len);
OUT_RINGp(chan, &vertex_four[3], vertex_len);
- END_PRIMITIVE(0x320210);
-
+ END_PRIMITIVE(0x210320);
+ END_PRIMITIVE(0x120230);
}
static void
--
1.6.5.4
From 52d3c69233685b33929cacf4dc6b7ce92aa9dc66 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <rand...@mail.ru>
Date: Tue, 9 Mar 2010 10:25:51 +0000
Subject: [PATCH 3/4] nouveau/nv04: attempt at line AA
---
src/mesa/drivers/dri/nouveau/nv04_render.c | 43 ++++++++++++++++++++++++++--
1 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/src/mesa/drivers/dri/nouveau/nv04_render.c b/src/mesa/drivers/dri/nouveau/nv04_render.c
index b1fce55..00c298a 100644
--- a/src/mesa/drivers/dri/nouveau/nv04_render.c
+++ b/src/mesa/drivers/dri/nouveau/nv04_render.c
@@ -225,6 +225,7 @@ for (i=first;i<=last;i++)
static void
swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
{
+ GLuint wantAA;
GLfloat LineWidth;
GLfloat dx, dy, z, z1;
GLfloat x1,x2,y1,y2;
@@ -234,6 +235,7 @@ swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
GLfloat pos_tmp2[4]; /*x,y,z,w */
LineWidth = ctx->Line.Width * 0.5F;
+ wantAA = ctx->Line.SmoothFlag;
/*
* Get line extents.
@@ -270,8 +272,17 @@ swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
vertex_four[0].EyeM = ((float *) _tnl_get_vertex( ctx, v1 ))[3];
vertex_four[0].Color = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[4];
vertex_four[0].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[5];
+ if (wantAA)
+ {
+ vertex_four[0].TextureS = 0.5F;
+ vertex_four[0].TextureT = 0.0F;
+ }
+ else
+ {
vertex_four[0].TextureS = ((float *) _tnl_get_vertex( ctx, v1 ))[6];
vertex_four[0].TextureT = ((float *) _tnl_get_vertex( ctx, v1 ))[7];
+ }
+
vertex_four[1].ScreenX = x1 + dx;
vertex_four[1].ScreenY = y1 + dy;
@@ -279,27 +290,53 @@ swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
vertex_four[1].EyeM = ((float *) _tnl_get_vertex( ctx, v1 ))[3];
vertex_four[1].Color = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[4];
vertex_four[1].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v1 ))[5];
+ if (wantAA)
+ {
+ vertex_four[1].TextureS = 0.5F;
+ vertex_four[1].TextureT = 1.0F;
+ }
+ else
+ {
vertex_four[1].TextureS = ((float *) _tnl_get_vertex( ctx, v1 ))[6];
vertex_four[1].TextureT = ((float *) _tnl_get_vertex( ctx, v1 ))[7];
-
+ }
+
+
vertex_four[2].ScreenX = x2 + dx;
vertex_four[2].ScreenY = y2 + dy;
vertex_four[2].ScreenZ = ((float *) _tnl_get_vertex( ctx, v2 ))[2];
vertex_four[2].EyeM = ((float *) _tnl_get_vertex( ctx, v2 ))[3];
vertex_four[2].Color = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[4];
vertex_four[2].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[5];
+ if (wantAA)
+ {
+ vertex_four[2].TextureS = 0.5F;
+ vertex_four[2].TextureT = 1.0F;
+ }
+ else
+ {
vertex_four[2].TextureS = ((float *) _tnl_get_vertex( ctx, v2 ))[6];
vertex_four[2].TextureT = ((float *) _tnl_get_vertex( ctx, v2 ))[7];
-
+ }
+
vertex_four[3].ScreenX = x2 - dx;
vertex_four[3].ScreenY = y2 - dy;
vertex_four[3].ScreenZ = ((float *) _tnl_get_vertex( ctx, v2 ))[2];
vertex_four[3].EyeM = ((float *) _tnl_get_vertex( ctx, v2 ))[3];
vertex_four[3].Color = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[4];
vertex_four[3].Specular = ((unsigned int *) _tnl_get_vertex( ctx, v2 ))[5];
+ if (wantAA)
+ {
+ vertex_four[3].TextureS = 0.5F;
+ vertex_four[3].TextureT = 0.0F;
+ }
+ else
+ {
vertex_four[3].TextureS = ((float *) _tnl_get_vertex( ctx, v2 ))[6];
vertex_four[3].TextureT = ((float *) _tnl_get_vertex( ctx, v2 ))[7];
-
+ }
+
+
BEGIN_PRIMITIVE(4);
OUT_RINGp(chan, &vertex_four[0], vertex_len);
OUT_RINGp(chan, &vertex_four[1], vertex_len);
--
1.6.5.4
From 0555c758ab064063c736249ec5779cf5af4f1744 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <rand...@mail.ru>
Date: Tue, 9 Mar 2010 19:49:18 +0000
Subject: [PATCH 4/4] nouveau/nv04: first cut at unfilled tris/quads
---
src/mesa/drivers/dri/nouveau/nv04_render.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/src/mesa/drivers/dri/nouveau/nv04_render.c b/src/mesa/drivers/dri/nouveau/nv04_render.c
index 00c298a..e3f5d16 100644
--- a/src/mesa/drivers/dri/nouveau/nv04_render.c
+++ b/src/mesa/drivers/dri/nouveau/nv04_render.c
@@ -349,16 +349,35 @@ swtnl_line(GLcontext *ctx, GLuint v1, GLuint v2)
static void
swtnl_triangle(GLcontext *ctx, GLuint v1, GLuint v2, GLuint v3)
{
+
+if (ctx->_TriangleCaps == DD_TRI_UNFILLED)
+{
+swtnl_line(ctx, v1, v2);
+swtnl_line(ctx, v2, v3);
+swtnl_line(ctx, v3, v1);
+}
+else
+{
BEGIN_PRIMITIVE(3);
OUT_VERTEX(v1);
OUT_VERTEX(v2);
OUT_VERTEX(v3);
- END_PRIMITIVE(0x210);
+ END_PRIMITIVE(0x210);
+}
}
static void
swtnl_quad(GLcontext *ctx, GLuint v1, GLuint v2, GLuint v3, GLuint v4)
{
+if (ctx->_TriangleCaps == DD_TRI_UNFILLED)
+{
+swtnl_line(ctx, v1, v2);
+swtnl_line(ctx, v2, v3);
+swtnl_line(ctx, v3, v4);
+swtnl_line(ctx, v4, v1);
+}
+else
+{
BEGIN_PRIMITIVE(4);
OUT_VERTEX(v1);
OUT_VERTEX(v2);
@@ -366,6 +385,7 @@ swtnl_quad(GLcontext *ctx, GLuint v1, GLuint v2, GLuint v3, GLuint v4)
OUT_VERTEX(v4);
END_PRIMITIVE(0x320210);
}
+}
/* TnL initialization. */
void
--
1.6.5.4
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev