aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZack Rusin <[email protected]>2008-04-11 19:58:22 -0400
committerKeith Whitwell <[email protected]>2008-04-14 11:00:35 +0100
commit808f968f3ad0cb32e86f517753d5715d00e9ec2c (patch)
treea75a2d4f267b8d36e668e8fd02de534ffa6e8ad6
parentaadbb1d7fbbaada6e378cb60194e5861cadf98d1 (diff)
return true if one of the vertices has been clipped
-rw-r--r--src/gallium/auxiliary/draw/draw_private.h12
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_exec.c5
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_llvm.c18
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_sse.c5
4 files changed, 25 insertions, 15 deletions
diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h
index f9aea9f3550..5c710667fc6 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -148,12 +148,12 @@ struct draw_vertex_shader {
/* Run the shader - this interface will get cleaned up in the
* future:
*/
- void (*run)( struct draw_vertex_shader *shader,
- struct draw_context *draw,
- const unsigned *elts,
- unsigned count,
- struct vertex_header *vOut[] );
-
+ boolean (*run)( struct draw_vertex_shader *shader,
+ struct draw_context *draw,
+ const unsigned *elts,
+ unsigned count,
+ struct vertex_header *vOut[] );
+
void (*delete)( struct draw_vertex_shader * );
};
diff --git a/src/gallium/auxiliary/draw/draw_vs_exec.c b/src/gallium/auxiliary/draw/draw_vs_exec.c
index df0051d6939..09e0d0eaabc 100644
--- a/src/gallium/auxiliary/draw/draw_vs_exec.c
+++ b/src/gallium/auxiliary/draw/draw_vs_exec.c
@@ -64,7 +64,7 @@ vs_exec_prepare( struct draw_vertex_shader *shader,
* \param count number of vertices to shade [1..4]
* \param vOut array of pointers to four output vertices
*/
-static void
+static boolean
vs_exec_run( struct draw_vertex_shader *shader,
struct draw_context *draw,
const unsigned *elts,
@@ -73,6 +73,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
{
struct tgsi_exec_machine *machine = &draw->machine;
unsigned int i, j;
+ unsigned int clipped = 0;
ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -120,6 +121,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
if (!draw->rasterizer->bypass_clipping) {
vOut[i + j]->clipmask = compute_clipmask(vOut[i + j]->clip, draw->plane,
draw->nr_planes);
+ clipped += vOut[i + j]->clipmask;
/* divide by w */
w = 1.0f / w;
@@ -168,6 +170,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
#endif
} /* loop over vertices */
}
+ return clipped != 0;
}
diff --git a/src/gallium/auxiliary/draw/draw_vs_llvm.c b/src/gallium/auxiliary/draw/draw_vs_llvm.c
index 7e48428cdda..6db1e65a2da 100644
--- a/src/gallium/auxiliary/draw/draw_vs_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_vs_llvm.c
@@ -67,18 +67,19 @@ vs_llvm_prepare( struct draw_vertex_shader *base,
* \param count number of vertices to shade [1..4]
* \param vOut array of pointers to four output vertices
*/
-static void
+static boolean
vs_llvm_run( struct draw_vertex_shader *base,
- struct draw_context *draw,
- const unsigned *elts,
+ struct draw_context *draw,
+ const unsigned *elts,
unsigned count,
struct vertex_header *vOut[] )
{
- struct draw_llvm_vertex_shader *shader =
+ struct draw_llvm_vertex_shader *shader =
(struct draw_llvm_vertex_shader *)base;
struct tgsi_exec_machine *machine = &draw->machine;
unsigned int j;
+ unsigned int clipped = 0;
ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -125,19 +126,21 @@ vs_llvm_run( struct draw_vertex_shader *base,
w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j];
if (!draw->rasterizer->bypass_clipping) {
- vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes);
+ vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane,
+ draw->nr_planes);
+ clipped += vOut[j]->clipmask;
/* divide by w */
w = 1.0f / w;
x *= w;
y *= w;
- z *= w;
+ z *= w;
}
else {
vOut[j]->clipmask = 0;
}
vOut[j]->edgeflag = 1;
-
+
if (!draw->identity_viewport) {
/* Viewport mapping */
vOut[j]->data[0][0] = x * scale[0] + trans[0];
@@ -162,6 +165,7 @@ vs_llvm_run( struct draw_vertex_shader *base,
vOut[j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j];
}
} /* loop over vertices */
+ return clipped != 0;
}
static void
diff --git a/src/gallium/auxiliary/draw/draw_vs_sse.c b/src/gallium/auxiliary/draw/draw_vs_sse.c
index bfec89254eb..6e8d2021f5c 100644
--- a/src/gallium/auxiliary/draw/draw_vs_sse.c
+++ b/src/gallium/auxiliary/draw/draw_vs_sse.c
@@ -78,7 +78,7 @@ vs_sse_prepare( struct draw_vertex_shader *base,
* \param count number of vertices to shade [1..4]
* \param vOut array of pointers to four output vertices
*/
-static void
+static boolean
vs_sse_run( struct draw_vertex_shader *base,
struct draw_context *draw,
const unsigned *elts,
@@ -88,6 +88,7 @@ vs_sse_run( struct draw_vertex_shader *base,
struct draw_sse_vertex_shader *shader = (struct draw_sse_vertex_shader *)base;
struct tgsi_exec_machine *machine = &draw->machine;
unsigned int i, j;
+ unsigned int clipped = 0;
ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -143,6 +144,7 @@ vs_sse_run( struct draw_vertex_shader *base,
if (!draw->rasterizer->bypass_clipping) {
vOut[i + j]->clipmask = compute_clipmask(vOut[i + j]->clip, draw->plane,
draw->nr_planes);
+ clipped += vOut[i + j]->clipmask;
/* divide by w */
w = 1.0f / w;
@@ -180,6 +182,7 @@ vs_sse_run( struct draw_vertex_shader *base,
}
}
}
+ return clipped != 0;
}