draw_vertex.h revision fe306e7ea5e789adc955653d9be8cd7f8af47264
1690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul/**************************************************************************
2690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
3690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * All Rights Reserved.
5690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
6690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
7690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * copy of this software and associated documentation files (the
8690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * "Software"), to deal in the Software without restriction, including
9690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * without limitation the rights to use, copy, modify, merge, publish,
10690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * distribute, sub license, and/or sell copies of the Software, and to
11690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * permit persons to whom the Software is furnished to do so, subject to
12690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * the following conditions:
13690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
14690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * The above copyright notice and this permission notice (including the
15690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * next paragraph) shall be included in all copies or substantial portions
16690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * of the Software.
17690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
18690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
26690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul **************************************************************************/
27690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
28e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul/**
29e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul * Post-transform vertex format info.  The vertex_info struct is used by
30e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul * the draw_vbuf code to emit hardware-specific vertex layouts into hw
31e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul * vertex buffers.
32e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul *
33e9c6c31651a0c1884633168adfd3ea6797fbdc60Brian Paul * Author:
34690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *    Brian Paul
35690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul */
36690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
37690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
38690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul#ifndef DRAW_VERTEX_H
39690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul#define DRAW_VERTEX_H
40690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
41690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
4206f198285dd1de8aa122a33413f01b573d47b8b6José Fonseca#include "pipe/p_compiler.h"
43c344bda34dcbc1731573edc94de0c20549557adfBrian Paul#include "pipe/p_state.h"
4406f198285dd1de8aa122a33413f01b573d47b8b6José Fonseca#include "util/u_debug.h"
45c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
46c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
472e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
482549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul * Vertex attribute emit modes
492e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul */
502549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paulenum attrib_emit {
512549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_OMIT,      /**< don't emit the attribute */
522549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F,
532549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F_PSIZE,  /**< insert constant point size */
542549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_2F,
552549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_3F,
562549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_4F,
57fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   EMIT_4UB, /**< is RGBA like the rest */
58fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   EMIT_4UB_BGRA
59a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin};
60690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
61690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
622e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
632e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul * Attribute interpolation mode
642e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul */
65a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusinenum interp_mode {
66942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_NONE,      /**< never interpolate vertex header info */
676000dcc973cdc1bd61621b432aed27d21059ae5dBrian Paul   INTERP_POS,       /**< special case for frag position */
68942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_CONSTANT,
69942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_LINEAR,
70942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_PERSPECTIVE
71a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin};
72942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul
73942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul
74086734502a614e7778533018846ee66a66df9821Brian Paul/**
75cd3643698eafa0869a8317b002e5b066de0172e7Brian Paul * Information about hardware/rasterization vertex layout.
76086734502a614e7778533018846ee66a66df9821Brian Paul */
77690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paulstruct vertex_info
78690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul{
79690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint num_attribs;
80d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian Paul   uint hwfmt[4];      /**< hardware format info for this format */
81690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint size;          /**< total vertex size in dwords */
8253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
8353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   /* Keep this small and at the end of the struct to allow quick
8453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell    * memcmp() comparisons.
8553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell    */
8653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   struct {
8772f993b5b11174c2917af29ef7a86e7866d681fbJosé Fonseca      unsigned interp_mode:4;      /**< INTERP_x */
8872f993b5b11174c2917af29ef7a86e7866d681fbJosé Fonseca      unsigned emit:4;             /**< EMIT_x */
8972f993b5b11174c2917af29ef7a86e7866d681fbJosé Fonseca      unsigned src_index:8;          /**< map to post-xform attribs */
9053d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   } attrib[PIPE_MAX_SHADER_INPUTS];
91690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul};
92690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
93079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonsecastatic INLINE size_t
9453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_size( const struct vertex_info *a )
9553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
96079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   return offsetof(const struct vertex_info, attrib[a->num_attribs]);
9753d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
9853d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
999b827018133868e84ddc0998a5b5387584c7478cMichal Krolstatic INLINE int
10053d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_compare( const struct vertex_info *a,
10153d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                    const struct vertex_info *b )
10253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
103079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   size_t sizea = draw_vinfo_size( a );
10453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   return memcmp( a, b, sizea );
10553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
10653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
1079b827018133868e84ddc0998a5b5387584c7478cMichal Krolstatic INLINE void
10853d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_copy( struct vertex_info *dst,
10953d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                 const struct vertex_info *src )
11053d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
111079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   size_t size = draw_vinfo_size( src );
11253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   memcpy( dst, src, size );
11353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
11453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
115690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
116690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
117898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul/**
118898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * Add another attribute to the given vertex_info object.
119382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul * \param src_index  indicates which post-transformed vertex attrib slot
120382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul *                   corresponds to this attribute.
121898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * \return slot in which the attribute was added
122898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul */
123898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paulstatic INLINE uint
124674d0130693f827ae9ea8e902a38c46d64444384Brian Pauldraw_emit_vertex_attr(struct vertex_info *vinfo,
12553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                      enum attrib_emit emit,
12653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                      enum interp_mode interp, /* only used by softpipe??? */
127382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul                      uint src_index)
128898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul{
129898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   const uint n = vinfo->num_attribs;
130c344bda34dcbc1731573edc94de0c20549557adfBrian Paul   assert(n < PIPE_MAX_SHADER_INPUTS);
13153d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   vinfo->attrib[n].emit = emit;
13253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   vinfo->attrib[n].interp_mode = interp;
13353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   vinfo->attrib[n].src_index = src_index;
134898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   vinfo->num_attribs++;
135898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   return n;
136898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul}
137898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
138898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
1392e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paulextern void draw_compute_vertex_size(struct vertex_info *vinfo);
140898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
14168a7cb21fa14eac9e38bf398623739a892cc0d52Keith Whitwellvoid draw_dump_emitted_vertex(const struct vertex_info *vinfo,
14268a7cb21fa14eac9e38bf398623739a892cc0d52Keith Whitwell                              const uint8_t *data);
143874b9265601fcc05b1e32e2be029f3ac6a966c97Keith Whitwell
1447b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
14584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantzstatic INLINE unsigned draw_translate_vinfo_format(enum attrib_emit emit)
1467b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell{
14784a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   switch (emit) {
14884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_OMIT:
14984a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return PIPE_FORMAT_NONE;
1507b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_1F:
1517b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_1F_PSIZE:
1527b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32_FLOAT;
1537b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_2F:
1547b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32_FLOAT;
1557b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_3F:
1567b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32B32_FLOAT;
1577b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_4F:
1587b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32B32A32_FLOAT;
1597b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_4UB:
1607b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R8G8B8A8_UNORM;
161fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   case EMIT_4UB_BGRA:
162fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      return PIPE_FORMAT_B8G8R8A8_UNORM;
1637b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   default:
16484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      assert(!"unexpected format");
1657b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_NONE;
1667b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   }
1677b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell}
1687b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
16984a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantzstatic INLINE unsigned draw_translate_vinfo_size(enum attrib_emit emit)
17084a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz{
17184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   switch (emit) {
17284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_OMIT:
17384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 0;
17484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_1F:
17584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_1F_PSIZE:
17684a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 1 * sizeof(float);
17784a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_2F:
17884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 2 * sizeof(float);
17984a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_3F:
18084a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 3 * sizeof(float);
18184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_4F:
18284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 4 * sizeof(float);
18384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_4UB:
18484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 4 * sizeof(unsigned char);
185fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   case EMIT_4UB_BGRA:
186fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      return 4 * sizeof(unsigned char);
18784a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   default:
18884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      assert(!"unexpected format");
18984a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 0;
19084a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   }
19184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz}
1927b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
193690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul#endif /* DRAW_VERTEX_H */
194