draw_vertex.h revision e9c6c31651a0c1884633168adfd3ea6797fbdc60
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
42c344bda34dcbc1731573edc94de0c20549557adfBrian Paul#include "pipe/p_state.h"
43c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
44c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
452e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
462549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul * Vertex attribute emit modes
472e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul */
482549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paulenum attrib_emit {
492549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_OMIT,      /**< don't emit the attribute */
502549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_ALL,       /**< emit whole post-xform vertex, w/ header */
512549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F,
522549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F_PSIZE,  /**< insert constant point size */
532549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_2F,
542549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_3F,
552549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_4F,
562549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_4UB  /**< XXX may need variations for RGBA vs BGRA, etc */
57a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin};
58690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
59690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
602e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
612e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul * Attribute interpolation mode
622e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul */
63a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusinenum interp_mode {
64942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_NONE,      /**< never interpolate vertex header info */
656000dcc973cdc1bd61621b432aed27d21059ae5dBrian Paul   INTERP_POS,       /**< special case for frag position */
66942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_CONSTANT,
67942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_LINEAR,
68942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul   INTERP_PERSPECTIVE
69a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin};
70942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul
71942b9bc5bc13d959baa86779a7c669cf96659b9aBrian Paul
72086734502a614e7778533018846ee66a66df9821Brian Paul/**
73cd3643698eafa0869a8317b002e5b066de0172e7Brian Paul * Information about hardware/rasterization vertex layout.
74086734502a614e7778533018846ee66a66df9821Brian Paul */
75690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paulstruct vertex_info
76690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul{
77690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint num_attribs;
78d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian Paul   uint hwfmt[4];      /**< hardware format info for this format */
79c344bda34dcbc1731573edc94de0c20549557adfBrian Paul   enum interp_mode interp_mode[PIPE_MAX_SHADER_INPUTS];
80c344bda34dcbc1731573edc94de0c20549557adfBrian Paul   enum attrib_emit emit[PIPE_MAX_SHADER_INPUTS];   /**< EMIT_x */
81c344bda34dcbc1731573edc94de0c20549557adfBrian Paul   uint src_index[PIPE_MAX_SHADER_INPUTS]; /**< map to post-xform attribs */
82690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint size;          /**< total vertex size in dwords */
83690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul};
84690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
85690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
86690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
87898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul/**
88898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * Add another attribute to the given vertex_info object.
89382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul * \param src_index  indicates which post-transformed vertex attrib slot
90382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul *                   corresponds to this attribute.
91898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * \return slot in which the attribute was added
92898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul */
93898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paulstatic INLINE uint
94674d0130693f827ae9ea8e902a38c46d64444384Brian Pauldraw_emit_vertex_attr(struct vertex_info *vinfo,
952549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul                      enum attrib_emit emit, enum interp_mode interp,
96382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul                      uint src_index)
97898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul{
98898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   const uint n = vinfo->num_attribs;
99c344bda34dcbc1731573edc94de0c20549557adfBrian Paul   assert(n < PIPE_MAX_SHADER_INPUTS);
1002549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   vinfo->emit[n] = emit;
101898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   vinfo->interp_mode[n] = interp;
102382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul   vinfo->src_index[n] = src_index;
103898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   vinfo->num_attribs++;
104898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   return n;
105898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul}
106898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
107898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
1082e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paulextern void draw_compute_vertex_size(struct vertex_info *vinfo);
109898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
110874b9265601fcc05b1e32e2be029f3ac6a966c97Keith Whitwell
111690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul#endif /* DRAW_VERTEX_H */
112