feedback.c revision 22a96f305898b5d1aa26809c7156a01686eb9bf0
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3559aec47015b741e045d57362f7732b3a04f9450Brian Paul * Version:  7.5
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5559aec47015b741e045d57362f7732b3a04f9450Brian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6559aec47015b741e045d57362f7732b3a04f9450Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26559aec47015b741e045d57362f7732b3a04f9450Brian Paul/**
27559aec47015b741e045d57362f7732b3a04f9450Brian Paul * \file feedback.c
28559aec47015b741e045d57362f7732b3a04f9450Brian Paul * Selection and feedback modes functions.
29559aec47015b741e045d57362f7732b3a04f9450Brian Paul */
30559aec47015b741e045d57362f7732b3a04f9450Brian Paul
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
33c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "feedback.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
392cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
42301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu#if FEATURE_feedback
436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_3D		0x01
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_4D		0x02
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_INDEX	0x04
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_COLOR	0x08
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_TEXTURE	0X10
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
53301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer )
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
5722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   ASSERT_OUTSIDE_BEGIN_END(ctx);
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_FEEDBACK) {
6008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glFeedbackBuffer" );
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (size<0) {
6408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(size<0)" );
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!buffer) {
6808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(buffer==NULL)" );
6922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      ctx->Feedback.BufferSize = 0;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (type) {
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_2D:
75cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 ctx->Feedback._Mask = 0;
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D:
78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 ctx->Feedback._Mask = FB_3D;
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D_COLOR:
8122a96f305898b5d1aa26809c7156a01686eb9bf0Ian Romanick	 ctx->Feedback._Mask = (FB_3D | FB_COLOR);
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D_COLOR_TEXTURE:
8422a96f305898b5d1aa26809c7156a01686eb9bf0Ian Romanick	 ctx->Feedback._Mask = (FB_3D | FB_COLOR | FB_TEXTURE);
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_4D_COLOR_TEXTURE:
8722a96f305898b5d1aa26809c7156a01686eb9bf0Ian Romanick	 ctx->Feedback._Mask = (FB_3D | FB_4D | FB_COLOR | FB_TEXTURE);
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
9008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glFeedbackBuffer" );
91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 return;
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE); /* Always flush */
95cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Feedback.Type = type;
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Feedback.BufferSize = size;
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Feedback.Buffer = buffer;
98cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Feedback.Count = 0;	              /* Becaues of this. */
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
102301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
103fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PassThrough( GLfloat token )
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
105fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
106cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_FEEDBACK) {
109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FLUSH_VERTICES(ctx, 0);
110bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, (GLfloat) (GLint) GL_PASS_THROUGH_TOKEN );
111bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, token );
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
116559aec47015b741e045d57362f7732b3a04f9450Brian Paul/**
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Put a vertex into the feedback buffer.
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
119559aec47015b741e045d57362f7732b3a04f9450Brian Paulvoid
120559aec47015b741e045d57362f7732b3a04f9450Brian Paul_mesa_feedback_vertex(GLcontext *ctx,
121559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat win[4],
122559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat color[4],
123559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      GLfloat index,
124559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat texcoord[4])
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
126bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul   _mesa_feedback_token( ctx, win[0] );
127bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul   _mesa_feedback_token( ctx, win[1] );
128cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_3D) {
129bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, win[2] );
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_4D) {
132bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, win[3] );
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_INDEX) {
135bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, (GLfloat) index );
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
137cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_COLOR) {
138bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, color[0] );
139bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, color[1] );
140bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, color[2] );
141bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, color[3] );
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
143cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_TEXTURE) {
144bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, texcoord[0] );
145bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, texcoord[1] );
146bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, texcoord[2] );
147bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token( ctx, texcoord[3] );
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul
1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Selection */
1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
1556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
1566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Establish a buffer for selection mode values.
1586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param size buffer size.
1606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param buffer buffer.
1616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glSelectBuffer().
1636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list.
1656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we're not in selection mode, flushes the vertices and initialize
1676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the fields in __GLcontextRec::Select with the given buffer.
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
169301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
170fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_SelectBuffer( GLsizei size, GLuint *buffer )
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
173cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
174cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_SELECT) {
17608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glSelectBuffer" );
177cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;			/* KW: added return */
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.Buffer = buffer;
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.BufferSize = size;
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.BufferCount = 0;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = 0.0;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write a value of a record into the selection buffer.
1926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1931eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param ctx GL context.
1941eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param value value.
1956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies there is free space in the buffer to write the value and
1976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * increments the pointer.
1986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
1998bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paulstatic INLINE void
2008bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paulwrite_record(GLcontext *ctx, GLuint value)
2018bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul{
2028bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   if (ctx->Select.BufferCount < ctx->Select.BufferSize) {
2038bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul      ctx->Select.Buffer[ctx->Select.BufferCount] = value;
2048bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   }
2058bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   ctx->Select.BufferCount++;
2068bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul}
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Update the hit flag and the maximum and minimum depth values.
2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param z depth.
2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Sets gl_selection::HitFlag and updates gl_selection::HitMinZ and
2166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * gl_selection::HitMaxZ.
2176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
218559aec47015b741e045d57362f7732b3a04f9450Brian Paulvoid
219559aec47015b741e045d57362f7732b3a04f9450Brian Paul_mesa_update_hitflag(GLcontext *ctx, GLfloat z)
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_TRUE;
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (z < ctx->Select.HitMinZ) {
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.HitMinZ = z;
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (z > ctx->Select.HitMaxZ) {
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.HitMaxZ = z;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record.
2336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
2356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record, i.e., the number of names in the stack, the minimum and
2376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * maximum depth values and the number of names in the name stack at the time
2386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * of the event. Resets the hit flag.
2396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_selection.
2416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
242559aec47015b741e045d57362f7732b3a04f9450Brian Paulstatic void
243559aec47015b741e045d57362f7732b3a04f9450Brian Paulwrite_hit_record(GLcontext *ctx)
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint zmin, zmax, zscale = (~0u);
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* HitMinZ and HitMaxZ are in [0,1].  Multiply these values by */
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* 2^32-1 and round to nearest unsigned integer. */
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   assert( ctx != NULL ); /* this line magically fixes a SunOS 5.x/gcc bug */
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   zmin = (GLuint) ((GLfloat) zscale * ctx->Select.HitMinZ);
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   zmax = (GLuint) ((GLfloat) zscale * ctx->Select.HitMaxZ);
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2558bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   write_record( ctx, ctx->Select.NameStackDepth );
2568bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   write_record( ctx, zmin );
2578bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul   write_record( ctx, zmax );
2583be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   for (i = 0; i < ctx->Select.NameStackDepth; i++) {
2598bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul      write_record( ctx, ctx->Select.NameStack[i] );
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.Hits++;
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = -1.0;
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize the name stack.
2716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in select mode and resets the name stack depth and resets
2736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the hit record data in gl_selection. Marks new render mode in
2746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::NewState.
2756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
276301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InitNames( void )
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
280cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
281cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Record the hit before the HitFlag is wiped out again. */
2833be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode == GL_SELECT) {
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ctx->Select.HitFlag) {
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         write_hit_record( ctx );
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.NameStackDepth = 0;
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = 0.0;
292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->NewState |= _NEW_RENDERMODE;
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Load the top-most name of the name stack.
2986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name.
3006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty.
3026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and replace the top-most name in the stack.
3046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
307301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_LoadName( GLuint name )
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3133be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3163be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->Select.NameStackDepth == 0) {
31708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glLoadName" );
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
320cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
322cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3263be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->Select.NameStackDepth < MAX_NAME_STACK_DEPTH) {
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.NameStack[ctx->Select.NameStackDepth-1] = name;
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.NameStack[MAX_NAME_STACK_DEPTH-1] = name;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Push a name into the name stack.
3376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name.
3396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not full.
3416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and adds the name to the top of the name stack.
3436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
346301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PushName( GLuint name )
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
350cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3523be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
356cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
360cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Select.NameStackDepth >= MAX_NAME_STACK_DEPTH) {
36108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_STACK_OVERFLOW, "glPushName" );
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
364cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      ctx->Select.NameStack[ctx->Select.NameStackDepth++] = name;
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pop a name into the name stack.
3706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty.
3726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and removes top-most name in the name stack.
3746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
377301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY
378fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PopName( void )
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
380fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
381cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
382cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3833be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
386cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Select.NameStackDepth == 0) {
39208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopName" );
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      ctx->Select.NameStackDepth--;
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
4026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Render Mode */
4036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
4066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set rasterization mode.
4076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param mode rasterization mode.
4096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list.
4116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glRenderMode().
4136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes the vertices and do the necessary cleanup according to the previous
4156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * rasterization mode, such as writing the hit record or resent the select
4166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * buffer index when exiting the select mode. Updates
4176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::RenderMode and notifies the driver via the
4186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::RenderMode callback.
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
420301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic GLint GLAPIENTRY
421fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_RenderMode( GLenum mode )
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
423fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint result;
425cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE & VERBOSE_API)
4289d47f3d6b8e8054602a637fad70d4769427df8b4Brian Paul      _mesa_debug(ctx, "glRenderMode %s\n", _mesa_lookup_enum_by_nr(mode));
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
430cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (ctx->RenderMode) {
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDER:
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 result = 0;
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SELECT:
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.HitFlag) {
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    write_hit_record( ctx );
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.BufferCount > ctx->Select.BufferSize) {
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* overflow */
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef DEBUG
443b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul            _mesa_warning(ctx, "Feedback buffer overflow");
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = -1;
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = ctx->Select.Hits;
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.BufferCount = 0;
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.Hits = 0;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.NameStackDepth = 0;
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FEEDBACK:
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Feedback.Count > ctx->Feedback.BufferSize) {
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* overflow */
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = -1;
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = ctx->Feedback.Count;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Feedback.Count = 0;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
46708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (mode) {
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDER:
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SELECT:
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.BufferSize==0) {
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* haven't called glSelectBuffer yet */
47708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	    _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FEEDBACK:
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Feedback.BufferSize==0) {
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* haven't called glFeedbackBuffer yet */
48408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	    _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
48908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->RenderMode = mode;
49422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   if (ctx->Driver.RenderMode)
495b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell      ctx->Driver.RenderMode( ctx, mode );
496b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return result;
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
4996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
5016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
503301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wuvoid
504301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu_mesa_init_feedback_dispatch(struct _glapi_table *disp)
505301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu{
506301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_InitNames(disp, _mesa_InitNames);
507301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_FeedbackBuffer(disp, _mesa_FeedbackBuffer);
508301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_LoadName(disp, _mesa_LoadName);
509301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_PassThrough(disp, _mesa_PassThrough);
510301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_PopName(disp, _mesa_PopName);
511301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_PushName(disp, _mesa_PushName);
512301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_SelectBuffer(disp, _mesa_SelectBuffer);
513301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu   SET_RenderMode(disp, _mesa_RenderMode);
514301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu}
515301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu
516301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu
517301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu#endif /* FEATURE_feedback */
518301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu
519301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu
5206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
5216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Initialization */
5226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
5236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize context feedback data.
5266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
5276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellvoid _mesa_init_feedback( GLcontext * ctx )
5286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
5296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Feedback */
5306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Type = GL_2D;   /* TODO: verify */
5316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Buffer = NULL;
5326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.BufferSize = 0;
5336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Count = 0;
5346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Selection/picking */
5366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.Buffer = NULL;
5376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.BufferSize = 0;
5386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.BufferCount = 0;
5396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.Hits = 0;
5406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.NameStackDepth = 0;
5416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Miscellaneous */
5436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->RenderMode = GL_RENDER;
5446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
5456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
547