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_zs_f(gl_format f, float z, uint8_t s)
84 return pack_zs_i(f, FLOAT_TO_UINT(z), s);
87 /* Integer base-2 logarithm, rounded towards zero. */
88 static inline unsigned
101 if (i & 0x000000f0) {
105 if (i & 0x0000000c) {
109 if (i & 0x00000002) {
115 static inline unsigned
116 align(unsigned x, unsigned m)
118 return (x + m - 1) & ~(m - 1);
122 get_scissors(struct gl_framebuffer *fb, int *x, int *y, int *w, int *h)
124 *w = fb->_Xmax - fb->_Xmin;
125 *h = fb->_Ymax - fb->_Ymin;
127 *y = (fb->Name ? fb->_Ymin :
128 /* Window system FBO: Flip the Y coordinate. */
129 fb->Height - fb->_Ymax);
133 get_viewport_scale(struct gl_context *ctx, float a[16])
135 struct gl_viewport_attrib *vp = &ctx->Viewport;
136 struct gl_framebuffer *fb = ctx->DrawBuffer;
138 a[MAT_SX] = (float)vp->Width / 2;
141 a[MAT_SY] = (float)vp->Height / 2;
143 /* Window system FBO: Flip the Y coordinate. */
144 a[MAT_SY] = - (float)vp->Height / 2;
146 a[MAT_SZ] = fb->_DepthMaxF * (vp->Far - vp->Near) / 2;
150 get_viewport_translate(struct gl_context *ctx, float a[4])
152 struct gl_viewport_attrib *vp = &ctx->Viewport;
153 struct gl_framebuffer *fb = ctx->DrawBuffer;
155 a[0] = (float)vp->Width / 2 + vp->X;
158 a[1] = (float)vp->Height / 2 + vp->Y;
160 /* Window system FBO: Flip the Y coordinate. */
161 a[1] = fb->Height - (float)vp->Height / 2 - vp->Y;
163 a[2] = fb->_DepthMaxF * (vp->Far + vp->Near) / 2;
167 OUT_RINGb(struct nouveau_channel *chan, GLboolean x)
169 OUT_RING(chan, x ? 1 : 0);
173 OUT_RINGm(struct nouveau_channel *chan, float m[16])
177 for (i = 0; i < 4; i++)
178 for (j = 0; j < 4; j++)
179 OUT_RINGf(chan, m[4*j + i]);
182 static inline GLboolean
183 is_color_operand(int op)
185 return op == GL_SRC_COLOR || op == GL_ONE_MINUS_SRC_COLOR;
188 static inline GLboolean
189 is_negative_operand(int op)
191 return op == GL_ONE_MINUS_SRC_COLOR || op == GL_ONE_MINUS_SRC_ALPHA;
194 static inline GLboolean
195 is_texture_source(int s)
197 return s == GL_TEXTURE || (s >= GL_TEXTURE0 && s <= GL_TEXTURE31);
200 static inline struct gl_texgen *
201 get_texgen_coord(struct gl_texture_unit *u, int i)
203 return ((struct gl_texgen *[])
204 { &u->GenS, &u->GenT, &u->GenR, &u->GenQ }) [i];
207 static inline float *
208 get_texgen_coeff(struct gl_texgen *c)
210 if (c->Mode == GL_OBJECT_LINEAR)
211 return c->ObjectPlane;
212 else if (c->Mode == GL_EYE_LINEAR)