• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2006 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14 
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23 
24 /* StormMesa implementation of SDL OpenGL support */
25 
26 #include "SDL_cgxgl_c.h"
27 #include "SDL_cgxvideo.h"
28 
29 #if SDL_VIDEO_OPENGL
30 AmigaMesaContext glcont=NULL;
31 #endif
32 
33 /* Init OpenGL */
CGX_GL_Init(_THIS)34 int CGX_GL_Init(_THIS)
35 {
36 #if SDL_VIDEO_OPENGL
37    int i = 0;
38 	struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */
39    struct Window *win = (struct Window *)SDL_Window;
40 
41 	// default config. Always used...
42 	attributes[i].ti_Tag = AMA_Window;	attributes[i++].ti_Data = (unsigned long)win;
43 	attributes[i].ti_Tag = AMA_Left;		attributes[i++].ti_Data = 0;
44 	attributes[i].ti_Tag = AMA_Bottom;	attributes[i++].ti_Data = 0;
45 	attributes[i].ti_Tag = AMA_Width;	attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight;
46 	attributes[i].ti_Tag = AMA_Height;	attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop;
47 	attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE;
48 
49 	// double buffer ?
50 	attributes[i].ti_Tag = AMA_DoubleBuf;
51 	if ( this->gl_config.double_buffer ) {
52 		attributes[i++].ti_Data = GL_TRUE;
53 	}
54 	else {
55 		attributes[i++].ti_Data = GL_FALSE;
56 	}
57 	// RGB(A) Mode ?
58 	attributes[i].ti_Tag = AMA_RGBMode;
59 	if ( this->gl_config.red_size   != 0 &&
60 	     this->gl_config.blue_size  != 0 &&
61 	     this->gl_config.green_size != 0 ) {
62 		attributes[i++].ti_Data = GL_TRUE;
63 	}
64 	else {
65 		attributes[i++].ti_Data = GL_FALSE;
66 	}
67 	// no depth buffer ?
68 	if ( this->gl_config.depth_size == 0 ) {
69 		attributes[i].ti_Tag = AMA_NoDepth;
70 		attributes[i++].ti_Data = GL_TRUE;
71 	}
72 	// no stencil buffer ?
73 	if ( this->gl_config.stencil_size == 0 ) {
74 		attributes[i].ti_Tag = AMA_NoStencil;
75 		attributes[i++].ti_Data = GL_TRUE;
76 	}
77 	// no accum buffer ?
78 	if ( this->gl_config.accum_red_size   != 0 &&
79 	     this->gl_config.accum_blue_size  != 0 &&
80 	     this->gl_config.accum_green_size != 0 ) {
81 		attributes[i].ti_Tag = AMA_NoAccum;
82 		attributes[i++].ti_Data = GL_TRUE;
83 	}
84 	// done...
85 	attributes[i].ti_Tag	= TAG_DONE;
86 
87 	glcont = AmigaMesaCreateContext(attributes);
88 	if ( glcont == NULL ) {
89 		SDL_SetError("Couldn't create OpenGL context");
90 		return(-1);
91 	}
92 	this->gl_data->gl_active = 1;
93 	this->gl_config.driver_loaded = 1;
94 
95 	return(0);
96 #else
97 	SDL_SetError("OpenGL support not configured");
98 	return(-1);
99 #endif
100 }
101 
102 /* Quit OpenGL */
CGX_GL_Quit(_THIS)103 void CGX_GL_Quit(_THIS)
104 {
105 #if SDL_VIDEO_OPENGL
106 	if ( glcont != NULL ) {
107 		AmigaMesaDestroyContext(glcont);
108 		glcont = NULL;
109 		this->gl_data->gl_active = 0;
110 		this->gl_config.driver_loaded = 0;
111 	}
112 #endif
113 }
114 
115 /* Attach context to another window */
CGX_GL_Update(_THIS)116 int CGX_GL_Update(_THIS)
117 {
118 #if SDL_VIDEO_OPENGL
119 	struct TagItem tags[2];
120 	struct Window *win = (struct Window*)SDL_Window;
121 	if(glcont == NULL) {
122 		return -1; //should never happen
123 	}
124 	tags[0].ti_Tag = AMA_Window;
125 	tags[0].ti_Data = (unsigned long)win;
126 	tags[1].ti_Tag = TAG_DONE;
127 	AmigaMesaSetRast(glcont, tags);
128 
129 	return 0;
130 #else
131 	SDL_SetError("OpenGL support not configured");
132 	return -1;
133 #endif
134 }
135 
136 #if SDL_VIDEO_OPENGL
137 
138 /* Make the current context active */
CGX_GL_MakeCurrent(_THIS)139 int CGX_GL_MakeCurrent(_THIS)
140 {
141 	if(glcont == NULL)
142 		return -1;
143 
144 	AmigaMesaMakeCurrent(glcont, glcont->buffer);
145 	return 0;
146 }
147 
CGX_GL_SwapBuffers(_THIS)148 void CGX_GL_SwapBuffers(_THIS)
149 {
150 	AmigaMesaSwapBuffers(glcont);
151 }
152 
CGX_GL_GetAttribute(_THIS,SDL_GLattr attrib,int * value)153 int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) {
154 	GLenum mesa_attrib;
155 
156 	switch(attrib) {
157 		case SDL_GL_RED_SIZE:
158 			mesa_attrib = GL_RED_BITS;
159 			break;
160 		case SDL_GL_GREEN_SIZE:
161 			mesa_attrib = GL_GREEN_BITS;
162 			break;
163 		case SDL_GL_BLUE_SIZE:
164 			mesa_attrib = GL_BLUE_BITS;
165 			break;
166 		case SDL_GL_ALPHA_SIZE:
167 			mesa_attrib = GL_ALPHA_BITS;
168 			break;
169 		case SDL_GL_DOUBLEBUFFER:
170 			mesa_attrib = GL_DOUBLEBUFFER;
171 			break;
172 		case SDL_GL_DEPTH_SIZE:
173 			mesa_attrib = GL_DEPTH_BITS;
174 			break;
175 		case SDL_GL_STENCIL_SIZE:
176 			mesa_attrib = GL_STENCIL_BITS;
177 			break;
178 		case SDL_GL_ACCUM_RED_SIZE:
179 			mesa_attrib = GL_ACCUM_RED_BITS;
180 			break;
181 		case SDL_GL_ACCUM_GREEN_SIZE:
182 			mesa_attrib = GL_ACCUM_GREEN_BITS;
183 			break;
184 		case SDL_GL_ACCUM_BLUE_SIZE:
185 			mesa_attrib = GL_ACCUM_BLUE_BITS;
186 			break;
187 		case SDL_GL_ACCUM_ALPHA_SIZE:
188 			mesa_attrib = GL_ACCUM_ALPHA_BITS;
189 			break;
190 		default :
191 			return -1;
192 	}
193 
194 	AmigaMesaGetConfig(glcont->visual, mesa_attrib, value);
195 	return 0;
196 }
197 
CGX_GL_GetProcAddress(_THIS,const char * proc)198 void *CGX_GL_GetProcAddress(_THIS, const char *proc) {
199 	void *func = NULL;
200 	func = AmiGetGLProc(proc);
201 	return func;
202 }
203 
CGX_GL_LoadLibrary(_THIS,const char * path)204 int CGX_GL_LoadLibrary(_THIS, const char *path) {
205 	/* Library is always open */
206 	this->gl_config.driver_loaded = 1;
207 
208 	return 0;
209 }
210 
211 #endif /* SDL_VIDEO_OPENGL */
212 
213