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