146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* StormMesa implementation of SDL OpenGL support */
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_cgxgl_c.h"
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_cgxvideo.h"
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
3046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerAmigaMesaContext glcont=NULL;
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Init OpenGL */
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_Init(_THIS)
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   int i = 0;
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   struct Window *win = (struct Window *)SDL_Window;
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// default config. Always used...
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_Window;	attributes[i++].ti_Data = (unsigned long)win;
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_Left;		attributes[i++].ti_Data = 0;
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_Bottom;	attributes[i++].ti_Data = 0;
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_Width;	attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight;
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_Height;	attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop;
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE;
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// double buffer ?
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_DoubleBuf;
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( this->gl_config.double_buffer ) {
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_TRUE;
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else {
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_FALSE;
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// RGB(A) Mode ?
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag = AMA_RGBMode;
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( this->gl_config.red_size   != 0 &&
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	     this->gl_config.blue_size  != 0 &&
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	     this->gl_config.green_size != 0 ) {
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_TRUE;
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else {
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_FALSE;
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// no depth buffer ?
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( this->gl_config.depth_size == 0 ) {
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i].ti_Tag = AMA_NoDepth;
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_TRUE;
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// no stencil buffer ?
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( this->gl_config.stencil_size == 0 ) {
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i].ti_Tag = AMA_NoStencil;
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_TRUE;
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// no accum buffer ?
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( this->gl_config.accum_red_size   != 0 &&
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	     this->gl_config.accum_blue_size  != 0 &&
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	     this->gl_config.accum_green_size != 0 ) {
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i].ti_Tag = AMA_NoAccum;
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		attributes[i++].ti_Data = GL_TRUE;
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	// done...
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	attributes[i].ti_Tag	= TAG_DONE;
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	glcont = AmigaMesaCreateContext(attributes);
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( glcont == NULL ) {
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Couldn't create OpenGL context");
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	this->gl_data->gl_active = 1;
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	this->gl_config.driver_loaded = 1;
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_SetError("OpenGL support not configured");
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(-1);
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Quit OpenGL */
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid CGX_GL_Quit(_THIS)
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( glcont != NULL ) {
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		AmigaMesaDestroyContext(glcont);
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		glcont = NULL;
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		this->gl_data->gl_active = 0;
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		this->gl_config.driver_loaded = 0;
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Attach context to another window */
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_Update(_THIS)
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	struct TagItem tags[2];
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	struct Window *win = (struct Window*)SDL_Window;
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if(glcont == NULL) {
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return -1; //should never happen
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tags[0].ti_Tag = AMA_Window;
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tags[0].ti_Data = (unsigned long)win;
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tags[1].ti_Tag = TAG_DONE;
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	AmigaMesaSetRast(glcont, tags);
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_SetError("OpenGL support not configured");
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return -1;
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Make the current context active */
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_MakeCurrent(_THIS)
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if(glcont == NULL)
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return -1;
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	AmigaMesaMakeCurrent(glcont, glcont->buffer);
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid CGX_GL_SwapBuffers(_THIS)
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	AmigaMesaSwapBuffers(glcont);
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) {
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	GLenum mesa_attrib;
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(attrib) {
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_RED_SIZE:
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_RED_BITS;
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_GREEN_SIZE:
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_GREEN_BITS;
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_BLUE_SIZE:
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_BLUE_BITS;
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ALPHA_SIZE:
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_ALPHA_BITS;
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_DOUBLEBUFFER:
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_DOUBLEBUFFER;
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_DEPTH_SIZE:
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_DEPTH_BITS;
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_STENCIL_SIZE:
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_STENCIL_BITS;
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_RED_SIZE:
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_ACCUM_RED_BITS;
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_GREEN_SIZE:
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_ACCUM_GREEN_BITS;
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_BLUE_SIZE:
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_ACCUM_BLUE_BITS;
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_ALPHA_SIZE:
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mesa_attrib = GL_ACCUM_ALPHA_BITS;
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		default :
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return -1;
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	AmigaMesaGetConfig(glcont->visual, mesa_attrib, value);
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid *CGX_GL_GetProcAddress(_THIS, const char *proc) {
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	void *func = NULL;
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	func = AmiGetGLProc(proc);
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return func;
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_LoadLibrary(_THIS, const char *path) {
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Library is always open */
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	this->gl_config.driver_loaded = 1;
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_VIDEO_OPENGL */
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
213