1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file polygon.c 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Polygon operations. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5.1 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pbo.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "polygon.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Specify whether to cull front- or back-facing facets. 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode culling mode. 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glCullFace(). 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameter and updates gl_polygon_attrib::CullFaceMode. On 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * change, flushes the vertices and notifies the driver via 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the dd_function_table::CullFace callback. 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CullFace( GLenum mode ) 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 (MESA_VERBOSE&VERBOSE_API) 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glCullFace %s\n", _mesa_lookup_enum_by_nr(mode)); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) { 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" ); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.CullFaceMode == mode) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFaceMode = mode; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.CullFace) 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CullFace( ctx, mode ); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Define front- and back-facing 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode orientation of front-facing polygons. 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glFrontFace(). 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameter and updates gl_polygon_attrib::FrontFace. On change 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flushes the vertices and notifies the driver via 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the dd_function_table::FrontFace callback. 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_FrontFace( GLenum mode ) 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&VERBOSE_API) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glFrontFace %s\n", _mesa_lookup_enum_by_nr(mode)); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode!=GL_CW && mode!=GL_CCW) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" ); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.FrontFace == mode) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.FrontFace = mode; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.FrontFace) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FrontFace( ctx, mode ); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the polygon rasterization mode. 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param face the polygons which \p mode applies to. 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mode how polygons should be rasterized. 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glPolygonMode(). 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameters and updates gl_polygon_attrib::FrontMode and 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gl_polygon_attrib::BackMode. On change flushes the vertices and notifies the 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver via the dd_function_table::PolygonMode callback. 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PolygonMode( GLenum face, GLenum mode ) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&VERBOSE_API) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glPolygonMode %s %s\n", 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(face), 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(mode)); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" ); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (face) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FRONT: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL_CORE) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" ); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.FrontMode == mode) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.FrontMode = mode; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FRONT_AND_BACK: 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.FrontMode == mode && 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.BackMode == mode) 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.FrontMode = mode; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.BackMode = mode; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BACK: 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL_CORE) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" ); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.BackMode == mode) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.BackMode = mode; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" ); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.FrontMode == GL_FILL && ctx->Polygon.BackMode == GL_FILL) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_TriangleCaps &= ~DD_TRI_UNFILLED; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_TriangleCaps |= DD_TRI_UNFILLED; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.PolygonMode) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.PolygonMode(ctx, face, mode); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if _HAVE_FULL_GL 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This routine updates the ctx->Polygon.Stipple state. 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we're getting the stipple data from a PBO, we map the buffer 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in order to access the data. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In any case, we obey the current pixel unpacking parameters when fetching 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the stipple data. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In the future, this routine should be used as a fallback, called via 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Driver.PolygonStipple(). We'll have to update all the DRI drivers 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * too. 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_polygon_stipple(struct gl_context *ctx, const GLubyte *pattern) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pattern = _mesa_map_validate_pbo_source(ctx, 2, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->Unpack, 32, 32, 1, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_COLOR_INDEX, GL_BITMAP, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_MAX, pattern, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glPolygonStipple"); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pattern) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unmap_pbo_source(ctx, &ctx->Unpack); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glPolygonStipple. 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PolygonStipple( const GLubyte *pattern ) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&VERBOSE_API) 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glPolygonStipple\n"); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_polygon_stipple(ctx, pattern); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.PolygonStipple) 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.PolygonStipple(ctx, pattern); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glPolygonStipple. 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetnPolygonStippleARB( GLsizei bufSize, GLubyte *dest ) 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&VERBOSE_API) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glGetPolygonStipple\n"); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = _mesa_map_validate_pbo_dest(ctx, 2, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->Pack, 32, 32, 1, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_COLOR_INDEX, GL_BITMAP, 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bufSize, dest, "glGetPolygonStipple"); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dest) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetPolygonStipple( GLubyte *dest ) 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_GetnPolygonStippleARB(INT_MAX, dest); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PolygonOffset( GLfloat factor, GLfloat units ) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&VERBOSE_API) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glPolygonOffset %f %f\n", factor, units); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.OffsetFactor == factor && 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetUnits == units) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POLYGON); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetFactor = factor; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetUnits = units; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.PolygonOffset) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.PolygonOffset( ctx, factor, units ); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias ) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX mult by DepthMaxF here??? */ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_PolygonOffset(factor, bias * ctx->DrawBuffer->_DepthMaxF ); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Initialization */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/ 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize the context polygon state. 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initializes __struct gl_contextRec::Polygon and __struct gl_contextRec::PolygonStipple 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attribute groups. 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _mesa_init_polygon( struct gl_context * ctx ) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Polygon group */ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFlag = GL_FALSE; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFaceMode = GL_BACK; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.FrontFace = GL_CCW; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon._FrontBit = 0; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.FrontMode = GL_FILL; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.BackMode = GL_FILL; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.SmoothFlag = GL_FALSE; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.StippleFlag = GL_FALSE; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetFactor = 0.0F; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetUnits = 0.0F; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetPoint = GL_FALSE; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetLine = GL_FALSE; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.OffsetFill = GL_FALSE; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Polygon Stipple group */ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) ); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 339