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