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