2 * Copyright (C) 2009 Francisco Jerez.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 #ifndef __NOUVEAU_UTIL_H__
28 #define __NOUVEAU_UTIL_H__
30 #include "main/formats.h"
31 #include "main/colormac.h"
33 static inline unsigned
34 pack_rgba_i(mesa_format f
, const uint8_t c
[])
37 case MESA_FORMAT_B8G8R8A8_UNORM
:
38 return PACK_COLOR_8888(c
[ACOMP
], c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
39 case MESA_FORMAT_A8R8G8B8_UNORM
:
40 return PACK_COLOR_8888(c
[BCOMP
], c
[GCOMP
], c
[RCOMP
], c
[ACOMP
]);
41 case MESA_FORMAT_B8G8R8X8_UNORM
:
42 return PACK_COLOR_8888(0, c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
43 case MESA_FORMAT_X8R8G8B8_UNORM
:
44 return PACK_COLOR_8888(c
[BCOMP
], c
[GCOMP
], c
[RCOMP
], 0);
45 case MESA_FORMAT_A8B8G8R8_UNORM
:
46 return PACK_COLOR_8888(c
[RCOMP
], c
[GCOMP
], c
[BCOMP
], c
[ACOMP
]);
47 case MESA_FORMAT_R8G8B8A8_UNORM
:
48 return PACK_COLOR_8888(c
[ACOMP
], c
[BCOMP
], c
[GCOMP
], c
[RCOMP
]);
49 case MESA_FORMAT_B5G6R5_UNORM
:
50 return PACK_COLOR_565(c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
56 static inline unsigned
57 pack_zs_i(mesa_format f
, uint32_t z
, uint8_t s
)
60 case MESA_FORMAT_S8_UINT_Z24_UNORM
:
61 return (z
& 0xffffff00) | (s
& 0xff);
62 case MESA_FORMAT_X8_UINT_Z24_UNORM
:
63 return (z
& 0xffffff00);
64 case MESA_FORMAT_Z_UNORM16
:
65 return (z
& 0xffff0000) >> 16;
71 static inline unsigned
72 pack_rgba_f(mesa_format f
, const float c
[])
74 return pack_rgba_i(f
, (uint8_t []) {
75 FLOAT_TO_UBYTE(c
[RCOMP
]),
76 FLOAT_TO_UBYTE(c
[GCOMP
]),
77 FLOAT_TO_UBYTE(c
[BCOMP
]),
78 FLOAT_TO_UBYTE(c
[ACOMP
]) });
81 static inline unsigned
82 pack_rgba_clamp_f(mesa_format f
, const float c
[])
85 _mesa_unclamped_float_rgba_to_ubyte(bytes
, c
);
86 return pack_rgba_i(f
, bytes
);
89 static inline unsigned
90 pack_zs_f(mesa_format f
, float z
, uint8_t s
)
92 return pack_zs_i(f
, FLOAT_TO_UINT(z
), s
);
95 static inline unsigned
96 pack_la_clamp_f(mesa_format f
, float l
, float a
)
99 UNCLAMPED_FLOAT_TO_UBYTE(lb
, l
);
100 UNCLAMPED_FLOAT_TO_UBYTE(ab
, a
);
101 return pack_rgba_i(f
, (uint8_t []) { lb
, lb
, lb
, ab
});
104 /* Integer base-2 logarithm, rounded towards zero. */
105 static inline unsigned
110 if (i
& 0xffff0000) {
114 if (i
& 0x0000ff00) {
118 if (i
& 0x000000f0) {
122 if (i
& 0x0000000c) {
126 if (i
& 0x00000002) {
133 get_scissors(struct gl_framebuffer
*fb
, int *x
, int *y
, int *w
, int *h
)
135 *w
= fb
->_Xmax
- fb
->_Xmin
;
136 *h
= fb
->_Ymax
- fb
->_Ymin
;
138 *y
= (fb
->Name
? fb
->_Ymin
:
139 /* Window system FBO: Flip the Y coordinate. */
140 fb
->Height
- fb
->_Ymax
);
144 get_viewport_scale(struct gl_context
*ctx
, float a
[16])
146 struct gl_viewport_attrib
*vp
= &ctx
->ViewportArray
[0];
147 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
149 a
[MAT_SX
] = (float)vp
->Width
/ 2;
152 a
[MAT_SY
] = (float)vp
->Height
/ 2;
154 /* Window system FBO: Flip the Y coordinate. */
155 a
[MAT_SY
] = - (float)vp
->Height
/ 2;
157 a
[MAT_SZ
] = fb
->_DepthMaxF
* (vp
->Far
- vp
->Near
) / 2;
161 get_viewport_translate(struct gl_context
*ctx
, float a
[4])
163 struct gl_viewport_attrib
*vp
= &ctx
->ViewportArray
[0];
164 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
166 a
[0] = (float)vp
->Width
/ 2 + vp
->X
;
169 a
[1] = (float)vp
->Height
/ 2 + vp
->Y
;
171 /* Window system FBO: Flip the Y coordinate. */
172 a
[1] = fb
->Height
- (float)vp
->Height
/ 2 - vp
->Y
;
174 a
[2] = fb
->_DepthMaxF
* (vp
->Far
+ vp
->Near
) / 2;
177 static inline GLboolean
178 is_color_operand(int op
)
180 return op
== GL_SRC_COLOR
|| op
== GL_ONE_MINUS_SRC_COLOR
;
183 static inline GLboolean
184 is_negative_operand(int op
)
186 return op
== GL_ONE_MINUS_SRC_COLOR
|| op
== GL_ONE_MINUS_SRC_ALPHA
;
189 static inline GLboolean
190 is_texture_source(int s
)
192 return s
== GL_TEXTURE
|| (s
>= GL_TEXTURE0
&& s
<= GL_TEXTURE31
);
195 static inline struct gl_texgen
*
196 get_texgen_coord(struct gl_texture_unit
*u
, int i
)
198 return ((struct gl_texgen
*[])
199 { &u
->GenS
, &u
->GenT
, &u
->GenR
, &u
->GenQ
}) [i
];
202 static inline float *
203 get_texgen_coeff(struct gl_texgen
*c
)
205 if (c
->Mode
== GL_OBJECT_LINEAR
)
206 return c
->ObjectPlane
;
207 else if (c
->Mode
== GL_EYE_LINEAR
)
213 static inline unsigned
214 get_format_blocksx(mesa_format format
,
219 _mesa_get_format_block_size(format
, &blockwidth
, &blockheight
);
220 return (x
+ blockwidth
- 1) / blockwidth
;
223 static inline unsigned
224 get_format_blocksy(mesa_format format
,
229 _mesa_get_format_block_size(format
, &blockwidth
, &blockheight
);
230 return (y
+ blockheight
- 1) / blockheight
;