1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.5 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file feedback.c 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Selection and feedback modes functions. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "feedback.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dispatch.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_feedback 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FB_3D 0x01 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FB_4D 0x02 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FB_COLOR 0x04 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FB_TEXTURE 0X08 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode==GL_FEEDBACK) { 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glFeedbackBuffer" ); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size<0) { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(size<0)" ); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer && size > 0) { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(buffer==NULL)" ); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.BufferSize = 0; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_2D: 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback._Mask = 0; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_3D: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback._Mask = FB_3D; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_3D_COLOR: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback._Mask = (FB_3D | FB_COLOR); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_3D_COLOR_TEXTURE: 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback._Mask = (FB_3D | FB_COLOR | FB_TEXTURE); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_4D_COLOR_TEXTURE: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback._Mask = (FB_3D | FB_4D | FB_COLOR | FB_TEXTURE); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glFeedbackBuffer" ); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); /* Always flush */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Type = type; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.BufferSize = size; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Buffer = buffer; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Count = 0; /* Becaues of this. */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PassThrough( GLfloat token ) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode==GL_FEEDBACK) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, 0); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, (GLfloat) (GLint) GL_PASS_THROUGH_TOKEN ); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, token ); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Put a vertex into the feedback buffer. 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_feedback_vertex(struct gl_context *ctx, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat win[4], 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat color[4], 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat texcoord[4]) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, win[0] ); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, win[1] ); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback._Mask & FB_3D) { 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, win[2] ); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback._Mask & FB_4D) { 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, win[3] ); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback._Mask & FB_COLOR) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, color[0] ); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, color[1] ); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, color[2] ); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, color[3] ); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback._Mask & FB_TEXTURE) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, texcoord[0] ); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, texcoord[1] ); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, texcoord[2] ); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_feedback_token( ctx, texcoord[3] ); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Selection */ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Establish a buffer for selection mode values. 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param size buffer size. 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param buffer buffer. 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glSelectBuffer(). 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note this function can't be put in a display list. 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies we're not in selection mode, flushes the vertices and initialize 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the fields in __struct gl_contextRec::Select with the given buffer. 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_SelectBuffer( GLsizei size, GLuint *buffer ) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size < 0) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glSelectBuffer(size)"); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode==GL_SELECT) { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glSelectBuffer" ); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /* KW: added return */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Buffer = buffer; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferSize = size; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferCount = 0; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitFlag = GL_FALSE; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMinZ = 1.0; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMaxZ = 0.0; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Write a value of a record into the selection buffer. 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param value value. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies there is free space in the buffer to write the value and 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * increments the pointer. 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_record(struct gl_context *ctx, GLuint value) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.BufferCount < ctx->Select.BufferSize) { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Buffer[ctx->Select.BufferCount] = value; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferCount++; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Update the hit flag and the maximum and minimum depth values. 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param z depth. 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sets gl_selection::HitFlag and updates gl_selection::HitMinZ and 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gl_selection::HitMaxZ. 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_update_hitflag(struct gl_context *ctx, GLfloat z) 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitFlag = GL_TRUE; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z < ctx->Select.HitMinZ) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMinZ = z; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z > ctx->Select.HitMaxZ) { 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMaxZ = z; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Write the hit record. 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Write the hit record, i.e., the number of names in the stack, the minimum and 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * maximum depth values and the number of names in the name stack at the time 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the event. Resets the hit flag. 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa gl_selection. 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_hit_record(struct gl_context *ctx) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint zmin, zmax, zscale = (~0u); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* HitMinZ and HitMaxZ are in [0,1]. Multiply these values by */ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 2^32-1 and round to nearest unsigned integer. */ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( ctx != NULL ); /* this line magically fixes a SunOS 5.x/gcc bug */ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zmin = (GLuint) ((GLfloat) zscale * ctx->Select.HitMinZ); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zmax = (GLuint) ((GLfloat) zscale * ctx->Select.HitMaxZ); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_record( ctx, ctx->Select.NameStackDepth ); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_record( ctx, zmin ); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_record( ctx, zmax ); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Select.NameStackDepth; i++) { 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_record( ctx, ctx->Select.NameStack[i] ); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Hits++; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitFlag = GL_FALSE; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMinZ = 1.0; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMaxZ = -1.0; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize the name stack. 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies we are in select mode and resets the name stack depth and resets 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the hit record data in gl_selection. Marks new render mode in 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::NewState. 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_InitNames( void ) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Record the hit before the HitFlag is wiped out again. */ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode == GL_SELECT) { 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.HitFlag) { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_hit_record( ctx ); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStackDepth = 0; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitFlag = GL_FALSE; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMinZ = 1.0; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.HitMaxZ = 0.0; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_RENDERMODE; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Load the top-most name of the name stack. 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name name. 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies we are in selection mode and that the name stack is not empty. 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and replace the top-most name in the stack. 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sa __struct gl_contextRec::Select. 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_LoadName( GLuint name ) 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode != GL_SELECT) { 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.NameStackDepth == 0) { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glLoadName" ); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.HitFlag) { 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_hit_record( ctx ); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.NameStackDepth < MAX_NAME_STACK_DEPTH) { 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStack[ctx->Select.NameStackDepth-1] = name; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStack[MAX_NAME_STACK_DEPTH-1] = name; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Push a name into the name stack. 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name name. 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies we are in selection mode and that the name stack is not full. 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and adds the name to the top of the name stack. 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sa __struct gl_contextRec::Select. 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PushName( GLuint name ) 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode != GL_SELECT) { 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.HitFlag) { 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_hit_record( ctx ); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.NameStackDepth >= MAX_NAME_STACK_DEPTH) { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_STACK_OVERFLOW, "glPushName" ); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStack[ctx->Select.NameStackDepth++] = name; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pop a name into the name stack. 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies we are in selection mode and that the name stack is not empty. 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flushes vertices. If there is a hit flag writes it (via write_hit_record()), 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and removes top-most name in the name stack. 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sa __struct gl_contextRec::Select. 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void GLAPIENTRY 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PopName( void ) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode != GL_SELECT) { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.HitFlag) { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_hit_record( ctx ); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.NameStackDepth == 0) { 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopName" ); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStackDepth--; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Render Mode */ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set rasterization mode. 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode rasterization mode. 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note this function can't be put in a display list. 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glRenderMode(). 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flushes the vertices and do the necessary cleanup according to the previous 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rasterization mode, such as writing the hit record or resent the select 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer index when exiting the select mode. Updates 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::RenderMode and notifies the driver via the 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dd_function_table::RenderMode callback. 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint GLAPIENTRY 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_RenderMode( GLenum mode ) 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint result; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & VERBOSE_API) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glRenderMode %s\n", _mesa_lookup_enum_by_nr(mode)); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_RENDERMODE); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->RenderMode) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RENDER: 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = 0; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SELECT: 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.HitFlag) { 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_hit_record( ctx ); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.BufferCount > ctx->Select.BufferSize) { 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* overflow */ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Feedback buffer overflow"); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = -1; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = ctx->Select.Hits; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferCount = 0; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Hits = 0; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStackDepth = 0; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if _HAVE_FULL_GL 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FEEDBACK: 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback.Count > ctx->Feedback.BufferSize) { 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* overflow */ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = -1; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = ctx->Feedback.Count; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Count = 0; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RENDER: 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SELECT: 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Select.BufferSize==0) { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* haven't called glSelectBuffer yet */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if _HAVE_FULL_GL 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FEEDBACK: 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Feedback.BufferSize==0) { 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* haven't called glFeedbackBuffer yet */ 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->RenderMode = mode; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.RenderMode) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.RenderMode( ctx, mode ); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return result; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_feedback_dispatch(struct _glapi_table *disp) 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_InitNames(disp, _mesa_InitNames); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_FeedbackBuffer(disp, _mesa_FeedbackBuffer); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_LoadName(disp, _mesa_LoadName); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_PassThrough(disp, _mesa_PassThrough); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_PopName(disp, _mesa_PopName); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_PushName(disp, _mesa_PushName); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_SelectBuffer(disp, _mesa_SelectBuffer); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_RenderMode(disp, _mesa_RenderMode); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_feedback */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Initialization */ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/ 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize context feedback data. 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _mesa_init_feedback( struct gl_context * ctx ) 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Feedback */ 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Type = GL_2D; /* TODO: verify */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Buffer = NULL; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.BufferSize = 0; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Feedback.Count = 0; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Selection/picking */ 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Buffer = NULL; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferSize = 0; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.BufferCount = 0; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.Hits = 0; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Select.NameStackDepth = 0; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Miscellaneous */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->RenderMode = GL_RENDER; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 548