f213fe9aaa8324552c9f4f2085292782cde7137a
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glitch64 / main.h
1 /*
2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002  Dave2001
4 * Copyright (c) 2003-2009  Sergey 'Gonetz' Lipski
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #ifndef MAIN_H
22 #define MAIN_H
23
24 #include <m64p_types.h>
25
26 #define LOG(...) // WriteLog(M64MSG_VERBOSE, __VA_ARGS__)
27 #define LOGINFO(...) WriteLog(M64MSG_INFO, __VA_ARGS__)
28 void WriteLog(m64p_msg_level level, const char *msg, ...);
29
30
31 #ifndef _WIN32
32 //#define VPDEBUG
33 #endif
34 #ifdef VPDEBUG
35 void dump_tex(int id);
36 void dump_start();
37 void dump_stop();
38 extern int dumping;
39 #endif
40
41 #define zscale 1.0f
42
43 typedef struct _wrapper_config
44 {
45   int res;
46   int fbo;
47   int anisofilter;
48   int vram_size;
49 } wrapper_config;
50 extern wrapper_config config;
51
52
53 // VP added this utility function
54 // returns the bytes per pixel of a given GR texture format
55 int grTexFormatSize(int fmt);
56
57 extern int packed_pixels_support;
58 extern int ati_sucks;
59 extern float largest_supported_anisotropy;
60
61 extern int default_texture; // the infamous "32*1024*1024" is now configurable
62 extern int depth_texture;
63 void set_depth_shader();
64 void set_bw_shader();
65 extern float invtex[2];
66 extern int buffer_cleared; // mark that the buffer has been cleared, used to check if we need to reload the texture buffer content
67
68 #ifdef _WIN32
69 #include <windows.h>
70 extern "C" {
71     #include <SDL_opengl.h>
72     extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
73     extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
74     extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
75     extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
76     extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
77     extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
78     extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
79     extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
80     extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
81     extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
82     extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
83     extern PFNGLFOGCOORDFEXTPROC glFogCoordfEXT;
84     extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
85     extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
86     extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
87     extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
88     extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
89     extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
90     extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
91     extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
92     extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
93     extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
94     extern PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
95     extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
96     extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
97     extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
98     extern PFNGLUNIFORM4FARBPROC glUniform4fARB;
99     extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
100     typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
101 }
102 #else
103 #include <stdio.h>
104 //#define printf(...)
105 #define GL_GLEXT_PROTOTYPES
106 #include <SDL_opengles2.h>
107 #endif // _WIN32
108 #include "glide.h"
109 #include "glState.cpp"
110
111 void display_warning(const unsigned char *text, ...);
112 void display_warning(const char *text, ...);
113 void init_geometry();
114 void init_textures();
115 void init_combiner();
116 void free_textures();
117 void updateCombiner(int i);
118 void updateCombinera(int i);
119 void remove_tex(unsigned int idmin, unsigned int idmax);
120 void add_tex(unsigned int id);
121
122 #ifdef _WIN32
123 extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
124 extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
125 extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
126 extern PFNGLFOGCOORDFPROC glFogCoordfEXT;
127
128 extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
129 extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
130 extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
131 extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
132 extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
133 extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
134 extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
135 extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
136 extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
137 extern PFNGLUNIFORM4IARBPROC glUniform4iARB;
138 extern PFNGLUNIFORM4FARBPROC glUniform4fARB;
139 extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
140 extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
141 extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
142 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
143 extern PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
144 #endif
145 void check_compile(GLuint shader);
146 void check_link(GLuint program);
147 void vbo_enable();
148 void vbo_disable();
149
150 //Vertex Attribute Locations
151 #define POSITION_ATTR 0
152 #define COLOUR_ATTR 1
153 #define TEXCOORD_0_ATTR 2
154 #define TEXCOORD_1_ATTR 3
155 #define FOG_ATTR 4
156
157 extern int w_buffer_mode;
158 extern int nbTextureUnits;
159 extern int width, height, widtho, heighto;
160 extern int tex0_width, tex0_height, tex1_width, tex1_height;
161 extern float texture_env_color[4];
162 extern int fog_enabled;
163 extern float lambda;
164 extern int need_lambda[2];
165 extern float lambda_color[2][4];
166 extern int inverted_culling;
167 extern int culling_mode;
168 extern int render_to_texture;
169 extern int lfb_color_fmt;
170 extern int need_to_compile;
171 extern int blackandwhite0;
172 extern int blackandwhite1;
173 extern int TMU_SIZE;
174
175 extern int blend_func_separate_support;
176 extern int fog_coord_support;
177 //extern int pbuffer_support;
178 extern int glsl_support;
179 extern unsigned int pBufferAddress;
180 extern int viewport_width, viewport_height, viewport_offset, nvidia_viewport_hack;
181 extern int UMAmode;
182
183 void grChromaRangeExt(GrColor_t color0, GrColor_t color1, FxU32 mode);
184 void grChromaRangeModeExt(GrChromakeyMode_t mode);
185 void grTexChromaRangeExt(GrChipID_t tmu, GrColor_t color0, GrColor_t color1, GrTexChromakeyMode_t mode);
186 void grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode);
187 void updateTexture();
188 void reloadTexture();
189 void free_combiners();
190 void compile_shader();
191 void set_lambda();
192 void set_copy_shader();
193 void disable_textureSizes();
194
195 // config functions
196
197 //FX_ENTRY void FX_CALL grConfigWrapperExt(HINSTANCE instance, HWND hwnd);
198 FX_ENTRY void FX_CALL grConfigWrapperExt(FxI32, FxI32, FxBool, FxBool);
199 FX_ENTRY GrScreenResolution_t FX_CALL grWrapperFullScreenResolutionExt(FxU32*, FxU32*);
200 FX_ENTRY char ** FX_CALL grQueryResolutionsExt(FxI32*);
201 FX_ENTRY FxBool FX_CALL grKeyPressedExt(FxU32 key);
202 FX_ENTRY void FX_CALL grGetGammaTableExt(FxU32, FxU32*, FxU32*, FxU32*);
203
204 int getFullScreenWidth();
205 int getFullScreenHeight();
206
207 // ZIGGY framebuffer copy extension
208 // allow to copy the depth or color buffer from back/front to front/back
209 #define GR_FBCOPY_MODE_DEPTH 0
210 #define GR_FBCOPY_MODE_COLOR 1
211 #define GR_FBCOPY_BUFFER_BACK 0
212 #define GR_FBCOPY_BUFFER_FRONT 1
213 FX_ENTRY void FX_CALL grFramebufferCopyExt(int x, int y, int w, int h,
214                                            int buffer_from, int buffer_to, int mode);
215
216
217 // COMBINE extension
218
219 typedef FxU32 GrCCUColor_t;
220 typedef FxU32 GrACUColor_t;
221 typedef FxU32 GrTCCUColor_t;
222 typedef FxU32 GrTACUColor_t;
223
224 typedef FxU32 GrCombineMode_t;
225 #define GR_FUNC_MODE_ZERO                 0x00
226 #define GR_FUNC_MODE_X                    0x01
227 #define GR_FUNC_MODE_ONE_MINUS_X          0x02
228 #define GR_FUNC_MODE_NEGATIVE_X           0x03
229 #define GR_FUNC_MODE_X_MINUS_HALF         0x04
230
231 #define GR_CMBX_ZERO                      0x00
232 #define GR_CMBX_TEXTURE_ALPHA             0x01
233 #define GR_CMBX_ALOCAL                    0x02
234 #define GR_CMBX_AOTHER                    0x03
235 #define GR_CMBX_B                         0x04
236 #define GR_CMBX_CONSTANT_ALPHA            0x05
237 #define GR_CMBX_CONSTANT_COLOR            0x06
238 #define GR_CMBX_DETAIL_FACTOR             0x07
239 #define GR_CMBX_ITALPHA                   0x08
240 #define GR_CMBX_ITRGB                     0x09
241 #define GR_CMBX_LOCAL_TEXTURE_ALPHA       0x0a
242 #define GR_CMBX_LOCAL_TEXTURE_RGB         0x0b
243 #define GR_CMBX_LOD_FRAC                  0x0c
244 #define GR_CMBX_OTHER_TEXTURE_ALPHA       0x0d
245 #define GR_CMBX_OTHER_TEXTURE_RGB         0x0e
246 #define GR_CMBX_TEXTURE_RGB               0x0f
247 #define GR_CMBX_TMU_CALPHA                0x10
248 #define GR_CMBX_TMU_CCOLOR                0x11
249
250
251 FX_ENTRY void FX_CALL
252 grColorCombineExt(GrCCUColor_t a, GrCombineMode_t a_mode,
253                                   GrCCUColor_t b, GrCombineMode_t b_mode,
254                   GrCCUColor_t c, FxBool c_invert,
255                                   GrCCUColor_t d, FxBool d_invert,
256                                   FxU32 shift, FxBool invert);
257
258 FX_ENTRY void FX_CALL
259 grAlphaCombineExt(GrACUColor_t a, GrCombineMode_t a_mode,
260                                   GrACUColor_t b, GrCombineMode_t b_mode,
261                                   GrACUColor_t c, FxBool c_invert,
262                                   GrACUColor_t d, FxBool d_invert,
263                                   FxU32 shift, FxBool invert);
264
265 FX_ENTRY void FX_CALL
266 grTexColorCombineExt(GrChipID_t       tmu,
267                      GrTCCUColor_t a, GrCombineMode_t a_mode,
268                      GrTCCUColor_t b, GrCombineMode_t b_mode,
269                      GrTCCUColor_t c, FxBool c_invert,
270                      GrTCCUColor_t d, FxBool d_invert,
271                      FxU32 shift, FxBool invert);
272
273 FX_ENTRY void FX_CALL
274 grTexAlphaCombineExt(GrChipID_t       tmu,
275                      GrTACUColor_t a, GrCombineMode_t a_mode,
276                      GrTACUColor_t b, GrCombineMode_t b_mode,
277                      GrTACUColor_t c, FxBool c_invert,
278                      GrTACUColor_t d, FxBool d_invert,
279                      FxU32 shift, FxBool invert);
280
281 FX_ENTRY void FX_CALL
282 grConstantColorValueExt(GrChipID_t    tmu,
283                         GrColor_t     value);
284
285 #define CHECK_FRAMEBUFFER_STATUS() \
286 {\
287  GLenum status; \
288  status = glCheckFramebufferStatus(GL_FRAMEBUFFER); \
289  /*display_warning("%x\n", status);*/\
290  switch(status) { \
291  case GL_FRAMEBUFFER_COMPLETE: \
292    /*display_warning("framebuffer complete!\n");*/\
293    break; \
294  case GL_FRAMEBUFFER_UNSUPPORTED: \
295    display_warning("framebuffer GL_FRAMEBUFFER_UNSUPPORTED_EXT\n");\
296     /* you gotta choose different formats */ \
297    /*assert(0);*/ \
298    break; \
299  case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: \
300    display_warning("framebuffer INCOMPLETE_ATTACHMENT\n");\
301    break; \
302  case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: \
303    display_warning("framebuffer FRAMEBUFFER_MISSING_ATTACHMENT\n");\
304    break; \
305  case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: \
306    display_warning("framebuffer FRAMEBUFFER_DIMENSIONS\n");\
307    break; \
308  default: \
309    break; \
310    /* programming error; will fail on all hardware */ \
311    /*assert(0);*/ \
312  }\
313 }
314
315 #ifdef VPDEBUG
316 #define LOGGING
317 #endif
318
319 #ifdef LOGGING
320 void OPEN_LOG();
321 void CLOSE_LOG();
322 //void LOG(const char *text, ...);
323 #else // LOGGING
324 #define OPEN_LOG()
325 #define CLOSE_LOG()
326 //#define LOG
327 #endif // LOGGING
328
329 #endif