1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker /**
26*61046927SAndroid Build Coastguard Worker * \brief Array type draw functions, the main workhorse of any OpenGL API
27*61046927SAndroid Build Coastguard Worker * \author Keith Whitwell
28*61046927SAndroid Build Coastguard Worker */
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #ifndef DRAW_H
32*61046927SAndroid Build Coastguard Worker #define DRAW_H
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
35*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
38*61046927SAndroid Build Coastguard Worker extern "C" {
39*61046927SAndroid Build Coastguard Worker #endif
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker struct gl_context;
42*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object;
43*61046927SAndroid Build Coastguard Worker struct _mesa_prim
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker GLubyte mode; /**< GL_POINTS, GL_LINES, GL_QUAD_STRIP, etc */
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker /**
48*61046927SAndroid Build Coastguard Worker * tnl: If true, line stipple emulation will reset the pattern walker.
49*61046927SAndroid Build Coastguard Worker * vbo: If false and the primitive is a line loop, the first vertex is
50*61046927SAndroid Build Coastguard Worker * the beginning of the line loop and it won't be drawn.
51*61046927SAndroid Build Coastguard Worker * Instead, it will be moved to the end.
52*61046927SAndroid Build Coastguard Worker */
53*61046927SAndroid Build Coastguard Worker bool begin;
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker /**
56*61046927SAndroid Build Coastguard Worker * tnl: If true and the primitive is a line loop, it will be closed.
57*61046927SAndroid Build Coastguard Worker * vbo: Same as tnl.
58*61046927SAndroid Build Coastguard Worker */
59*61046927SAndroid Build Coastguard Worker bool end;
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker GLuint start;
62*61046927SAndroid Build Coastguard Worker GLuint count;
63*61046927SAndroid Build Coastguard Worker GLint basevertex;
64*61046927SAndroid Build Coastguard Worker GLuint draw_id;
65*61046927SAndroid Build Coastguard Worker };
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker /* Would like to call this a "vbo_index_buffer", but this would be
68*61046927SAndroid Build Coastguard Worker * confusing as the indices are not neccessarily yet in a non-null
69*61046927SAndroid Build Coastguard Worker * buffer object.
70*61046927SAndroid Build Coastguard Worker */
71*61046927SAndroid Build Coastguard Worker struct _mesa_index_buffer
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker GLuint count;
74*61046927SAndroid Build Coastguard Worker uint8_t index_size_shift; /* logbase2(index_size) */
75*61046927SAndroid Build Coastguard Worker struct gl_buffer_object *obj;
76*61046927SAndroid Build Coastguard Worker const void *ptr;
77*61046927SAndroid Build Coastguard Worker };
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker void
81*61046927SAndroid Build Coastguard Worker _mesa_set_varying_vp_inputs(struct gl_context *ctx, GLbitfield varying_inputs);
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker void
84*61046927SAndroid Build Coastguard Worker _mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao);
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker void
87*61046927SAndroid Build Coastguard Worker _mesa_save_and_set_draw_vao(struct gl_context *ctx,
88*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object *vao,
89*61046927SAndroid Build Coastguard Worker GLbitfield vp_input_filter,
90*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object **old_vao,
91*61046927SAndroid Build Coastguard Worker GLbitfield *old_vp_input_filter);
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker void
94*61046927SAndroid Build Coastguard Worker _mesa_restore_draw_vao(struct gl_context *ctx,
95*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object *saved,
96*61046927SAndroid Build Coastguard Worker GLbitfield saved_vp_input_filter);
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker void
99*61046927SAndroid Build Coastguard Worker _mesa_bitmap(struct gl_context *ctx, GLsizei width, GLsizei height,
100*61046927SAndroid Build Coastguard Worker GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
101*61046927SAndroid Build Coastguard Worker const GLubyte *bitmap, struct pipe_resource *tex);
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker static inline unsigned
_mesa_get_index_size_shift(GLenum type)104*61046927SAndroid Build Coastguard Worker _mesa_get_index_size_shift(GLenum type)
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker /* The type is already validated, so use a fast conversion.
107*61046927SAndroid Build Coastguard Worker *
108*61046927SAndroid Build Coastguard Worker * GL_UNSIGNED_BYTE - GL_UNSIGNED_BYTE = 0
109*61046927SAndroid Build Coastguard Worker * GL_UNSIGNED_SHORT - GL_UNSIGNED_BYTE = 2
110*61046927SAndroid Build Coastguard Worker * GL_UNSIGNED_INT - GL_UNSIGNED_BYTE = 4
111*61046927SAndroid Build Coastguard Worker *
112*61046927SAndroid Build Coastguard Worker * Divide by 2 to get 0,1,2.
113*61046927SAndroid Build Coastguard Worker */
114*61046927SAndroid Build Coastguard Worker return (type - GL_UNSIGNED_BYTE) >> 1;
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker static inline bool
_mesa_is_index_type_valid(GLenum type)118*61046927SAndroid Build Coastguard Worker _mesa_is_index_type_valid(GLenum type)
119*61046927SAndroid Build Coastguard Worker {
120*61046927SAndroid Build Coastguard Worker /* GL_UNSIGNED_BYTE = 0x1401
121*61046927SAndroid Build Coastguard Worker * GL_UNSIGNED_SHORT = 0x1403
122*61046927SAndroid Build Coastguard Worker * GL_UNSIGNED_INT = 0x1405
123*61046927SAndroid Build Coastguard Worker *
124*61046927SAndroid Build Coastguard Worker * The trick is that bit 1 and bit 2 mean USHORT and UINT, respectively.
125*61046927SAndroid Build Coastguard Worker * After clearing those two bits (with ~6), we should get UBYTE.
126*61046927SAndroid Build Coastguard Worker * Both bits can't be set, because the enum would be greater than UINT.
127*61046927SAndroid Build Coastguard Worker */
128*61046927SAndroid Build Coastguard Worker return type <= GL_UNSIGNED_INT && (type & ~6) == GL_UNSIGNED_BYTE;
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
132*61046927SAndroid Build Coastguard Worker } // extern "C"
133*61046927SAndroid Build Coastguard Worker #endif
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker #endif
136