u_prim.h revision cdc920a0
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#include "pipe/p_defines.h" 34#include "util/u_debug.h" 35 36#ifdef __cplusplus 37extern "C" { 38#endif 39 40static INLINE boolean u_validate_pipe_prim( unsigned pipe_prim, unsigned nr ) 41{ 42 boolean ok = TRUE; 43 44 switch (pipe_prim) { 45 case PIPE_PRIM_POINTS: 46 ok = (nr >= 1); 47 break; 48 case PIPE_PRIM_LINES: 49 ok = (nr >= 2); 50 break; 51 case PIPE_PRIM_LINE_STRIP: 52 case PIPE_PRIM_LINE_LOOP: 53 ok = (nr >= 2); 54 break; 55 case PIPE_PRIM_TRIANGLES: 56 ok = (nr >= 3); 57 break; 58 case PIPE_PRIM_TRIANGLE_STRIP: 59 case PIPE_PRIM_TRIANGLE_FAN: 60 case PIPE_PRIM_POLYGON: 61 ok = (nr >= 3); 62 break; 63 case PIPE_PRIM_QUADS: 64 ok = (nr >= 4); 65 break; 66 case PIPE_PRIM_QUAD_STRIP: 67 ok = (nr >= 4); 68 break; 69 default: 70 ok = 0; 71 break; 72 } 73 74 return ok; 75} 76 77 78static INLINE boolean u_trim_pipe_prim( unsigned pipe_prim, unsigned *nr ) 79{ 80 boolean ok = TRUE; 81 82 switch (pipe_prim) { 83 case PIPE_PRIM_POINTS: 84 ok = (*nr >= 1); 85 break; 86 case PIPE_PRIM_LINES: 87 ok = (*nr >= 2); 88 *nr -= (*nr % 2); 89 break; 90 case PIPE_PRIM_LINE_STRIP: 91 case PIPE_PRIM_LINE_LOOP: 92 ok = (*nr >= 2); 93 break; 94 case PIPE_PRIM_TRIANGLES: 95 ok = (*nr >= 3); 96 *nr -= (*nr % 3); 97 break; 98 case PIPE_PRIM_TRIANGLE_STRIP: 99 case PIPE_PRIM_TRIANGLE_FAN: 100 case PIPE_PRIM_POLYGON: 101 ok = (*nr >= 3); 102 break; 103 case PIPE_PRIM_QUADS: 104 ok = (*nr >= 4); 105 *nr -= (*nr % 4); 106 break; 107 case PIPE_PRIM_QUAD_STRIP: 108 ok = (*nr >= 4); 109 *nr -= (*nr % 2); 110 break; 111 default: 112 ok = 0; 113 break; 114 } 115 116 if (!ok) 117 *nr = 0; 118 119 return ok; 120} 121 122 123static INLINE unsigned u_reduced_prim( unsigned pipe_prim ) 124{ 125 switch (pipe_prim) { 126 case PIPE_PRIM_POINTS: 127 return PIPE_PRIM_POINTS; 128 129 case PIPE_PRIM_LINES: 130 case PIPE_PRIM_LINE_STRIP: 131 case PIPE_PRIM_LINE_LOOP: 132 return PIPE_PRIM_LINES; 133 134 default: 135 return PIPE_PRIM_TRIANGLES; 136 } 137} 138 139static INLINE unsigned 140u_vertices_per_prim(int primitive) 141{ 142 switch(primitive) { 143 case PIPE_PRIM_POINTS: 144 return 1; 145 case PIPE_PRIM_LINES: 146 case PIPE_PRIM_LINE_LOOP: 147 case PIPE_PRIM_LINE_STRIP: 148 return 2; 149 case PIPE_PRIM_TRIANGLES: 150 case PIPE_PRIM_TRIANGLE_STRIP: 151 case PIPE_PRIM_TRIANGLE_FAN: 152 return 3; 153 case PIPE_PRIM_LINES_ADJACENCY: 154 case PIPE_PRIM_LINE_STRIP_ADJACENCY: 155 return 4; 156 case PIPE_PRIM_TRIANGLES_ADJACENCY: 157 case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY: 158 return 6; 159 160 /* following primitives should never be used 161 * with geometry shaders abd their size is 162 * undefined */ 163 case PIPE_PRIM_POLYGON: 164 case PIPE_PRIM_QUADS: 165 case PIPE_PRIM_QUAD_STRIP: 166 default: 167 debug_printf("Unrecognized geometry shader primitive"); 168 return 3; 169 } 170} 171 172const char *u_prim_name( unsigned pipe_prim ); 173 174#endif 175