13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**************************************************************************
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved.
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions:
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software.
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /*
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  * Authors:
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org  */
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifndef DRAW_PIPE_H
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define DRAW_PIPE_H
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_compiler.h"
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw_private.h"       /* for sizeof(vertex_header) */
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Basic info for a point/line/triangle primitive.
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct prim_header {
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float det;                 /**< front/back face determinant */
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ushort flags;
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ushort pad;
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct vertex_header *v[3];  /**< 1 to 3 vertex pointers */
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Base class for all primitive drawing stages.
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct draw_stage
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct draw_context *draw;   /**< parent context */
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct draw_stage *next;     /**< next stage in pipeline */
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char *name;            /**< for debugging  */
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct vertex_header **tmp;  /**< temp vert storage, such as for clipping */
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned nr_tmps;
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*point)( struct draw_stage *,
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		  struct prim_header * );
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*line)( struct draw_stage *,
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 struct prim_header * );
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*tri)( struct draw_stage *,
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		struct prim_header * );
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*flush)( struct draw_stage *,
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		  unsigned flags );
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*reset_stipple_counter)( struct draw_stage * );
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void (*destroy)( struct draw_stage * );
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_unfilled_stage( struct draw_context *context );
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_twoside_stage( struct draw_context *context );
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_offset_stage( struct draw_context *context );
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_clip_stage( struct draw_context *context );
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_flatshade_stage( struct draw_context *context );
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_cull_stage( struct draw_context *context );
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_stipple_stage( struct draw_context *context );
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_wide_line_stage( struct draw_context *context );
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_wide_point_stage( struct draw_context *context );
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern struct draw_stage *draw_validate_stage( struct draw_context *context );
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern void draw_free_temp_verts( struct draw_stage *stage );
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern boolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr );
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern void draw_reset_vertex_ids( struct draw_context *draw );
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid draw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header);
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid draw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header);
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid draw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header);
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Get a writeable copy of a vertex.
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param stage  drawing stage info
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param vert  the vertex to copy (source)
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \param idx  index into stage's tmp[] array to put the copy (dest)
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \return  pointer to the copied vertex
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE struct vertex_header *
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgdup_vert( struct draw_stage *stage,
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	  const struct vertex_header *vert,
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	  unsigned idx )
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct vertex_header *tmp = stage->tmp[idx];
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const uint vsize = sizeof(struct vertex_header)
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      + stage->draw->vs.num_vs_outputs * 4 * sizeof(float);
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   memcpy(tmp, vert, vsize);
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   tmp->vertex_id = UNDEFINED_VERTEX_ID;
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return tmp;
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif
127