1690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul/**************************************************************************
2690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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"
45183e122bdfe27f875c3c121964484dae9587c051Marek Olšák#include "util/u_memory.h"
46c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
47afa035031ff9e0c07a2297d864e46c76f7bfff58Roland Scheidegger#define DRAW_ATTR_NONEXIST 255
48c344bda34dcbc1731573edc94de0c20549557adfBrian Paul
492e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
502549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul * Vertex attribute emit modes
512e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul */
522549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paulenum attrib_emit {
532549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_OMIT,      /**< don't emit the attribute */
542549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F,
552549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_1F_PSIZE,  /**< insert constant point size */
562549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_2F,
572549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_3F,
582549d79ae5342a2b97c06e3b0db9da6eb7821d2eBrian Paul   EMIT_4F,
59fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   EMIT_4UB, /**< is RGBA like the rest */
60fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   EMIT_4UB_BGRA
61a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin};
62690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
63690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
642e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paul/**
65cd3643698eafa0869a8317b002e5b066de0172e7Brian Paul * Information about hardware/rasterization vertex layout.
66086734502a614e7778533018846ee66a66df9821Brian Paul */
67690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paulstruct vertex_info
68690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul{
69690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint num_attribs;
70d8b16d416de95daa4f0ede9b839bdbf0fa6bf1b1Brian Paul   uint hwfmt[4];      /**< hardware format info for this format */
71690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul   uint size;          /**< total vertex size in dwords */
7253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
7353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   /* Keep this small and at the end of the struct to allow quick
7453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell    * memcmp() comparisons.
7553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell    */
7653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   struct {
772dbc20e45689e09766552517a74e2270e49817b5Roland Scheidegger      unsigned emit:8;             /**< EMIT_x */
7872f993b5b11174c2917af29ef7a86e7866d681fbJosé Fonseca      unsigned src_index:8;          /**< map to post-xform attribs */
79183e122bdfe27f875c3c121964484dae9587c051Marek Olšák   } attrib[PIPE_MAX_SHADER_OUTPUTS];
80690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul};
81690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
82a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline size_t
8353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_size( const struct vertex_info *a )
8453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
85079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   return offsetof(const struct vertex_info, attrib[a->num_attribs]);
8653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
8753d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
88a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int
8953d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_compare( const struct vertex_info *a,
9053d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                    const struct vertex_info *b )
9153d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
92079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   size_t sizea = draw_vinfo_size( a );
9353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   return memcmp( a, b, sizea );
9453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
9553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
96a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
9753d4706c6c0922160f310834daaec5718ff1c511Keith Whitwelldraw_vinfo_copy( struct vertex_info *dst,
9853d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                 const struct vertex_info *src )
9953d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell{
100079be0fd3f1d0f52f26a95756809ac4a2325ccb1José Fonseca   size_t size = draw_vinfo_size( src );
10153d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   memcpy( dst, src, size );
10253d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell}
10353d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell
104690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
105690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul
106898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul/**
107898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * Add another attribute to the given vertex_info object.
108382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul * \param src_index  indicates which post-transformed vertex attrib slot
109382b86e90f69fa0493fae3c7e5c9cd482984af8fBrian Paul *                   corresponds to this attribute.
110898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul * \return slot in which the attribute was added
111898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul */
112a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint
113674d0130693f827ae9ea8e902a38c46d64444384Brian Pauldraw_emit_vertex_attr(struct vertex_info *vinfo,
11453d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell                      enum attrib_emit emit,
1154b5595b38b3884531624fab6def7c604e92d0914Zack Rusin                      int src_index)
116898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul{
117898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   const uint n = vinfo->num_attribs;
118978d5ed06bfc3d87a4b1ca1981caeeaa88de2790Zack Rusin
119978d5ed06bfc3d87a4b1ca1981caeeaa88de2790Zack Rusin   /* If the src_index is negative, meaning it hasn't been found
120afa035031ff9e0c07a2297d864e46c76f7bfff58Roland Scheidegger    * we'll assign it all zeros later - set to DRAW_ATTR_NONEXIST */
121978d5ed06bfc3d87a4b1ca1981caeeaa88de2790Zack Rusin   if (src_index < 0) {
122afa035031ff9e0c07a2297d864e46c76f7bfff58Roland Scheidegger      src_index = DRAW_ATTR_NONEXIST;
123978d5ed06bfc3d87a4b1ca1981caeeaa88de2790Zack Rusin   }
124978d5ed06bfc3d87a4b1ca1981caeeaa88de2790Zack Rusin
125489df4a71aca99b2eebc62c02215a5860def944dBrian Paul   assert(n < ARRAY_SIZE(vinfo->attrib));
12653d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   vinfo->attrib[n].emit = emit;
12753d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell   vinfo->attrib[n].src_index = src_index;
128898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   vinfo->num_attribs++;
129898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul   return n;
130898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul}
131898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
132898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
1332e21058e3d2c484b282cbc0bb5e7169b9a8d4fc7Brian Paulextern void draw_compute_vertex_size(struct vertex_info *vinfo);
134898d68a3762f84f0d435cda2f6aafddd356d1788Brian Paul
13568a7cb21fa14eac9e38bf398623739a892cc0d52Keith Whitwellvoid draw_dump_emitted_vertex(const struct vertex_info *vinfo,
13668a7cb21fa14eac9e38bf398623739a892cc0d52Keith Whitwell                              const uint8_t *data);
137874b9265601fcc05b1e32e2be029f3ac6a966c97Keith Whitwell
1387b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
139a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline enum pipe_format draw_translate_vinfo_format(enum attrib_emit emit)
1407b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell{
14184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   switch (emit) {
14284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_OMIT:
14384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return PIPE_FORMAT_NONE;
1447b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_1F:
1457b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_1F_PSIZE:
1467b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32_FLOAT;
1477b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_2F:
1487b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32_FLOAT;
1497b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_3F:
1507b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32B32_FLOAT;
1517b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_4F:
1527b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R32G32B32A32_FLOAT;
1537b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   case EMIT_4UB:
1547b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_R8G8B8A8_UNORM;
155fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   case EMIT_4UB_BGRA:
156fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      return PIPE_FORMAT_B8G8R8A8_UNORM;
1577b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   default:
15884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      assert(!"unexpected format");
1597b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell      return PIPE_FORMAT_NONE;
1607b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell   }
1617b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell}
1627b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
163a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned draw_translate_vinfo_size(enum attrib_emit emit)
16484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz{
16584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   switch (emit) {
16684a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_OMIT:
16784a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 0;
16884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_1F:
16984a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_1F_PSIZE:
17084a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 1 * sizeof(float);
17184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_2F:
17284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 2 * sizeof(float);
17384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_3F:
17484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 3 * sizeof(float);
17584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_4F:
17684a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 4 * sizeof(float);
17784a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   case EMIT_4UB:
17884a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 4 * sizeof(unsigned char);
179fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz   case EMIT_4UB_BGRA:
180fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      return 4 * sizeof(unsigned char);
18184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   default:
18284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      assert(!"unexpected format");
18384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      return 0;
18484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz   }
18584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz}
1867b85ea19de09d4e7e077ca147528e90e52683690Keith Whitwell
187690a9de40b20092ae9027dc52d7b26a48995bbffBrian Paul#endif /* DRAW_VERTEX_H */
188