Link Here
|
1 |
--- src/mesa/drivers/dri/nouveau/nouveau_array.c.orig 2011-01-06 01:19:15.000000000 +0100 |
2 |
+++ src/mesa/drivers/dri/nouveau/nouveau_array.c 2012-04-28 18:27:06.000000000 +0200 |
3 |
@@ -29,54 +29,71 @@ |
4 |
#include "nouveau_array.h" |
5 |
#include "nouveau_bufferobj.h" |
6 |
|
7 |
+#define EXTRACT(in_t, out_t) extract_func_##in_t##_to_##out_t |
8 |
+ |
9 |
+#define EXTRACT_FUNC(in_t, out_t, k) \ |
10 |
+static out_t EXTRACT(in_t, out_t) \ |
11 |
+(struct nouveau_array *a, int i, int j) { \ |
12 |
+ in_t x = ((in_t *)(a->buf + i * a->stride))[j]; \ |
13 |
+ \ |
14 |
+ return (out_t)x / (k); \ |
15 |
+} |
16 |
+ |
17 |
+EXTRACT_FUNC(GLchar, unsigned, 1); |
18 |
+EXTRACT_FUNC(GLchar, float, SCHAR_MAX); |
19 |
+EXTRACT_FUNC(GLubyte, unsigned, 1); |
20 |
+EXTRACT_FUNC(GLubyte, float, UCHAR_MAX); |
21 |
+EXTRACT_FUNC(GLshort, unsigned, 1); |
22 |
+EXTRACT_FUNC(GLshort, float, SHRT_MAX); |
23 |
+EXTRACT_FUNC(GLushort, unsigned, 1); |
24 |
+EXTRACT_FUNC(GLushort, float, USHRT_MAX); |
25 |
+EXTRACT_FUNC(GLint, unsigned, 1); |
26 |
+EXTRACT_FUNC(GLint, float, INT_MAX); |
27 |
+EXTRACT_FUNC(GLuint, unsigned, 1); |
28 |
+EXTRACT_FUNC(GLuint, float, UINT_MAX); |
29 |
+EXTRACT_FUNC(GLfloat, unsigned, 1.0 / UINT_MAX); |
30 |
+EXTRACT_FUNC(GLfloat, float, 1); |
31 |
+ |
32 |
+#undef EXTRACT_FUNC |
33 |
+ |
34 |
static void |
35 |
get_array_extract(struct nouveau_array *a, extract_u_t *extract_u, |
36 |
extract_f_t *extract_f) |
37 |
{ |
38 |
-#define EXTRACT(in_t, out_t, k) \ |
39 |
- ({ \ |
40 |
- auto out_t f(struct nouveau_array *, int, int); \ |
41 |
- out_t f(struct nouveau_array *a, int i, int j) { \ |
42 |
- in_t x = ((in_t *)(a->buf + i * a->stride))[j]; \ |
43 |
- \ |
44 |
- return (out_t)x / (k); \ |
45 |
- }; \ |
46 |
- f; \ |
47 |
- }); |
48 |
- |
49 |
switch (a->type) { |
50 |
case GL_BYTE: |
51 |
- *extract_u = EXTRACT(char, unsigned, 1); |
52 |
- *extract_f = EXTRACT(char, float, SCHAR_MAX); |
53 |
+ *extract_u = EXTRACT(GLchar, unsigned); |
54 |
+ *extract_f = EXTRACT(GLchar, float); |
55 |
break; |
56 |
case GL_UNSIGNED_BYTE: |
57 |
- *extract_u = EXTRACT(unsigned char, unsigned, 1); |
58 |
- *extract_f = EXTRACT(unsigned char, float, UCHAR_MAX); |
59 |
+ *extract_u = EXTRACT(GLubyte, unsigned); |
60 |
+ *extract_f = EXTRACT(GLubyte, float); |
61 |
break; |
62 |
case GL_SHORT: |
63 |
- *extract_u = EXTRACT(short, unsigned, 1); |
64 |
- *extract_f = EXTRACT(short, float, SHRT_MAX); |
65 |
+ *extract_u = EXTRACT(GLshort, unsigned); |
66 |
+ *extract_f = EXTRACT(GLshort, float); |
67 |
break; |
68 |
case GL_UNSIGNED_SHORT: |
69 |
- *extract_u = EXTRACT(unsigned short, unsigned, 1); |
70 |
- *extract_f = EXTRACT(unsigned short, float, USHRT_MAX); |
71 |
+ *extract_u = EXTRACT(GLushort, unsigned); |
72 |
+ *extract_f = EXTRACT(GLushort, float); |
73 |
break; |
74 |
case GL_INT: |
75 |
- *extract_u = EXTRACT(int, unsigned, 1); |
76 |
- *extract_f = EXTRACT(int, float, INT_MAX); |
77 |
+ *extract_u = EXTRACT(GLint, unsigned); |
78 |
+ *extract_f = EXTRACT(GLint, float); |
79 |
break; |
80 |
case GL_UNSIGNED_INT: |
81 |
- *extract_u = EXTRACT(unsigned int, unsigned, 1); |
82 |
- *extract_f = EXTRACT(unsigned int, float, UINT_MAX); |
83 |
+ *extract_u = EXTRACT(GLuint, unsigned); |
84 |
+ *extract_f = EXTRACT(GLuint, float); |
85 |
break; |
86 |
case GL_FLOAT: |
87 |
- *extract_u = EXTRACT(float, unsigned, 1.0 / UINT_MAX); |
88 |
- *extract_f = EXTRACT(float, float, 1); |
89 |
+ *extract_u = EXTRACT(GLfloat, unsigned); |
90 |
+ *extract_f = EXTRACT(GLfloat, float); |
91 |
break; |
92 |
default: |
93 |
assert(0); |
94 |
} |
95 |
} |
96 |
+#undef EXTRACT |
97 |
|
98 |
void |
99 |
nouveau_init_array(struct nouveau_array *a, int attr, int stride, |