feedback.c revision 559aec47015b741e045d57362f7732b3a04f9450
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"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_3D		0x01
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_4D		0x02
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_INDEX	0x04
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_COLOR	0x08
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_TEXTURE	0X10
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
52c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer )
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
5622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   ASSERT_OUTSIDE_BEGIN_END(ctx);
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_FEEDBACK) {
5908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glFeedbackBuffer" );
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (size<0) {
6308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(size<0)" );
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!buffer) {
6708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(buffer==NULL)" );
6822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      ctx->Feedback.BufferSize = 0;
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (type) {
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_2D:
74cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 ctx->Feedback._Mask = 0;
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D:
77cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 ctx->Feedback._Mask = FB_3D;
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D_COLOR:
8022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 ctx->Feedback._Mask = (FB_3D |
81b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul				(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX));
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_3D_COLOR_TEXTURE:
8422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 ctx->Feedback._Mask = (FB_3D |
8522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX) |
86cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				FB_TEXTURE);
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_4D_COLOR_TEXTURE:
8922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 ctx->Feedback._Mask = (FB_3D | FB_4D |
90b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul				(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX) |
91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				FB_TEXTURE);
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
9408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glFeedbackBuffer" );
95cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 return;
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
98cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE); /* Always flush */
99cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Feedback.Type = type;
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Feedback.BufferSize = size;
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Feedback.Buffer = buffer;
102cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Feedback.Count = 0;	              /* Becaues of this. */
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
107fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PassThrough( GLfloat token )
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
109fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
110cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_FEEDBACK) {
113cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FLUSH_VERTICES(ctx, 0);
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_PASS_THROUGH_TOKEN );
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, token );
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
120559aec47015b741e045d57362f7732b3a04f9450Brian Paul/**
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Put a vertex into the feedback buffer.
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
123559aec47015b741e045d57362f7732b3a04f9450Brian Paulvoid
124559aec47015b741e045d57362f7732b3a04f9450Brian Paul_mesa_feedback_vertex(GLcontext *ctx,
125559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat win[4],
126559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat color[4],
127559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      GLfloat index,
128559aec47015b741e045d57362f7732b3a04f9450Brian Paul                      const GLfloat texcoord[4])
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1301bf9dfaf5dea61e3d33a69b0a549be54ef6d74dfKeith Whitwell   FEEDBACK_TOKEN( ctx, win[0] );
1311bf9dfaf5dea61e3d33a69b0a549be54ef6d74dfKeith Whitwell   FEEDBACK_TOKEN( ctx, win[1] );
132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_3D) {
1331bf9dfaf5dea61e3d33a69b0a549be54ef6d74dfKeith Whitwell      FEEDBACK_TOKEN( ctx, win[2] );
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_4D) {
1361bf9dfaf5dea61e3d33a69b0a549be54ef6d74dfKeith Whitwell      FEEDBACK_TOKEN( ctx, win[3] );
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
138cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_INDEX) {
1391bf9dfaf5dea61e3d33a69b0a549be54ef6d74dfKeith Whitwell      FEEDBACK_TOKEN( ctx, (GLfloat) index );
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
141cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_COLOR) {
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, color[0] );
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, color[1] );
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, color[2] );
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, color[3] );
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
147cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Feedback._Mask & FB_TEXTURE) {
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, texcoord[0] );
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, texcoord[1] );
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, texcoord[2] );
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      FEEDBACK_TOKEN( ctx, texcoord[3] );
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
155559aec47015b741e045d57362f7732b3a04f9450Brian Paul#endif /* _HAVE_FULL_GL */
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
1596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Selection */
1606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
1616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
1626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Establish a buffer for selection mode values.
1646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param size buffer size.
1666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param buffer buffer.
1676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glSelectBuffer().
1696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list.
1716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we're not in selection mode, flushes the vertices and initialize
1736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the fields in __GLcontextRec::Select with the given buffer.
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
175c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_SelectBuffer( GLsizei size, GLuint *buffer )
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->RenderMode==GL_SELECT) {
18208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glSelectBuffer" );
183cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;			/* KW: added return */
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
185cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.Buffer = buffer;
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.BufferSize = size;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.BufferCount = 0;
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = 0.0;
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write a value of a record into the selection buffer.
1986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param CTX GL context.
2006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param V value.
2016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies there is free space in the buffer to write the value and
2036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * increments the pointer.
2046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define WRITE_RECORD( CTX, V )					\
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	if (CTX->Select.BufferCount < CTX->Select.BufferSize) {	\
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	   CTX->Select.Buffer[CTX->Select.BufferCount] = (V);	\
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}							\
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	CTX->Select.BufferCount++;
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Update the hit flag and the maximum and minimum depth values.
2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
2166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param z depth.
2176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Sets gl_selection::HitFlag and updates gl_selection::HitMinZ and
2196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * gl_selection::HitMaxZ.
2206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
221559aec47015b741e045d57362f7732b3a04f9450Brian Paulvoid
222559aec47015b741e045d57362f7732b3a04f9450Brian Paul_mesa_update_hitflag(GLcontext *ctx, GLfloat z)
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_TRUE;
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (z < ctx->Select.HitMinZ) {
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.HitMinZ = z;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (z > ctx->Select.HitMaxZ) {
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.HitMaxZ = z;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record.
2366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
2386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record, i.e., the number of names in the stack, the minimum and
2406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * maximum depth values and the number of names in the name stack at the time
2416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * of the event. Resets the hit flag.
2426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_selection.
2446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
245559aec47015b741e045d57362f7732b3a04f9450Brian Paulstatic void
246559aec47015b741e045d57362f7732b3a04f9450Brian Paulwrite_hit_record(GLcontext *ctx)
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint zmin, zmax, zscale = (~0u);
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* HitMinZ and HitMaxZ are in [0,1].  Multiply these values by */
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* 2^32-1 and round to nearest unsigned integer. */
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   assert( ctx != NULL ); /* this line magically fixes a SunOS 5.x/gcc bug */
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   zmin = (GLuint) ((GLfloat) zscale * ctx->Select.HitMinZ);
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   zmax = (GLuint) ((GLfloat) zscale * ctx->Select.HitMaxZ);
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   WRITE_RECORD( ctx, ctx->Select.NameStackDepth );
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   WRITE_RECORD( ctx, zmin );
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   WRITE_RECORD( ctx, zmax );
2613be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   for (i = 0; i < ctx->Select.NameStackDepth; i++) {
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      WRITE_RECORD( ctx, ctx->Select.NameStack[i] );
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.Hits++;
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = -1.0;
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize the name stack.
2746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in select mode and resets the name stack depth and resets
2766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the hit record data in gl_selection. Marks new render mode in
2776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::NewState.
2786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
279c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InitNames( void )
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Record the hit before the HitFlag is wiped out again. */
2863be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode == GL_SELECT) {
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ctx->Select.HitFlag) {
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         write_hit_record( ctx );
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.NameStackDepth = 0;
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitFlag = GL_FALSE;
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMinZ = 1.0;
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Select.HitMaxZ = 0.0;
295cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->NewState |= _NEW_RENDERMODE;
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Load the top-most name of the name stack.
3016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name.
3036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty.
3056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and replace the top-most name in the stack.
3076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
310c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_LoadName( GLuint name )
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
314cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
315cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3163be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3193be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->Select.NameStackDepth == 0) {
32008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glLoadName" );
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
325cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3293be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->Select.NameStackDepth < MAX_NAME_STACK_DEPTH) {
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.NameStack[ctx->Select.NameStackDepth-1] = name;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Select.NameStack[MAX_NAME_STACK_DEPTH-1] = name;
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Push a name into the name stack.
3406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name.
3426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not full.
3446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and adds the name to the top of the name stack.
3466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
349c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PushName( GLuint name )
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
353cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
354cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3553be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Select.NameStackDepth >= MAX_NAME_STACK_DEPTH) {
36408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_STACK_OVERFLOW, "glPushName" );
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
366cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
367cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      ctx->Select.NameStack[ctx->Select.NameStackDepth++] = name;
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pop a name into the name stack.
3736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty.
3756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()),
3766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and removes top-most name in the name stack.
3776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * sa __GLcontextRec::Select.
3796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
380c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
381fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PopName( void )
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
383fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
384cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
385cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3863be135f0000515f677c3ca927034caa2fc669e2eBrian Paul   if (ctx->RenderMode != GL_SELECT) {
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Select.HitFlag) {
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      write_hit_record( ctx );
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (ctx->Select.NameStackDepth == 0) {
39508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopName" );
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
397cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
398cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      ctx->Select.NameStackDepth--;
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
4056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Render Mode */
4066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
4096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set rasterization mode.
4106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param mode rasterization mode.
4126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list.
4146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glRenderMode().
4166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes the vertices and do the necessary cleanup according to the previous
4186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * rasterization mode, such as writing the hit record or resent the select
4196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * buffer index when exiting the select mode. Updates
4206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::RenderMode and notifies the driver via the
4216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::RenderMode callback.
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
423c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall BennettGLint GLAPIENTRY
424fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_RenderMode( GLenum mode )
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
426fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint result;
428cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE & VERBOSE_API)
4319d47f3d6b8e8054602a637fad70d4769427df8b4Brian Paul      _mesa_debug(ctx, "glRenderMode %s\n", _mesa_lookup_enum_by_nr(mode));
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
433cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (ctx->RenderMode) {
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDER:
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 result = 0;
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SELECT:
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.HitFlag) {
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    write_hit_record( ctx );
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.BufferCount > ctx->Select.BufferSize) {
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* overflow */
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef DEBUG
446b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul            _mesa_warning(ctx, "Feedback buffer overflow");
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = -1;
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = ctx->Select.Hits;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.BufferCount = 0;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.Hits = 0;
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Select.NameStackDepth = 0;
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FEEDBACK:
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Feedback.Count > ctx->Feedback.BufferSize) {
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* overflow */
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = -1;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    result = ctx->Feedback.Count;
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 ctx->Feedback.Count = 0;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
47008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (mode) {
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDER:
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SELECT:
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Select.BufferSize==0) {
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* haven't called glSelectBuffer yet */
48008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	    _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FEEDBACK:
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (ctx->Feedback.BufferSize==0) {
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* haven't called glFeedbackBuffer yet */
48708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	    _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 break;
4906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
49208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->RenderMode = mode;
49722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   if (ctx->Driver.RenderMode)
498b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell      ctx->Driver.RenderMode( ctx, mode );
499b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return result;
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
5026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
5046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
5076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Initialization */
5086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
5096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize context feedback data.
5126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
5136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellvoid _mesa_init_feedback( GLcontext * ctx )
5146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
5156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Feedback */
5166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Type = GL_2D;   /* TODO: verify */
5176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Buffer = NULL;
5186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.BufferSize = 0;
5196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Feedback.Count = 0;
5206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Selection/picking */
5226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.Buffer = NULL;
5236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.BufferSize = 0;
5246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.BufferCount = 0;
5256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.Hits = 0;
5266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Select.NameStackDepth = 0;
5276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Miscellaneous */
5296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->RenderMode = GL_RENDER;
5306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
5316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
533