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 17ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwellstipple_quad(struct quad_stage *qs, struct quad_header *quads[], unsigned nr) 18e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian{ 19bd35c53143560177a045b314c9b4196c229f4a4cBrian static const uint bit31 = 1 << 31; 20bd35c53143560177a045b314c9b4196c229f4a4cBrian static const uint bit30 = 1 << 30; 21ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell unsigned pass = nr; 22bd35c53143560177a045b314c9b4196c229f4a4cBrian 23a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell struct softpipe_context *softpipe = qs->softpipe; 24a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell unsigned q; 25bd35c53143560177a045b314c9b4196c229f4a4cBrian 26a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell pass = 0; 27bd35c53143560177a045b314c9b4196c229f4a4cBrian 28a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell for (q = 0; q < nr; q++) { 29a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell struct quad_header *quad = quads[q]; 30bd35c53143560177a045b314c9b4196c229f4a4cBrian 31a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell const int col0 = quad->input.x0 % 32; 32a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell const int y0 = quad->input.y0; 33a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell const int y1 = y0 + 1; 34a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell const uint stipple0 = softpipe->poly_stipple.stipple[y0 % 32]; 35a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell const uint stipple1 = softpipe->poly_stipple.stipple[y1 % 32]; 36aa0f415c8d5d79d0763fca49d91b1963bf0975f6Keith Whitwell 37a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell /* turn off quad mask bits that fail the stipple test */ 38a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell if ((stipple0 & (bit31 >> col0)) == 0) 39a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell quad->inout.mask &= ~MASK_TOP_LEFT; 40f908421e64886a7cbc1365fef45412b97b993220Brian Paul 41a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell if ((stipple0 & (bit30 >> col0)) == 0) 42a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell quad->inout.mask &= ~MASK_TOP_RIGHT; 43ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 44a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell if ((stipple1 & (bit31 >> col0)) == 0) 45a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell quad->inout.mask &= ~MASK_BOTTOM_LEFT; 46ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 47a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell if ((stipple1 & (bit30 >> col0)) == 0) 48a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell quad->inout.mask &= ~MASK_BOTTOM_RIGHT; 49ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 50a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell if (quad->inout.mask) 51a1dbd7aa159e266592a1e52504680992327ca9e0Keith Whitwell quads[pass++] = quad; 5280362a90d8ad1fca14d7276169fc962f953d936dBrian } 53376fb1c23efd437109da88cd2e53fca9d1c77bf2Brian 54ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell qs->next->run(qs->next, quads, pass); 55e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian} 56e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian 57e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian 58e4eb97318cbce238c5aaaf11af42c33229274859Brianstatic void stipple_begin(struct quad_stage *qs) 59e4eb97318cbce238c5aaaf11af42c33229274859Brian{ 607c306afdaad534cc4b474f07b4970bbf3ea46ff9Keith Whitwell qs->next->begin(qs->next); 61e4eb97318cbce238c5aaaf11af42c33229274859Brian} 62e4eb97318cbce238c5aaaf11af42c33229274859Brian 63e4eb97318cbce238c5aaaf11af42c33229274859Brian 64f93b9dc09a8f9289d7bd5c0f99c935f28016691emichalstatic void stipple_destroy(struct quad_stage *qs) 65f93b9dc09a8f9289d7bd5c0f99c935f28016691emichal{ 66f93b9dc09a8f9289d7bd5c0f99c935f28016691emichal FREE( qs ); 676961769cb23c8b9ed2fb56d8ce6e649848412357michal} 686961769cb23c8b9ed2fb56d8ce6e649848412357michal 696961769cb23c8b9ed2fb56d8ce6e649848412357michal 70e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brianstruct quad_stage * 71e89bd0fbc56ecfb96f3aff926c5891c45221dd37Briansp_quad_polygon_stipple_stage( struct softpipe_context *softpipe ) 72e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian{ 73e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian struct quad_stage *stage = CALLOC_STRUCT(quad_stage); 74e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian 75e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian stage->softpipe = softpipe; 76e4eb97318cbce238c5aaaf11af42c33229274859Brian stage->begin = stipple_begin; 77e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian stage->run = stipple_quad; 786961769cb23c8b9ed2fb56d8ce6e649848412357michal stage->destroy = stipple_destroy; 79e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian 80e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian return stage; 81e89bd0fbc56ecfb96f3aff926c5891c45221dd37Brian} 82