sp_quad_stipple.c revision f908421e64886a7cbc1365fef45412b97b993220
1e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
2e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian/**
3e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian * quad polygon stipple stage
4e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian */
5e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
6e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian#include "sp_context.h"
77925274da323d5a896b557181d4016e0391f026fBrian#include "sp_quad.h"
8ed6f41e2f467f5b9338320a96202c7dfd181422fBrian#include "sp_quad_pipe.h"
9e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian#include "pipe/p_defines.h"
104f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
11e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
12e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
13e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian/**
14e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian * Apply polygon stipple to quads produced by triangle rasterization
15e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian */
16e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brianstatic void
17e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brianstipple_quad(struct quad_stage *qs, struct quad_header *quad)
18e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian{
19bd35c53143560177a045b314c9b4196c229f4a4cBrian   static const uint bit31 = 1 << 31;
20bd35c53143560177a045b314c9b4196c229f4a4cBrian   static const uint bit30 = 1 << 30;
21bd35c53143560177a045b314c9b4196c229f4a4cBrian
22253d2d1676e07ddfc566f3761e409f9cabde1937Brian   if (quad->input.prim == QUAD_PRIM_TRI) {
2380362a90d8ad1fca14d7276169fc962f953d936dBrian      struct softpipe_context *softpipe = qs->softpipe;
24bd35c53143560177a045b314c9b4196c229f4a4cBrian      /* need to invert Y to index into OpenGL's stipple pattern */
25017f862de1f857bca29f09794539aaf411014f13Brian      int y0, y1;
26017f862de1f857bca29f09794539aaf411014f13Brian      uint stipple0, stipple1;
27f908421e64886a7cbc1365fef45412b97b993220Brian Paul      const int col0 = quad->input.x0 % 32;
28f908421e64886a7cbc1365fef45412b97b993220Brian Paul
29017f862de1f857bca29f09794539aaf411014f13Brian      if (softpipe->rasterizer->origin_lower_left) {
3001f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         y0 = softpipe->framebuffer.height - 1 - quad->input.y0;
31017f862de1f857bca29f09794539aaf411014f13Brian         y1 = y0 - 1;
32017f862de1f857bca29f09794539aaf411014f13Brian      }
33017f862de1f857bca29f09794539aaf411014f13Brian      else {
3401f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         y0 = quad->input.y0;
35017f862de1f857bca29f09794539aaf411014f13Brian         y1 = y0 + 1;
36017f862de1f857bca29f09794539aaf411014f13Brian      }
37f908421e64886a7cbc1365fef45412b97b993220Brian Paul
38017f862de1f857bca29f09794539aaf411014f13Brian      stipple0 = softpipe->poly_stipple.stipple[y0 % 32];
39017f862de1f857bca29f09794539aaf411014f13Brian      stipple1 = softpipe->poly_stipple.stipple[y1 % 32];
40bd35c53143560177a045b314c9b4196c229f4a4cBrian
41f908421e64886a7cbc1365fef45412b97b993220Brian Paul      /* turn off quad mask bits that fail the stipple test */
42bd35c53143560177a045b314c9b4196c229f4a4cBrian      if ((stipple0 & (bit31 >> col0)) == 0)
4301f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         quad->inout.mask &= ~MASK_TOP_LEFT;
44bd35c53143560177a045b314c9b4196c229f4a4cBrian
45bd35c53143560177a045b314c9b4196c229f4a4cBrian      if ((stipple0 & (bit30 >> col0)) == 0)
4601f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         quad->inout.mask &= ~MASK_TOP_RIGHT;
47bd35c53143560177a045b314c9b4196c229f4a4cBrian
48bd35c53143560177a045b314c9b4196c229f4a4cBrian      if ((stipple1 & (bit31 >> col0)) == 0)
4901f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         quad->inout.mask &= ~MASK_BOTTOM_LEFT;
50aa0f415c8d5d79d0763fca49d91b1963bf0975f6Keith Whitwell
51bd35c53143560177a045b314c9b4196c229f4a4cBrian      if ((stipple1 & (bit30 >> col0)) == 0)
5201f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol         quad->inout.mask &= ~MASK_BOTTOM_RIGHT;
53f908421e64886a7cbc1365fef45412b97b993220Brian Paul
54f908421e64886a7cbc1365fef45412b97b993220Brian Paul      if (!quad->inout.mask) {
55f908421e64886a7cbc1365fef45412b97b993220Brian Paul         /* all fragments failed stipple test, end of quad pipeline */
56376fb1c23efd437109da88cd2e53fca9d1c77bf2Brian         return;
57f908421e64886a7cbc1365fef45412b97b993220Brian Paul      }
5880362a90d8ad1fca14d7276169fc962f953d936dBrian   }
59376fb1c23efd437109da88cd2e53fca9d1c77bf2Brian
60376fb1c23efd437109da88cd2e53fca9d1c77bf2Brian   qs->next->run(qs->next, quad);
61e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian}
62e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
63e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
64e4eb97318cbce238c5aaaf11af42c33229274859Brianstatic void stipple_begin(struct quad_stage *qs)
65e4eb97318cbce238c5aaaf11af42c33229274859Brian{
667c306afdaad534cc4b474f07b4970bbf3ea46ff9Keith Whitwell   qs->next->begin(qs->next);
67e4eb97318cbce238c5aaaf11af42c33229274859Brian}
68e4eb97318cbce238c5aaaf11af42c33229274859Brian
69e4eb97318cbce238c5aaaf11af42c33229274859Brian
70f93b9dc09a8f9289d7bd5c0f99c935f28016691emichalstatic void stipple_destroy(struct quad_stage *qs)
71f93b9dc09a8f9289d7bd5c0f99c935f28016691emichal{
72f93b9dc09a8f9289d7bd5c0f99c935f28016691emichal   FREE( qs );
736961769cb23c8b9ed2fb56d8ce6e649848412357michal}
746961769cb23c8b9ed2fb56d8ce6e649848412357michal
756961769cb23c8b9ed2fb56d8ce6e649848412357michal
76e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brianstruct quad_stage *
77e89bd0fbc56ecfb96f3aff926c5891c45221dd37Briansp_quad_polygon_stipple_stage( struct softpipe_context *softpipe )
78e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian{
79e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian   struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
80e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
81e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian   stage->softpipe = softpipe;
82e4eb97318cbce238c5aaaf11af42c33229274859Brian   stage->begin = stipple_begin;
83e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian   stage->run = stipple_quad;
846961769cb23c8b9ed2fb56d8ce6e649848412357michal   stage->destroy = stipple_destroy;
85e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian
86e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian   return stage;
87e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian}
88