void gl_InitOpenGL() { SDL_Surface *screen_surface; if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0) // page-flipping needs double buffering { printf("Unable to set GL attribute : %s\n",SDL_GetError()); exit(1); } if (SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1)<0) // enable page-flipping { printf("Unable to set GL attribute : %s\n",SDL_GetError()); exit(1); } if (SDL_GL_LoadLibrary(NULL)<0) { printf("Unable to dynamically open GL lib : %s\n",SDL_GetError()); exit(1); } if (FullScreen) screen_surface = SDL_SetVideoMode(0, 0, 0, SDL_OPENGL|SDL_FULLSCREEN); else screen_surface = SDL_SetVideoMode(640, 512, 0, SDL_OPENGL); if (screen_surface == NULL) { printf("Unable to open video mode : %s\n",SDL_GetError()); SDL_Quit(); exit(1); } screen_width = screen_surface->w; screen_height = screen_surface->h; init_glfuncs(); }
SDL_Surface* OpenGLPlugin::OpenGLInit(int w,int h, int bpp, bool fs, int glScanline) { _GLScanlines = glScanline; #ifdef _WIN32 const char *gl_library = "OpenGL32.DLL"; #else const char *gl_library = "libGL.so.1"; #endif int surface_bpp; SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (SDL_GL_LoadLibrary(gl_library)<0) { fprintf(stderr,"Unable to dynamically open GL lib : %s\n",SDL_GetError()); return NULL; } if (!fs) { w=CPCVisibleSCRWidth*2; h=CPCVisibleSCRHeight*2; } _video=SDL_SetVideoMode(w,h,0,SDL_OPENGL | (fs?SDL_FULLSCREEN:0)); if (!_video) { fprintf(stderr, "Could not set requested video mode: %s\n", SDL_GetError()); return NULL; } if (init_glfuncs()!=0) { fprintf(stderr, "Cannot init OpenGL functions: %s\n", SDL_GetError()); return NULL; } int major, minor; const char *version; version = (char *) eglGetString(GL_VERSION); if (sscanf(version, "%d.%d", &major, &minor) != 2) { fprintf(stderr, "Unable to get OpenGL version\n"); return NULL; } GLint max_texsize; eglGetIntegerv(GL_MAX_TEXTURE_SIZE,&max_texsize); if (max_texsize<512) { fprintf(stderr, "Your OpenGL implementation doesn't support 512x512 textures\n"); return NULL; } // We have to react differently to the bpp parameter than with software rendering // Here are the rules : // for 8bpp OpenGL, we need the GL_EXT_paletted_texture extension // for 16bpp OpenGL, we need OpenGL 1.2+ // for 24bpp reversed OpenGL, we need OpenGL 1.2+ surface_bpp=0; switch(bpp) { case 8: surface_bpp = (HaveOpenGLExtension("GL_EXT_paletted_texture"))?8:0; break; case 15: case 16: surface_bpp = ((major>1)||(major == 1 && minor >= 2))?16:0; break; case 24: surface_bpp = ((major>1)||(major == 1 && minor >= 2))?24:0; case 32: surface_bpp = ((major>1)||(major == 1 && minor >= 2))?32:0; default: surface_bpp = ((major>1)||(major == 1 && minor >= 2))?32:0; break; } if (surface_bpp==0) { fprintf(stderr, "Your OpenGL implementation doesn't support %dbpp textures\n",surface_bpp); return NULL; } eglDisable(GL_FOG); eglDisable(GL_LIGHTING); eglDisable(GL_CULL_FACE); eglDisable(GL_DEPTH_TEST); eglDisable(GL_BLEND); eglDisable(GL_NORMALIZE); eglDisable(GL_ALPHA_TEST); eglEnable(GL_TEXTURE_2D); eglBlendFunc (GL_SRC_ALPHA, GL_ONE); eglGenTextures(1,&_screenTexnum); eglBindTexture(GL_TEXTURE_2D,_screenTexnum); eglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _openGLFilter?GL_LINEAR:GL_NEAREST); eglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _openGLFilter?GL_LINEAR:GL_NEAREST); _texWidth=512; _texHeight=512; switch(surface_bpp) { case 32: eglTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA,_texWidth,_texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); break; case 24: eglTexImage2D(GL_TEXTURE_2D, 0,GL_RGB,_texWidth,_texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); break; case 16: eglTexImage2D(GL_TEXTURE_2D, 0,GL_RGB5,_texWidth,_texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); break; case 8: eglTexImage2D(GL_TEXTURE_2D, 0,GL_COLOR_INDEX8_EXT,_texWidth,_texHeight, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, NULL); break; } if (_GLScanlines!=0) { Uint8 texmod; switch(_GLScanlines) { case 25: texmod=192; break; case 50: texmod=128; break; case 75: texmod=64; break; case 100: texmod=0; break; default: texmod=255; } eglGenTextures(1,&_modulateTexnum); eglBindTexture(GL_TEXTURE_2D,_modulateTexnum); eglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _openGLFilter?GL_LINEAR:GL_NEAREST); eglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _openGLFilter?GL_LINEAR:GL_NEAREST); Uint8 modulate_texture[]={ 255,255,255, 0,0,0}; modulate_texture[3]=texmod; modulate_texture[4]=texmod; modulate_texture[5]=texmod; eglTexImage2D(GL_TEXTURE_2D, 0,GL_RGB8,1,2, 0,GL_RGB,GL_UNSIGNED_BYTE, modulate_texture); } eglViewport(0,0,w,h); eglMatrixMode(GL_PROJECTION); eglLoadIdentity(); eglOrtho(0,w,h,0,-1.0, 1.0); eglMatrixMode(GL_MODELVIEW); eglLoadIdentity(); // _publicVideo=SDL_CreateRGBSurface(SDL_SWSURFACE,CPCVisibleSCRWidth,CPCVisibleSCRHeight,surface_bpp,0,0,0,0); return _publicVideo; }