1 /************************************************************************** 2 * 3 * Copyright 2003 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 #ifndef I915_STATE_INLINES_H 29 #define I915_STATE_INLINES_H 30 31 #include "pipe/p_compiler.h" 32 #include "pipe/p_defines.h" 33 #include "util/u_debug.h" 34 #include "i915_reg.h" 35 36 37 static INLINE unsigned 38 i915_translate_compare_func(unsigned func) 39 { 40 switch (func) { 41 case PIPE_FUNC_NEVER: 42 return COMPAREFUNC_NEVER; 43 case PIPE_FUNC_LESS: 44 return COMPAREFUNC_LESS; 45 case PIPE_FUNC_LEQUAL: 46 return COMPAREFUNC_LEQUAL; 47 case PIPE_FUNC_GREATER: 48 return COMPAREFUNC_GREATER; 49 case PIPE_FUNC_GEQUAL: 50 return COMPAREFUNC_GEQUAL; 51 case PIPE_FUNC_NOTEQUAL: 52 return COMPAREFUNC_NOTEQUAL; 53 case PIPE_FUNC_EQUAL: 54 return COMPAREFUNC_EQUAL; 55 case PIPE_FUNC_ALWAYS: 56 return COMPAREFUNC_ALWAYS; 57 default: 58 return COMPAREFUNC_ALWAYS; 59 } 60 } 61 62 static INLINE unsigned 63 i915_translate_shadow_compare_func(unsigned func) 64 { 65 switch (func) { 66 case PIPE_FUNC_NEVER: 67 return COMPAREFUNC_ALWAYS; 68 case PIPE_FUNC_LESS: 69 return COMPAREFUNC_LEQUAL; 70 case PIPE_FUNC_LEQUAL: 71 return COMPAREFUNC_LESS; 72 case PIPE_FUNC_GREATER: 73 return COMPAREFUNC_GEQUAL; 74 case PIPE_FUNC_GEQUAL: 75 return COMPAREFUNC_GREATER; 76 case PIPE_FUNC_NOTEQUAL: 77 return COMPAREFUNC_EQUAL; 78 case PIPE_FUNC_EQUAL: 79 return COMPAREFUNC_NOTEQUAL; 80 case PIPE_FUNC_ALWAYS: 81 return COMPAREFUNC_NEVER; 82 default: 83 return COMPAREFUNC_NEVER; 84 } 85 } 86 87 static INLINE unsigned 88 i915_translate_stencil_op(unsigned op) 89 { 90 switch (op) { 91 case PIPE_STENCIL_OP_KEEP: 92 return STENCILOP_KEEP; 93 case PIPE_STENCIL_OP_ZERO: 94 return STENCILOP_ZERO; 95 case PIPE_STENCIL_OP_REPLACE: 96 return STENCILOP_REPLACE; 97 case PIPE_STENCIL_OP_INCR: 98 return STENCILOP_INCRSAT; 99 case PIPE_STENCIL_OP_DECR: 100 return STENCILOP_DECRSAT; 101 case PIPE_STENCIL_OP_INCR_WRAP: 102 return STENCILOP_INCR; 103 case PIPE_STENCIL_OP_DECR_WRAP: 104 return STENCILOP_DECR; 105 case PIPE_STENCIL_OP_INVERT: 106 return STENCILOP_INVERT; 107 default: 108 return STENCILOP_ZERO; 109 } 110 } 111 112 static INLINE unsigned 113 i915_translate_blend_factor(unsigned factor) 114 { 115 switch (factor) { 116 case PIPE_BLENDFACTOR_ZERO: 117 return BLENDFACT_ZERO; 118 case PIPE_BLENDFACTOR_SRC_ALPHA: 119 return BLENDFACT_SRC_ALPHA; 120 case PIPE_BLENDFACTOR_ONE: 121 return BLENDFACT_ONE; 122 case PIPE_BLENDFACTOR_SRC_COLOR: 123 return BLENDFACT_SRC_COLR; 124 case PIPE_BLENDFACTOR_INV_SRC_COLOR: 125 return BLENDFACT_INV_SRC_COLR; 126 case PIPE_BLENDFACTOR_DST_COLOR: 127 return BLENDFACT_DST_COLR; 128 case PIPE_BLENDFACTOR_INV_DST_COLOR: 129 return BLENDFACT_INV_DST_COLR; 130 case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 131 return BLENDFACT_INV_SRC_ALPHA; 132 case PIPE_BLENDFACTOR_DST_ALPHA: 133 return BLENDFACT_DST_ALPHA; 134 case PIPE_BLENDFACTOR_INV_DST_ALPHA: 135 return BLENDFACT_INV_DST_ALPHA; 136 case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 137 return BLENDFACT_SRC_ALPHA_SATURATE; 138 case PIPE_BLENDFACTOR_CONST_COLOR: 139 return BLENDFACT_CONST_COLOR; 140 case PIPE_BLENDFACTOR_INV_CONST_COLOR: 141 return BLENDFACT_INV_CONST_COLOR; 142 case PIPE_BLENDFACTOR_CONST_ALPHA: 143 return BLENDFACT_CONST_ALPHA; 144 case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 145 return BLENDFACT_INV_CONST_ALPHA; 146 default: 147 return BLENDFACT_ZERO; 148 } 149 } 150 151 static INLINE unsigned 152 i915_translate_blend_func(unsigned mode) 153 { 154 switch (mode) { 155 case PIPE_BLEND_ADD: 156 return BLENDFUNC_ADD; 157 case PIPE_BLEND_MIN: 158 return BLENDFUNC_MIN; 159 case PIPE_BLEND_MAX: 160 return BLENDFUNC_MAX; 161 case PIPE_BLEND_SUBTRACT: 162 return BLENDFUNC_SUBTRACT; 163 case PIPE_BLEND_REVERSE_SUBTRACT: 164 return BLENDFUNC_REVERSE_SUBTRACT; 165 default: 166 return 0; 167 } 168 } 169 170 171 static INLINE unsigned 172 i915_translate_logic_op(unsigned opcode) 173 { 174 switch (opcode) { 175 case PIPE_LOGICOP_CLEAR: 176 return LOGICOP_CLEAR; 177 case PIPE_LOGICOP_AND: 178 return LOGICOP_AND; 179 case PIPE_LOGICOP_AND_REVERSE: 180 return LOGICOP_AND_RVRSE; 181 case PIPE_LOGICOP_COPY: 182 return LOGICOP_COPY; 183 case PIPE_LOGICOP_COPY_INVERTED: 184 return LOGICOP_COPY_INV; 185 case PIPE_LOGICOP_AND_INVERTED: 186 return LOGICOP_AND_INV; 187 case PIPE_LOGICOP_NOOP: 188 return LOGICOP_NOOP; 189 case PIPE_LOGICOP_XOR: 190 return LOGICOP_XOR; 191 case PIPE_LOGICOP_OR: 192 return LOGICOP_OR; 193 case PIPE_LOGICOP_OR_INVERTED: 194 return LOGICOP_OR_INV; 195 case PIPE_LOGICOP_NOR: 196 return LOGICOP_NOR; 197 case PIPE_LOGICOP_EQUIV: 198 return LOGICOP_EQUIV; 199 case PIPE_LOGICOP_INVERT: 200 return LOGICOP_INV; 201 case PIPE_LOGICOP_OR_REVERSE: 202 return LOGICOP_OR_RVRSE; 203 case PIPE_LOGICOP_NAND: 204 return LOGICOP_NAND; 205 case PIPE_LOGICOP_SET: 206 return LOGICOP_SET; 207 default: 208 return LOGICOP_SET; 209 } 210 } 211 212 213 214 static INLINE boolean i915_validate_vertices( unsigned hw_prim, unsigned nr ) 215 { 216 boolean ok; 217 218 switch (hw_prim) { 219 case PRIM3D_POINTLIST: 220 ok = (nr >= 1); 221 assert(ok); 222 break; 223 case PRIM3D_LINELIST: 224 ok = (nr >= 2) && (nr % 2) == 0; 225 assert(ok); 226 break; 227 case PRIM3D_LINESTRIP: 228 ok = (nr >= 2); 229 assert(ok); 230 break; 231 case PRIM3D_TRILIST: 232 ok = (nr >= 3) && (nr % 3) == 0; 233 assert(ok); 234 break; 235 case PRIM3D_TRISTRIP: 236 ok = (nr >= 3); 237 assert(ok); 238 break; 239 case PRIM3D_TRIFAN: 240 ok = (nr >= 3); 241 assert(ok); 242 break; 243 case PRIM3D_POLY: 244 ok = (nr >= 3); 245 assert(ok); 246 break; 247 default: 248 assert(0); 249 ok = 0; 250 break; 251 } 252 253 return ok; 254 } 255 256 #endif 257