1b8e80941Smrg/****************************************************************************
2b8e80941Smrg * Copyright (C) 2015 Intel Corporation.   All Rights Reserved.
3b8e80941Smrg *
4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5b8e80941Smrg * copy of this software and associated documentation files (the "Software"),
6b8e80941Smrg * to deal in the Software without restriction, including without limitation
7b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the
9b8e80941Smrg * Software is furnished to do so, subject to the following conditions:
10b8e80941Smrg *
11b8e80941Smrg * The above copyright notice and this permission notice (including the next
12b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the
13b8e80941Smrg * Software.
14b8e80941Smrg *
15b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21b8e80941Smrg * IN THE SOFTWARE.
22b8e80941Smrg ***************************************************************************/
23b8e80941Smrg
24b8e80941Smrg#ifndef SWR_STATE_H
25b8e80941Smrg#define SWR_STATE_H
26b8e80941Smrg
27b8e80941Smrg#include "pipe/p_defines.h"
28b8e80941Smrg#include "tgsi/tgsi_scan.h"
29b8e80941Smrg#include "tgsi/tgsi_parse.h"
30b8e80941Smrg#include "tgsi/tgsi_dump.h"
31b8e80941Smrg#include "gallivm/lp_bld_init.h"
32b8e80941Smrg#include "gallivm/lp_bld_tgsi.h"
33b8e80941Smrg#include "util/crc32.h"
34b8e80941Smrg#include "api.h"
35b8e80941Smrg#include "swr_tex_sample.h"
36b8e80941Smrg#include "swr_shader.h"
37b8e80941Smrg#include <unordered_map>
38b8e80941Smrg#include <memory>
39b8e80941Smrg
40b8e80941Smrgtemplate <typename T>
41b8e80941Smrgstruct ShaderVariant {
42b8e80941Smrg   struct gallivm_state *gallivm;
43b8e80941Smrg   T shader;
44b8e80941Smrg
45b8e80941Smrg   ShaderVariant(struct gallivm_state *gs, T code) : gallivm(gs), shader(code) {}
46b8e80941Smrg   ~ShaderVariant() { gallivm_destroy(gallivm); }
47b8e80941Smrg};
48b8e80941Smrg
49b8e80941Smrgtypedef ShaderVariant<PFN_VERTEX_FUNC> VariantVS;
50b8e80941Smrgtypedef ShaderVariant<PFN_PIXEL_KERNEL> VariantFS;
51b8e80941Smrgtypedef ShaderVariant<PFN_GS_FUNC> VariantGS;
52b8e80941Smrg
53b8e80941Smrg/* skeleton */
54b8e80941Smrgstruct swr_vertex_shader {
55b8e80941Smrg   struct pipe_shader_state pipe;
56b8e80941Smrg   struct lp_tgsi_info info;
57b8e80941Smrg   std::unordered_map<swr_jit_vs_key, std::unique_ptr<VariantVS>> map;
58b8e80941Smrg   SWR_STREAMOUT_STATE soState;
59b8e80941Smrg   PFN_SO_FUNC soFunc[PIPE_PRIM_MAX] {0};
60b8e80941Smrg};
61b8e80941Smrg
62b8e80941Smrgstruct swr_fragment_shader {
63b8e80941Smrg   struct pipe_shader_state pipe;
64b8e80941Smrg   struct lp_tgsi_info info;
65b8e80941Smrg   uint32_t constantMask;
66b8e80941Smrg   uint32_t flatConstantMask;
67b8e80941Smrg   uint32_t pointSpriteMask;
68b8e80941Smrg   std::unordered_map<swr_jit_fs_key, std::unique_ptr<VariantFS>> map;
69b8e80941Smrg};
70b8e80941Smrg
71b8e80941Smrgstruct swr_geometry_shader {
72b8e80941Smrg   struct pipe_shader_state pipe;
73b8e80941Smrg   struct lp_tgsi_info info;
74b8e80941Smrg   SWR_GS_STATE gsState;
75b8e80941Smrg
76b8e80941Smrg   std::unordered_map<swr_jit_gs_key, std::unique_ptr<VariantGS>> map;
77b8e80941Smrg};
78b8e80941Smrg
79b8e80941Smrg/* Vertex element state */
80b8e80941Smrgstruct swr_vertex_element_state {
81b8e80941Smrg   FETCH_COMPILE_STATE fsState;
82b8e80941Smrg   PFN_FETCH_FUNC fsFunc {NULL};
83b8e80941Smrg   uint32_t stream_pitch[PIPE_MAX_ATTRIBS] {0};
84b8e80941Smrg   uint32_t min_instance_div[PIPE_MAX_ATTRIBS] {0};
85b8e80941Smrg   uint32_t instanced_bufs {0};
86b8e80941Smrg   std::unordered_map<swr_jit_fetch_key, PFN_FETCH_FUNC> map;
87b8e80941Smrg};
88b8e80941Smrg
89b8e80941Smrgstruct swr_blend_state {
90b8e80941Smrg   struct pipe_blend_state pipe;
91b8e80941Smrg   SWR_BLEND_STATE blendState;
92b8e80941Smrg   RENDER_TARGET_BLEND_COMPILE_STATE compileState[PIPE_MAX_COLOR_BUFS];
93b8e80941Smrg};
94b8e80941Smrg
95b8e80941Smrgstruct swr_poly_stipple {
96b8e80941Smrg   struct pipe_poly_stipple pipe;
97b8e80941Smrg   bool prim_is_poly;
98b8e80941Smrg};
99b8e80941Smrg
100b8e80941Smrg/*
101b8e80941Smrg * Derived SWR API DrawState
102b8e80941Smrg * For convenience of making simple changes without re-deriving state.
103b8e80941Smrg */
104b8e80941Smrgstruct swr_derived_state {
105b8e80941Smrg   SWR_RASTSTATE rastState;
106b8e80941Smrg   SWR_VIEWPORT vp;
107b8e80941Smrg   SWR_VIEWPORT_MATRICES vpm;
108b8e80941Smrg};
109b8e80941Smrg
110b8e80941Smrgvoid swr_update_derived(struct pipe_context *,
111b8e80941Smrg                        const struct pipe_draw_info * = nullptr);
112b8e80941Smrg
113b8e80941Smrg/*
114b8e80941Smrg * Conversion functions: Convert mesa state defines to SWR.
115b8e80941Smrg */
116b8e80941Smrg
117b8e80941Smrgstatic INLINE SWR_LOGIC_OP
118b8e80941Smrgswr_convert_logic_op(const UINT op)
119b8e80941Smrg{
120b8e80941Smrg   switch (op) {
121b8e80941Smrg   case PIPE_LOGICOP_CLEAR:
122b8e80941Smrg      return LOGICOP_CLEAR;
123b8e80941Smrg   case PIPE_LOGICOP_NOR:
124b8e80941Smrg      return LOGICOP_NOR;
125b8e80941Smrg   case PIPE_LOGICOP_AND_INVERTED:
126b8e80941Smrg      return LOGICOP_AND_INVERTED;
127b8e80941Smrg   case PIPE_LOGICOP_COPY_INVERTED:
128b8e80941Smrg      return LOGICOP_COPY_INVERTED;
129b8e80941Smrg   case PIPE_LOGICOP_AND_REVERSE:
130b8e80941Smrg      return LOGICOP_AND_REVERSE;
131b8e80941Smrg   case PIPE_LOGICOP_INVERT:
132b8e80941Smrg      return LOGICOP_INVERT;
133b8e80941Smrg   case PIPE_LOGICOP_XOR:
134b8e80941Smrg      return LOGICOP_XOR;
135b8e80941Smrg   case PIPE_LOGICOP_NAND:
136b8e80941Smrg      return LOGICOP_NAND;
137b8e80941Smrg   case PIPE_LOGICOP_AND:
138b8e80941Smrg      return LOGICOP_AND;
139b8e80941Smrg   case PIPE_LOGICOP_EQUIV:
140b8e80941Smrg      return LOGICOP_EQUIV;
141b8e80941Smrg   case PIPE_LOGICOP_NOOP:
142b8e80941Smrg      return LOGICOP_NOOP;
143b8e80941Smrg   case PIPE_LOGICOP_OR_INVERTED:
144b8e80941Smrg      return LOGICOP_OR_INVERTED;
145b8e80941Smrg   case PIPE_LOGICOP_COPY:
146b8e80941Smrg      return LOGICOP_COPY;
147b8e80941Smrg   case PIPE_LOGICOP_OR_REVERSE:
148b8e80941Smrg      return LOGICOP_OR_REVERSE;
149b8e80941Smrg   case PIPE_LOGICOP_OR:
150b8e80941Smrg      return LOGICOP_OR;
151b8e80941Smrg   case PIPE_LOGICOP_SET:
152b8e80941Smrg      return LOGICOP_SET;
153b8e80941Smrg   default:
154b8e80941Smrg      assert(0 && "Unsupported logic op");
155b8e80941Smrg      return LOGICOP_NOOP;
156b8e80941Smrg   }
157b8e80941Smrg}
158b8e80941Smrg
159b8e80941Smrgstatic INLINE SWR_STENCILOP
160b8e80941Smrgswr_convert_stencil_op(const UINT op)
161b8e80941Smrg{
162b8e80941Smrg   switch (op) {
163b8e80941Smrg   case PIPE_STENCIL_OP_KEEP:
164b8e80941Smrg      return STENCILOP_KEEP;
165b8e80941Smrg   case PIPE_STENCIL_OP_ZERO:
166b8e80941Smrg      return STENCILOP_ZERO;
167b8e80941Smrg   case PIPE_STENCIL_OP_REPLACE:
168b8e80941Smrg      return STENCILOP_REPLACE;
169b8e80941Smrg   case PIPE_STENCIL_OP_INCR:
170b8e80941Smrg      return STENCILOP_INCRSAT;
171b8e80941Smrg   case PIPE_STENCIL_OP_DECR:
172b8e80941Smrg      return STENCILOP_DECRSAT;
173b8e80941Smrg   case PIPE_STENCIL_OP_INCR_WRAP:
174b8e80941Smrg      return STENCILOP_INCR;
175b8e80941Smrg   case PIPE_STENCIL_OP_DECR_WRAP:
176b8e80941Smrg      return STENCILOP_DECR;
177b8e80941Smrg   case PIPE_STENCIL_OP_INVERT:
178b8e80941Smrg      return STENCILOP_INVERT;
179b8e80941Smrg   default:
180b8e80941Smrg      assert(0 && "Unsupported stencil op");
181b8e80941Smrg      return STENCILOP_KEEP;
182b8e80941Smrg   }
183b8e80941Smrg}
184b8e80941Smrg
185b8e80941Smrgstatic INLINE SWR_FORMAT
186b8e80941Smrgswr_convert_index_type(const UINT index_size)
187b8e80941Smrg{
188b8e80941Smrg   switch (index_size) {
189b8e80941Smrg   case sizeof(unsigned char):
190b8e80941Smrg      return R8_UINT;
191b8e80941Smrg   case sizeof(unsigned short):
192b8e80941Smrg      return R16_UINT;
193b8e80941Smrg   case sizeof(unsigned int):
194b8e80941Smrg      return R32_UINT;
195b8e80941Smrg   default:
196b8e80941Smrg      assert(0 && "Unsupported index type");
197b8e80941Smrg      return R32_UINT;
198b8e80941Smrg   }
199b8e80941Smrg}
200b8e80941Smrg
201b8e80941Smrg
202b8e80941Smrgstatic INLINE SWR_ZFUNCTION
203b8e80941Smrgswr_convert_depth_func(const UINT pipe_func)
204b8e80941Smrg{
205b8e80941Smrg   switch (pipe_func) {
206b8e80941Smrg   case PIPE_FUNC_NEVER:
207b8e80941Smrg      return ZFUNC_NEVER;
208b8e80941Smrg   case PIPE_FUNC_LESS:
209b8e80941Smrg      return ZFUNC_LT;
210b8e80941Smrg   case PIPE_FUNC_EQUAL:
211b8e80941Smrg      return ZFUNC_EQ;
212b8e80941Smrg   case PIPE_FUNC_LEQUAL:
213b8e80941Smrg      return ZFUNC_LE;
214b8e80941Smrg   case PIPE_FUNC_GREATER:
215b8e80941Smrg      return ZFUNC_GT;
216b8e80941Smrg   case PIPE_FUNC_NOTEQUAL:
217b8e80941Smrg      return ZFUNC_NE;
218b8e80941Smrg   case PIPE_FUNC_GEQUAL:
219b8e80941Smrg      return ZFUNC_GE;
220b8e80941Smrg   case PIPE_FUNC_ALWAYS:
221b8e80941Smrg      return ZFUNC_ALWAYS;
222b8e80941Smrg   default:
223b8e80941Smrg      assert(0 && "Unsupported depth func");
224b8e80941Smrg      return ZFUNC_ALWAYS;
225b8e80941Smrg   }
226b8e80941Smrg}
227b8e80941Smrg
228b8e80941Smrg
229b8e80941Smrgstatic INLINE SWR_CULLMODE
230b8e80941Smrgswr_convert_cull_mode(const UINT cull_face)
231b8e80941Smrg{
232b8e80941Smrg   switch (cull_face) {
233b8e80941Smrg   case PIPE_FACE_NONE:
234b8e80941Smrg      return SWR_CULLMODE_NONE;
235b8e80941Smrg   case PIPE_FACE_FRONT:
236b8e80941Smrg      return SWR_CULLMODE_FRONT;
237b8e80941Smrg   case PIPE_FACE_BACK:
238b8e80941Smrg      return SWR_CULLMODE_BACK;
239b8e80941Smrg   case PIPE_FACE_FRONT_AND_BACK:
240b8e80941Smrg      return SWR_CULLMODE_BOTH;
241b8e80941Smrg   default:
242b8e80941Smrg      assert(0 && "Invalid cull mode");
243b8e80941Smrg      return SWR_CULLMODE_NONE;
244b8e80941Smrg   }
245b8e80941Smrg}
246b8e80941Smrg
247b8e80941Smrgstatic INLINE SWR_BLEND_OP
248b8e80941Smrgswr_convert_blend_func(const UINT blend_func)
249b8e80941Smrg{
250b8e80941Smrg   switch (blend_func) {
251b8e80941Smrg   case PIPE_BLEND_ADD:
252b8e80941Smrg      return BLENDOP_ADD;
253b8e80941Smrg   case PIPE_BLEND_SUBTRACT:
254b8e80941Smrg      return BLENDOP_SUBTRACT;
255b8e80941Smrg   case PIPE_BLEND_REVERSE_SUBTRACT:
256b8e80941Smrg      return BLENDOP_REVSUBTRACT;
257b8e80941Smrg   case PIPE_BLEND_MIN:
258b8e80941Smrg      return BLENDOP_MIN;
259b8e80941Smrg   case PIPE_BLEND_MAX:
260b8e80941Smrg      return BLENDOP_MAX;
261b8e80941Smrg   default:
262b8e80941Smrg      assert(0 && "Invalid blend func");
263b8e80941Smrg      return BLENDOP_ADD;
264b8e80941Smrg   }
265b8e80941Smrg}
266b8e80941Smrg
267b8e80941Smrgstatic INLINE SWR_BLEND_FACTOR
268b8e80941Smrgswr_convert_blend_factor(const UINT blend_factor)
269b8e80941Smrg{
270b8e80941Smrg   switch (blend_factor) {
271b8e80941Smrg   case PIPE_BLENDFACTOR_ONE:
272b8e80941Smrg      return BLENDFACTOR_ONE;
273b8e80941Smrg   case PIPE_BLENDFACTOR_SRC_COLOR:
274b8e80941Smrg      return BLENDFACTOR_SRC_COLOR;
275b8e80941Smrg   case PIPE_BLENDFACTOR_SRC_ALPHA:
276b8e80941Smrg      return BLENDFACTOR_SRC_ALPHA;
277b8e80941Smrg   case PIPE_BLENDFACTOR_DST_ALPHA:
278b8e80941Smrg      return BLENDFACTOR_DST_ALPHA;
279b8e80941Smrg   case PIPE_BLENDFACTOR_DST_COLOR:
280b8e80941Smrg      return BLENDFACTOR_DST_COLOR;
281b8e80941Smrg   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
282b8e80941Smrg      return BLENDFACTOR_SRC_ALPHA_SATURATE;
283b8e80941Smrg   case PIPE_BLENDFACTOR_CONST_COLOR:
284b8e80941Smrg      return BLENDFACTOR_CONST_COLOR;
285b8e80941Smrg   case PIPE_BLENDFACTOR_CONST_ALPHA:
286b8e80941Smrg      return BLENDFACTOR_CONST_ALPHA;
287b8e80941Smrg   case PIPE_BLENDFACTOR_SRC1_COLOR:
288b8e80941Smrg      return BLENDFACTOR_SRC1_COLOR;
289b8e80941Smrg   case PIPE_BLENDFACTOR_SRC1_ALPHA:
290b8e80941Smrg      return BLENDFACTOR_SRC1_ALPHA;
291b8e80941Smrg   case PIPE_BLENDFACTOR_ZERO:
292b8e80941Smrg      return BLENDFACTOR_ZERO;
293b8e80941Smrg   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
294b8e80941Smrg      return BLENDFACTOR_INV_SRC_COLOR;
295b8e80941Smrg   case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
296b8e80941Smrg      return BLENDFACTOR_INV_SRC_ALPHA;
297b8e80941Smrg   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
298b8e80941Smrg      return BLENDFACTOR_INV_DST_ALPHA;
299b8e80941Smrg   case PIPE_BLENDFACTOR_INV_DST_COLOR:
300b8e80941Smrg      return BLENDFACTOR_INV_DST_COLOR;
301b8e80941Smrg   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
302b8e80941Smrg      return BLENDFACTOR_INV_CONST_COLOR;
303b8e80941Smrg   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
304b8e80941Smrg      return BLENDFACTOR_INV_CONST_ALPHA;
305b8e80941Smrg   case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
306b8e80941Smrg      return BLENDFACTOR_INV_SRC1_COLOR;
307b8e80941Smrg   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
308b8e80941Smrg      return BLENDFACTOR_INV_SRC1_ALPHA;
309b8e80941Smrg   default:
310b8e80941Smrg      assert(0 && "Invalid blend factor");
311b8e80941Smrg      return BLENDFACTOR_ONE;
312b8e80941Smrg   }
313b8e80941Smrg}
314b8e80941Smrg
315b8e80941Smrgstatic INLINE enum SWR_SURFACE_TYPE
316b8e80941Smrgswr_convert_target_type(const enum pipe_texture_target target)
317b8e80941Smrg{
318b8e80941Smrg   switch (target) {
319b8e80941Smrg   case PIPE_BUFFER:
320b8e80941Smrg      return SURFACE_BUFFER;
321b8e80941Smrg   case PIPE_TEXTURE_1D:
322b8e80941Smrg   case PIPE_TEXTURE_1D_ARRAY:
323b8e80941Smrg      return SURFACE_1D;
324b8e80941Smrg   case PIPE_TEXTURE_2D:
325b8e80941Smrg   case PIPE_TEXTURE_2D_ARRAY:
326b8e80941Smrg   case PIPE_TEXTURE_RECT:
327b8e80941Smrg      return SURFACE_2D;
328b8e80941Smrg   case PIPE_TEXTURE_3D:
329b8e80941Smrg      return SURFACE_3D;
330b8e80941Smrg   case PIPE_TEXTURE_CUBE:
331b8e80941Smrg   case PIPE_TEXTURE_CUBE_ARRAY:
332b8e80941Smrg      return SURFACE_CUBE;
333b8e80941Smrg   default:
334b8e80941Smrg      assert(0);
335b8e80941Smrg      return SURFACE_NULL;
336b8e80941Smrg   }
337b8e80941Smrg}
338b8e80941Smrg
339b8e80941Smrg/*
340b8e80941Smrg * Convert mesa PIPE_PRIM_X to SWR enum PRIMITIVE_TOPOLOGY
341b8e80941Smrg */
342b8e80941Smrgstatic INLINE enum PRIMITIVE_TOPOLOGY
343b8e80941Smrgswr_convert_prim_topology(const unsigned mode)
344b8e80941Smrg{
345b8e80941Smrg   switch (mode) {
346b8e80941Smrg   case PIPE_PRIM_POINTS:
347b8e80941Smrg      return TOP_POINT_LIST;
348b8e80941Smrg   case PIPE_PRIM_LINES:
349b8e80941Smrg      return TOP_LINE_LIST;
350b8e80941Smrg   case PIPE_PRIM_LINE_LOOP:
351b8e80941Smrg      return TOP_LINE_LOOP;
352b8e80941Smrg   case PIPE_PRIM_LINE_STRIP:
353b8e80941Smrg      return TOP_LINE_STRIP;
354b8e80941Smrg   case PIPE_PRIM_TRIANGLES:
355b8e80941Smrg      return TOP_TRIANGLE_LIST;
356b8e80941Smrg   case PIPE_PRIM_TRIANGLE_STRIP:
357b8e80941Smrg      return TOP_TRIANGLE_STRIP;
358b8e80941Smrg   case PIPE_PRIM_TRIANGLE_FAN:
359b8e80941Smrg      return TOP_TRIANGLE_FAN;
360b8e80941Smrg   case PIPE_PRIM_QUADS:
361b8e80941Smrg      return TOP_QUAD_LIST;
362b8e80941Smrg   case PIPE_PRIM_QUAD_STRIP:
363b8e80941Smrg      return TOP_QUAD_STRIP;
364b8e80941Smrg   case PIPE_PRIM_POLYGON:
365b8e80941Smrg      return TOP_TRIANGLE_FAN; /* XXX TOP_POLYGON; */
366b8e80941Smrg   case PIPE_PRIM_LINES_ADJACENCY:
367b8e80941Smrg      return TOP_LINE_LIST_ADJ;
368b8e80941Smrg   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
369b8e80941Smrg      return TOP_LISTSTRIP_ADJ;
370b8e80941Smrg   case PIPE_PRIM_TRIANGLES_ADJACENCY:
371b8e80941Smrg      return TOP_TRI_LIST_ADJ;
372b8e80941Smrg   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
373b8e80941Smrg      return TOP_TRI_STRIP_ADJ;
374b8e80941Smrg   default:
375b8e80941Smrg      assert(0 && "Unknown topology");
376b8e80941Smrg      return TOP_UNKNOWN;
377b8e80941Smrg   }
378b8e80941Smrg};
379b8e80941Smrg
380b8e80941Smrg/*
381b8e80941Smrg * convert mesa PIPE_POLYGON_MODE_X to SWR enum SWR_FILLMODE
382b8e80941Smrg */
383b8e80941Smrgstatic INLINE enum SWR_FILLMODE
384b8e80941Smrgswr_convert_fill_mode(const unsigned mode)
385b8e80941Smrg{
386b8e80941Smrg   switch(mode) {
387b8e80941Smrg   case PIPE_POLYGON_MODE_FILL:
388b8e80941Smrg      return SWR_FILLMODE_SOLID;
389b8e80941Smrg   case PIPE_POLYGON_MODE_LINE:
390b8e80941Smrg      return SWR_FILLMODE_WIREFRAME;
391b8e80941Smrg   case PIPE_POLYGON_MODE_POINT:
392b8e80941Smrg      return SWR_FILLMODE_POINT;
393b8e80941Smrg   default:
394b8e80941Smrg      assert(0 && "Unknown fillmode");
395b8e80941Smrg      return SWR_FILLMODE_SOLID; // at least do something sensible
396b8e80941Smrg   }
397b8e80941Smrg}
398b8e80941Smrg
399b8e80941Smrg#endif
400