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