1507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/**************************************************************************
2507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
4507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * All Rights Reserved.
5507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
6507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
7507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * copy of this software and associated documentation files (the
8507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * "Software"), to deal in the Software without restriction, including
9507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * the following conditions:
13507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
14507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * The above copyright notice and this permission notice (including the
15507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * of the Software.
17507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
18507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
26507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell **************************************************************************/
27507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
28507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell /*
29507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell  * Authors:
30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca  *   Keith Whitwell <keithw@vmware.com>
31507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell  */
32507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
33507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#ifndef DRAW_PIPE_H
34507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#define DRAW_PIPE_H
35507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
36507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "pipe/p_compiler.h"
37507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw_private.h"       /* for sizeof(vertex_header) */
3805487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin#include "draw_context.h"
39507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
40507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
41f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell/**
42f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell * Basic info for a point/line/triangle primitive.
43f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell */
44f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwellstruct prim_header {
45f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   float det;                 /**< front/back face determinant */
46f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   ushort flags;
47f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   ushort pad;
48f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   struct vertex_header *v[3];  /**< 1 to 3 vertex pointers */
49f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell};
50f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell
51f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell
52507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
53507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/**
54507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * Base class for all primitive drawing stages.
55507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell */
56507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellstruct draw_stage
57507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
58507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   struct draw_context *draw;   /**< parent context */
59507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
60507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   struct draw_stage *next;     /**< next stage in pipeline */
61eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell   const char *name;            /**< for debugging  */
62507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
63507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   struct vertex_header **tmp;  /**< temp vert storage, such as for clipping */
64507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   unsigned nr_tmps;
65507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
66507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*point)( struct draw_stage *,
67507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell		  struct prim_header * );
68507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
69507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*line)( struct draw_stage *,
70507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell		 struct prim_header * );
71507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
72507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*tri)( struct draw_stage *,
73507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell		struct prim_header * );
74507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
75507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*flush)( struct draw_stage *,
76507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell		  unsigned flags );
77507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
78507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*reset_stipple_counter)( struct draw_stage * );
79507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
80507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   void (*destroy)( struct draw_stage * );
81507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell};
82507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
83507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
84507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_unfilled_stage( struct draw_context *context );
85507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_twoside_stage( struct draw_context *context );
86507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_offset_stage( struct draw_context *context );
87507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_clip_stage( struct draw_context *context );
88507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_flatshade_stage( struct draw_context *context );
89507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_cull_stage( struct draw_context *context );
90507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_stipple_stage( struct draw_context *context );
91507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_wide_line_stage( struct draw_context *context );
92507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_wide_point_stage( struct draw_context *context );
93507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern struct draw_stage *draw_validate_stage( struct draw_context *context );
94507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
95507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellextern void draw_free_temp_verts( struct draw_stage *stage );
96a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellextern boolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr );
97507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
98dcf6f776ce32b89b7ff784bb38030bd29698e005Keith Whitwellextern void draw_reset_vertex_ids( struct draw_context *draw );
99507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
100a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid draw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header);
101a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid draw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header);
102a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid draw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header);
103a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell
104a3ae5dc7dd5c2f8893f86a920247e690e550ebd4Zack Rusinvoid draw_aapoint_prepare_outputs(struct draw_context *context,
105a3ae5dc7dd5c2f8893f86a920247e690e550ebd4Zack Rusin                                  struct draw_stage *stage);
106a3ae5dc7dd5c2f8893f86a920247e690e550ebd4Zack Rusinvoid draw_aaline_prepare_outputs(struct draw_context *context,
107a3ae5dc7dd5c2f8893f86a920247e690e550ebd4Zack Rusin                                 struct draw_stage *stage);
108d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusinvoid draw_unfilled_prepare_outputs(struct draw_context *context,
109d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin                                   struct draw_stage *stage);
110507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
111507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/**
112507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * Get a writeable copy of a vertex.
113507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * \param stage  drawing stage info
114507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * \param vert  the vertex to copy (source)
115507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * \param idx  index into stage's tmp[] array to put the copy (dest)
116507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * \return  pointer to the copied vertex
117507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell */
118a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct vertex_header *
119507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwelldup_vert( struct draw_stage *stage,
120507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell	  const struct vertex_header *vert,
121507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell	  unsigned idx )
122507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
123507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   struct vertex_header *tmp = stage->tmp[idx];
124507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   const uint vsize = sizeof(struct vertex_header)
12505487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin      + draw_num_shader_outputs(stage->draw) * 4 * sizeof(float);
126507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   memcpy(tmp, vert, vsize);
127507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   tmp->vertex_id = UNDEFINED_VERTEX_ID;
128507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   return tmp;
129507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
130507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
131507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#endif
132