2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
9 #include "SDL_opengl.h"
12 #include "osregistry.h"
14 #include "gropenglinternal.h"
17 #include "grinternal.h"
23 bool OGL_inited = false;
25 SDL_Window *GL_window = NULL;
26 SDL_GLContext GL_context;
28 volatile int GL_activate = 0;
29 volatile int GL_deactivate = 0;
31 int GL_viewport_x = 0;
32 int GL_viewport_y = 0;
33 int GL_viewport_w = 640;
34 int GL_viewport_h = 480;
35 float GL_viewport_scale_w = 1.0f;
36 float GL_viewport_scale_h = 1.0f;
37 int GL_min_texture_width = 0;
38 int GL_max_texture_width = 0;
39 int GL_min_texture_height = 0;
40 int GL_max_texture_height = 0;
42 rb_t *render_buffer = NULL;
43 static size_t render_buffer_size = 0;
46 void opengl_alloc_render_buffer(unsigned int nelems)
52 if ( render_buffer && (nelems <= render_buffer_size) ) {
60 render_buffer = (rb_t*) malloc(sizeof(rb_t) * nelems);
61 render_buffer_size = nelems;
64 void opengl_free_render_buffer()
69 render_buffer_size = 0;
73 void opengl_set_variables()
75 GL_min_texture_height = 16;
76 GL_min_texture_width = 16;
78 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GL_max_texture_width);
79 GL_max_texture_height = GL_max_texture_width;
81 // no texture is larger than 1024, so maybe don't use sections
82 if (GL_max_texture_width >= 1024) {
83 gr_screen.use_sections = 0;
87 void opengl_init_viewport()
91 GL_viewport_w = gr_screen.max_w;
92 GL_viewport_h = gr_screen.max_h;
93 GL_viewport_scale_w = 1.0f;
94 GL_viewport_scale_h = 1.0f;
96 glViewport(GL_viewport_x, GL_viewport_y, GL_viewport_w, GL_viewport_h);
99 void opengl_stuff_fog_value(float z, float *f_val)
107 f_float = 1.0f - ((gr_screen.fog_far - z) / (gr_screen.fog_far - gr_screen.fog_near));
109 if (f_float < 0.0f) {
111 } else if (f_float > 1.0f) {
118 void gr_opengl_clear()
120 glClearColor(gr_screen.current_clear_color.red / 255.0f,
121 gr_screen.current_clear_color.green / 255.0f,
122 gr_screen.current_clear_color.blue / 255.0f, 1.0f);
124 glClear( GL_COLOR_BUFFER_BIT );
127 void gr_opengl_reset_clip()
129 gr_screen.offset_x = 0;
130 gr_screen.offset_y = 0;
131 gr_screen.clip_left = 0;
132 gr_screen.clip_top = 0;
133 gr_screen.clip_right = gr_screen.max_w - 1;
134 gr_screen.clip_bottom = gr_screen.max_h - 1;
135 gr_screen.clip_width = gr_screen.max_w;
136 gr_screen.clip_height = gr_screen.max_h;
138 glDisable(GL_SCISSOR_TEST);
141 uint gr_opengl_lock()
146 void gr_opengl_unlock()
150 void gr_opengl_zbias(int bias)
153 glEnable(GL_POLYGON_OFFSET_FILL);
154 glPolygonOffset(0.0f, GLfloat(-bias));
156 glDisable(GL_POLYGON_OFFSET_FILL);
160 void gr_opengl_set_cull(int cull)
163 glEnable (GL_CULL_FACE);
164 glFrontFace (GL_CCW);
166 glDisable (GL_CULL_FACE);
170 void gr_opengl_activate(int active)
179 void gr_opengl_cleanup()
181 #ifndef __EMSCRIPTEN__
186 opengl_free_render_buffer();
190 SDL_DestroyWindow(GL_window);
196 void gr_opengl_init()
202 mprintf(( "Initializing OpenGL graphics device...\n" ));
206 if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
207 Error(LOCATION, "Couldn't init SDL: %s", SDL_GetError());
210 GL_window = SDL_CreateWindow(os_get_title(), SDL_WINDOWPOS_CENTERED,
211 SDL_WINDOWPOS_CENTERED,
212 gr_screen.max_w, gr_screen.max_h, SDL_WINDOW_OPENGL);
215 Error(LOCATION, "Couldn't create window: %s\n", SDL_GetError());
218 os_set_window(GL_window);
220 int a = 1, r = 5, g = 5, b = 5, bpp = 16;
221 int FSAA = os_config_read_uint("Video", "AntiAlias", 0);
223 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, r);
224 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, g);
225 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, b);
226 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, a);
227 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, bpp);
230 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
231 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, FSAA);
234 #ifndef __EMSCRIPTEN__
237 // try GL 2 first, then fall back to GL 1
238 if ( !opengl2_init() ) {
242 int rc = opengl2_init();
246 Error(LOCATION, "Unable to initialize OpenGL renderer!\n");
249 mprintf((" Attributes requested : ARGB %d%d%d%d, BPP %d, AA %d\n",
250 a, r, g, b, bpp, FSAA));
252 SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r);
253 SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g);
254 SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b);
255 SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &a);
256 SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &bpp);
257 SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &FSAA);
259 mprintf((" Attributes received : ARGB %d%d%d%d, BPP %d, AA %d\n",
260 a, r, g, b, bpp, FSAA));
264 SDL_DisableScreenSaver();
267 // maybe go fullscreen - should be done *after* main GL init
268 int fullscreen = os_config_read_uint("Video", "Fullscreen", 1);
269 if ( !Cmdline_window && (fullscreen || Cmdline_fullscreen) ) {
270 gr_force_fullscreen();
271 // poll for window events
278 gr_screen.bits_per_pixel = 16;
279 gr_screen.bytes_per_pixel = 2;
285 Gr_red.mask = 0x7C01;
290 Gr_green.mask = 0x3E1;
299 Gr_alpha.scale = 255;
306 gr_screen.bits_per_pixel = 32;
307 gr_screen.bytes_per_pixel = 4;
318 Gr_green.mask = 0xff00;
323 Gr_blue.mask = 0xff0000;
328 Gr_alpha.mask = 0xff000000;
333 Int3(); // Illegal bpp
337 // DDOI - set these so no one else does!
338 // texture values, always 5551 - 16-bit
339 Gr_t_red.mask = 0x7C01;
343 Gr_t_green.mask = 0x3E1;
344 Gr_t_green.shift = 6;
345 Gr_t_green.scale = 8;
347 Gr_t_blue.mask = 0x20;
351 Gr_t_alpha.mask = 0x1;
352 Gr_t_alpha.shift = 0;
353 Gr_t_alpha.scale = 255;
355 // alpha-texture values
356 Gr_ta_red.mask = 0x0f00;
358 Gr_ta_red.scale = 16;
360 Gr_ta_green.mask = 0x00f0;
361 Gr_ta_green.shift = 4;
362 Gr_ta_green.scale = 16;
364 Gr_ta_blue.mask = 0x000f;
365 Gr_ta_blue.shift = 0;
366 Gr_ta_blue.scale = 16;
368 Gr_ta_alpha.mask = 0xf000;
369 Gr_ta_alpha.shift = 12;
370 Gr_ta_alpha.scale = 16;
373 Gr_current_red = &Gr_red;
374 Gr_current_blue = &Gr_blue;
375 Gr_current_green = &Gr_green;
376 Gr_current_alpha = &Gr_alpha;