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" 38db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 395e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 402cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 43301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu#if FEATURE_feedback 446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_3D 0x01 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define FB_4D 0x02 4824d311c13339978a37885e88a49a990903652339Ian Romanick#define FB_COLOR 0x04 4924d311c13339978a37885e88a49a990903652339Ian Romanick#define FB_TEXTURE 0X08 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 } 6707e5295b6fe77253ea38dbc0d649b20e7275373aEric Anholt if (!buffer && size > 0) { 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 120f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_feedback_vertex(struct gl_context *ctx, 121559aec47015b741e045d57362f7732b3a04f9450Brian Paul const GLfloat win[4], 122559aec47015b741e045d57362f7732b3a04f9450Brian Paul const GLfloat color[4], 123559aec47015b741e045d57362f7732b3a04f9450Brian Paul const GLfloat texcoord[4]) 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 125bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, win[0] ); 126bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, win[1] ); 127cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Feedback._Mask & FB_3D) { 128bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, win[2] ); 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 130cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Feedback._Mask & FB_4D) { 131bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, win[3] ); 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Feedback._Mask & FB_COLOR) { 134bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, color[0] ); 135bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, color[1] ); 136bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, color[2] ); 137bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, color[3] ); 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 139cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Feedback._Mask & FB_TEXTURE) { 140bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, texcoord[0] ); 141bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, texcoord[1] ); 142bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, texcoord[2] ); 143bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul _mesa_feedback_token( ctx, texcoord[3] ); 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 147bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul 1486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/ 1496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Selection */ 1506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 1516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Establish a buffer for selection mode values. 1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param size buffer size. 1566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param buffer buffer. 1576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glSelectBuffer(). 1596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list. 1616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we're not in selection mode, flushes the vertices and initialize 163f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * the fields in __struct gl_contextRec::Select with the given buffer. 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 165301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY 166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_SelectBuffer( GLsizei size, GLuint *buffer ) 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 169cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 170cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 17157b8f13aa4dea6c8056f60574b0d4abccc2dbb49Yuanhan Liu if (size < 0) { 17257b8f13aa4dea6c8056f60574b0d4abccc2dbb49Yuanhan Liu _mesa_error(ctx, GL_INVALID_VALUE, "glSelectBuffer(size)"); 17357b8f13aa4dea6c8056f60574b0d4abccc2dbb49Yuanhan Liu return; 17457b8f13aa4dea6c8056f60574b0d4abccc2dbb49Yuanhan Liu } 17557b8f13aa4dea6c8056f60574b0d4abccc2dbb49Yuanhan Liu 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->RenderMode==GL_SELECT) { 17708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, "glSelectBuffer" ); 178cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return; /* KW: added return */ 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 1816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.Buffer = buffer; 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.BufferSize = size; 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.BufferCount = 0; 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitFlag = GL_FALSE; 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMinZ = 1.0; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMaxZ = 0.0; 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write a value of a record into the selection buffer. 1936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1941eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param ctx GL context. 1951eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param value value. 1966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies there is free space in the buffer to write the value and 1986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * increments the pointer. 1996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 2009520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 201f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergwrite_record(struct gl_context *ctx, GLuint value) 2028bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul{ 2038bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul if (ctx->Select.BufferCount < ctx->Select.BufferSize) { 2048bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul ctx->Select.Buffer[ctx->Select.BufferCount] = value; 2058bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul } 2068bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul ctx->Select.BufferCount++; 2078bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul} 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Update the hit flag and the maximum and minimum depth values. 2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param z depth. 2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Sets gl_selection::HitFlag and updates gl_selection::HitMinZ and 2176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * gl_selection::HitMaxZ. 2186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 219559aec47015b741e045d57362f7732b3a04f9450Brian Paulvoid 220f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_update_hitflag(struct gl_context *ctx, GLfloat z) 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitFlag = GL_TRUE; 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < ctx->Select.HitMinZ) { 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMinZ = z; 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z > ctx->Select.HitMaxZ) { 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMaxZ = z; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record. 2346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 2366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Write the hit record, i.e., the number of names in the stack, the minimum and 2386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * maximum depth values and the number of names in the name stack at the time 2396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * of the event. Resets the hit flag. 2406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_selection. 2426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 243559aec47015b741e045d57362f7732b3a04f9450Brian Paulstatic void 244f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergwrite_hit_record(struct gl_context *ctx) 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint zmin, zmax, zscale = (~0u); 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* HitMinZ and HitMaxZ are in [0,1]. Multiply these values by */ 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 2^32-1 and round to nearest unsigned integer. */ 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert( ctx != NULL ); /* this line magically fixes a SunOS 5.x/gcc bug */ 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zmin = (GLuint) ((GLfloat) zscale * ctx->Select.HitMinZ); 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zmax = (GLuint) ((GLfloat) zscale * ctx->Select.HitMaxZ); 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2568bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul write_record( ctx, ctx->Select.NameStackDepth ); 2578bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul write_record( ctx, zmin ); 2588bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul write_record( ctx, zmax ); 2593be135f0000515f677c3ca927034caa2fc669e2eBrian Paul for (i = 0; i < ctx->Select.NameStackDepth; i++) { 2608bf25a17d2f8f888e8e8a4f7a2c6d68c6c06f6e8Brian Paul write_record( ctx, ctx->Select.NameStack[i] ); 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.Hits++; 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitFlag = GL_FALSE; 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMinZ = 1.0; 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMaxZ = -1.0; 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize the name stack. 2726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in select mode and resets the name stack depth and resets 2746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the hit record data in gl_selection. Marks new render mode in 275f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * __struct gl_contextRec::NewState. 2766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 277301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY 278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InitNames( void ) 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 281cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 282cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Record the hit before the HitFlag is wiped out again. */ 2843be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->RenderMode == GL_SELECT) { 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.HitFlag) { 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg write_hit_record( ctx ); 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.NameStackDepth = 0; 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitFlag = GL_FALSE; 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMinZ = 1.0; 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.HitMaxZ = 0.0; 293cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->NewState |= _NEW_RENDERMODE; 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Load the top-most name of the name stack. 2996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name. 3016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty. 3036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 3046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and replace the top-most name in the stack. 3056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 306f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * sa __struct gl_contextRec::Select. 3076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 308301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY 309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_LoadName( GLuint name ) 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3143be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->RenderMode != GL_SELECT) { 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 3173be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->Select.NameStackDepth == 0) { 31808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, "glLoadName" ); 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 322cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.HitFlag) { 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg write_hit_record( ctx ); 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 3273be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->Select.NameStackDepth < MAX_NAME_STACK_DEPTH) { 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.NameStack[ctx->Select.NameStackDepth-1] = name; 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.NameStack[MAX_NAME_STACK_DEPTH-1] = name; 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Push a name into the name stack. 3386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name name. 3406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not full. 3426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 3436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and adds the name to the top of the name stack. 3446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 345f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * sa __struct gl_contextRec::Select. 3466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 347301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY 348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PushName( GLuint name ) 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 352cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3533be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->RenderMode != GL_SELECT) { 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 356cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.HitFlag) { 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg write_hit_record( ctx ); 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 361cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Select.NameStackDepth >= MAX_NAME_STACK_DEPTH) { 36208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_STACK_OVERFLOW, "glPushName" ); 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 364cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else 365cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->Select.NameStack[ctx->Select.NameStackDepth++] = name; 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pop a name into the name stack. 3716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies we are in selection mode and that the name stack is not empty. 3736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 3746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * and removes top-most name in the name stack. 3756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 376f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * sa __struct gl_contextRec::Select. 3776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 378301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wustatic void GLAPIENTRY 379fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PopName( void ) 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 381fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 382cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 383cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3843be135f0000515f677c3ca927034caa2fc669e2eBrian Paul if (ctx->RenderMode != GL_SELECT) { 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 388cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.HitFlag) { 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg write_hit_record( ctx ); 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 392cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Select.NameStackDepth == 0) { 39308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopName" ); 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else 396cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->Select.NameStackDepth--; 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 4036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Render Mode */ 4046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 4076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set rasterization mode. 4086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param mode rasterization mode. 4106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note this function can't be put in a display list. 4126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glRenderMode(). 4146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Flushes the vertices and do the necessary cleanup according to the previous 4166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * rasterization mode, such as writing the hit record or resent the select 4176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * buffer index when exiting the select mode. Updates 418f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * __struct gl_contextRec::RenderMode and notifies the driver via the 4196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::RenderMode callback. 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 421c56d0a61b97b29cec851df4cd385f095e3876848Chad VersaceGLint GLAPIENTRY 422fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_RenderMode( GLenum mode ) 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 424fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint result; 426cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0); 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (MESA_VERBOSE & VERBOSE_API) 4299d47f3d6b8e8054602a637fad70d4769427df8b4Brian Paul _mesa_debug(ctx, "glRenderMode %s\n", _mesa_lookup_enum_by_nr(mode)); 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 431cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (ctx->RenderMode) { 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDER: 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg result = 0; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_SELECT: 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.HitFlag) { 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg write_hit_record( ctx ); 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.BufferCount > ctx->Select.BufferSize) { 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* overflow */ 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef DEBUG 444b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_warning(ctx, "Feedback buffer overflow"); 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg result = -1; 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg result = ctx->Select.Hits; 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.BufferCount = 0; 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.Hits = 0; 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Select.NameStackDepth = 0; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 4556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_FEEDBACK: 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Feedback.Count > ctx->Feedback.BufferSize) { 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* overflow */ 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg result = -1; 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg result = ctx->Feedback.Count; 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Feedback.Count = 0; 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 4666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 46808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (mode) { 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDER: 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_SELECT: 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Select.BufferSize==0) { 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* haven't called glSelectBuffer yet */ 47808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 4816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_FEEDBACK: 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Feedback.BufferSize==0) { 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* haven't called glFeedbackBuffer yet */ 48508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 4886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 49008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->RenderMode = mode; 49522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (ctx->Driver.RenderMode) 496b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell ctx->Driver.RenderMode( ctx, mode ); 497b980b2eeb62dc48101a7481d02d196c80b9da397Keith Whitwell 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return result; 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 5006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 5026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 504301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wuvoid 505301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu_mesa_init_feedback_dispatch(struct _glapi_table *disp) 506301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu{ 507301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_InitNames(disp, _mesa_InitNames); 508301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_FeedbackBuffer(disp, _mesa_FeedbackBuffer); 509301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_LoadName(disp, _mesa_LoadName); 510301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_PassThrough(disp, _mesa_PassThrough); 511301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_PopName(disp, _mesa_PopName); 512301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_PushName(disp, _mesa_PushName); 513301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_SelectBuffer(disp, _mesa_SelectBuffer); 514301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu SET_RenderMode(disp, _mesa_RenderMode); 515301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu} 516301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu 517301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu 518301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu#endif /* FEATURE_feedback */ 519301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu 520301a510092859d2e214d64f4ac2ebe03d591c64bChia-I Wu 5216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/ 5226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Initialization */ 5236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 5246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 5266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize context feedback data. 5276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 528f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _mesa_init_feedback( struct gl_context * ctx ) 5296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{ 5306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell /* Feedback */ 5316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Feedback.Type = GL_2D; /* TODO: verify */ 5326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Feedback.Buffer = NULL; 5336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Feedback.BufferSize = 0; 5346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Feedback.Count = 0; 5356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell /* Selection/picking */ 5376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Select.Buffer = NULL; 5386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Select.BufferSize = 0; 5396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Select.BufferCount = 0; 5406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Select.Hits = 0; 5416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->Select.NameStackDepth = 0; 5426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell /* Miscellaneous */ 5446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell ctx->RenderMode = GL_RENDER; 5456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell} 5466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 5476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 548