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"
12 #include "gropengl1.h"
13 #include "gropengl2.h"
14 #include "gropenglinternal.h"
17 #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;
44 void opengl_alloc_render_buffer(unsigned int nelems)
50 if ( render_buffer && (nelems <= render_buffer_size) ) {
58 render_buffer = (rb_t*) malloc(sizeof(rb_t) * nelems);
59 render_buffer_size = nelems;
60 printf("render_buffer_size: %d\n", render_buffer_size);
63 void opengl_free_render_buffer()
68 render_buffer_size = 0;
72 void gr_opengl_set_viewport(int width, int height)
76 float ratio = gr_screen.max_w / i2fl(gr_screen.max_h);
79 h = i2fl((width / ratio) + 0.5f);
83 w = i2fl((height * ratio) + 0.5f);
93 GL_viewport_scale_w = w / i2fl(gr_screen.max_w);
94 GL_viewport_scale_h = h / i2fl(gr_screen.max_h);
96 glViewport(GL_viewport_x, GL_viewport_y, GL_viewport_w, GL_viewport_h);
98 glMatrixMode(GL_PROJECTION);
100 glOrtho(0, GL_viewport_w, GL_viewport_h, 0, 0.0, 1.0);
101 glMatrixMode(GL_MODELVIEW);
103 glScalef(GL_viewport_scale_w, GL_viewport_scale_h, 1.0f);
106 void gr_opengl_force_windowed()
108 SDL_SetWindowFullscreen(GL_window, 0);
111 void gr_opengl_force_fullscreen()
113 int fullscreen = os_config_read_uint(NULL, "Fullscreen", 1);
114 int flag = SDL_WINDOW_FULLSCREEN_DESKTOP;
116 if (fullscreen == 2) {
117 flag = SDL_WINDOW_FULLSCREEN;
120 SDL_SetWindowFullscreen(GL_window, flag);
123 void gr_opengl_set_color_fast(color *dst)
125 if ( dst->screen_sig != gr_screen.signature ) {
126 if ( dst->is_alphacolor ) {
127 gr_opengl_init_alphacolor( dst, dst->red, dst->green, dst->blue, dst->alpha, dst->ac_type );
129 gr_opengl_init_color( dst, dst->red, dst->green, dst->blue );
132 gr_screen.current_color = *dst;
135 void gr_opengl_get_color( int * r, int * g, int * b )
137 if (r) *r = gr_screen.current_color.red;
138 if (g) *g = gr_screen.current_color.green;
139 if (b) *b = gr_screen.current_color.blue;
142 void gr_opengl_init_color(color *c, int r, int g, int b)
144 c->screen_sig = gr_screen.signature;
145 c->red = (unsigned char)r;
146 c->green = (unsigned char)g;
147 c->blue = (unsigned char)b;
149 c->ac_type = AC_TYPE_NONE;
151 c->is_alphacolor = 0;
155 void gr_opengl_init_alphacolor( color *clr, int r, int g, int b, int alpha, int type )
157 if ( r < 0 ) r = 0; else if ( r > 255 ) r = 255;
158 if ( g < 0 ) g = 0; else if ( g > 255 ) g = 255;
159 if ( b < 0 ) b = 0; else if ( b > 255 ) b = 255;
160 if ( alpha < 0 ) alpha = 0; else if ( alpha > 255 ) alpha = 255;
162 gr_opengl_init_color( clr, r, g, b );
164 clr->alpha = (unsigned char)alpha;
165 clr->ac_type = (ubyte)type;
166 clr->alphacolor = -1;
167 clr->is_alphacolor = 1;
170 void gr_opengl_set_color( int r, int g, int b )
172 SDL_assert((r >= 0) && (r < 256));
173 SDL_assert((g >= 0) && (g < 256));
174 SDL_assert((b >= 0) && (b < 256));
176 gr_opengl_init_color( &gr_screen.current_color, r, g, b );
179 void gr_opengl_set_clear_color(int r, int g, int b)
181 gr_opengl_init_color(&gr_screen.current_clear_color, r, g, b);
184 void gr_opengl_set_bitmap(int bitmap_num, int alphablend_mode, int bitblt_mode, float alpha, int sx, int sy)
186 gr_screen.current_alpha = alpha;
187 gr_screen.current_alphablend_mode = alphablend_mode;
188 gr_screen.current_bitblt_mode = bitblt_mode;
189 gr_screen.current_bitmap = bitmap_num;
191 gr_screen.current_bitmap_sx = sx;
192 gr_screen.current_bitmap_sy = sy;
195 void gr_opengl_create_shader(shader * shade, float r, float g, float b, float c )
197 shade->screen_sig = gr_screen.signature;
204 void gr_opengl_set_shader( shader * shade )
207 if (shade->screen_sig != gr_screen.signature) {
208 gr_create_shader( shade, shade->r, shade->g, shade->b, shade->c );
210 gr_screen.current_shader = *shade;
212 gr_create_shader( &gr_screen.current_shader, 0.0f, 0.0f, 0.0f, 0.0f );
216 int gr_opengl_zbuffer_get()
218 if ( !gr_global_zbuffering ) {
219 return GR_ZBUFF_NONE;
221 return gr_zbuffering_mode;
224 int gr_opengl_zbuffer_set(int mode)
226 int tmp = gr_zbuffering_mode;
228 gr_zbuffering_mode = mode;
230 if (gr_zbuffering_mode == GR_ZBUFF_NONE ) {
238 void opengl_set_variables()
240 GL_min_texture_height = 16;
241 GL_min_texture_width = 16;
243 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GL_max_texture_width);
244 GL_max_texture_height = GL_max_texture_width;
246 // no texture is larger than 1024, so maybe don't use sections
247 if (GL_max_texture_width >= 1024) {
248 gr_screen.use_sections = 0;
252 void gr_opengl_cleanup()
256 opengl_free_render_buffer();
259 void gr_opengl_init()
266 mprintf(( "Initializing OpenGL graphics device...\n" ));
270 if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
271 Error(LOCATION, "Couldn't init SDL: %s", SDL_GetError());
274 int a = 1, r = 5, g = 5, b = 5, bpp = 16, db = 1;
276 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, r);
277 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, g);
278 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, b);
279 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, a);
280 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, bpp);
281 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, db);
283 FSAA = os_config_read_uint(NULL, "FSAA", 2);
286 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
287 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, FSAA);
290 GL_window = SDL_CreateWindow(Osreg_title, SDL_WINDOWPOS_CENTERED,
291 SDL_WINDOWPOS_CENTERED,
292 gr_screen.max_w, gr_screen.max_h, SDL_WINDOW_OPENGL);
295 Error(LOCATION, "Couldn't create window: %s\n", SDL_GetError());
298 GL_context = SDL_GL_CreateContext(GL_window);
300 const char *gl_version = (const char*)glGetString(GL_VERSION);
301 int v_major = 0, v_minor = 0;
303 sscanf(gl_version, "%d.%d", &v_major, &v_minor);
305 GL_version = (v_major * 10) + v_minor;
307 // version check, require 1.2+ for sake of simplicity
308 if (GL_version < 12) {
309 Error(LOCATION, "Minimum OpenGL version is 1.2!");
312 mprintf((" Vendor : %s\n", glGetString(GL_VENDOR)));
313 mprintf((" Renderer : %s\n", glGetString(GL_RENDERER)));
314 mprintf((" Version : %s\n", gl_version));
316 mprintf((" Attributes requested: ARGB %d%d%d%d, BPP %d, DB %d, AA %d\n", a, r, g, b, bpp, db, FSAA));
318 SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r);
319 SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g);
320 SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b);
321 SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &a);
322 SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &bpp);
323 SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &db);
324 SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &FSAA);
326 mprintf((" Attributes received: ARGB %d%d%d%d, BPP %d, DB %d, AA %d\n", a, r, g, b, bpp, db, FSAA));
331 // initial setup viewport
332 gr_opengl_set_viewport(gr_screen.max_w, gr_screen.max_h);
334 // maybe go fullscreen - should be done *after* initial viewport setup
335 int fullscreen = os_config_read_uint(NULL, "Fullscreen", 1);
336 if ( !Cmdline_window && (fullscreen || Cmdline_fullscreen) ) {
337 int flag = SDL_WINDOW_FULLSCREEN_DESKTOP;
339 if (fullscreen == 2) {
340 flag = SDL_WINDOW_FULLSCREEN;
343 SDL_SetWindowFullscreen(GL_window, flag);
346 // set up generic variables before further init() calls
347 opengl_set_variables();
349 // if (v_major >= 2) {
357 Bm_pixel_format = BM_PIXEL_FORMAT_ARGB;
360 extern int D3D_enabled;
367 gr_screen.bits_per_pixel = 16;
368 gr_screen.bytes_per_pixel = 2;
373 Gr_red.mask = 0x7C00;
378 Gr_green.mask = 0x3E0;
387 Gr_alpha.scale = 255;
388 Gr_alpha.mask = 0x8000;
394 gr_screen.bits_per_pixel = 32;
395 gr_screen.bytes_per_pixel = 4;
400 Gr_red.mask = 0xff0000;
405 Gr_green.mask = 0xff00;
415 Gr_alpha.mask = 0xff000000;
420 Int3(); // Illegal bpp
424 // DDOI - set these so no one else does!
425 Gr_t_red.mask = Gr_red.mask;
426 Gr_t_red.shift = Gr_red.shift;
427 Gr_t_red.scale = Gr_red.scale;
429 Gr_t_green.mask = Gr_green.mask;
430 Gr_t_green.shift = Gr_green.shift;
431 Gr_t_green.scale = Gr_green.scale;
433 Gr_t_blue.mask = Gr_blue.mask;
434 Gr_t_blue.shift = Gr_blue.shift;
435 Gr_t_blue.scale = Gr_blue.scale;
437 Gr_t_alpha.mask = Gr_alpha.mask;
438 Gr_t_alpha.scale = Gr_alpha.scale;
439 Gr_t_alpha.shift = Gr_alpha.shift;
441 Gr_ta_red.mask = 0x0f00;
443 Gr_ta_red.scale = 16;
445 Gr_ta_green.mask = 0x00f0;
446 Gr_ta_green.shift = 4;
447 Gr_ta_green.scale = 16;
449 Gr_ta_blue.mask = 0x000f;
450 Gr_ta_blue.shift = 0;
451 Gr_ta_blue.scale = 16;
453 Gr_ta_alpha.mask = 0xf000;
454 Gr_ta_alpha.shift = 12;
455 Gr_ta_alpha.scale = 16;
457 Gr_current_red = &Gr_red;
458 Gr_current_blue = &Gr_blue;
459 Gr_current_green = &Gr_green;
460 Gr_current_alpha = &Gr_alpha;
469 int opengl_max_tex_size_get()
471 GLint max_texture_size = 0;
473 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
474 return max_texture_size;