ALL: Huge upstream synch + PerRom DelaySI & CountPerOp parameters
[mupen64plus-pandora.git] / source / gles2glide64 / src / GlideHQ / tc-1.1+ / internal.h
CommitLineData
98e75f2d 1/*
2 * Texture compression
3 * Version: 1.0
4 *
5 * Copyright (C) 2004 Daniel Borca All Rights Reserved.
6 *
7 * this is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * this is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Make; see the file COPYING. If not, write to
19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22
23#ifndef INTERNAL_H_included
24#define INTERNAL_H_included
25
2d262872 26#include <stdint.h>
27
98e75f2d 28/*****************************************************************************\
29 * DLL stuff
30\*****************************************************************************/
31
32#ifdef __WIN32__
33#define TAPI __declspec(dllexport)
34#define TAPIENTRY /*__stdcall*/
35#else
36#define TAPI
37#define TAPIENTRY
38#endif
39
40
41/*****************************************************************************\
42 * 64bit types on 32bit machine
43\*****************************************************************************/
44
2d262872 45/*
46 * Define a 64-bit unsigned integer type and macros
47 */
48#if 1
49
50#define Q_NATIVE 1
98e75f2d 51
2d262872 52typedef uint64_t qword;
98e75f2d 53
54#define Q_MOV32(a, b) a = b
55#define Q_OR32(a, b) a |= b
56#define Q_SHL(a, c) a <<= c
57
2d262872 58#else
59
60#define Q_NATIVE 0
98e75f2d 61
62typedef struct {
2d262872 63 dword lo, hi;
98e75f2d 64} qword;
65
66#define Q_MOV32(a, b) a.lo = b
67#define Q_OR32(a, b) a.lo |= b
98e75f2d 68
2d262872 69#define Q_SHL(a, c) \
70 do { \
71 if ((c) >= 32) { \
72 a.hi = a.lo << ((c) - 32); \
73 a.lo = 0; \
74 } else { \
75 a.hi = (a.hi << (c)) | (a.lo >> (32 - (c))); \
76 a.lo <<= (c); \
77 } \
78 } while (0)
79
80#endif
98e75f2d 81
82
83/*****************************************************************************\
84 * Config
85\*****************************************************************************/
86
87#define RCOMP 0
88#define GCOMP 1
89#define BCOMP 2
90#define ACOMP 3
91
92/*****************************************************************************\
93 * Metric
94\*****************************************************************************/
95
96#define F(i) (float)1 /* can be used to obtain an oblong metric: 0.30 / 0.59 / 0.11 */
97#define SAFECDOT 1 /* for paranoids */
98
2d262872 99#define MAKEIVEC(NV, NC, IV, B, V0, V1) \
100 do { \
101 /* compute interpolation vector */ \
102 float d2 = 0.0F; \
103 float rd2; \
104 \
105 for (i = 0; i < NC; i++) { \
106 IV[i] = (V1[i] - V0[i]) * F(i); \
107 d2 += IV[i] * IV[i]; \
108 } \
109 rd2 = (float)NV / d2; \
110 B = 0; \
111 for (i = 0; i < NC; i++) { \
112 IV[i] *= F(i); \
113 B -= IV[i] * V0[i]; \
114 IV[i] *= rd2; \
115 } \
116 B = B * rd2 + 0.5f; \
117 } while (0)
98e75f2d 118
119#define CALCCDOT(TEXEL, NV, NC, IV, B, V)\
2d262872 120 do { \
121 float dot = 0.0F; \
122 for (i = 0; i < NC; i++) { \
123 dot += V[i] * IV[i]; \
124 } \
125 TEXEL = (int)(dot + B); \
126 if (SAFECDOT) { \
127 if (TEXEL < 0) { \
128 TEXEL = 0; \
129 } else if (TEXEL > NV) { \
130 TEXEL = NV; \
131 } \
132 } \
133 } while (0)
98e75f2d 134
135
136/*****************************************************************************\
137 * Utility functions
138\*****************************************************************************/
139
2d262872 140/** Copy a 4-element vector */
141#define COPY_4V( DST, SRC ) \
142do { \
143 (DST)[0] = (SRC)[0]; \
144 (DST)[1] = (SRC)[1]; \
145 (DST)[2] = (SRC)[2]; \
146 (DST)[3] = (SRC)[3]; \
147} while (0)
148
149/** Copy a 4-element unsigned byte vector */
150static inline void
151COPY_4UBV(uint8_t dst[4], const uint8_t src[4])
152{
153#if defined(__i386__)
154 *((uint32_t *) dst) = *((uint32_t *) src);
155#else
156 /* The uint32_t cast might fail if DST or SRC are not dword-aligned (RISC) */
157 COPY_4V(dst, src);
158#endif
159}
160
161void reorder_source_3(byte *tex, dword width, dword height, int srcRowStride);
162void *reorder_source_3_alloc(const byte *source, dword width, dword height, int srcRowStride);
163void reorder_source_4(byte *tex, dword width, dword height, int srcRowStride);
164void *reorder_source_4_alloc(const byte *source, dword width, dword height, int srcRowStride);
98e75f2d 165
166#endif