98e75f2d |
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 |