gallium: move the test for bypass_vs into the vs_XXX_run() functions
authorBrian <brian.paul@tungstengraphics.com>
Mon, 31 Mar 2008 20:14:30 +0000 (14:14 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 31 Mar 2008 20:14:30 +0000 (14:14 -0600)
Also:
1. Added an identity_viewport flag to skip viewport transformation when it
has no effect.  Might also add an explicit bypass_viewport flag someday.
2. Separate the code for computing clip codes and doing the viewport transform.
Predicate them separately.
Note: even if bypass_vs is set, we still look at the shader to determine the
number of inputs and outputs.

src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_prim.c
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_vs_exec.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/draw/draw_vs_sse.c

index 10bf9f54c10e94606f8bf301cf30cea602a682f8..d0d5f66b376a1d07fb755f8f7575b6b165da34c9 100644 (file)
@@ -228,6 +228,14 @@ void draw_set_viewport_state( struct draw_context *draw,
 {
    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
    draw->viewport = *viewport; /* struct copy */
+   draw->identity_viewport = (viewport->scale[0] == 1.0f &&
+                              viewport->scale[1] == 1.0f &&
+                              viewport->scale[2] == 1.0f &&
+                              viewport->scale[3] == 1.0f &&
+                              viewport->translate[0] == 0.0f &&
+                              viewport->translate[1] == 0.0f &&
+                              viewport->translate[2] == 0.0f &&
+                              viewport->translate[3] == 0.0f);
 }
 
 
index ddcde01d9a2e41cc5298822680bd2ddf0213538b..9779aa8440a85d55379c622b98c7a85e1014dec6 100644 (file)
@@ -593,8 +593,7 @@ draw_arrays(struct draw_context *draw, unsigned prim,
    }
 
    /* drawing done here: */
-   if (!draw->rasterizer->bypass_vs ||
-       !draw_pt_arrays(draw, prim, start, count)) {
+   if (!draw_pt_arrays(draw, prim, start, count)) {
       /* we have to run the whole pipeline */
       draw_prim(draw, prim, start, count);
    }
index 8eb2f515cbcee72d870f2176899c28a73725c521..9a9b25297f1d91cf1d7e9afbf4f3318120f32012 100644 (file)
@@ -232,6 +232,8 @@ struct draw_context
    struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
    struct draw_vertex_shader *vertex_shader;
 
+   boolean identity_viewport;
+
    uint num_vs_outputs;  /**< convenience, from vertex_shader */
 
    /* user-space vertex data, buffers */
index 487d0ea7f4f4c361f42e3a6a568599b4f41c66eb..c8ed17c00a2069bfe799b824c4c120878e8aae0c 100644 (file)
@@ -110,13 +110,20 @@ vs_exec_run( struct draw_vertex_shader *shader,
 
    machine->Consts = (float (*)[4]) draw->user.constants;
    machine->Inputs = ALIGN16_ASSIGN(inputs);
-   machine->Outputs = ALIGN16_ASSIGN(outputs);
+   if (draw->rasterizer->bypass_vs) {
+      /* outputs are just the inputs */
+      machine->Outputs = machine->Inputs;
+   }
+   else {
+      machine->Outputs = ALIGN16_ASSIGN(outputs);
+   }
 
    draw->vertex_fetch.fetch_func( draw, machine, elts, count );
 
-   /* run interpreter */
-   tgsi_exec_machine_run( machine );
-
+   if (!draw->rasterizer->bypass_vs) {
+      /* run interpreter */
+      tgsi_exec_machine_run( machine );
+   }
 
    /* store machine results */
    for (j = 0; j < count; j++) {
@@ -136,8 +143,13 @@ vs_exec_run( struct draw_vertex_shader *shader,
 
       if (!draw->rasterizer->bypass_clipping) {
          vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes);
-         vOut[j]->edgeflag = 1;
+      }
+      else {
+         vOut[j]->clipmask = 0;
+      }
+      vOut[j]->edgeflag = 1;
 
+      if (!draw->identity_viewport) {
          /* divide by w */
          w = 1.0f / w;
          x *= w;
@@ -151,8 +163,6 @@ vs_exec_run( struct draw_vertex_shader *shader,
          vOut[j]->data[0][3] = w;
       }
       else {
-         vOut[j]->clipmask = 0;
-         vOut[j]->edgeflag = 1;
          vOut[j]->data[0][0] = x;
          vOut[j]->data[0][1] = y;
          vOut[j]->data[0][2] = z;
index d29cb18efe493a68321304eee293fd2488b471d2..8aa8a617bbbe48db538a2a04fc993a7a2cec5e38 100644 (file)
@@ -121,31 +121,45 @@ vs_llvm_run( struct draw_vertex_shader *base,
    machine->Consts = (float (*)[4]) draw->user.constants;
 
    machine->Inputs = ALIGN16_ASSIGN(inputs);
-   machine->Outputs = ALIGN16_ASSIGN(outputs);
+   if (draw->rasterizer->bypass_vs) {
+      /* outputs are just the inputs */
+      machine->Outputs = machine->Inputs;
+   }
+   else {
+      machine->Outputs = ALIGN16_ASSIGN(outputs);
+   }
+
 
    draw->vertex_fetch.fetch_func( draw, machine, elts, count );
 
-   /* run shader */
-   gallivm_cpu_vs_exec(shader->llvm_prog,
-                       machine->Inputs,
-                       machine->Outputs,
-                       machine->Consts,
-                       machine->Temps);
+   if (!draw->rasterizer->bypass_vs) {
+      /* run shader */
+      gallivm_cpu_vs_exec(shader->llvm_prog,
+                          machine->Inputs,
+                          machine->Outputs,
+                          machine->Consts,
+                          machine->Temps);
+   }
 
    /* store machine results */
    for (j = 0; j < count; j++) {
       unsigned slot;
       float x, y, z, w;
 
-      if (!draw->rasterizer->bypass_clipping) {
-         x = vOut[j]->clip[0] = machine->Outputs[0].xyzw[0].f[j];
-         y = vOut[j]->clip[1] = machine->Outputs[0].xyzw[1].f[j];
-         z = vOut[j]->clip[2] = machine->Outputs[0].xyzw[2].f[j];
-         w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j];
+      x = vOut[j]->clip[0] = machine->Outputs[0].xyzw[0].f[j];
+      y = vOut[j]->clip[1] = machine->Outputs[0].xyzw[1].f[j];
+      z = vOut[j]->clip[2] = machine->Outputs[0].xyzw[2].f[j];
+      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]->edgeflag = 1;
+      }
+      else {
+         vOut[j]->clipmask = 0;
+      }
+      vOut[j]->edgeflag = 1;
          
+      if (!draw->identity_viewport) {
          /* divide by w */
          w = 1.0f / w;
          x *= w;
@@ -159,8 +173,6 @@ vs_llvm_run( struct draw_vertex_shader *base,
          vOut[j]->data[0][3] = w;
       }
       else {
-         vOut[j]->clipmask = 0;
-         vOut[j]->edgeflag = 1;
          vOut[j]->data[0][0] = x;
          vOut[j]->data[0][1] = y;
          vOut[j]->data[0][2] = z;
index bc910dc2d042508a6cad1ee832d3bb68464fd5a9..701137f90873117a641d27193bf718909e03a5f5 100644 (file)
@@ -126,7 +126,13 @@ vs_sse_run( struct draw_vertex_shader *base,
    /* Consts does not require 16 byte alignment. */
    machine->Consts = (float (*)[4]) draw->user.constants;
    machine->Inputs = ALIGN16_ASSIGN(inputs);
-   machine->Outputs = ALIGN16_ASSIGN(outputs);
+   if (draw->rasterizer->bypass_vs) {
+      /* outputs are just the inputs */
+      machine->Outputs = machine->Inputs;
+   }
+   else {
+      machine->Outputs = ALIGN16_ASSIGN(outputs);
+   }
 
 
    /* Fetch vertices.  This may at some point be integrated into the
@@ -137,13 +143,14 @@ vs_sse_run( struct draw_vertex_shader *base,
    draw->vertex_fetch.fetch_func( draw, machine, elts, count );
 
 
-   /* run compiled shader
-    */   
-   shader->func(
-      machine->Inputs,
-      machine->Outputs,
-      machine->Consts,
-      machine->Temps );
+   if (!draw->rasterizer->bypass_vs) {
+      /* run compiled shader
+       */   
+      shader->func(machine->Inputs,
+                   machine->Outputs,
+                   machine->Consts,
+                   machine->Temps );
+   }
 
 
    /* XXX: Computing the clipmask and emitting results should be done
@@ -161,8 +168,13 @@ vs_sse_run( struct draw_vertex_shader *base,
 
       if (!draw->rasterizer->bypass_clipping) {
          vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes);
-         vOut[j]->edgeflag = 1;
+      }
+      else {
+         vOut[j]->clipmask = 0;
+      }
+      vOut[j]->edgeflag = 1;
 
+      if (!draw->identity_viewport) {
          /* divide by w */
          w = 1.0f / w;
          x *= w;
@@ -176,8 +188,6 @@ vs_sse_run( struct draw_vertex_shader *base,
          vOut[j]->data[0][3] = w;
       }
       else {
-         vOut[j]->clipmask = 0;
-         vOut[j]->edgeflag = 1;
          vOut[j]->data[0][0] = x;
          vOut[j]->data[0][1] = y;
          vOut[j]->data[0][2] = z;