draw: use SoA fetch, not AoS one
[mesa.git] / src / gallium / auxiliary / draw / draw_pipe_cull.c
index fc8293bd1286ca272c58406ddc9d8c5522762462..3e8e45895973a9b3d0e5ab8934648a69358d404b 100644 (file)
@@ -68,15 +68,17 @@ static void cull_point( struct draw_stage *stage,
 {
    const unsigned num_written_culldistances =
       draw_current_shader_num_written_culldistances(stage->draw);
+   const unsigned num_written_clipdistances =
+      draw_current_shader_num_written_clipdistances(stage->draw);
    unsigned i;
 
    debug_assert(num_written_culldistances);
 
    for (i = 0; i < num_written_culldistances; ++i) {
-      unsigned cull_idx = i / 4;
+      unsigned cull_idx = (num_written_clipdistances + i) / 4;
       unsigned out_idx =
-         draw_current_shader_culldistance_output(stage->draw, cull_idx);
-      unsigned idx = i % 4;
+         draw_current_shader_ccdistance_output(stage->draw, cull_idx);
+      unsigned idx = (num_written_clipdistances + i) % 4;
       float cull1 = header->v[0]->data[out_idx][idx];
       boolean vert1_out = cull_distance_is_out(cull1);
       if (vert1_out)
@@ -96,15 +98,17 @@ static void cull_line( struct draw_stage *stage,
 {
    const unsigned num_written_culldistances =
       draw_current_shader_num_written_culldistances(stage->draw);
+   const unsigned num_written_clipdistances =
+      draw_current_shader_num_written_clipdistances(stage->draw);
    unsigned i;
 
    debug_assert(num_written_culldistances);
 
    for (i = 0; i < num_written_culldistances; ++i) {
-      unsigned cull_idx = i / 4;
+      unsigned cull_idx = (num_written_clipdistances + i) / 4;
       unsigned out_idx =
-         draw_current_shader_culldistance_output(stage->draw, cull_idx);
-      unsigned idx = i % 4;
+         draw_current_shader_ccdistance_output(stage->draw, cull_idx);
+      unsigned idx = (num_written_clipdistances + i) % 4;
       float cull1 = header->v[0]->data[out_idx][idx];
       float cull2 = header->v[1]->data[out_idx][idx];
       boolean vert1_out = cull_distance_is_out(cull1);
@@ -125,15 +129,16 @@ static void cull_tri( struct draw_stage *stage,
 {
    const unsigned num_written_culldistances =
       draw_current_shader_num_written_culldistances(stage->draw);
-
+   const unsigned num_written_clipdistances =
+      draw_current_shader_num_written_clipdistances(stage->draw);
    /* Do the distance culling */
    if (num_written_culldistances) {
       unsigned i;
       for (i = 0; i < num_written_culldistances; ++i) {
-         unsigned cull_idx = i / 4;
+         unsigned cull_idx = (num_written_clipdistances + i) / 4;
          unsigned out_idx =
-            draw_current_shader_culldistance_output(stage->draw, cull_idx);
-         unsigned idx = i % 4;
+            draw_current_shader_ccdistance_output(stage->draw, cull_idx);
+         unsigned idx = (num_written_clipdistances + i) % 4;
          float cull1 = header->v[0]->data[out_idx][idx];
          float cull2 = header->v[1]->data[out_idx][idx];
          float cull3 = header->v[2]->data[out_idx][idx];
@@ -251,7 +256,7 @@ static void cull_destroy( struct draw_stage *stage )
 struct draw_stage *draw_cull_stage( struct draw_context *draw )
 {
    struct cull_stage *cull = CALLOC_STRUCT(cull_stage);
-   if (cull == NULL)
+   if (!cull)
       goto fail;
 
    cull->stage.draw = draw;