llvmpipe: use scissor_planes_needed helper function
authorRoland Scheidegger <sroland@vmware.com>
Tue, 2 Feb 2016 23:36:15 +0000 (00:36 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Wed, 3 Feb 2016 00:25:45 +0000 (01:25 +0100)
So it doesn't get out of sync in multiple places.

src/gallium/drivers/llvmpipe/lp_setup_context.h
src/gallium/drivers/llvmpipe/lp_setup_line.c
src/gallium/drivers/llvmpipe/lp_setup_tri.c

index 03bb8ce2b6f3bdc99af8dc639c217f4a5e7345ac..5ab297d7e1a6c7f0776287ec34d42cd32d8cfc46 100644 (file)
@@ -168,6 +168,21 @@ struct lp_setup_context
                      const float (*v2)[4]);
 };
 
+static inline void
+scissor_planes_needed(boolean scis_planes[4], struct u_rect *bbox,
+                      struct u_rect *scissor)
+{
+   /* left */
+   scis_planes[0] = (bbox->x0 < scissor->x0);
+   /* right */
+   scis_planes[1] = (bbox->x1 > scissor->x1);
+   /* top */
+   scis_planes[2] = (bbox->y0 < scissor->y0);
+   /* bottom */
+   scis_planes[3] = (bbox->y1 > scissor->y1);
+}
+
+
 void lp_setup_choose_triangle( struct lp_setup_context *setup );
 void lp_setup_choose_line( struct lp_setup_context *setup );
 void lp_setup_choose_point( struct lp_setup_context *setup );
index f6e1198d03639a5a0900aa3cb231e6d3b8b9c9d4..af4e7900d3c0452c388310466d071874b073effe 100644 (file)
@@ -591,11 +591,9 @@ try_setup_line( struct lp_setup_context *setup,
     */
    if (setup->scissor_test) {
       /* why not just use draw_regions */
-      struct u_rect *scissor = &setup->scissors[viewport_index];
-      nr_planes += (bbox.x0 < scissor->x0);
-      nr_planes += (bbox.x1 > scissor->x1);
-      nr_planes += (bbox.y0 < scissor->y0);
-      nr_planes += (bbox.y1 > scissor->y1);
+      boolean s_planes[4];
+      scissor_planes_needed(s_planes, &bbox, &setup->scissors[viewport_index]);
+      nr_planes += s_planes[0] + s_planes[1] + s_planes[2] + s_planes[3];
    }
 
    line = lp_setup_alloc_triangle(scene,
@@ -723,29 +721,31 @@ try_setup_line( struct lp_setup_context *setup,
       /* why not just use draw_regions */
       struct u_rect *scissor = &setup->scissors[viewport_index];
       struct lp_rast_plane *plane_s = &plane[4];
+      boolean s_planes[4];
+      scissor_planes_needed(s_planes, &bbox, scissor);
 
-      if (bbox.x0 < scissor->x0) {
+      if (s_planes[0]) {
          plane_s->dcdx = -1 << 8;
          plane_s->dcdy = 0;
          plane_s->c = (1-scissor->x0) << 8;
          plane_s->eo = 1 << 8;
          plane_s++;
       }
-      if (bbox.x1 > scissor->x1) {
+      if (s_planes[1]) {
          plane_s->dcdx = 1 << 8;
          plane_s->dcdy = 0;
          plane_s->c = (scissor->x1+1) << 8;
          plane_s->eo = 0 << 8;
          plane_s++;
       }
-      if (bbox.y0 < scissor->y0) {
+      if (s_planes[2]) {
          plane_s->dcdx = 0;
          plane_s->dcdy = 1 << 8;
          plane_s->c = (1-scissor->y0) << 8;
          plane_s->eo = 1 << 8;
          plane_s++;
       }
-      if (bbox.y1 > scissor->y1) {
+      if (s_planes[3]) {
          plane_s->dcdx = 0;
          plane_s->dcdy = -1 << 8;
          plane_s->c = (scissor->y1+1) << 8;
index 7b0088912bdc6afa52c69ad4a96412fe8e38bcbb..cdb3d015dec7b6125f77ab44fb2fb358014e60d1 100644 (file)
@@ -347,11 +347,9 @@ do_triangle_ccw(struct lp_setup_context *setup,
     */
    if (setup->scissor_test) {
       /* why not just use draw_regions */
-      struct u_rect *scissor = &setup->scissors[viewport_index];
-      nr_planes += (bbox.x0 < scissor->x0);
-      nr_planes += (bbox.x1 > scissor->x1);
-      nr_planes += (bbox.y0 < scissor->y0);
-      nr_planes += (bbox.y1 > scissor->y1);
+      boolean s_planes[4];
+      scissor_planes_needed(s_planes, &bbox, &setup->scissors[viewport_index]);
+      nr_planes += s_planes[0] + s_planes[1] + s_planes[2] + s_planes[3];
    }
 
    tri = lp_setup_alloc_triangle(scene,
@@ -685,29 +683,31 @@ do_triangle_ccw(struct lp_setup_context *setup,
       /* why not just use draw_regions */
       struct u_rect *scissor = &setup->scissors[viewport_index];
       struct lp_rast_plane *plane_s = &plane[3];
+      boolean s_planes[4];
+      scissor_planes_needed(s_planes, &bbox, scissor);
 
-      if (bbox.x0 < scissor->x0) {
+      if (s_planes[0]) {
          plane_s->dcdx = -1 << 8;
          plane_s->dcdy = 0;
          plane_s->c = (1-scissor->x0) << 8;
          plane_s->eo = 1 << 8;
          plane_s++;
       }
-      if (bbox.x1 > scissor->x1) {
+      if (s_planes[1]) {
          plane_s->dcdx = 1 << 8;
          plane_s->dcdy = 0;
          plane_s->c = (scissor->x1+1) << 8;
          plane_s->eo = 0 << 8;
          plane_s++;
       }
-      if (bbox.y0 < scissor->y0) {
+      if (s_planes[2]) {
          plane_s->dcdx = 0;
          plane_s->dcdy = 1 << 8;
          plane_s->c = (1-scissor->y0) << 8;
          plane_s->eo = 1 << 8;
          plane_s++;
       }
-      if (bbox.y1 > scissor->y1) {
+      if (s_planes[3]) {
          plane_s->dcdx = 0;
          plane_s->dcdy = -1 << 8;
          plane_s->c = (scissor->y1+1) << 8;