Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / auxiliary / draw / draw_vertex.h
1 /**************************************************************************
2  * 
3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4  * All Rights Reserved.
5  * 
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  * 
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  * 
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  * 
26  **************************************************************************/
27
28 /**
29  * Post-transform vertex format info.  The vertex_info struct is used by
30  * the draw_vbuf code to emit hardware-specific vertex layouts into hw
31  * vertex buffers.
32  *
33  * Author:
34  *    Brian Paul
35  */
36
37
38 #ifndef DRAW_VERTEX_H
39 #define DRAW_VERTEX_H
40
41
42 #include "pipe/p_compiler.h"
43 #include "pipe/p_state.h"
44 #include "util/u_debug.h"
45
46
47 /**
48  * Vertex attribute emit modes
49  */
50 enum attrib_emit {
51    EMIT_OMIT,      /**< don't emit the attribute */
52    EMIT_1F,
53    EMIT_1F_PSIZE,  /**< insert constant point size */
54    EMIT_2F,
55    EMIT_3F,
56    EMIT_4F,
57    EMIT_4UB, /**< is RGBA like the rest */
58    EMIT_4UB_BGRA
59 };
60
61
62 /**
63  * Attribute interpolation mode
64  */
65 enum interp_mode {
66    INTERP_NONE,      /**< never interpolate vertex header info */
67    INTERP_POS,       /**< special case for frag position */
68    INTERP_CONSTANT,
69    INTERP_LINEAR,
70    INTERP_PERSPECTIVE
71 };
72
73
74 /**
75  * Information about hardware/rasterization vertex layout.
76  */
77 struct vertex_info
78 {
79    uint num_attribs;
80    uint hwfmt[4];      /**< hardware format info for this format */
81    uint size;          /**< total vertex size in dwords */
82    
83    /* Keep this small and at the end of the struct to allow quick
84     * memcmp() comparisons.
85     */
86    struct {
87       unsigned interp_mode:4;      /**< INTERP_x */
88       unsigned emit:4;             /**< EMIT_x */
89       unsigned src_index:8;          /**< map to post-xform attribs */
90    } attrib[PIPE_MAX_SHADER_INPUTS];
91 };
92
93 static INLINE size_t
94 draw_vinfo_size( const struct vertex_info *a )
95 {
96    return offsetof(const struct vertex_info, attrib[a->num_attribs]);
97 }
98
99 static INLINE int
100 draw_vinfo_compare( const struct vertex_info *a,
101                     const struct vertex_info *b )
102 {
103    size_t sizea = draw_vinfo_size( a );
104    return memcmp( a, b, sizea );
105 }
106
107 static INLINE void
108 draw_vinfo_copy( struct vertex_info *dst,
109                  const struct vertex_info *src )
110 {
111    size_t size = draw_vinfo_size( src );
112    memcpy( dst, src, size );
113 }
114
115
116
117 /**
118  * Add another attribute to the given vertex_info object.
119  * \param src_index  indicates which post-transformed vertex attrib slot
120  *                   corresponds to this attribute.
121  * \return slot in which the attribute was added
122  */
123 static INLINE uint
124 draw_emit_vertex_attr(struct vertex_info *vinfo,
125                       enum attrib_emit emit, 
126                       enum interp_mode interp, /* only used by softpipe??? */
127                       uint src_index)
128 {
129    const uint n = vinfo->num_attribs;
130    assert(n < PIPE_MAX_SHADER_INPUTS);
131    vinfo->attrib[n].emit = emit;
132    vinfo->attrib[n].interp_mode = interp;
133    vinfo->attrib[n].src_index = src_index;
134    vinfo->num_attribs++;
135    return n;
136 }
137
138
139 extern void draw_compute_vertex_size(struct vertex_info *vinfo);
140
141 void draw_dump_emitted_vertex(const struct vertex_info *vinfo, 
142                               const uint8_t *data);
143
144
145 static INLINE enum pipe_format draw_translate_vinfo_format(enum attrib_emit emit)
146 {
147    switch (emit) {
148    case EMIT_OMIT:
149       return PIPE_FORMAT_NONE;
150    case EMIT_1F:
151    case EMIT_1F_PSIZE:
152       return PIPE_FORMAT_R32_FLOAT;
153    case EMIT_2F:
154       return PIPE_FORMAT_R32G32_FLOAT;
155    case EMIT_3F:
156       return PIPE_FORMAT_R32G32B32_FLOAT;
157    case EMIT_4F:
158       return PIPE_FORMAT_R32G32B32A32_FLOAT;
159    case EMIT_4UB:
160       return PIPE_FORMAT_R8G8B8A8_UNORM;
161    case EMIT_4UB_BGRA:
162       return PIPE_FORMAT_B8G8R8A8_UNORM;
163    default:
164       assert(!"unexpected format");
165       return PIPE_FORMAT_NONE;
166    }
167 }
168
169 static INLINE unsigned draw_translate_vinfo_size(enum attrib_emit emit)
170 {
171    switch (emit) {
172    case EMIT_OMIT:
173       return 0;
174    case EMIT_1F:
175    case EMIT_1F_PSIZE:
176       return 1 * sizeof(float);
177    case EMIT_2F:
178       return 2 * sizeof(float);
179    case EMIT_3F:
180       return 3 * sizeof(float);
181    case EMIT_4F:
182       return 4 * sizeof(float);
183    case EMIT_4UB:
184       return 4 * sizeof(unsigned char);
185    case EMIT_4UB_BGRA:
186       return 4 * sizeof(unsigned char);
187    default:
188       assert(!"unexpected format");
189       return 0;
190    }
191 }
192
193 #endif /* DRAW_VERTEX_H */