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
10 #include "osregistry.h"
13 #include "gropenglinternal.h"
16 #include "grinternal.h"
22 bool OGL_inited = false;
25 SDL_Window *GL_window = NULL;
26 SDL_GLContext GL_context;
30 int GL_viewport_x = 0;
31 int GL_viewport_y = 0;
32 int GL_viewport_w = 640;
33 int GL_viewport_h = 480;
34 float GL_viewport_scale_w = 1.0f;
35 float GL_viewport_scale_h = 1.0f;
36 int GL_min_texture_width = 0;
37 int GL_max_texture_width = 0;
38 int GL_min_texture_height = 0;
39 int GL_max_texture_height = 0;
41 rb_t *render_buffer = NULL;
42 static size_t render_buffer_size = 0;
45 void opengl_alloc_render_buffer(unsigned int nelems)
51 if ( render_buffer && (nelems <= render_buffer_size) ) {
59 render_buffer = (rb_t*) malloc(sizeof(rb_t) * nelems);
60 render_buffer_size = nelems;
63 void opengl_free_render_buffer()
68 render_buffer_size = 0;
72 void opengl_set_variables()
74 GL_min_texture_height = 16;
75 GL_min_texture_width = 16;
77 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GL_max_texture_width);
78 GL_max_texture_height = GL_max_texture_width;
80 // no texture is larger than 1024, so maybe don't use sections
81 if (GL_max_texture_width >= 1024) {
82 gr_screen.use_sections = 0;
86 void opengl_init_viewport()
90 GL_viewport_w = gr_screen.max_w;
91 GL_viewport_h = gr_screen.max_h;
92 GL_viewport_scale_w = 1.0f;
93 GL_viewport_scale_h = 1.0f;
95 glViewport(GL_viewport_x, GL_viewport_y, GL_viewport_w, GL_viewport_h);
97 glMatrixMode(GL_PROJECTION);
99 glOrtho(0, GL_viewport_w, GL_viewport_h, 0, 0.0, 1.0);
100 glMatrixMode(GL_MODELVIEW);
104 void gr_opengl_force_windowed()
106 SDL_SetWindowFullscreen(GL_window, 0);
109 void gr_opengl_force_fullscreen()
111 SDL_SetWindowFullscreen(GL_window, SDL_WINDOW_FULLSCREEN_DESKTOP);
114 void gr_opengl_toggle_fullscreen()
116 Uint32 flags = SDL_GetWindowFlags(GL_window);
118 if ( (flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP ) {
119 gr_opengl_force_windowed();
121 gr_opengl_force_fullscreen();
125 void gr_opengl_cleanup()
129 opengl_free_render_buffer();
132 void gr_opengl_init()
139 mprintf(( "Initializing OpenGL graphics device...\n" ));
143 if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
144 Error(LOCATION, "Couldn't init SDL: %s", SDL_GetError());
147 int a = 1, r = 5, g = 5, b = 5, bpp = 16, db = 1;
149 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, r);
150 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, g);
151 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, b);
152 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, a);
153 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, bpp);
154 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, db);
156 FSAA = os_config_read_uint(NULL, "FSAA", 0);
159 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
160 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, FSAA);
163 GL_window = SDL_CreateWindow(os_get_title(), SDL_WINDOWPOS_CENTERED,
164 SDL_WINDOWPOS_CENTERED,
165 gr_screen.max_w, gr_screen.max_h, SDL_WINDOW_OPENGL);
168 Error(LOCATION, "Couldn't create window: %s\n", SDL_GetError());
171 GL_context = SDL_GL_CreateContext(GL_window);
173 const char *gl_version = (const char*)glGetString(GL_VERSION);
174 int v_major = 0, v_minor = 0;
176 sscanf(gl_version, "%d.%d", &v_major, &v_minor);
178 GL_version = (v_major * 10) + v_minor;
180 // version check, require 1.2+ for sake of simplicity
181 if (GL_version < 12) {
182 Error(LOCATION, "Minimum OpenGL version is 1.2!");
185 mprintf((" Vendor : %s\n", glGetString(GL_VENDOR)));
186 mprintf((" Renderer : %s\n", glGetString(GL_RENDERER)));
187 mprintf((" Version : %s\n", gl_version));
189 mprintf((" Attributes requested: ARGB %d%d%d%d, BPP %d, DB %d, AA %d\n", a, r, g, b, bpp, db, FSAA));
191 SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r);
192 SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g);
193 SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b);
194 SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &a);
195 SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &bpp);
196 SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &db);
197 SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &FSAA);
199 mprintf((" Attributes received : ARGB %d%d%d%d, BPP %d, DB %d, AA %d\n", a, r, g, b, bpp, db, FSAA));
202 SDL_DisableScreenSaver();
205 // initial viewport setup
206 opengl_init_viewport();
208 // set up generic variables before further init() calls
209 opengl_set_variables();
214 // maybe go fullscreen - should be done *after* main GL init
215 int fullscreen = os_config_read_uint(NULL, "Fullscreen", 1);
216 if ( !Cmdline_window && (fullscreen || Cmdline_fullscreen) ) {
217 SDL_SetWindowFullscreen(GL_window, SDL_WINDOW_FULLSCREEN_DESKTOP);
218 // poll for window events
228 gr_screen.bits_per_pixel = 16;
229 gr_screen.bytes_per_pixel = 2;
235 Gr_red.mask = 0x7C00;
240 Gr_green.mask = 0x3E0;
249 Gr_alpha.scale = 255;
250 Gr_alpha.mask = 0x8000;
256 gr_screen.bits_per_pixel = 32;
257 gr_screen.bytes_per_pixel = 4;
263 Gr_red.mask = 0xff0000;
268 Gr_green.mask = 0xff00;
278 Gr_alpha.mask = 0xff000000;
283 Int3(); // Illegal bpp
287 // DDOI - set these so no one else does!
288 // texture values, always 1555 - 16-bit
289 Gr_t_red.mask = 0x7C00;
293 Gr_t_green.mask = 0x3E0;
294 Gr_t_green.shift = 5;
295 Gr_t_green.scale = 8;
297 Gr_t_blue.mask = 0x1F;
301 Gr_t_alpha.mask = 0x8000;
302 Gr_t_alpha.scale = 255;
303 Gr_t_alpha.shift = 15;
305 // alpha-texture values
306 Gr_ta_red.mask = 0x0f00;
308 Gr_ta_red.scale = 16;
310 Gr_ta_green.mask = 0x00f0;
311 Gr_ta_green.shift = 4;
312 Gr_ta_green.scale = 16;
314 Gr_ta_blue.mask = 0x000f;
315 Gr_ta_blue.shift = 0;
316 Gr_ta_blue.scale = 16;
318 Gr_ta_alpha.mask = 0xf000;
319 Gr_ta_alpha.shift = 12;
320 Gr_ta_alpha.scale = 16;
323 Gr_current_red = &Gr_red;
324 Gr_current_blue = &Gr_blue;
325 Gr_current_green = &Gr_green;
326 Gr_current_alpha = &Gr_alpha;