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(gl_format f
, uint8_t c
[])
37 case MESA_FORMAT_ARGB8888
:
38 return PACK_COLOR_8888(c
[ACOMP
], c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
39 case MESA_FORMAT_ARGB8888_REV
:
40 return PACK_COLOR_8888(c
[BCOMP
], c
[GCOMP
], c
[RCOMP
], c
[ACOMP
]);
41 case MESA_FORMAT_XRGB8888
:
42 return PACK_COLOR_8888(0, c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
43 case MESA_FORMAT_XRGB8888_REV
:
44 return PACK_COLOR_8888(c
[BCOMP
], c
[GCOMP
], c
[RCOMP
], 0);
45 case MESA_FORMAT_RGBA8888
:
46 return PACK_COLOR_8888(c
[RCOMP
], c
[GCOMP
], c
[BCOMP
], c
[ACOMP
]);
47 case MESA_FORMAT_RGBA8888_REV
:
48 return PACK_COLOR_8888(c
[ACOMP
], c
[BCOMP
], c
[GCOMP
], c
[RCOMP
]);
49 case MESA_FORMAT_RGB565
:
50 return PACK_COLOR_565(c
[RCOMP
], c
[GCOMP
], c
[BCOMP
]);
56 static inline unsigned
57 pack_zs_i(gl_format f
, uint32_t z
, uint8_t s
)
60 case MESA_FORMAT_Z24_S8
:
61 return (z
& 0xffffff00) | (s
& 0xff);
62 case MESA_FORMAT_Z24_X8
:
63 return (z
& 0xffffff00);
65 return (z
& 0xffff0000) >> 16;
71 static inline unsigned
72 pack_rgba_f(gl_format f
, 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(gl_format f
, 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(gl_format f
, float z
, uint8_t s
)
92 return pack_zs_i(f
, FLOAT_TO_UINT(z
), s
);
95 /* Integer base-2 logarithm, rounded towards zero. */
96 static inline unsigned
101 if (i
& 0xffff0000) {
105 if (i
& 0x0000ff00) {
109 if (i
& 0x000000f0) {
113 if (i
& 0x0000000c) {
117 if (i
& 0x00000002) {
123 static inline unsigned
124 align(unsigned x
, unsigned m
)
126 return (x
+ m
- 1) & ~(m
- 1);
130 get_scissors(struct gl_framebuffer
*fb
, int *x
, int *y
, int *w
, int *h
)
132 *w
= fb
->_Xmax
- fb
->_Xmin
;
133 *h
= fb
->_Ymax
- fb
->_Ymin
;
135 *y
= (fb
->Name
? fb
->_Ymin
:
136 /* Window system FBO: Flip the Y coordinate. */
137 fb
->Height
- fb
->_Ymax
);
141 get_viewport_scale(struct gl_context
*ctx
, float a
[16])
143 struct gl_viewport_attrib
*vp
= &ctx
->ViewportArray
[0];
144 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
146 a
[MAT_SX
] = (float)vp
->Width
/ 2;
149 a
[MAT_SY
] = (float)vp
->Height
/ 2;
151 /* Window system FBO: Flip the Y coordinate. */
152 a
[MAT_SY
] = - (float)vp
->Height
/ 2;
154 a
[MAT_SZ
] = fb
->_DepthMaxF
* (vp
->Far
- vp
->Near
) / 2;
158 get_viewport_translate(struct gl_context
*ctx
, float a
[4])
160 struct gl_viewport_attrib
*vp
= &ctx
->ViewportArray
[0];
161 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
163 a
[0] = (float)vp
->Width
/ 2 + vp
->X
;
166 a
[1] = (float)vp
->Height
/ 2 + vp
->Y
;
168 /* Window system FBO: Flip the Y coordinate. */
169 a
[1] = fb
->Height
- (float)vp
->Height
/ 2 - vp
->Y
;
171 a
[2] = fb
->_DepthMaxF
* (vp
->Far
+ vp
->Near
) / 2;
174 static inline GLboolean
175 is_color_operand(int op
)
177 return op
== GL_SRC_COLOR
|| op
== GL_ONE_MINUS_SRC_COLOR
;
180 static inline GLboolean
181 is_negative_operand(int op
)
183 return op
== GL_ONE_MINUS_SRC_COLOR
|| op
== GL_ONE_MINUS_SRC_ALPHA
;
186 static inline GLboolean
187 is_texture_source(int s
)
189 return s
== GL_TEXTURE
|| (s
>= GL_TEXTURE0
&& s
<= GL_TEXTURE31
);
192 static inline struct gl_texgen
*
193 get_texgen_coord(struct gl_texture_unit
*u
, int i
)
195 return ((struct gl_texgen
*[])
196 { &u
->GenS
, &u
->GenT
, &u
->GenR
, &u
->GenQ
}) [i
];
199 static inline float *
200 get_texgen_coeff(struct gl_texgen
*c
)
202 if (c
->Mode
== GL_OBJECT_LINEAR
)
203 return c
->ObjectPlane
;
204 else if (c
->Mode
== GL_EYE_LINEAR
)
210 static inline unsigned
211 get_format_blocksx(gl_format format
,
216 _mesa_get_format_block_size(format
, &blockwidth
, &blockheight
);
217 return (x
+ blockwidth
- 1) / blockwidth
;
220 static inline unsigned
221 get_format_blocksy(gl_format format
,
226 _mesa_get_format_block_size(format
, &blockwidth
, &blockheight
);
227 return (y
+ blockheight
- 1) / blockheight
;