xref: /aosp_15_r20/external/mesa3d/src/mesa/main/polygon.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**
2*61046927SAndroid Build Coastguard Worker  * \file polygon.c
3*61046927SAndroid Build Coastguard Worker  * Polygon operations.
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker /*
7*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
8*61046927SAndroid Build Coastguard Worker  *
9*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
12*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
13*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
14*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
16*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
17*61046927SAndroid Build Coastguard Worker  *
18*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
19*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
20*61046927SAndroid Build Coastguard Worker  *
21*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
24*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
28*61046927SAndroid Build Coastguard Worker  */
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "context.h"
34*61046927SAndroid Build Coastguard Worker #include "draw_validate.h"
35*61046927SAndroid Build Coastguard Worker #include "image.h"
36*61046927SAndroid Build Coastguard Worker #include "enums.h"
37*61046927SAndroid Build Coastguard Worker #include "pack.h"
38*61046927SAndroid Build Coastguard Worker #include "pbo.h"
39*61046927SAndroid Build Coastguard Worker #include "polygon.h"
40*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
41*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
42*61046927SAndroid Build Coastguard Worker #include "varray.h"
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker /**
47*61046927SAndroid Build Coastguard Worker  * Specify whether to cull front- or back-facing facets.
48*61046927SAndroid Build Coastguard Worker  *
49*61046927SAndroid Build Coastguard Worker  * \param mode culling mode.
50*61046927SAndroid Build Coastguard Worker  *
51*61046927SAndroid Build Coastguard Worker  * \sa glCullFace().
52*61046927SAndroid Build Coastguard Worker  *
53*61046927SAndroid Build Coastguard Worker  * Verifies the parameter and updates gl_polygon_attrib::CullFaceMode. On
54*61046927SAndroid Build Coastguard Worker  * change, flushes the vertices and notifies the driver via
55*61046927SAndroid Build Coastguard Worker  * the dd_function_table::CullFace callback.
56*61046927SAndroid Build Coastguard Worker  */
57*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
cull_face(struct gl_context * ctx,GLenum mode,bool no_error)58*61046927SAndroid Build Coastguard Worker cull_face(struct gl_context *ctx, GLenum mode, bool no_error)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    if (ctx->Polygon.CullFaceMode == mode)
61*61046927SAndroid Build Coastguard Worker       return;
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    if (!no_error &&
64*61046927SAndroid Build Coastguard Worker        mode != GL_FRONT && mode != GL_BACK && mode != GL_FRONT_AND_BACK) {
65*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glCullFace");
66*61046927SAndroid Build Coastguard Worker       return;
67*61046927SAndroid Build Coastguard Worker    }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0,
70*61046927SAndroid Build Coastguard Worker                   GL_POLYGON_BIT);
71*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_RASTERIZER;
72*61046927SAndroid Build Coastguard Worker    ctx->Polygon.CullFaceMode = mode;
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_CullFace_no_error(GLenum mode)77*61046927SAndroid Build Coastguard Worker _mesa_CullFace_no_error(GLenum mode)
78*61046927SAndroid Build Coastguard Worker {
79*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
80*61046927SAndroid Build Coastguard Worker    cull_face(ctx, mode, true);
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_CullFace(GLenum mode)85*61046927SAndroid Build Coastguard Worker _mesa_CullFace(GLenum mode)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
90*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glCullFace %s\n", _mesa_enum_to_string(mode));
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    cull_face(ctx, mode, false);
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker /**
97*61046927SAndroid Build Coastguard Worker  * Define front- and back-facing
98*61046927SAndroid Build Coastguard Worker  *
99*61046927SAndroid Build Coastguard Worker  * \param mode orientation of front-facing polygons.
100*61046927SAndroid Build Coastguard Worker  *
101*61046927SAndroid Build Coastguard Worker  * \sa glFrontFace().
102*61046927SAndroid Build Coastguard Worker  *
103*61046927SAndroid Build Coastguard Worker  * Verifies the parameter and updates gl_polygon_attrib::FrontFace. On change
104*61046927SAndroid Build Coastguard Worker  * flushes the vertices and notifies the driver via
105*61046927SAndroid Build Coastguard Worker  * the dd_function_table::FrontFace callback.
106*61046927SAndroid Build Coastguard Worker  */
107*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
front_face(struct gl_context * ctx,GLenum mode,bool no_error)108*61046927SAndroid Build Coastguard Worker front_face(struct gl_context *ctx, GLenum mode, bool no_error)
109*61046927SAndroid Build Coastguard Worker {
110*61046927SAndroid Build Coastguard Worker    if (ctx->Polygon.FrontFace == mode)
111*61046927SAndroid Build Coastguard Worker       return;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    if (!no_error && mode != GL_CW && mode != GL_CCW) {
114*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glFrontFace");
115*61046927SAndroid Build Coastguard Worker       return;
116*61046927SAndroid Build Coastguard Worker    }
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0,
119*61046927SAndroid Build Coastguard Worker                   GL_POLYGON_BIT);
120*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_RASTERIZER;
121*61046927SAndroid Build Coastguard Worker    ctx->Polygon.FrontFace = mode;
122*61046927SAndroid Build Coastguard Worker }
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_FrontFace_no_error(GLenum mode)126*61046927SAndroid Build Coastguard Worker _mesa_FrontFace_no_error(GLenum mode)
127*61046927SAndroid Build Coastguard Worker {
128*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
129*61046927SAndroid Build Coastguard Worker    front_face(ctx, mode, true);
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_FrontFace(GLenum mode)134*61046927SAndroid Build Coastguard Worker _mesa_FrontFace(GLenum mode)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
139*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glFrontFace %s\n", _mesa_enum_to_string(mode));
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    front_face(ctx, mode, false);
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker /**
146*61046927SAndroid Build Coastguard Worker  * Set the polygon rasterization mode.
147*61046927SAndroid Build Coastguard Worker  *
148*61046927SAndroid Build Coastguard Worker  * \param face the polygons which \p mode applies to.
149*61046927SAndroid Build Coastguard Worker  * \param mode how polygons should be rasterized.
150*61046927SAndroid Build Coastguard Worker  *
151*61046927SAndroid Build Coastguard Worker  * \sa glPolygonMode().
152*61046927SAndroid Build Coastguard Worker  *
153*61046927SAndroid Build Coastguard Worker  * Verifies the parameters and updates gl_polygon_attrib::FrontMode and
154*61046927SAndroid Build Coastguard Worker  * gl_polygon_attrib::BackMode. On change flushes the vertices and notifies the
155*61046927SAndroid Build Coastguard Worker  * driver via the dd_function_table::PolygonMode callback.
156*61046927SAndroid Build Coastguard Worker  */
157*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
polygon_mode(struct gl_context * ctx,GLenum face,GLenum mode,bool no_error)158*61046927SAndroid Build Coastguard Worker polygon_mode(struct gl_context *ctx, GLenum face, GLenum mode, bool no_error)
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker    bool old_mode_has_fill_rectangle =
161*61046927SAndroid Build Coastguard Worker       ctx->Polygon.FrontMode == GL_FILL_RECTANGLE_NV ||
162*61046927SAndroid Build Coastguard Worker       ctx->Polygon.BackMode == GL_FILL_RECTANGLE_NV;
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
165*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glPolygonMode %s %s\n",
166*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string(face),
167*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string(mode));
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    if (!no_error) {
170*61046927SAndroid Build Coastguard Worker       switch (mode) {
171*61046927SAndroid Build Coastguard Worker       case GL_POINT:
172*61046927SAndroid Build Coastguard Worker       case GL_LINE:
173*61046927SAndroid Build Coastguard Worker       case GL_FILL:
174*61046927SAndroid Build Coastguard Worker          break;
175*61046927SAndroid Build Coastguard Worker       case GL_FILL_RECTANGLE_NV:
176*61046927SAndroid Build Coastguard Worker          if (ctx->Extensions.NV_fill_rectangle)
177*61046927SAndroid Build Coastguard Worker             break;
178*61046927SAndroid Build Coastguard Worker          FALLTHROUGH;
179*61046927SAndroid Build Coastguard Worker       default:
180*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glPolygonMode(mode)");
181*61046927SAndroid Build Coastguard Worker          return;
182*61046927SAndroid Build Coastguard Worker       }
183*61046927SAndroid Build Coastguard Worker    }
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker    switch (face) {
186*61046927SAndroid Build Coastguard Worker    case GL_FRONT:
187*61046927SAndroid Build Coastguard Worker       if (!no_error && _mesa_is_desktop_gl_core(ctx)) {
188*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
189*61046927SAndroid Build Coastguard Worker          return;
190*61046927SAndroid Build Coastguard Worker       }
191*61046927SAndroid Build Coastguard Worker       if (ctx->Polygon.FrontMode == mode)
192*61046927SAndroid Build Coastguard Worker          return;
193*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, 0,
194*61046927SAndroid Build Coastguard Worker                      GL_POLYGON_BIT);
195*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_RASTERIZER;
196*61046927SAndroid Build Coastguard Worker       ctx->Polygon.FrontMode = mode;
197*61046927SAndroid Build Coastguard Worker       _mesa_update_edgeflag_state_vao(ctx);
198*61046927SAndroid Build Coastguard Worker       break;
199*61046927SAndroid Build Coastguard Worker    case GL_FRONT_AND_BACK:
200*61046927SAndroid Build Coastguard Worker       if (ctx->Polygon.FrontMode == mode && ctx->Polygon.BackMode == mode)
201*61046927SAndroid Build Coastguard Worker          return;
202*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, 0,
203*61046927SAndroid Build Coastguard Worker                      GL_POLYGON_BIT);
204*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_RASTERIZER;
205*61046927SAndroid Build Coastguard Worker       ctx->Polygon.FrontMode = mode;
206*61046927SAndroid Build Coastguard Worker       ctx->Polygon.BackMode = mode;
207*61046927SAndroid Build Coastguard Worker       _mesa_update_edgeflag_state_vao(ctx);
208*61046927SAndroid Build Coastguard Worker       break;
209*61046927SAndroid Build Coastguard Worker    case GL_BACK:
210*61046927SAndroid Build Coastguard Worker       if (!no_error && _mesa_is_desktop_gl_core(ctx)) {
211*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
212*61046927SAndroid Build Coastguard Worker          return;
213*61046927SAndroid Build Coastguard Worker       }
214*61046927SAndroid Build Coastguard Worker       if (ctx->Polygon.BackMode == mode)
215*61046927SAndroid Build Coastguard Worker          return;
216*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, 0,
217*61046927SAndroid Build Coastguard Worker                      GL_POLYGON_BIT);
218*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_RASTERIZER;
219*61046927SAndroid Build Coastguard Worker       ctx->Polygon.BackMode = mode;
220*61046927SAndroid Build Coastguard Worker       _mesa_update_edgeflag_state_vao(ctx);
221*61046927SAndroid Build Coastguard Worker       break;
222*61046927SAndroid Build Coastguard Worker    default:
223*61046927SAndroid Build Coastguard Worker       if (!no_error)
224*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
225*61046927SAndroid Build Coastguard Worker       return;
226*61046927SAndroid Build Coastguard Worker    }
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    if (ctx->Extensions.INTEL_conservative_rasterization ||
229*61046927SAndroid Build Coastguard Worker        (mode == GL_FILL_RECTANGLE_NV || old_mode_has_fill_rectangle))
230*61046927SAndroid Build Coastguard Worker       _mesa_update_valid_to_render_state(ctx);
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PolygonMode_no_error(GLenum face,GLenum mode)235*61046927SAndroid Build Coastguard Worker _mesa_PolygonMode_no_error(GLenum face, GLenum mode)
236*61046927SAndroid Build Coastguard Worker {
237*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
238*61046927SAndroid Build Coastguard Worker    polygon_mode(ctx, face, mode, true);
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PolygonMode(GLenum face,GLenum mode)243*61046927SAndroid Build Coastguard Worker _mesa_PolygonMode(GLenum face, GLenum mode)
244*61046927SAndroid Build Coastguard Worker {
245*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
246*61046927SAndroid Build Coastguard Worker    polygon_mode(ctx, face, mode, false);
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker /**
251*61046927SAndroid Build Coastguard Worker  * Called by glPolygonStipple.
252*61046927SAndroid Build Coastguard Worker  */
253*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PolygonStipple(const GLubyte * pattern)254*61046927SAndroid Build Coastguard Worker _mesa_PolygonStipple(const GLubyte *pattern)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
259*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glPolygonStipple\n");
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, GL_POLYGON_STIPPLE_BIT);
262*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_POLY_STIPPLE;
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker    pattern = _mesa_map_validate_pbo_source(ctx, 2,
265*61046927SAndroid Build Coastguard Worker                                            &ctx->Unpack, 32, 32, 1,
266*61046927SAndroid Build Coastguard Worker                                            GL_COLOR_INDEX, GL_BITMAP,
267*61046927SAndroid Build Coastguard Worker                                            INT_MAX, pattern,
268*61046927SAndroid Build Coastguard Worker                                            "glPolygonStipple");
269*61046927SAndroid Build Coastguard Worker    if (!pattern)
270*61046927SAndroid Build Coastguard Worker       return;
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker    _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker    _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
275*61046927SAndroid Build Coastguard Worker }
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker /**
279*61046927SAndroid Build Coastguard Worker  * Called by glPolygonStipple.
280*61046927SAndroid Build Coastguard Worker  */
281*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnPolygonStippleARB(GLsizei bufSize,GLubyte * dest)282*61046927SAndroid Build Coastguard Worker _mesa_GetnPolygonStippleARB( GLsizei bufSize, GLubyte *dest )
283*61046927SAndroid Build Coastguard Worker {
284*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE&VERBOSE_API)
287*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glGetPolygonStipple\n");
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    if (ctx->Pack.BufferObj)
290*61046927SAndroid Build Coastguard Worker       ctx->Pack.BufferObj->UsageHistory |= USAGE_PIXEL_PACK_BUFFER;
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker    dest = _mesa_map_validate_pbo_dest(ctx, 2,
293*61046927SAndroid Build Coastguard Worker                                       &ctx->Pack, 32, 32, 1,
294*61046927SAndroid Build Coastguard Worker                                       GL_COLOR_INDEX, GL_BITMAP,
295*61046927SAndroid Build Coastguard Worker                                       bufSize, dest, "glGetPolygonStipple");
296*61046927SAndroid Build Coastguard Worker    if (!dest)
297*61046927SAndroid Build Coastguard Worker       return;
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
302*61046927SAndroid Build Coastguard Worker }
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPolygonStipple(GLubyte * dest)306*61046927SAndroid Build Coastguard Worker _mesa_GetPolygonStipple( GLubyte *dest )
307*61046927SAndroid Build Coastguard Worker {
308*61046927SAndroid Build Coastguard Worker    _mesa_GetnPolygonStippleARB(INT_MAX, dest);
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker 
311*61046927SAndroid Build Coastguard Worker void
_mesa_polygon_offset_clamp(struct gl_context * ctx,GLfloat factor,GLfloat units,GLfloat clamp)312*61046927SAndroid Build Coastguard Worker _mesa_polygon_offset_clamp(struct gl_context *ctx,
313*61046927SAndroid Build Coastguard Worker                            GLfloat factor, GLfloat units, GLfloat clamp)
314*61046927SAndroid Build Coastguard Worker {
315*61046927SAndroid Build Coastguard Worker    if (ctx->Polygon.OffsetFactor == factor &&
316*61046927SAndroid Build Coastguard Worker        ctx->Polygon.OffsetUnits == units &&
317*61046927SAndroid Build Coastguard Worker        ctx->Polygon.OffsetClamp == clamp)
318*61046927SAndroid Build Coastguard Worker       return;
319*61046927SAndroid Build Coastguard Worker 
320*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0,
321*61046927SAndroid Build Coastguard Worker                   GL_POLYGON_BIT);
322*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_RASTERIZER;
323*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetFactor = factor;
324*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetUnits = units;
325*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetClamp = clamp;
326*61046927SAndroid Build Coastguard Worker }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PolygonOffset(GLfloat factor,GLfloat units)329*61046927SAndroid Build Coastguard Worker _mesa_PolygonOffset( GLfloat factor, GLfloat units )
330*61046927SAndroid Build Coastguard Worker {
331*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE&VERBOSE_API)
334*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glPolygonOffset %f %f\n", factor, units);
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    _mesa_polygon_offset_clamp(ctx, factor, units, 0.0);
337*61046927SAndroid Build Coastguard Worker }
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PolygonOffsetClampEXT(GLfloat factor,GLfloat units,GLfloat clamp)340*61046927SAndroid Build Coastguard Worker _mesa_PolygonOffsetClampEXT( GLfloat factor, GLfloat units, GLfloat clamp )
341*61046927SAndroid Build Coastguard Worker {
342*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.ARB_polygon_offset_clamp) {
345*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
346*61046927SAndroid Build Coastguard Worker                   "unsupported function (%s) called", "glPolygonOffsetClamp");
347*61046927SAndroid Build Coastguard Worker       return;
348*61046927SAndroid Build Coastguard Worker    }
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE&VERBOSE_API)
351*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glPolygonOffsetClamp %f %f %f\n", factor, units, clamp);
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    _mesa_polygon_offset_clamp(ctx, factor, units, clamp);
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker /**********************************************************************/
357*61046927SAndroid Build Coastguard Worker /** \name Initialization */
358*61046927SAndroid Build Coastguard Worker /*@{*/
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker /**
361*61046927SAndroid Build Coastguard Worker  * Initialize the context polygon state.
362*61046927SAndroid Build Coastguard Worker  *
363*61046927SAndroid Build Coastguard Worker  * \param ctx GL context.
364*61046927SAndroid Build Coastguard Worker  *
365*61046927SAndroid Build Coastguard Worker  * Initializes __struct gl_contextRec::Polygon and __struct gl_contextRec::PolygonStipple
366*61046927SAndroid Build Coastguard Worker  * attribute groups.
367*61046927SAndroid Build Coastguard Worker  */
_mesa_init_polygon(struct gl_context * ctx)368*61046927SAndroid Build Coastguard Worker void _mesa_init_polygon( struct gl_context * ctx )
369*61046927SAndroid Build Coastguard Worker {
370*61046927SAndroid Build Coastguard Worker    /* Polygon group */
371*61046927SAndroid Build Coastguard Worker    ctx->Polygon.CullFlag = GL_FALSE;
372*61046927SAndroid Build Coastguard Worker    ctx->Polygon.CullFaceMode = GL_BACK;
373*61046927SAndroid Build Coastguard Worker    ctx->Polygon.FrontFace = GL_CCW;
374*61046927SAndroid Build Coastguard Worker    ctx->Polygon.FrontMode = GL_FILL;
375*61046927SAndroid Build Coastguard Worker    ctx->Polygon.BackMode = GL_FILL;
376*61046927SAndroid Build Coastguard Worker    ctx->Polygon.SmoothFlag = GL_FALSE;
377*61046927SAndroid Build Coastguard Worker    ctx->Polygon.StippleFlag = GL_FALSE;
378*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetFactor = 0.0F;
379*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetUnits = 0.0F;
380*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetClamp = 0.0F;
381*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetPoint = GL_FALSE;
382*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetLine = GL_FALSE;
383*61046927SAndroid Build Coastguard Worker    ctx->Polygon.OffsetFill = GL_FALSE;
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    /* Polygon Stipple group */
387*61046927SAndroid Build Coastguard Worker    memset( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
388*61046927SAndroid Build Coastguard Worker }
389*61046927SAndroid Build Coastguard Worker 
390*61046927SAndroid Build Coastguard Worker /*@}*/
391