12a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**************************************************************************
22a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
42a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * All Rights Reserved.
52a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
62a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
72a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * copy of this software and associated documentation files (the
82a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * "Software"), to deal in the Software without restriction, including
92a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
102a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
112a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * permit persons to whom the Software is furnished to do so, subject to
122a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * the following conditions:
132a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
142a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * The above copyright notice and this permission notice (including the
152a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * next paragraph) shall be included in all copies or substantial portions
162a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * of the Software.
172a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
182a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
192a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
202a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
222a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
232a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
242a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
252a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
262a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul **************************************************************************/
272a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
282a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**
292a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * GL_SELECT and GL_FEEDBACK render modes.
302a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * Basically, we use a private instance of the 'draw' module for doing
312a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * selection/feedback.  It would be nice to use the transform_feedback
322a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * hardware feature, but it's defined as happening pre-clip and we want
332a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * post-clipped primitives.  Also, there's concerns about the efficiency
342a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * of using the hardware for this anyway.
352a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *
362a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * Authors:
372a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul *   Brian Paul
382a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul */
392a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
402a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "main/imports.h"
412a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "main/context.h"
422a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "main/feedback.h"
432a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
442a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "vbo/vbo.h"
452a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
462a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "st_context.h"
472a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "st_draw.h"
482a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "st_cb_feedback.h"
49c323d5b8096cec3251c7a4a4269f0f7570fb274fMarek Olšák#include "st_program.h"
502a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
512a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "pipe/p_context.h"
522a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul#include "pipe/p_defines.h"
532a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
546acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
55507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw/draw_pipe.h"
562a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
572a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
582a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**
592a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * This is actually used for both feedback and selection.
602a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul */
612a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstruct feedback_stage
622a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
632a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct draw_stage stage;   /**< Base class */
64f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx;            /**< Rendering context */
652a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   GLboolean reset_stipple_counter;
662a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul};
672a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
682a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
692a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**********************************************************************
702a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * GL Feedback functions
712a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul **********************************************************************/
722a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
73164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline struct feedback_stage *
742a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulfeedback_stage( struct draw_stage *stage )
752a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
762a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   return (struct feedback_stage *)stage;
772a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
782a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
792a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
802a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
81f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergfeedback_vertex(struct gl_context *ctx, const struct draw_context *draw,
822a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul                const struct vertex_header *v)
832a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
8476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul   const struct st_context *st = st_context(ctx);
852a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   GLfloat win[4];
862a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   const GLfloat *color, *texcoord;
872a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   GLuint slot;
882a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
892a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   win[0] = v->data[0][0];
9015d8e05e1e98a9bfd5a365d0fda222668f24261fBrian Paul   if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP)
9115d8e05e1e98a9bfd5a365d0fda222668f24261fBrian Paul      win[1] = ctx->DrawBuffer->Height - v->data[0][1];
9215d8e05e1e98a9bfd5a365d0fda222668f24261fBrian Paul   else
9315d8e05e1e98a9bfd5a365d0fda222668f24261fBrian Paul      win[1] = v->data[0][1];
942a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   win[2] = v->data[0][2];
952a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   win[3] = 1.0F / v->data[0][3];
962a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
97086734502a614e7778533018846ee66a66df9821Brian Paul   /* XXX
98086734502a614e7778533018846ee66a66df9821Brian Paul    * When we compute vertex layout, save info about position of the
99086734502a614e7778533018846ee66a66df9821Brian Paul    * color and texcoord attribs to use here.
100086734502a614e7778533018846ee66a66df9821Brian Paul    */
101086734502a614e7778533018846ee66a66df9821Brian Paul
10236b252e94724b2512ea941eff2b3a3abeb80be79Paul Berry   slot = st->vertex_result_to_slot[VARYING_SLOT_COL0];
1037049ff53f640aeccc9523a103468183ffda996fdBrian Paul   if (slot != ~0U)
1042a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      color = v->data[slot];
1052a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   else
1062a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
1072a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
10836b252e94724b2512ea941eff2b3a3abeb80be79Paul Berry   slot = st->vertex_result_to_slot[VARYING_SLOT_TEX0];
1097049ff53f640aeccc9523a103468183ffda996fdBrian Paul   if (slot != ~0U)
1102a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      texcoord = v->data[slot];
1112a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   else
1122a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      texcoord = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
1132a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
11424d311c13339978a37885e88a49a990903652339Ian Romanick   _mesa_feedback_vertex(ctx, win, color, texcoord);
1152a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1162a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1172a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1182a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
1192a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulfeedback_tri( struct draw_stage *stage, struct prim_header *prim )
1202a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
1212a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
1222a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct draw_context *draw = stage->draw;
123b2b2febe2ca5a1e7c005e518a24ea85f033449abJoakim Sindholt   _mesa_feedback_token(fs->ctx, (GLfloat) GL_POLYGON_TOKEN);
124b2b2febe2ca5a1e7c005e518a24ea85f033449abJoakim Sindholt   _mesa_feedback_token(fs->ctx, (GLfloat) 3); /* three vertices */
1252a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[0]);
1262a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[1]);
1272a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[2]);
1282a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1292a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1302a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1312a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
1322a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulfeedback_line( struct draw_stage *stage, struct prim_header *prim )
1332a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
1342a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
1352a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct draw_context *draw = stage->draw;
1362a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   if (fs->reset_stipple_counter) {
137b2b2febe2ca5a1e7c005e518a24ea85f033449abJoakim Sindholt      _mesa_feedback_token(fs->ctx, (GLfloat) GL_LINE_RESET_TOKEN);
1382a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      fs->reset_stipple_counter = GL_FALSE;
1392a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   }
1402a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   else {
141b2b2febe2ca5a1e7c005e518a24ea85f033449abJoakim Sindholt      _mesa_feedback_token(fs->ctx, (GLfloat) GL_LINE_TOKEN);
1422a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   }
1432a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[0]);
1442a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[1]);
1452a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1462a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1472a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1482a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
1492a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulfeedback_point( struct draw_stage *stage, struct prim_header *prim )
1502a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
1512a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
1522a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct draw_context *draw = stage->draw;
153b2b2febe2ca5a1e7c005e518a24ea85f033449abJoakim Sindholt   _mesa_feedback_token(fs->ctx, (GLfloat) GL_POINT_TOKEN);
1542a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   feedback_vertex(fs->ctx, draw, prim->v[0]);
1552a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1562a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1572a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1582a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
1590bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paulfeedback_flush( struct draw_stage *stage, unsigned flags )
1602a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
1612a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   /* no-op */
1622a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1632a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1642a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1652a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
1662a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulfeedback_reset_stipple_counter( struct draw_stage *stage )
1672a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
1682a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
1692a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->reset_stipple_counter = GL_TRUE;
1702a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1712a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1722a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1736548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paulstatic void
1746548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paulfeedback_destroy( struct draw_stage *stage )
1756548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paul{
1766548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paul   /* no-op */
1776548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paul}
1786548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paul
1792a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**
1802a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * Create GL feedback drawing stage.
1812a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul */
1822a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic struct draw_stage *
183f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdraw_glfeedback_stage(struct gl_context *ctx, struct draw_context *draw)
1842a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
185f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul   struct feedback_stage *fs = ST_CALLOC_STRUCT(feedback_stage);
1862a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1872a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.draw = draw;
1882a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.next = NULL;
1892a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.point = feedback_point;
1902a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.line = feedback_line;
1912a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.tri = feedback_tri;
1920bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paul   fs->stage.flush = feedback_flush;
1932a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.reset_stipple_counter = feedback_reset_stipple_counter;
1946548e9b0183d2ddfc8b57919d5be0e75ef79182eBrian Paul   fs->stage.destroy = feedback_destroy;
1952a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->ctx = ctx;
1962a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
1972a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   return &fs->stage;
1982a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
1992a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2002a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2012a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2022a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**********************************************************************
2032a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * GL Selection functions
2042a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul **********************************************************************/
2052a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2062a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
2072a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulselect_tri( struct draw_stage *stage, struct prim_header *prim )
2082a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
2092a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
2102a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[0]->data[0][2] );
2112a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[1]->data[0][2] );
2122a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[2]->data[0][2] );
2132a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2142a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2152a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
2162a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulselect_line( struct draw_stage *stage, struct prim_header *prim )
2172a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
2182a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
2192a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[0]->data[0][2] );
2202a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[1]->data[0][2] );
2212a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2222a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2232a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2242a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
2252a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulselect_point( struct draw_stage *stage, struct prim_header *prim )
2262a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
2272a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   struct feedback_stage *fs = feedback_stage(stage);
2282a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   _mesa_update_hitflag( fs->ctx, prim->v[0]->data[0][2] );
2292a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2302a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2312a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2322a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
2330bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paulselect_flush( struct draw_stage *stage, unsigned flags )
2342a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
2352a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   /* no-op */
2362a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2372a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2382a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2392a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
2402a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulselect_reset_stipple_counter( struct draw_stage *stage )
2412a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
2422a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   /* no-op */
2432a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2442a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
245211170c192dfac5c2b39a6f34056255712fdfed6Brian Paulstatic void
246211170c192dfac5c2b39a6f34056255712fdfed6Brian Paulselect_destroy( struct draw_stage *stage )
247211170c192dfac5c2b39a6f34056255712fdfed6Brian Paul{
248211170c192dfac5c2b39a6f34056255712fdfed6Brian Paul   /* no-op */
249211170c192dfac5c2b39a6f34056255712fdfed6Brian Paul}
250211170c192dfac5c2b39a6f34056255712fdfed6Brian Paul
2512a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2522a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul/**
2532a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul * Create GL selection mode drawing stage.
2542a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul */
2552a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic struct draw_stage *
256f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdraw_glselect_stage(struct gl_context *ctx, struct draw_context *draw)
2572a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
258f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul   struct feedback_stage *fs = ST_CALLOC_STRUCT(feedback_stage);
2592a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2602a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.draw = draw;
2612a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.next = NULL;
2622a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.point = select_point;
2632a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.line = select_line;
2642a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.tri = select_tri;
2650bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paul   fs->stage.flush = select_flush;
2662a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->stage.reset_stipple_counter = select_reset_stipple_counter;
267211170c192dfac5c2b39a6f34056255712fdfed6Brian Paul   fs->stage.destroy = select_destroy;
2682a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   fs->ctx = ctx;
2692a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2702a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   return &fs->stage;
2712a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
2722a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2732a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2742a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulstatic void
275f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_RenderMode(struct gl_context *ctx, GLenum newMode )
2762a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
27776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul   struct st_context *st = st_context(ctx);
2782a808219b3f9a50bc5bf3c5290db6a55cd707de7Eric Anholt   struct draw_context *draw = st_get_draw_context(st);
2792a808219b3f9a50bc5bf3c5290db6a55cd707de7Eric Anholt
2802a808219b3f9a50bc5bf3c5290db6a55cd707de7Eric Anholt   if (!st->draw)
2812a808219b3f9a50bc5bf3c5290db6a55cd707de7Eric Anholt      return;
2822a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
2832a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   if (newMode == GL_RENDER) {
2842a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      /* restore normal VBO draw function */
285c885775cae8feabe5431ba7867fac99332f5ee8eBrian Paul      vbo_set_draw_func(ctx, st_draw_vbo);
2862a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   }
2872a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   else if (newMode == GL_SELECT) {
2882a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      if (!st->selection_stage)
2892a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul         st->selection_stage = draw_glselect_stage(ctx, draw);
290de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin      draw_set_rasterize_stage(draw, st->selection_stage);
2912a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      /* Plug in new vbo draw function */
292c885775cae8feabe5431ba7867fac99332f5ee8eBrian Paul      vbo_set_draw_func(ctx, st_feedback_draw_vbo);
2932a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   }
2942a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   else {
29581faead818a0b2fde131df019f5dfb0baef49273Timothy Arceri      struct gl_program *vp = st->ctx->VertexProgram._Current;
296c323d5b8096cec3251c7a4a4269f0f7570fb274fMarek Olšák
2972a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      if (!st->feedback_stage)
2982a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul         st->feedback_stage = draw_glfeedback_stage(ctx, draw);
299de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin      draw_set_rasterize_stage(draw, st->feedback_stage);
3002a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul      /* Plug in new vbo draw function */
301c885775cae8feabe5431ba7867fac99332f5ee8eBrian Paul      vbo_set_draw_func(ctx, st_feedback_draw_vbo);
3020585b4e746f35efbc8577311eab6679951217ac3Brian Paul      /* need to generate/use a vertex program that emits pos/color/tex */
303c323d5b8096cec3251c7a4a4269f0f7570fb274fMarek Olšák      if (vp)
304c323d5b8096cec3251c7a4a4269f0f7570fb274fMarek Olšák         st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(vp));
3052a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   }
3062a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
3072a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
3082a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
3092a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul
3102a40c71fed9461a6ecd17788b17b35655262aec6Brian Paulvoid st_init_feedback_functions(struct dd_function_table *functions)
3112a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul{
3122a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul   functions->RenderMode = st_RenderMode;
3132a40c71fed9461a6ecd17788b17b35655262aec6Brian Paul}
314