1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/*
2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Copyright (C) 2009 Francisco Jerez.
3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * All Rights Reserved.
4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Permission is hereby granted, free of charge, to any person obtaining
6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * a copy of this software and associated documentation files (the
7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * "Software"), to deal in the Software without restriction, including
8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * without limitation the rights to use, copy, modify, merge, publish,
9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to
10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * permit persons to whom the Software is furnished to do so, subject to
11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * the following conditions:
12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * The above copyright notice and this permission notice (including the
14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * next paragraph) shall be included in all copies or substantial
15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * portions of the Software.
16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez */
26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#ifndef __NOUVEAU_UTIL_H__
28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define __NOUVEAU_UTIL_H__
29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/formats.h"
31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/colormac.h"
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpack_rgba_i(gl_format f, uint8_t c[])
35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (f) {
37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_ARGB8888:
38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(c[ACOMP], c[RCOMP], c[GCOMP], c[BCOMP]);
39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_ARGB8888_REV:
40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(c[BCOMP], c[GCOMP], c[RCOMP], c[ACOMP]);
41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_XRGB8888:
42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(0, c[RCOMP], c[GCOMP], c[BCOMP]);
43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_XRGB8888_REV:
44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(c[BCOMP], c[GCOMP], c[RCOMP], 0);
45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_RGBA8888:
46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(c[RCOMP], c[GCOMP], c[BCOMP], c[ACOMP]);
47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_RGBA8888_REV:
48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_8888(c[ACOMP], c[BCOMP], c[GCOMP], c[RCOMP]);
49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_RGB565:
50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return PACK_COLOR_565(c[RCOMP], c[GCOMP], c[BCOMP]);
51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpack_zs_i(gl_format f, uint32_t z, uint8_t s)
58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (f) {
60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_Z24_S8:
61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return (z & 0xffffff00) | (s & 0xff);
62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_Z24_X8:
63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return (z & 0xffffff00);
64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case MESA_FORMAT_Z16:
65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return (z & 0xffff0000) >> 16;
66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpack_rgba_f(gl_format f, float c[])
73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return pack_rgba_i(f, (uint8_t []) {
75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			   FLOAT_TO_UBYTE(c[RCOMP]),
76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			   FLOAT_TO_UBYTE(c[GCOMP]),
77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			   FLOAT_TO_UBYTE(c[BCOMP]),
78bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			   FLOAT_TO_UBYTE(c[ACOMP]) });
79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
82093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airliepack_rgba_clamp_f(gl_format f, float c[])
83093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie{
8481a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie	GLubyte bytes[4];
8581a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie	_mesa_unclamped_float_rgba_to_ubyte(bytes, c);
8681a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie	return pack_rgba_i(f, bytes);
87093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie}
88093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie
89093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airliestatic inline unsigned
90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpack_zs_f(gl_format f, float z, uint8_t s)
91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return pack_zs_i(f, FLOAT_TO_UINT(z), s);
93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* Integer base-2 logarithm, rounded towards zero. */
96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezlog2i(unsigned i)
98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	unsigned r = 0;
100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
101bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (i & 0xffff0000) {
102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		i >>= 16;
103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		r += 16;
104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (i & 0x0000ff00) {
106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		i >>= 8;
107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		r += 8;
108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (i & 0x000000f0) {
110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		i >>= 4;
111bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		r += 4;
112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (i & 0x0000000c) {
114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		i >>= 2;
115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		r += 2;
116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (i & 0x00000002) {
118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		r += 1;
119bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return r;
121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned
124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezalign(unsigned x, unsigned m)
125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return (x + m - 1) & ~(m - 1);
127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline void
130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_scissors(struct gl_framebuffer *fb, int *x, int *y, int *w, int *h)
131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	*w = fb->_Xmax - fb->_Xmin;
133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	*h = fb->_Ymax - fb->_Ymin;
134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	*x = fb->_Xmin;
135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	*y = (fb->Name ? fb->_Ymin :
136bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	      /* Window system FBO: Flip the Y coordinate. */
137bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	      fb->Height - fb->_Ymax);
138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
140bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline void
141f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_viewport_scale(struct gl_context *ctx, float a[16])
142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct gl_viewport_attrib *vp = &ctx->Viewport;
144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct gl_framebuffer *fb = ctx->DrawBuffer;
145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	a[MAT_SX] = (float)vp->Width / 2;
147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (fb->Name)
149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		a[MAT_SY] = (float)vp->Height / 2;
150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	else
151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		/* Window system FBO: Flip the Y coordinate. */
152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		a[MAT_SY] = - (float)vp->Height / 2;
153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
154bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	a[MAT_SZ] = fb->_DepthMaxF * (vp->Far - vp->Near) / 2;
155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
157bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline void
158f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_viewport_translate(struct gl_context *ctx, float a[4])
159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
160bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct gl_viewport_attrib *vp = &ctx->Viewport;
161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct gl_framebuffer *fb = ctx->DrawBuffer;
162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	a[0] = (float)vp->Width / 2 + vp->X;
164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (fb->Name)
166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		a[1] = (float)vp->Height / 2 + vp->Y;
167bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	else
168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		/* Window system FBO: Flip the Y coordinate. */
169bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		a[1] = fb->Height - (float)vp->Height / 2 - vp->Y;
170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	a[2] = fb->_DepthMaxF * (vp->Far + vp->Near) / 2;
172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
1747269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezstatic inline GLboolean
1757269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezis_color_operand(int op)
1767269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez{
1777269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez	return op == GL_SRC_COLOR || op == GL_ONE_MINUS_SRC_COLOR;
1787269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez}
1797269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez
1807269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezstatic inline GLboolean
1817269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezis_negative_operand(int op)
1827269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez{
1837269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez	return op == GL_ONE_MINUS_SRC_COLOR || op == GL_ONE_MINUS_SRC_ALPHA;
1847269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez}
1857269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez
1867269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezstatic inline GLboolean
1877269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerezis_texture_source(int s)
1887269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez{
1897269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez	return s == GL_TEXTURE || (s >= GL_TEXTURE0 && s <= GL_TEXTURE31);
1907269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez}
1917269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez
192c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerezstatic inline struct gl_texgen *
193c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerezget_texgen_coord(struct gl_texture_unit *u, int i)
194c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez{
195c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	return ((struct gl_texgen *[])
196c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		{ &u->GenS, &u->GenT, &u->GenR, &u->GenQ }) [i];
197c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez}
198c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez
199c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerezstatic inline float *
200c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerezget_texgen_coeff(struct gl_texgen *c)
201c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez{
202c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	if (c->Mode == GL_OBJECT_LINEAR)
203c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		return c->ObjectPlane;
204c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	else if (c->Mode == GL_EYE_LINEAR)
205c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		return c->EyePlane;
206c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	else
207c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		return NULL;
208c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez}
209c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez
2106d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotnýstatic inline unsigned
2116d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotnýget_format_blocksx(gl_format format,
2126d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný		       unsigned x)
2136d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný{
2146d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	GLuint blockwidth;
2156d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	GLuint blockheight;
2166d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	_mesa_get_format_block_size(format, &blockwidth, &blockheight);
2176d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	return (x + blockwidth - 1) / blockwidth;
2186d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný}
2196d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný
2206d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotnýstatic inline unsigned
2216d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotnýget_format_blocksy(gl_format format,
2226d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný		       unsigned y)
2236d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný{
2246d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	GLuint blockwidth;
2256d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	GLuint blockheight;
2266d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	_mesa_get_format_block_size(format, &blockwidth, &blockheight);
2276d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný	return (y + blockheight - 1) / blockheight;
2286d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný}
2296d5efe96ee710ca1dd5f745f74a5bbfa4fd42fd9Viktor Novotný
230bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#endif
231