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