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