1c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell/**************************************************************************
2c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
3c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * All Rights Reserved.
5c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
6c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
7c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * copy of this software and associated documentation files (the
8c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * "Software"), to deal in the Software without restriction, including
9c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * the following conditions:
13c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
14c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * The above copyright notice and this permission notice (including the
15c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * of the Software.
17c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
18c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
26c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell **************************************************************************/
27c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
28c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell /*
29c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell  * Authors:
30c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell  *   Keith Whitwell <keith@tungstengraphics.com>
31c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell  */
32c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
334f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
344b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca#include "util/u_format.h"
351acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák#include "util/u_half.h"
36fc431a58dc1446383edc11aec2a0b7de5b363e5eJosé Fonseca#include "util/u_math.h"
37c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell#include "pipe/p_state.h"
38c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell#include "translate.h"
39c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
40c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
41c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell#define DRAW_DBG 0
42c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
430a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšáktypedef void (*fetch_func)(void *dst,
444b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca                           const uint8_t *src,
454b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca                           unsigned i, unsigned j);
460a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšáktypedef void (*emit_func)(const void *attrib, void *ptr);
47c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
48c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
49c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
50c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstruct translate_generic {
51c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   struct translate translate;
52c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
53c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   struct {
54543b9566bdaa48fea2df1866fa1310c1cdbcde27Michal Krol      enum translate_element_type type;
55543b9566bdaa48fea2df1866fa1310c1cdbcde27Michal Krol
56c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      fetch_func fetch;
57c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      unsigned buffer;
58c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      unsigned input_offset;
597ca0ce38340144794267609646048b3820d594abMichal Krol      unsigned instance_divisor;
60c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
61c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      emit_func emit;
62c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      unsigned output_offset;
63c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
644b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca      const uint8_t *input_ptr;
65c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      unsigned input_stride;
66fc431a58dc1446383edc11aec2a0b7de5b363e5eJosé Fonseca      unsigned max_index;
67c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
68ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      /* this value is set to -1 if this is a normal element with output_format != input_format:
69ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri       * in this case, u_format is used to do a full conversion
70ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri       *
71ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri       * this value is set to the format size in bytes if output_format == input_format or for 32-bit instance ids:
72ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri       * in this case, memcpy is used to copy this amount of bytes
73ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri       */
74ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      int copy_size;
75ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri
76c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   } attrib[PIPE_MAX_ATTRIBS];
77c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
78c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   unsigned nr_attrib;
79c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell};
80c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
81c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
82c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstatic struct translate_generic *translate_generic( struct translate *translate )
83c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
84c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   return (struct translate_generic *)translate;
85c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
86c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
87c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell/**
880a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák * Fetch a dword[4] vertex attribute from memory, doing format/type
89c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * conversion as needed.
90c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell *
91c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * This is probably needed/dupliocated elsewhere, eg format
92c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * conversion, texture sampling etc.
93c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell */
940a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák#define ATTRIB( NAME, SZ, SRCTYPE, DSTTYPE, TO )        \
95c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstatic void						\
960a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákemit_##NAME(const void *attrib, void *ptr)		\
97c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{  \
98c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   unsigned i;						\
990a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   SRCTYPE *in = (SRCTYPE *)attrib;                     \
1000a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   DSTTYPE *out = (DSTTYPE *)ptr;			\
101c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell							\
102c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   for (i = 0; i < SZ; i++) {				\
1030a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      out[i] = TO(in[i]);				\
104c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   }							\
105c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
106c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
107c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
108fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_64_FLOAT(x)   ((double) x)
109fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_32_FLOAT(x)   (x)
1101acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák#define TO_16_FLOAT(x)   util_float_to_half(x)
111c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
112fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_8_USCALED(x)  ((unsigned char) x)
113fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_16_USCALED(x) ((unsigned short) x)
114fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_32_USCALED(x) ((unsigned int) x)
115c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
116fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_8_SSCALED(x)  ((char) x)
117fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_16_SSCALED(x) ((short) x)
118fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_32_SSCALED(x) ((int) x)
119c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
120fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_8_UNORM(x)    ((unsigned char) (x * 255.0f))
121fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_16_UNORM(x)   ((unsigned short) (x * 65535.0f))
122fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_32_UNORM(x)   ((unsigned int) (x * 4294967295.0f))
123c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
124fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_8_SNORM(x)    ((char) (x * 127.0f))
125fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_16_SNORM(x)   ((short) (x * 32767.0f))
126fd6acabd2f62fe006b078ae7640a944c7f65903cJosé Fonseca#define TO_32_SNORM(x)   ((int) (x * 2147483647.0f))
127c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
12889e9d6b6db933c870443714c3d7c9539d117cddfBrian Paul#define TO_32_FIXED(x)   ((int) (x * 65536.0f))
12989e9d6b6db933c870443714c3d7c9539d117cddfBrian Paul
1300a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák#define TO_INT(x)        (x)
1310a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1320a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1330a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R64G64B64A64_FLOAT,   4, float, double, TO_64_FLOAT )
1340a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R64G64B64_FLOAT,      3, float, double, TO_64_FLOAT )
1350a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R64G64_FLOAT,         2, float, double, TO_64_FLOAT )
1360a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R64_FLOAT,            1, float, double, TO_64_FLOAT )
1370a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1380a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_FLOAT,   4, float, float, TO_32_FLOAT )
1390a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_FLOAT,      3, float, float, TO_32_FLOAT )
1400a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_FLOAT,         2, float, float, TO_32_FLOAT )
1410a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_FLOAT,            1, float, float, TO_32_FLOAT )
1420a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1430a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_FLOAT,   4, float, ushort, TO_16_FLOAT )
1440a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_FLOAT,      3, float, ushort, TO_16_FLOAT )
1450a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_FLOAT,         2, float, ushort, TO_16_FLOAT )
1460a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_FLOAT,            1, float, ushort, TO_16_FLOAT )
1470a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1480a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_USCALED, 4, float, unsigned, TO_32_USCALED )
1490a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_USCALED,    3, float, unsigned, TO_32_USCALED )
1500a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_USCALED,       2, float, unsigned, TO_32_USCALED )
1510a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_USCALED,          1, float, unsigned, TO_32_USCALED )
1520a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1530a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_SSCALED, 4, float, int, TO_32_SSCALED )
1540a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_SSCALED,    3, float, int, TO_32_SSCALED )
1550a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_SSCALED,       2, float, int, TO_32_SSCALED )
1560a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_SSCALED,          1, float, int, TO_32_SSCALED )
1570a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1580a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_UNORM, 4, float, unsigned, TO_32_UNORM )
1590a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_UNORM,    3, float, unsigned, TO_32_UNORM )
1600a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_UNORM,       2, float, unsigned, TO_32_UNORM )
1610a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_UNORM,          1, float, unsigned, TO_32_UNORM )
1620a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1630a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_SNORM, 4, float, int, TO_32_SNORM )
1640a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_SNORM,    3, float, int, TO_32_SNORM )
1650a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_SNORM,       2, float, int, TO_32_SNORM )
1660a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_SNORM,          1, float, int, TO_32_SNORM )
1670a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1680a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_USCALED, 4, float, ushort, TO_16_USCALED )
1690a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_USCALED,    3, float, ushort, TO_16_USCALED )
1700a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_USCALED,       2, float, ushort, TO_16_USCALED )
1710a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_USCALED,          1, float, ushort, TO_16_USCALED )
1720a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1730a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_SSCALED, 4, float, short, TO_16_SSCALED )
1740a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_SSCALED,    3, float, short, TO_16_SSCALED )
1750a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_SSCALED,       2, float, short, TO_16_SSCALED )
1760a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_SSCALED,          1, float, short, TO_16_SSCALED )
1770a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1780a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_UNORM, 4, float, ushort, TO_16_UNORM )
1790a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_UNORM,    3, float, ushort, TO_16_UNORM )
1800a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_UNORM,       2, float, ushort, TO_16_UNORM )
1810a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_UNORM,          1, float, ushort, TO_16_UNORM )
1820a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1830a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_SNORM, 4, float, short, TO_16_SNORM )
1840a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_SNORM,    3, float, short, TO_16_SNORM )
1850a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_SNORM,       2, float, short, TO_16_SNORM )
1860a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_SNORM,          1, float, short, TO_16_SNORM )
1870a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1880a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_USCALED,   4, float, ubyte, TO_8_USCALED )
1890a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_USCALED,     3, float, ubyte, TO_8_USCALED )
1900a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_USCALED,       2, float, ubyte, TO_8_USCALED )
1910a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_USCALED,         1, float, ubyte, TO_8_USCALED )
1920a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1930a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_SSCALED,  4, float, char, TO_8_SSCALED )
1940a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_SSCALED,    3, float, char, TO_8_SSCALED )
1950a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_SSCALED,      2, float, char, TO_8_SSCALED )
1960a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_SSCALED,        1, float, char, TO_8_SSCALED )
1970a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
1980a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_UNORM,  4, float, ubyte, TO_8_UNORM )
1990a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_UNORM,    3, float, ubyte, TO_8_UNORM )
2000a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_UNORM,      2, float, ubyte, TO_8_UNORM )
2010a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_UNORM,        1, float, ubyte, TO_8_UNORM )
2020a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2030a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_SNORM,  4, float, char, TO_8_SNORM )
2040a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_SNORM,    3, float, char, TO_8_SNORM )
2050a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_SNORM,      2, float, char, TO_8_SNORM )
2060a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_SNORM,        1, float, char, TO_8_SNORM )
2070a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2080a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_UINT, 4, uint32_t, unsigned, TO_INT )
2090a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_UINT,    3, uint32_t, unsigned, TO_INT )
2100a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_UINT,       2, uint32_t, unsigned, TO_INT )
2110a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_UINT,          1, uint32_t, unsigned, TO_INT )
2120a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2130a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_UINT, 4, uint32_t, ushort, TO_INT )
2140a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_UINT,    3, uint32_t, ushort, TO_INT )
2150a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_UINT,       2, uint32_t, ushort, TO_INT )
2160a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_UINT,          1, uint32_t, ushort, TO_INT )
2170a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2180a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_UINT,   4, uint32_t, ubyte, TO_INT )
2190a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_UINT,     3, uint32_t, ubyte, TO_INT )
2200a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_UINT,       2, uint32_t, ubyte, TO_INT )
2210a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_UINT,         1, uint32_t, ubyte, TO_INT )
2220a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2230a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32A32_SINT, 4, int32_t, int, TO_INT )
2240a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32B32_SINT,    3, int32_t, int, TO_INT )
2250a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32G32_SINT,       2, int32_t, int, TO_INT )
2260a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R32_SINT,          1, int32_t, int, TO_INT )
2270a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2280a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16A16_SINT, 4, int32_t, short, TO_INT )
2290a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16B16_SINT,    3, int32_t, short, TO_INT )
2300a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16G16_SINT,       2, int32_t, short, TO_INT )
2310a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R16_SINT,          1, int32_t, short, TO_INT )
2320a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
2330a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8A8_SINT,   4, int32_t, char, TO_INT )
2340a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8B8_SINT,     3, int32_t, char, TO_INT )
2350a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8G8_SINT,       2, int32_t, char, TO_INT )
2360a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek OlšákATTRIB( R8_SINT,         1, int32_t, char, TO_INT )
2374b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca
238684aeb366fb72a2dbf9dd7a0803f29880858cd06Luca Barbieristatic void
2390a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákemit_A8R8G8B8_UNORM( const void *attrib, void *ptr)
240684aeb366fb72a2dbf9dd7a0803f29880858cd06Luca Barbieri{
2410a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   float *in = (float *)attrib;
242684aeb366fb72a2dbf9dd7a0803f29880858cd06Luca Barbieri   ubyte *out = (ubyte *)ptr;
2430a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[0] = TO_8_UNORM(in[3]);
2440a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[1] = TO_8_UNORM(in[0]);
2450a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[2] = TO_8_UNORM(in[1]);
2460a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[3] = TO_8_UNORM(in[2]);
247684aeb366fb72a2dbf9dd7a0803f29880858cd06Luca Barbieri}
248c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
249c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstatic void
2500a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákemit_B8G8R8A8_UNORM( const void *attrib, void *ptr)
251c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
2520a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   float *in = (float *)attrib;
253c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   ubyte *out = (ubyte *)ptr;
2540a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[2] = TO_8_UNORM(in[0]);
2550a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[1] = TO_8_UNORM(in[1]);
2560a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[0] = TO_8_UNORM(in[2]);
2570a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   out[3] = TO_8_UNORM(in[3]);
258c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
259c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
260d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
261d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_B10G10R10A2_UNORM( const void *attrib, void *ptr )
262d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
263d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
264d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
265d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)(CLAMP(src[2], 0, 1) * 0x3ff)) & 0x3ff;
266d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)(CLAMP(src[1], 0, 1) * 0x3ff)) & 0x3ff) << 10;
267d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)(CLAMP(src[0], 0, 1) * 0x3ff)) & 0x3ff) << 20;
268d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)(CLAMP(src[3], 0, 1) * 0x3)) << 30;
269d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
270d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
271d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
272d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
273d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
274d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
275d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
276d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_B10G10R10A2_USCALED( const void *attrib, void *ptr )
277d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
278d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
279d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
280d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff;
281d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
282d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff) << 20;
283d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)CLAMP(src[3], 0, 3)) << 30;
284d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
285d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
286d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
287d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
288d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
289d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
290d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
291d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_B10G10R10A2_SNORM( const void *attrib, void *ptr )
292d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
293d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
294d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
295d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)(CLAMP(src[2], -1, 1) * 0x1ff)) & 0x3ff) ;
296d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)(CLAMP(src[1], -1, 1) * 0x1ff)) & 0x3ff) << 10) ;
297d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)(CLAMP(src[0], -1, 1) * 0x1ff)) & 0x3ff) << 20) ;
298d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)(CLAMP(src[3], -1, 1) * 0x1)) << 30) ;
299d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
300d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
301d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
302d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
303d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
304d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
305d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
306d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_B10G10R10A2_SSCALED( const void *attrib, void *ptr )
307d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
308d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
309d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
310d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) ;
311d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
312d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) << 20) ;
313d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
314d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
315d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
316d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
317d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
318d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
319d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
320d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
321d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_R10G10B10A2_UNORM( const void *attrib, void *ptr )
322d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
323d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
324d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
325d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)(CLAMP(src[0], 0, 1) * 0x3ff)) & 0x3ff;
326d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)(CLAMP(src[1], 0, 1) * 0x3ff)) & 0x3ff) << 10;
327d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)(CLAMP(src[2], 0, 1) * 0x3ff)) & 0x3ff) << 20;
328d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)(CLAMP(src[3], 0, 1) * 0x3)) << 30;
329d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
330d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
331d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
332d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
333d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
334d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
335d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
336d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_R10G10B10A2_USCALED( const void *attrib, void *ptr )
337d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
338d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
339d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
340d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff;
341d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
342d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff) << 20;
343d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= ((uint32_t)CLAMP(src[3], 0, 3)) << 30;
344d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
345d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
346d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
347d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
348d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
349d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
350d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
351d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_R10G10B10A2_SNORM( const void *attrib, void *ptr )
352d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
353d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
354d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
355d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)(CLAMP(src[0], -1, 1) * 0x1ff)) & 0x3ff) ;
356d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)(CLAMP(src[1], -1, 1) * 0x1ff)) & 0x3ff) << 10) ;
357d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)(CLAMP(src[2], -1, 1) * 0x1ff)) & 0x3ff) << 20) ;
358d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)(CLAMP(src[3], -1, 1) * 0x1)) << 30) ;
359d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
360d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
361d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
362d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
363d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
364d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
365d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákstatic void
366d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšákemit_R10G10B10A2_SSCALED( const void *attrib, void *ptr)
367d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák{
368d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   float *src = (float *)ptr;
369d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   uint32_t value = 0;
370d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) ;
371d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
372d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)((((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) << 20) ;
373d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value |= (uint32_t)(((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
374d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN
375d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   value = util_bswap32(value);
376d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák#endif
377d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   *(uint32_t *)attrib = value;
378d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák}
379d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
3805266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieristatic void
3810a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákemit_NULL( const void *attrib, void *ptr )
3825266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri{
3835266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri   /* do nothing is the only sensible option */
3845266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri}
3855266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri
386c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstatic emit_func get_emit_func( enum pipe_format format )
387c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
388c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   switch (format) {
389c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R64_FLOAT:
39055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R64_FLOAT;
391c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R64G64_FLOAT:
39255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R64G64_FLOAT;
393c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R64G64B64_FLOAT:
39455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R64G64B64_FLOAT;
395c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R64G64B64A64_FLOAT:
39655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R64G64B64A64_FLOAT;
397c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
398c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32_FLOAT:
39955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32_FLOAT;
400c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32_FLOAT:
40155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32_FLOAT;
402c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32_FLOAT:
40355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32_FLOAT;
404c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32A32_FLOAT:
40555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32A32_FLOAT;
406c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
4071acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16_FLOAT:
4081acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák      return &emit_R16_FLOAT;
4091acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16_FLOAT:
4101acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák      return &emit_R16G16_FLOAT;
4111acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16B16_FLOAT:
4121acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák      return &emit_R16G16B16_FLOAT;
4131acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16B16A16_FLOAT:
4141acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák      return &emit_R16G16B16A16_FLOAT;
4151acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák
416c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32_UNORM:
41755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32_UNORM;
418c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32_UNORM:
41955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32_UNORM;
420c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32_UNORM:
42155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32_UNORM;
422c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32A32_UNORM:
42355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32A32_UNORM;
424c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
425c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32_USCALED:
42655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32_USCALED;
427c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32_USCALED:
42855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32_USCALED;
429c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32_USCALED:
43055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32_USCALED;
431c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32A32_USCALED:
43255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32A32_USCALED;
433c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
434c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32_SNORM:
43555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32_SNORM;
436c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32_SNORM:
43755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32_SNORM;
438c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32_SNORM:
43955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32_SNORM;
440c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32A32_SNORM:
44155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32A32_SNORM;
442c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
443c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32_SSCALED:
44455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32_SSCALED;
445c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32_SSCALED:
44655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32_SSCALED;
447c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32_SSCALED:
44855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32_SSCALED;
449c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R32G32B32A32_SSCALED:
45055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R32G32B32A32_SSCALED;
451c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
452c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16_UNORM:
45355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16_UNORM;
454c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16_UNORM:
45555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16_UNORM;
456c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16_UNORM:
45755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16_UNORM;
458c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16A16_UNORM:
45955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16A16_UNORM;
460c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
461c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16_USCALED:
46255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16_USCALED;
463c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16_USCALED:
46455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16_USCALED;
465c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16_USCALED:
46655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16_USCALED;
467c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16A16_USCALED:
46855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16A16_USCALED;
469c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
470c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16_SNORM:
47155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16_SNORM;
472c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16_SNORM:
47355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16_SNORM;
474c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16_SNORM:
47555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16_SNORM;
476c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16A16_SNORM:
47755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16A16_SNORM;
478c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
479c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16_SSCALED:
48055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16_SSCALED;
481c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16_SSCALED:
48255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16_SSCALED;
483c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16_SSCALED:
48455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16_SSCALED;
485c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R16G16B16A16_SSCALED:
48655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R16G16B16A16_SSCALED;
487c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
488c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8_UNORM:
48955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8_UNORM;
490c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8_UNORM:
49155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8_UNORM;
492c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8_UNORM:
49355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8_UNORM;
494c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8A8_UNORM:
49555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8A8_UNORM;
496c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
497c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8_USCALED:
49855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8_USCALED;
499c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8_USCALED:
50055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8_USCALED;
501c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8_USCALED:
50255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8_USCALED;
503c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8A8_USCALED:
50455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8A8_USCALED;
505c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
506c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8_SNORM:
50755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8_SNORM;
508c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8_SNORM:
50955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8_SNORM;
510c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8_SNORM:
51155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8_SNORM;
512c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8A8_SNORM:
51355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8A8_SNORM;
514c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
515c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8_SSCALED:
51655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8_SSCALED;
517c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8_SSCALED:
51855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8_SSCALED;
519c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8_SSCALED:
52055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8_SSCALED;
521c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   case PIPE_FORMAT_R8G8B8A8_SSCALED:
52255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca      return &emit_R8G8B8A8_SSCALED;
523c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
524a48975347126aacf3a82a5b3e3c69bffd491020aJosé Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
525c16d04bd2939154c0360f1ac51fe61a86e5dd9e5Marek Olšák      return &emit_B8G8R8A8_UNORM;
526c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
527a48975347126aacf3a82a5b3e3c69bffd491020aJosé Fonseca   case PIPE_FORMAT_A8R8G8B8_UNORM:
528c16d04bd2939154c0360f1ac51fe61a86e5dd9e5Marek Olšák      return &emit_A8R8G8B8_UNORM;
529c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
5300a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32_UINT:
5310a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32_UINT;
5320a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32_UINT:
5330a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32_UINT;
5340a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32_UINT:
5350a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32B32_UINT;
5360a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32A32_UINT:
5370a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32B32A32_UINT;
5380a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
5390a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16_UINT:
5400a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16_UINT;
5410a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16_UINT:
5420a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16_UINT;
5430a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16_UINT:
5440a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16B16_UINT;
5450a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16A16_UINT:
5460a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16B16A16_UINT;
5470a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
5480a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8_UINT:
5490a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8_UINT;
5500a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8_UINT:
5510a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8_UINT;
5520a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8_UINT:
5530a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8B8_UINT;
5540a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8A8_UINT:
5550a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8B8A8_UINT;
5560a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
5570a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32_SINT:
5580a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32_SINT;
5590a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32_SINT:
5600a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32_SINT;
5610a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32_SINT:
5620a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32B32_SINT;
5630a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32A32_SINT:
5640a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R32G32B32A32_SINT;
5650a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
5660a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16_SINT:
5670a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16_SINT;
5680a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16_SINT:
5690a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16_SINT;
5700a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16_SINT:
5710a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16B16_SINT;
5720a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16A16_SINT:
5730a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R16G16B16A16_SINT;
5740a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
5750a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8_SINT:
5760a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8_SINT;
5770a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8_SINT:
5780a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8_SINT;
5790a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8_SINT:
5800a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8B8_SINT;
5810a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8A8_SINT:
5820a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      return &emit_R8G8B8A8_SINT;
5830a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
584d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_UNORM:
585d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_B10G10R10A2_UNORM;
586d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_USCALED:
587d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_B10G10R10A2_USCALED;
588d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_SNORM:
589d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_B10G10R10A2_SNORM;
590d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_SSCALED:
591d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_B10G10R10A2_SSCALED;
592d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
593d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_UNORM:
594d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_R10G10B10A2_UNORM;
595d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_USCALED:
596d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_R10G10B10A2_USCALED;
597d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_SNORM:
598d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_R10G10B10A2_SNORM;
599d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_SSCALED:
600d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák      return &emit_R10G10B10A2_SSCALED;
601d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
602c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   default:
6035266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri      assert(0);
6045266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri      return &emit_NULL;
605c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   }
606c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
607c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
6081cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieristatic ALWAYS_INLINE void PIPE_CDECL generic_run_one( struct translate_generic *tg,
6091cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                                         unsigned elt,
6101cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                                         unsigned instance_id,
6111cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                                         void *vert )
6121cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri{
6131cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri   unsigned nr_attrs = tg->nr_attrib;
6141cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri   unsigned attr;
6151cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6161cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri   for (attr = 0; attr < nr_attrs; attr++) {
6171cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      float data[4];
618ded92e5dd8eb39bf2a486a6ce95cbef595149582José Fonseca      uint8_t *dst = (uint8_t *)vert + tg->attrib[attr].output_offset;
6191cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6201cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      if (tg->attrib[attr].type == TRANSLATE_ELEMENT_NORMAL) {
6211cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         const uint8_t *src;
6221cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         unsigned index;
6231cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         int copy_size;
6241cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6251cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         if (tg->attrib[attr].instance_divisor) {
6261cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            index = instance_id / tg->attrib[attr].instance_divisor;
6278b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul            /* XXX we need to clamp the index here too, but to a
6288b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul             * per-array max value, not the draw->pt.max_index value
6298b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul             * that's being given to us via translate->set_buffer().
6308b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul             */
6311cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         }
6321cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         else {
6331cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            index = elt;
6348b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul            /* clamp to avoid going out of bounds */
6358b7f760f835f870b8f6af6c4d6613d44440f1dc5Brian Paul            index = MIN2(index, tg->attrib[attr].max_index);
6361cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         }
6371cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6381cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         src = tg->attrib[attr].input_ptr +
6391cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri               tg->attrib[attr].input_stride * index;
6401cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6411cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         copy_size = tg->attrib[attr].copy_size;
6421cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         if(likely(copy_size >= 0))
6431cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            memcpy(dst, src, copy_size);
6441cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         else
6451cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         {
6461cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            tg->attrib[attr].fetch( data, src, 0, 0 );
6471cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6481cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            if (0)
6491cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri               debug_printf("Fetch linear attr %d  from %p  stride %d  index %d: "
6501cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         " %f, %f, %f, %f \n",
6511cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         attr,
6521cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         tg->attrib[attr].input_ptr,
6531cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         tg->attrib[attr].input_stride,
6541cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         index,
6551cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri                         data[0], data[1],data[2], data[3]);
6561cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
6571cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            tg->attrib[attr].emit( data, dst );
6581cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         }
6591cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      } else {
6601cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         if(likely(tg->attrib[attr].copy_size >= 0))
6611cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            memcpy(data, &instance_id, 4);
6621cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         else
6631cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         {
6641cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            data[0] = (float)instance_id;
6651cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri            tg->attrib[attr].emit( data, dst );
6661cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri         }
6671cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      }
6681cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri   }
6691cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri}
6701cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri
671c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell/**
672c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell * Fetch vertex attributes for 'count' vertices.
673c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell */
674b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwellstatic void PIPE_CDECL generic_run_elts( struct translate *translate,
675b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                         const unsigned *elts,
676b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                         unsigned count,
6775007e39f76c897b8f3aa4acf6086c8b7ac30bdefMichal Krol                                         unsigned instance_id,
678b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                         void *output_buffer )
679c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
680c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   struct translate_generic *tg = translate_generic(translate);
681c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   char *vert = output_buffer;
682c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   unsigned i;
683c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
684c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   for (i = 0; i < count; i++) {
6851cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      generic_run_one(tg, *elts++, instance_id, vert);
686a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell      vert += tg->translate.key.output_stride;
687a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   }
688a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell}
689a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell
6904a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieristatic void PIPE_CDECL generic_run_elts16( struct translate *translate,
6914a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         const uint16_t *elts,
6924a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         unsigned count,
6934a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         unsigned instance_id,
6944a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         void *output_buffer )
6954a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri{
6964a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   struct translate_generic *tg = translate_generic(translate);
6974a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   char *vert = output_buffer;
6984a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   unsigned i;
6994a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri
7004a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   for (i = 0; i < count; i++) {
7014a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri      generic_run_one(tg, *elts++, instance_id, vert);
7024a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri      vert += tg->translate.key.output_stride;
7034a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   }
7044a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri}
7054a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri
7064a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieristatic void PIPE_CDECL generic_run_elts8( struct translate *translate,
7074a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         const uint8_t *elts,
7084a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         unsigned count,
7094a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         unsigned instance_id,
7104a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri                                         void *output_buffer )
7114a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri{
7124a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   struct translate_generic *tg = translate_generic(translate);
7134a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   char *vert = output_buffer;
7144a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   unsigned i;
7154a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri
7164a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   for (i = 0; i < count; i++) {
7174a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri      generic_run_one(tg, *elts++, instance_id, vert);
7184a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri      vert += tg->translate.key.output_stride;
7194a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   }
7204a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri}
7214a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri
722b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwellstatic void PIPE_CDECL generic_run( struct translate *translate,
723b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                    unsigned start,
724b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                    unsigned count,
7257ca0ce38340144794267609646048b3820d594abMichal Krol                                    unsigned instance_id,
726b5c8b3fba6ac90a0d83e02bfe432142f1adee9e5Keith Whitwell                                    void *output_buffer )
727a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell{
728a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   struct translate_generic *tg = translate_generic(translate);
729a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   char *vert = output_buffer;
730a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   unsigned i;
731a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell
732a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   for (i = 0; i < count; i++) {
7331cb92fb92e69b5b138293398a98665c2a3c63a5bLuca Barbieri      generic_run_one(tg, start + i, instance_id, vert);
734a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell      vert += tg->translate.key.output_stride;
735c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   }
736c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
737c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
738c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
739c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
740c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwellstatic void generic_set_buffer( struct translate *translate,
741c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell				unsigned buf,
742c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell				const void *ptr,
743fc431a58dc1446383edc11aec2a0b7de5b363e5eJosé Fonseca				unsigned stride,
744fc431a58dc1446383edc11aec2a0b7de5b363e5eJosé Fonseca				unsigned max_index )
745c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
746c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   struct translate_generic *tg = translate_generic(translate);
747c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   unsigned i;
748c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
749c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   for (i = 0; i < tg->nr_attrib; i++) {
750c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      if (tg->attrib[i].buffer == buf) {
7514b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca	 tg->attrib[i].input_ptr = ((const uint8_t *)ptr +
752c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell				    tg->attrib[i].input_offset);
753c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell	 tg->attrib[i].input_stride = stride;
754fc431a58dc1446383edc11aec2a0b7de5b363e5eJosé Fonseca         tg->attrib[i].max_index = max_index;
755c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      }
756c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   }
757c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
758c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
759c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
760a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwellstatic void generic_release( struct translate *translate )
761c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
762a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   /* Refcount?
763a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell    */
764c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   FREE(translate);
765c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
766c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
7670a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákstatic boolean
7680a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšákis_legal_int_format_combo( const struct util_format_description *src,
7690a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák                           const struct util_format_description *dst )
7700a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák{
7710a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   unsigned i;
7720a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   unsigned nr = MIN2(src->nr_channels, dst->nr_channels);
7730a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
7740a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   for (i = 0; i < nr; i++) {
7750a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      /* The signs must match. */
7767528e2104fdda88a9eca5d84d979a21f5c517dc9Vinson Lee      if (src->channel[i].type != dst->channel[i].type) {
7770a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         return FALSE;
7780a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      }
7790a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
7800a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      /* Integers must not lose precision at any point in the pipeline. */
7810a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      if (src->channel[i].size > dst->channel[i].size) {
7820a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         return FALSE;
7830a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      }
7840a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   }
7850a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   return TRUE;
7860a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák}
7870a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
788a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwellstruct translate *translate_generic_create( const struct translate_key *key )
789c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell{
790c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   struct translate_generic *tg = CALLOC_STRUCT(translate_generic);
791c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   unsigned i;
792c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
793c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   if (tg == NULL)
794c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell      return NULL;
795c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
796a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   tg->translate.key = *key;
797a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   tg->translate.release = generic_release;
798c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   tg->translate.set_buffer = generic_set_buffer;
799c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   tg->translate.run_elts = generic_run_elts;
8004a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   tg->translate.run_elts16 = generic_run_elts16;
8014a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri   tg->translate.run_elts8 = generic_run_elts8;
802a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   tg->translate.run = generic_run;
803a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell
804a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   for (i = 0; i < key->nr_elements; i++) {
8054b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca      const struct util_format_description *format_desc =
8064b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca            util_format_description(key->element[i].input_format);
8074b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca
8084b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca      assert(format_desc);
8094b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca      assert(format_desc->fetch_rgba_float);
8104b891234f81d441426a62abcff96720022d2ac3dJosé Fonseca
811543b9566bdaa48fea2df1866fa1310c1cdbcde27Michal Krol      tg->attrib[i].type = key->element[i].type;
812a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell
8130a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      if (format_desc->channel[0].pure_integer) {
8140a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         const struct util_format_description *out_format_desc =
8150a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák               util_format_description(key->element[i].output_format);
8160a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
8170a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         if (!is_legal_int_format_combo(format_desc, out_format_desc)) {
8180a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák            FREE(tg);
8190a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák            return NULL;
8200a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         }
8210a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
8220a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         if (format_desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
8230a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák            tg->attrib[i].fetch = (fetch_func)format_desc->fetch_rgba_sint;
8240a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         } else {
8250a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák            tg->attrib[i].fetch = (fetch_func)format_desc->fetch_rgba_uint;
8260a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         }
8270a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      } else {
8280a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák         tg->attrib[i].fetch = (fetch_func)format_desc->fetch_rgba_float;
8290a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák      }
8300a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
831a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell      tg->attrib[i].buffer = key->element[i].input_buffer;
832a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell      tg->attrib[i].input_offset = key->element[i].input_offset;
8337ca0ce38340144794267609646048b3820d594abMichal Krol      tg->attrib[i].instance_divisor = key->element[i].instance_divisor;
834c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
835a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell      tg->attrib[i].output_offset = key->element[i].output_offset;
8365266bc3c60033ccc3515b3a6d02f7219f981cbb1Luca Barbieri
837ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      tg->attrib[i].copy_size = -1;
838ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      if (tg->attrib[i].type == TRANSLATE_ELEMENT_INSTANCE_ID)
839ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      {
840ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri            if(key->element[i].output_format == PIPE_FORMAT_R32_USCALED
841ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri                  || key->element[i].output_format == PIPE_FORMAT_R32_SSCALED)
842ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri               tg->attrib[i].copy_size = 4;
843ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      }
844ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      else
845ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      {
846ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri         if(key->element[i].input_format == key->element[i].output_format
847ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri               && format_desc->block.width == 1
848ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri               && format_desc->block.height == 1
849ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri               && !(format_desc->block.bits & 7))
850ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri            tg->attrib[i].copy_size = format_desc->block.bits >> 3;
851ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      }
852ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri
853ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      if(tg->attrib[i].copy_size < 0)
854ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri	      tg->attrib[i].emit = get_emit_func(key->element[i].output_format);
855ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri      else
856ddcf028aa0a1bd6f79381164c8b1c3b816792e47Luca Barbieri	      tg->attrib[i].emit  = NULL;
857c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   }
858c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
859a5a7dc24ba2dcf9bbdd73709c4c182e324bdc3a5Keith Whitwell   tg->nr_attrib = key->nr_elements;
860c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
861c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell
862c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell   return &tg->translate;
863c81bbab6f6c0413996799800cac6fb49a698e765Keith Whitwell}
86410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
86510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieriboolean translate_generic_is_output_format_supported(enum pipe_format format)
86610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri{
86710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   switch(format)
86810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   {
86910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R64G64B64A64_FLOAT: return TRUE;
87010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R64G64B64_FLOAT: return TRUE;
87110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R64G64_FLOAT: return TRUE;
87210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R64_FLOAT: return TRUE;
87310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
87410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32A32_FLOAT: return TRUE;
87510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32_FLOAT: return TRUE;
87610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32_FLOAT: return TRUE;
87710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32_FLOAT: return TRUE;
87810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
8791acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16B16A16_FLOAT: return TRUE;
8801acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16B16_FLOAT: return TRUE;
8811acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16G16_FLOAT: return TRUE;
8821acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák   case PIPE_FORMAT_R16_FLOAT: return TRUE;
8831acef6a7465e8c54dc10a43c9e7278d4506c1d5eMarek Olšák
88410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32A32_USCALED: return TRUE;
88510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32_USCALED: return TRUE;
88610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32_USCALED: return TRUE;
88710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32_USCALED: return TRUE;
88810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
88910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32A32_SSCALED: return TRUE;
89010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32_SSCALED: return TRUE;
89110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32_SSCALED: return TRUE;
89210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32_SSCALED: return TRUE;
89310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
89410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32A32_UNORM: return TRUE;
89510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32_UNORM: return TRUE;
89610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32_UNORM: return TRUE;
89710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32_UNORM: return TRUE;
89810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
89910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32A32_SNORM: return TRUE;
90010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32B32_SNORM: return TRUE;
90110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32G32_SNORM: return TRUE;
90210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R32_SNORM: return TRUE;
90310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
90410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16A16_USCALED: return TRUE;
90510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16_USCALED: return TRUE;
90610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16_USCALED: return TRUE;
90710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16_USCALED: return TRUE;
90810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
90910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16A16_SSCALED: return TRUE;
91010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16_SSCALED: return TRUE;
91110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16_SSCALED: return TRUE;
91210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16_SSCALED: return TRUE;
91310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
91410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16A16_UNORM: return TRUE;
91510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16_UNORM: return TRUE;
91610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16_UNORM: return TRUE;
91710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16_UNORM: return TRUE;
91810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
91910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16A16_SNORM: return TRUE;
92010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16B16_SNORM: return TRUE;
92110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16G16_SNORM: return TRUE;
92210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R16_SNORM: return TRUE;
92310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
92410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8A8_USCALED: return TRUE;
92510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8_USCALED: return TRUE;
92610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8_USCALED: return TRUE;
92710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8_USCALED: return TRUE;
92810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
92910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8A8_SSCALED: return TRUE;
93010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8_SSCALED: return TRUE;
93110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8_SSCALED: return TRUE;
93210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8_SSCALED: return TRUE;
93310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
93410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8A8_UNORM: return TRUE;
93510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8_UNORM: return TRUE;
93610adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8_UNORM: return TRUE;
93710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8_UNORM: return TRUE;
93810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
93910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8A8_SNORM: return TRUE;
94010adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8B8_SNORM: return TRUE;
94110adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8G8_SNORM: return TRUE;
94210adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_R8_SNORM: return TRUE;
94310adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri
94410adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_A8R8G8B8_UNORM: return TRUE;
94510adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   case PIPE_FORMAT_B8G8R8A8_UNORM: return TRUE;
9460a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9470a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32A32_UINT: return TRUE;
9480a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32_UINT: return TRUE;
9490a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32_UINT: return TRUE;
9500a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32_UINT: return TRUE;
9510a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9520a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16A16_UINT: return TRUE;
9530a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16_UINT: return TRUE;
9540a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16_UINT: return TRUE;
9550a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16_UINT: return TRUE;
9560a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9570a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8A8_UINT: return TRUE;
9580a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8_UINT: return TRUE;
9590a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8_UINT: return TRUE;
9600a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8_UINT: return TRUE;
9610a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9620a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32A32_SINT: return TRUE;
9630a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32B32_SINT: return TRUE;
9640a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32G32_SINT: return TRUE;
9650a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R32_SINT: return TRUE;
9660a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9670a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16A16_SINT: return TRUE;
9680a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16B16_SINT: return TRUE;
9690a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16G16_SINT: return TRUE;
9700a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R16_SINT: return TRUE;
9710a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
9720a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8A8_SINT: return TRUE;
9730a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8B8_SINT: return TRUE;
9740a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8G8_SINT: return TRUE;
9750a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák   case PIPE_FORMAT_R8_SINT: return TRUE;
9760a8a7144a152eba0e1bd955b7a423ed5336a9f31Marek Olšák
977d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_UNORM: return TRUE;
978d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_USCALED: return TRUE;
979d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_SNORM: return TRUE;
980d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_B10G10R10A2_SSCALED: return TRUE;
981d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
982d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_UNORM: return TRUE;
983d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_USCALED: return TRUE;
984d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_SNORM: return TRUE;
985d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák   case PIPE_FORMAT_R10G10B10A2_SSCALED: return TRUE;
986d1f11ed3eff405561fd94ed05a9f0e5e049f0908Marek Olšák
98710adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   default: return FALSE;
98810adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri   }
98910adb7840c3a37dedc940fe593b246336eebd71eLuca Barbieri}
990