u_prim.h revision 4a49301e
1/************************************************************************** 2 * 3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29#ifndef U_BLIT_H 30#define U_BLIT_H 31 32 33#ifdef __cplusplus 34extern "C" { 35#endif 36 37#include "pipe/p_defines.h" 38 39static INLINE boolean u_validate_pipe_prim( unsigned pipe_prim, unsigned nr ) 40{ 41 boolean ok = TRUE; 42 43 switch (pipe_prim) { 44 case PIPE_PRIM_POINTS: 45 ok = (nr >= 1); 46 break; 47 case PIPE_PRIM_LINES: 48 ok = (nr >= 2); 49 break; 50 case PIPE_PRIM_LINE_STRIP: 51 case PIPE_PRIM_LINE_LOOP: 52 ok = (nr >= 2); 53 break; 54 case PIPE_PRIM_TRIANGLES: 55 ok = (nr >= 3); 56 break; 57 case PIPE_PRIM_TRIANGLE_STRIP: 58 case PIPE_PRIM_TRIANGLE_FAN: 59 case PIPE_PRIM_POLYGON: 60 ok = (nr >= 3); 61 break; 62 case PIPE_PRIM_QUADS: 63 ok = (nr >= 4); 64 break; 65 case PIPE_PRIM_QUAD_STRIP: 66 ok = (nr >= 4); 67 break; 68 default: 69 ok = 0; 70 break; 71 } 72 73 return ok; 74} 75 76 77static INLINE boolean u_trim_pipe_prim( unsigned pipe_prim, unsigned *nr ) 78{ 79 boolean ok = TRUE; 80 81 switch (pipe_prim) { 82 case PIPE_PRIM_POINTS: 83 ok = (*nr >= 1); 84 break; 85 case PIPE_PRIM_LINES: 86 ok = (*nr >= 2); 87 *nr -= (*nr % 2); 88 break; 89 case PIPE_PRIM_LINE_STRIP: 90 case PIPE_PRIM_LINE_LOOP: 91 ok = (*nr >= 2); 92 break; 93 case PIPE_PRIM_TRIANGLES: 94 ok = (*nr >= 3); 95 *nr -= (*nr % 3); 96 break; 97 case PIPE_PRIM_TRIANGLE_STRIP: 98 case PIPE_PRIM_TRIANGLE_FAN: 99 case PIPE_PRIM_POLYGON: 100 ok = (*nr >= 3); 101 break; 102 case PIPE_PRIM_QUADS: 103 ok = (*nr >= 4); 104 *nr -= (*nr % 4); 105 break; 106 case PIPE_PRIM_QUAD_STRIP: 107 ok = (*nr >= 4); 108 *nr -= (*nr % 2); 109 break; 110 default: 111 ok = 0; 112 break; 113 } 114 115 if (!ok) 116 *nr = 0; 117 118 return ok; 119} 120 121 122static INLINE unsigned u_reduced_prim( unsigned pipe_prim ) 123{ 124 switch (pipe_prim) { 125 case PIPE_PRIM_POINTS: 126 return PIPE_PRIM_POINTS; 127 128 case PIPE_PRIM_LINES: 129 case PIPE_PRIM_LINE_STRIP: 130 case PIPE_PRIM_LINE_LOOP: 131 return PIPE_PRIM_LINES; 132 133 default: 134 return PIPE_PRIM_TRIANGLES; 135 } 136} 137 138#endif 139