From b61ef3a107d4779742579bcb29e51ef0f2b1b546 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 18 Aug 2013 15:41:52 +0200 Subject: [PATCH] - bumped minimum supported OpenGL version to 1.4. The engine was already using several 1.3 and 1.4 features which would have caused problems on 1.2. - removed gl_vid_compatibility. With the bump to 1.4 no hardware requiring this flag is supported anymore. - disabled 16 bit framebuffers for the same reason. As a conseqence all code for rendering without stencil could also be removed. --- src/gl/renderer/gl_renderer.cpp | 16 + src/gl/renderer/gl_renderer.h | 16 +- src/gl/renderer/gl_renderstate.cpp | 4 +- src/gl/scene/gl_portal.cpp | 9 - src/gl/scene/gl_scene.cpp | 15 +- src/gl/system/gl_cvars.h | 1 - src/gl/system/gl_framebuffer.cpp | 6 +- src/gl/system/gl_interface.cpp | 648 ++++++++++++++--------------- src/gl/system/gl_interface.h | 7 - src/gl/system/gl_menu.cpp | 1 - src/gl/system/gl_wipe.cpp | 6 - src/gl/textures/gl_hwtexture.cpp | 4 - src/sdl/sdlglvideo.cpp | 73 +--- src/sdl/sdlglvideo.h | 4 +- src/win32/win32gliface.cpp | 215 ++++------ src/win32/win32gliface.h | 4 +- 16 files changed, 443 insertions(+), 586 deletions(-) diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 62983f213..e398a04c2 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -81,6 +81,22 @@ EXTERN_CVAR(Bool, gl_render_segs) // //----------------------------------------------------------------------------- +FGLRenderer::FGLRenderer(OpenGLFrameBuffer *fb) +{ + framebuffer = fb; + mCurrentPortal = NULL; + mMirrorCount = 0; + mPlaneMirrorCount = 0; + mLightCount = 0; + mAngles = FRotator(0,0,0); + mViewVector = FVector2(0,0); + mCameraPos = FVector3(0,0,0); + mVBO = NULL; + gl_spriteindex = 0; + mShaderManager = NULL; + glpart2 = glpart = gllight = mirrortexture = NULL; +} + void FGLRenderer::Initialize() { glpart2 = FTexture::CreateTexture(Wads.GetNumForFullName("glstuff/glpart2.png"), FTexture::TEX_MiscPatch); diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index f1b39fc46..8db9cb195 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -71,21 +71,7 @@ public: FFlatVertexBuffer *mVBO; - FGLRenderer(OpenGLFrameBuffer *fb) - { - framebuffer = fb; - mCurrentPortal = NULL; - mMirrorCount = 0; - mPlaneMirrorCount = 0; - mLightCount = 0; - mAngles = FRotator(0,0,0); - mViewVector = FVector2(0,0); - mCameraPos = FVector3(0,0,0); - mVBO = NULL; - gl_spriteindex = 0; - mShaderManager = NULL; - glpart2 = glpart = gllight = mirrortexture = NULL; - } + FGLRenderer(OpenGLFrameBuffer *fb); ~FGLRenderer() ; angle_t FrustumAngle(); diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index 31c46bc8a..f986d7afc 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -46,6 +46,8 @@ #include "gl/renderer/gl_renderstate.h" #include "gl/renderer/gl_colormap.h" +void gl_SetTextureMode(int type); + FRenderState gl_RenderState; int FStateAttr::ChangeCounter; @@ -291,7 +293,7 @@ void FRenderState::Apply(bool forcenoshader) GLRenderer->mShaderManager->SetActiveShader(NULL); if (mTextureMode != ffTextureMode) { - gl.SetTextureMode((ffTextureMode = mTextureMode)); + gl_SetTextureMode((ffTextureMode = mTextureMode)); } if (mTextureEnabled != ffTextureEnabled) { diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 6c72c2219..95ab7b567 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -470,15 +470,6 @@ void GLPortal::EndFrame() { GLPortal * p; - if (gl.flags & RFL_NOSTENCIL) - { - while (portals.Pop(p) && p) - { - delete p; - } - return; - } - if (gl_portalinfo) { Printf("%s%d portals, depth = %d\n%s{\n", indent.GetChars(), portals.Size(), renderdepth, indent.GetChars()); diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index 072d3408c..51454ed1a 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -511,15 +511,12 @@ void FGLRenderer::RenderScene(int recursion) // flood all the gaps with the back sector's flat texture // This will always be drawn like GLDL_PLAIN or GLDL_FOG, depending on the fog settings - if (!(gl.flags&RFL_NOSTENCIL)) // needs a stencil to work! - { - gl.DepthMask(false); // don't write to Z-buffer! - gl_RenderState.EnableFog(true); - gl_RenderState.EnableAlphaTest(false); - gl_RenderState.BlendFunc(GL_ONE,GL_ZERO); - gl_drawinfo->DrawUnhandledMissingTextures(); - gl_RenderState.EnableAlphaTest(true); - } + gl.DepthMask(false); // don't write to Z-buffer! + gl_RenderState.EnableFog(true); + gl_RenderState.EnableAlphaTest(false); + gl_RenderState.BlendFunc(GL_ONE,GL_ZERO); + gl_drawinfo->DrawUnhandledMissingTextures(); + gl_RenderState.EnableAlphaTest(true); gl.DepthMask(true); gl.PolygonOffset(0.0f, 0.0f); diff --git a/src/gl/system/gl_cvars.h b/src/gl/system/gl_cvars.h index 4e8aa85fd..f748f9b52 100644 --- a/src/gl/system/gl_cvars.h +++ b/src/gl/system/gl_cvars.h @@ -16,7 +16,6 @@ EXTERN_CVAR(Bool, gl_colormap_shader) EXTERN_CVAR(Bool, gl_brightmap_shader) EXTERN_CVAR(Bool, gl_glow_shader) -EXTERN_CVAR(Bool, gl_vid_compatibility) EXTERN_CVAR(Bool,gl_enhanced_nightvision) EXTERN_CVAR(Int, screenblocks); EXTERN_CVAR(Bool, gl_texture) diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index 6ba5032bb..c486cb374 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -73,6 +73,8 @@ CVAR(Bool, gl_aalines, false, CVAR_ARCHIVE) FGLRenderer *GLRenderer; void gl_SetupMenu(); +void gl_LoadExtensions(); +void gl_PrintStartupLog(); //========================================================================== // @@ -115,14 +117,14 @@ void OpenGLFrameBuffer::InitializeState() { static bool first=true; - gl.LoadExtensions(); + gl_LoadExtensions(); Super::InitializeState(); if (first) { first=false; // [BB] For some reason this crashes, if compiled with MinGW and optimization. Has to be investigated. #ifdef _MSC_VER - gl.PrintStartupLog(); + gl_PrintStartupLog(); #endif if (gl.flags&RFL_NPOT_TEXTURE) diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index 1576b5c49..6789c2c20 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -53,9 +53,7 @@ static void APIENTRY glBlendEquationDummy (GLenum mode); static TArray m_Extensions; -#define gl pgl - -RenderContext * gl; +RenderContext gl; int occlusion_type=0; @@ -107,201 +105,6 @@ static bool CheckExtension(const char *ext) } -//========================================================================== -// -// -// -//========================================================================== - -static void APIENTRY LoadExtensions() -{ - CollectExtensions(); - - const char *version = (const char*)glGetString(GL_VERSION); - - // Don't even start if it's lower than 1.2 - if (strcmp(version, "1.2") < 0) - { - I_FatalError("Unsupported OpenGL version.\nAt least GL 1.2 is required to run "GAMENAME".\n"); - } - - // This loads any function pointers and flags that require a vaild render context to - // initialize properly - - gl->shadermodel = 0; // assume no shader support - gl->vendorstring=(char*)glGetString(GL_VENDOR); - - // First try the regular function - gl->BlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation"); - // If that fails try the EXT version - if (!gl->BlendEquation) gl->BlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquationEXT"); - // If that fails use a no-op dummy - if (!gl->BlendEquation) gl->BlendEquation = glBlendEquationDummy; - - if (CheckExtension("GL_ARB_texture_non_power_of_two")) gl->flags|=RFL_NPOT_TEXTURE; - if (CheckExtension("GL_ARB_texture_compression")) gl->flags|=RFL_TEXTURE_COMPRESSION; - if (CheckExtension("GL_EXT_texture_compression_s3tc")) gl->flags|=RFL_TEXTURE_COMPRESSION_S3TC; - if (strstr(gl->vendorstring, "NVIDIA")) gl->flags|=RFL_NVIDIA; - else if (strstr(gl->vendorstring, "ATI Technologies")) gl->flags|=RFL_ATI; - - if (strcmp(version, "2.0") >= 0) gl->flags|=RFL_GL_20; - if (strcmp(version, "2.1") >= 0) gl->flags|=RFL_GL_21; - if (strcmp(version, "3.0") >= 0) gl->flags|=RFL_GL_30; - - glGetIntegerv(GL_MAX_TEXTURE_SIZE,&gl->max_texturesize); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - if (gl->flags & RFL_GL_20) - { - gl->DeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"); - gl->DeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram"); - gl->DetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader"); - gl->CreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); - gl->ShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"); - gl->CompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"); - gl->CreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"); - gl->AttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"); - gl->LinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"); - gl->UseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"); - gl->ValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram"); - - gl->VertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f"); - gl->VertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f"); - gl->VertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f"); - gl->VertexAttrib2fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib2fv"); - gl->VertexAttrib3fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib3fv"); - gl->VertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv"); - gl->VertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)wglGetProcAddress("glVertexAttrib4ubv"); - gl->GetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation"); - gl->BindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)wglGetProcAddress("glBindAttribLocation"); - - - gl->Uniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f"); - gl->Uniform2f = (PFNGLUNIFORM2FPROC)wglGetProcAddress("glUniform2f"); - gl->Uniform3f = (PFNGLUNIFORM3FPROC)wglGetProcAddress("glUniform3f"); - gl->Uniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress("glUniform4f"); - gl->Uniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"); - gl->Uniform2i = (PFNGLUNIFORM2IPROC)wglGetProcAddress("glUniform2i"); - gl->Uniform3i = (PFNGLUNIFORM3IPROC)wglGetProcAddress("glUniform3i"); - gl->Uniform4i = (PFNGLUNIFORM4IPROC)wglGetProcAddress("glUniform4i"); - gl->Uniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"); - gl->Uniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv"); - gl->Uniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv"); - gl->Uniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv"); - gl->Uniform1iv = (PFNGLUNIFORM1IVPROC)wglGetProcAddress("glUniform1iv"); - gl->Uniform2iv = (PFNGLUNIFORM2IVPROC)wglGetProcAddress("glUniform2iv"); - gl->Uniform3iv = (PFNGLUNIFORM3IVPROC)wglGetProcAddress("glUniform3iv"); - gl->Uniform4iv = (PFNGLUNIFORM4IVPROC)wglGetProcAddress("glUniform4iv"); - - gl->UniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)wglGetProcAddress("glUniformMatrix2fv"); - gl->UniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv"); - gl->UniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv"); - - gl->GetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog"); - gl->GetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"); - gl->GetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"); - gl->GetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform"); - gl->GetUniformfv = (PFNGLGETUNIFORMFVPROC)wglGetProcAddress("glGetUniformfv"); - gl->GetUniformiv = (PFNGLGETUNIFORMIVPROC)wglGetProcAddress("glGetUniformiv"); - gl->GetShaderSource = (PFNGLGETSHADERSOURCEPROC)wglGetProcAddress("glGetShaderSource"); - - gl->EnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray"); - gl->DisableVertexAttribArray= (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray"); - gl->VertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer"); - - // what'S the equivalent of this in GL 2.0??? - gl->GetObjectParameteriv = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB"); - - // Rules: - // SM4 will always use shaders. No option to switch them off is needed here. - // SM3 has shaders optional but they are off by default (they will have a performance impact - // SM2 only uses shaders for colormaps on camera textures and has no option to use them in general. - // On SM2 cards the shaders will be too slow and show visual bugs (at least on GF 6800.) - if (strcmp((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION), "1.3") >= 0) gl->shadermodel = 4; - else if (CheckExtension("GL_NV_GPU_shader4")) gl->shadermodel = 4; // for pre-3.0 drivers that support GF8xxx. - else if (CheckExtension("GL_EXT_GPU_shader4")) gl->shadermodel = 4; // for pre-3.0 drivers that support GF8xxx. - else if (CheckExtension("GL_NV_vertex_program3")) gl->shadermodel = 3; - else if (!strstr(gl->vendorstring, "NVIDIA")) gl->shadermodel = 3; - else gl->shadermodel = 2; // Only for older NVidia cards which had notoriously bad shader support. - - // Command line overrides for testing and problem cases. - if (Args->CheckParm("-sm2") && gl->shadermodel > 2) gl->shadermodel = 2; - else if (Args->CheckParm("-sm3") && gl->shadermodel > 3) gl->shadermodel = 3; - } - - if (CheckExtension("GL_ARB_occlusion_query")) - { - gl->GenQueries = (PFNGLGENQUERIESARBPROC)wglGetProcAddress("glGenQueriesARB"); - gl->DeleteQueries = (PFNGLDELETEQUERIESARBPROC)wglGetProcAddress("glDeleteQueriesARB"); - gl->GetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVARBPROC)wglGetProcAddress("glGetQueryObjectuivARB"); - gl->BeginQuery = (PFNGLBEGINQUERYARBPROC)wglGetProcAddress("glBeginQueryARB"); - gl->EndQuery = (PFNGLENDQUERYPROC)wglGetProcAddress("glEndQueryARB"); - gl->flags|=RFL_OCCLUSION_QUERY; - } - - if (gl->flags & RFL_GL_21) - { - gl->BindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer"); - gl->DeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers"); - gl->GenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers"); - gl->BufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData"); - gl->BufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData"); - gl->MapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer"); - gl->UnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer"); - gl->flags |= RFL_VBO; - } - else if (CheckExtension("GL_ARB_vertex_buffer_object")) - { - gl->BindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBufferARB"); - gl->DeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffersARB"); - gl->GenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffersARB"); - gl->BufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferDataARB"); - gl->BufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubDataARB"); - gl->MapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBufferARB"); - gl->UnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBufferARB"); - gl->flags |= RFL_VBO; - } - - if (CheckExtension("GL_ARB_map_buffer_range")) - { - gl->MapBufferRange = (PFNGLMAPBUFFERRANGEPROC)wglGetProcAddress("glMapBufferRange"); - gl->FlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)wglGetProcAddress("glFlushMappedBufferRange"); - gl->flags|=RFL_MAP_BUFFER_RANGE; - } - - if (CheckExtension("GL_ARB_framebuffer_object")) - { - gl->GenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers"); - gl->DeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers"); - gl->BindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer"); - gl->FramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D"); - gl->GenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers"); - gl->DeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers"); - gl->BindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer"); - gl->RenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage"); - gl->FramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer"); - - gl->flags|=RFL_FRAMEBUFFER; - } - -#if 0 - if (CheckExtension("GL_ARB_texture_buffer_object") && - CheckExtension("GL_ARB_texture_float") && - CheckExtension("GL_EXT_GPU_Shader4") && - CheckExtension("GL_ARB_texture_rg") && - gl->shadermodel == 4) - { - gl->TexBufferARB = (PFNGLTEXBUFFERARBPROC)wglGetProcAddress("glTexBufferARB"); - gl->flags|=RFL_TEXTUREBUFFER; - } -#endif - - - - gl->ActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTextureARB"); - gl->MultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) wglGetProcAddress("glMultiTexCoord2fARB"); - gl->MultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) wglGetProcAddress("glMultiTexCoord2fvARB"); -} //========================================================================== // @@ -309,141 +112,10 @@ static void APIENTRY LoadExtensions() // //========================================================================== -static void APIENTRY PrintStartupLog() +static void InitContext() { - Printf ("GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - Printf ("GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - Printf ("GL_VERSION: %s\n", glGetString(GL_VERSION)); - Printf ("GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - Printf ("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS)); - int v; - - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &v); - Printf ("Max. texture units: %d\n", v); - glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &v); - Printf ("Max. fragment uniforms: %d\n", v); - if (gl->shadermodel == 4) gl->maxuniforms = v; - glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &v); - Printf ("Max. vertex uniforms: %d\n", v); - glGetIntegerv(GL_MAX_VARYING_FLOATS, &v); - Printf ("Max. varying: %d\n", v); - glGetIntegerv(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, &v); - Printf ("Max. combined uniforms: %d\n", v); - glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &v); - Printf ("Max. combined uniform blocks: %d\n", v); - -} - -//========================================================================== -// -// -// -//========================================================================== - -static void APIENTRY glBlendEquationDummy (GLenum mode) -{ - // If this is not supported all non-existent modes are - // made to draw nothing. - if (mode == GL_FUNC_ADD) - { - glColorMask(true, true, true, true); - } - else - { - glColorMask(false, false, false, false); - } -} - -//========================================================================== -// -// -// -//========================================================================== - -static void APIENTRY SetTextureMode(int type) -{ - static float white[] = {1.f,1.f,1.f,1.f}; - - if (gl_vid_compatibility) - { - type = TM_MODULATE; - } - if (type == TM_MASK) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - } - else if (type == TM_OPAQUE) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - } - else if (type == TM_INVERT) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - } - else if (type == TM_INVERTOPAQUE) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - } - else // if (type == TM_MODULATE) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - } -} - -//========================================================================== -// -// -// -//========================================================================== - -void APIENTRY GetContext(RenderContext & gl) -{ - ::gl=≷ - gl.flags=0; - gl.LoadExtensions = LoadExtensions; - gl.SetTextureMode = SetTextureMode; - gl.PrintStartupLog = PrintStartupLog; - gl.Begin = glBegin; gl.End = glEnd; gl.DrawArrays = glDrawArrays; @@ -522,6 +194,322 @@ void APIENTRY GetContext(RenderContext & gl) gl.BlendEquation = glBlendEquationDummy; } +//========================================================================== +// +// +// +//========================================================================== +void gl_LoadExtensions() +{ + InitContext(); + CollectExtensions(); + + const char *version = (const char*)glGetString(GL_VERSION); + + // Don't even start if it's lower than 1.4 + if (strcmp(version, "1.4") < 0) + { + I_FatalError("Unsupported OpenGL version.\nAt least GL 1.4 is required to run "GAMENAME".\n"); + } + + // This loads any function pointers and flags that require a vaild render context to + // initialize properly + + gl.shadermodel = 0; // assume no shader support + gl.vendorstring=(char*)glGetString(GL_VENDOR); + + // First try the regular function + gl.BlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation"); + // If that fails try the EXT version + if (!gl.BlendEquation) gl.BlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquationEXT"); + // If that fails use a no-op dummy + if (!gl.BlendEquation) gl.BlendEquation = glBlendEquationDummy; + + if (CheckExtension("GL_ARB_texture_non_power_of_two")) gl.flags|=RFL_NPOT_TEXTURE; + if (CheckExtension("GL_ARB_texture_compression")) gl.flags|=RFL_TEXTURE_COMPRESSION; + if (CheckExtension("GL_EXT_texture_compression_s3tc")) gl.flags|=RFL_TEXTURE_COMPRESSION_S3TC; + if (strstr(gl.vendorstring, "NVIDIA")) gl.flags|=RFL_NVIDIA; + else if (strstr(gl.vendorstring, "ATI Technologies")) gl.flags|=RFL_ATI; + + if (strcmp(version, "2.0") >= 0) gl.flags|=RFL_GL_20; + if (strcmp(version, "2.1") >= 0) gl.flags|=RFL_GL_21; + if (strcmp(version, "3.0") >= 0) gl.flags|=RFL_GL_30; + + glGetIntegerv(GL_MAX_TEXTURE_SIZE,&gl.max_texturesize); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + if (gl.flags & RFL_GL_20) + { + gl.DeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"); + gl.DeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram"); + gl.DetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader"); + gl.CreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); + gl.ShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"); + gl.CompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"); + gl.CreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"); + gl.AttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"); + gl.LinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"); + gl.UseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"); + gl.ValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram"); + + gl.VertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f"); + gl.VertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f"); + gl.VertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f"); + gl.VertexAttrib2fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib2fv"); + gl.VertexAttrib3fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib3fv"); + gl.VertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv"); + gl.VertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)wglGetProcAddress("glVertexAttrib4ubv"); + gl.GetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation"); + gl.BindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)wglGetProcAddress("glBindAttribLocation"); + + + gl.Uniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f"); + gl.Uniform2f = (PFNGLUNIFORM2FPROC)wglGetProcAddress("glUniform2f"); + gl.Uniform3f = (PFNGLUNIFORM3FPROC)wglGetProcAddress("glUniform3f"); + gl.Uniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress("glUniform4f"); + gl.Uniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"); + gl.Uniform2i = (PFNGLUNIFORM2IPROC)wglGetProcAddress("glUniform2i"); + gl.Uniform3i = (PFNGLUNIFORM3IPROC)wglGetProcAddress("glUniform3i"); + gl.Uniform4i = (PFNGLUNIFORM4IPROC)wglGetProcAddress("glUniform4i"); + gl.Uniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"); + gl.Uniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv"); + gl.Uniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv"); + gl.Uniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv"); + gl.Uniform1iv = (PFNGLUNIFORM1IVPROC)wglGetProcAddress("glUniform1iv"); + gl.Uniform2iv = (PFNGLUNIFORM2IVPROC)wglGetProcAddress("glUniform2iv"); + gl.Uniform3iv = (PFNGLUNIFORM3IVPROC)wglGetProcAddress("glUniform3iv"); + gl.Uniform4iv = (PFNGLUNIFORM4IVPROC)wglGetProcAddress("glUniform4iv"); + + gl.UniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)wglGetProcAddress("glUniformMatrix2fv"); + gl.UniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv"); + gl.UniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv"); + + gl.GetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog"); + gl.GetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"); + gl.GetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"); + gl.GetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform"); + gl.GetUniformfv = (PFNGLGETUNIFORMFVPROC)wglGetProcAddress("glGetUniformfv"); + gl.GetUniformiv = (PFNGLGETUNIFORMIVPROC)wglGetProcAddress("glGetUniformiv"); + gl.GetShaderSource = (PFNGLGETSHADERSOURCEPROC)wglGetProcAddress("glGetShaderSource"); + + gl.EnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray"); + gl.DisableVertexAttribArray= (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray"); + gl.VertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer"); + + // what'S the equivalent of this in GL 2.0??? + gl.GetObjectParameteriv = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB"); + + // Rules: + // SM4 will always use shaders. No option to switch them off is needed here. + // SM3 has shaders optional but they are off by default (they will have a performance impact + // SM2 only uses shaders for colormaps on camera textures and has no option to use them in general. + // On SM2 cards the shaders will be too slow and show visual bugs (at least on GF 6800.) + if (strcmp((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION), "1.3") >= 0) gl.shadermodel = 4; + else if (CheckExtension("GL_NV_GPU_shader4")) gl.shadermodel = 4; // for pre-3.0 drivers that support GF8xxx. + else if (CheckExtension("GL_EXT_GPU_shader4")) gl.shadermodel = 4; // for pre-3.0 drivers that support GF8xxx. + else if (CheckExtension("GL_NV_vertex_program3")) gl.shadermodel = 3; + else if (!strstr(gl.vendorstring, "NVIDIA")) gl.shadermodel = 3; + else gl.shadermodel = 2; // Only for older NVidia cards which had notoriously bad shader support. + + // Command line overrides for testing and problem cases. + if (Args->CheckParm("-sm2") && gl.shadermodel > 2) gl.shadermodel = 2; + else if (Args->CheckParm("-sm3") && gl.shadermodel > 3) gl.shadermodel = 3; + } + + if (CheckExtension("GL_ARB_occlusion_query")) + { + gl.GenQueries = (PFNGLGENQUERIESARBPROC)wglGetProcAddress("glGenQueriesARB"); + gl.DeleteQueries = (PFNGLDELETEQUERIESARBPROC)wglGetProcAddress("glDeleteQueriesARB"); + gl.GetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVARBPROC)wglGetProcAddress("glGetQueryObjectuivARB"); + gl.BeginQuery = (PFNGLBEGINQUERYARBPROC)wglGetProcAddress("glBeginQueryARB"); + gl.EndQuery = (PFNGLENDQUERYPROC)wglGetProcAddress("glEndQueryARB"); + gl.flags|=RFL_OCCLUSION_QUERY; + } + + if (gl.flags & RFL_GL_21) + { + gl.BindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer"); + gl.DeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers"); + gl.GenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers"); + gl.BufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData"); + gl.BufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData"); + gl.MapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer"); + gl.UnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer"); + gl.flags |= RFL_VBO; + } + else if (CheckExtension("GL_ARB_vertex_buffer_object")) + { + gl.BindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBufferARB"); + gl.DeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffersARB"); + gl.GenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffersARB"); + gl.BufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferDataARB"); + gl.BufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubDataARB"); + gl.MapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBufferARB"); + gl.UnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBufferARB"); + gl.flags |= RFL_VBO; + } + + if (CheckExtension("GL_ARB_map_buffer_range")) + { + gl.MapBufferRange = (PFNGLMAPBUFFERRANGEPROC)wglGetProcAddress("glMapBufferRange"); + gl.FlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)wglGetProcAddress("glFlushMappedBufferRange"); + gl.flags|=RFL_MAP_BUFFER_RANGE; + } + + if (CheckExtension("GL_ARB_framebuffer_object")) + { + gl.GenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers"); + gl.DeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers"); + gl.BindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer"); + gl.FramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D"); + gl.GenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers"); + gl.DeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers"); + gl.BindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer"); + gl.RenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage"); + gl.FramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer"); + + gl.flags|=RFL_FRAMEBUFFER; + } + +#if 0 + if (CheckExtension("GL_ARB_texture_buffer_object") && + CheckExtension("GL_ARB_texture_float") && + CheckExtension("GL_EXT_GPU_Shader4") && + CheckExtension("GL_ARB_texture_rg") && + gl.shadermodel == 4) + { + gl.TexBufferARB = (PFNGLTEXBUFFERARBPROC)wglGetProcAddress("glTexBufferARB"); + gl.flags|=RFL_TEXTUREBUFFER; + } +#endif + + + + gl.ActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTextureARB"); + gl.MultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) wglGetProcAddress("glMultiTexCoord2fARB"); + gl.MultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) wglGetProcAddress("glMultiTexCoord2fvARB"); +} + +//========================================================================== +// +// +// +//========================================================================== + +void gl_PrintStartupLog() +{ + Printf ("GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + Printf ("GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + Printf ("GL_VERSION: %s\n", glGetString(GL_VERSION)); + Printf ("GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + Printf ("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS)); + int v; + + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &v); + Printf ("Max. texture units: %d\n", v); + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &v); + Printf ("Max. fragment uniforms: %d\n", v); + if (gl.shadermodel == 4) gl.maxuniforms = v; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &v); + Printf ("Max. vertex uniforms: %d\n", v); + glGetIntegerv(GL_MAX_VARYING_FLOATS, &v); + Printf ("Max. varying: %d\n", v); + glGetIntegerv(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, &v); + Printf ("Max. combined uniforms: %d\n", v); + glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &v); + Printf ("Max. combined uniform blocks: %d\n", v); + +} + +//========================================================================== +// +// +// +//========================================================================== + +static void APIENTRY glBlendEquationDummy (GLenum mode) +{ + // If this is not supported all non-existent modes are + // made to draw nothing. + if (mode == GL_FUNC_ADD) + { + glColorMask(true, true, true, true); + } + else + { + glColorMask(false, false, false, false); + } +} + +//========================================================================== +// +// +// +//========================================================================== + +void gl_SetTextureMode(int type) +{ + static float white[] = {1.f,1.f,1.f,1.f}; + + if (type == TM_MASK) + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + } + else if (type == TM_OPAQUE) + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + } + else if (type == TM_INVERT) + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + } + else if (type == TM_INVERTOPAQUE) + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + } + else // if (type == TM_MODULATE) + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + } +} //} // extern "C" diff --git a/src/gl/system/gl_interface.h b/src/gl/system/gl_interface.h index 5473f3e03..2cd554111 100644 --- a/src/gl/system/gl_interface.h +++ b/src/gl/system/gl_interface.h @@ -21,7 +21,6 @@ typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat enum RenderFlags { RFL_NPOT_TEXTURE=1, - RFL_NOSTENCIL=2, RFL_OCCLUSION_QUERY=4, // [BB] Added texture compression flags. RFL_TEXTURE_COMPRESSION=8, @@ -67,10 +66,6 @@ struct RenderContext return maxuniforms>=2048? 128:64; } - void (APIENTRY * LoadExtensions) (); - void (APIENTRY * SetTextureMode) (int type); - void (APIENTRY * PrintStartupLog) (); - void (APIENTRY * Begin) (GLenum mode); void (APIENTRY * End) (void); void (APIENTRY * DrawArrays) (GLenum mode, GLint first, GLsizei count); @@ -237,7 +232,5 @@ struct RenderContext }; -void APIENTRY GetContext(RenderContext & gl); - #endif diff --git a/src/gl/system/gl_menu.cpp b/src/gl/system/gl_menu.cpp index 5429da9c7..ba70431da 100644 --- a/src/gl/system/gl_menu.cpp +++ b/src/gl/system/gl_menu.cpp @@ -19,7 +19,6 @@ CVAR(Bool,gl_mirrors,true,0) // This is for debugging only! CVAR(Bool,gl_mirror_envmap, true, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) CVAR(Bool, gl_render_segs, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, gl_seamless, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) -CVAR(Bool, gl_vid_compatibility, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); CUSTOM_CVAR(Int, r_mirror_recursions,4,CVAR_GLOBALCONFIG|CVAR_ARCHIVE) { diff --git a/src/gl/system/gl_wipe.cpp b/src/gl/system/gl_wipe.cpp index 83f5abd82..63ec45b43 100644 --- a/src/gl/system/gl_wipe.cpp +++ b/src/gl/system/gl_wipe.cpp @@ -69,8 +69,6 @@ struct RECT { }; #endif -EXTERN_CVAR(Bool, gl_vid_compatibility) - //=========================================================================== // // Screen wipes @@ -127,10 +125,6 @@ private: bool OpenGLFrameBuffer::WipeStartScreen(int type) { - if (gl_vid_compatibility) - { - return false; // not all required features present. - } switch (type) { case wipe_Burn: diff --git a/src/gl/textures/gl_hwtexture.cpp b/src/gl/textures/gl_hwtexture.cpp index f81d003d4..0093729b2 100644 --- a/src/gl/textures/gl_hwtexture.cpp +++ b/src/gl/textures/gl_hwtexture.cpp @@ -119,10 +119,6 @@ void FHardwareTexture::LoadImage(unsigned char * buffer,int w, int h, unsigned i rw = GetTexDimension (w); rh = GetTexDimension (h); - if (gl_vid_compatibility) - { - mipmap=false; - } gl.TexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, (mipmap && use_mipmapping && !forcenofiltering)); if (rw == w && rh == h) diff --git a/src/sdl/sdlglvideo.cpp b/src/sdl/sdlglvideo.cpp index 3285b8ed5..0241a4f39 100644 --- a/src/sdl/sdlglvideo.cpp +++ b/src/sdl/sdlglvideo.cpp @@ -59,8 +59,6 @@ CUSTOM_CVAR(Int, gl_vid_multisample, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_ Printf("This won't take effect until "GAMENAME" is restarted.\n"); } -RenderContext gl; - // PRIVATE DATA DEFINITIONS ------------------------------------------------ // Dummy screen sizes to pass when windowed @@ -123,7 +121,6 @@ SDLGLVideo::SDLGLVideo (int parm) fprintf( stderr, "Video initialization failed: %s\n", SDL_GetError( ) ); } - GetContext(gl); #ifndef _WIN32 // mouse cursor is visible by default on linux systems, we disable it by default SDL_ShowCursor (0); @@ -285,40 +282,18 @@ bool SDLGLVideo::SetResolution (int width, int height, int bits) // //========================================================================== -bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int multisample) +bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, int multisample) { - int stencil; - - if (!nostencil) - { - stencil=1; - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24 ); - SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24 ); + SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8 ); // SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - if (multisample > 0) { - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ); - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, multisample ); - } - } - else - { - // Use the cheapest mode available and let's hope the driver can handle this... - stencil=0; - - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 4 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 4 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 4 ); - SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 4 ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); - //SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 )*/ - } - if (stencil==0) - { - gl.flags|=RFL_NOSTENCIL; + if (multisample > 0) { + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ); + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, multisample ); } return true; } @@ -329,13 +304,20 @@ bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int multis // //========================================================================== -bool SDLGLVideo::InitHardware (bool allowsoftware, bool nostencil, int multisample) +bool SDLGLVideo::InitHardware (bool allowsoftware, int multisample) { - if (!SetupPixelFormat(allowsoftware, nostencil, multisample)) + if (!SetupPixelFormat(allowsoftware, multisample)) { Printf ("R_OPENGL: Reverting to software mode...\n"); return false; } + int value = 0; + SDL_GL_GetAttribute( SDL_GL_STENCIL_SIZE, &value ); + if (!value) + { + Printf("R_OPENGL: Failed to initialize stencil buffer! Reverting to software mode...\n"); + } + return true; } @@ -355,23 +337,15 @@ SDLGLFB::SDLGLFB (void *, int width, int height, int, int, bool fullscreen) UpdatePending = false; - if (!static_cast(Video)->InitHardware(false, gl_vid_compatibility, localmultisample)) + if (!static_cast(Video)->InitHardware(false, localmultisample)) { vid_renderer = 0; return; } - // Mac OS X version will crash when entering fullscreen mode with BPP <= 8 - // Also it may crash with BPP == 16 on some configurations - // It seems 24 and 32 bits are safe values - // So value of vid_displaybits is ignored and hardcoded constant is used instead Screen = SDL_SetVideoMode (width, height, -#if defined(__APPLE__) 32, -#else // ! __APPLE__ - vid_displaybits, -#endif // __APPLE__ SDL_HWSURFACE|SDL_HWPALETTE|SDL_OPENGL | SDL_GL_DOUBLEBUFFER|SDL_ANYFORMAT| (fullscreen ? SDL_FULLSCREEN : 0)); @@ -401,13 +375,6 @@ SDLGLFB::~SDLGLFB () void SDLGLFB::InitializeState() { - int value = 0; - SDL_GL_GetAttribute( SDL_GL_STENCIL_SIZE, &value ); - if (!value) - { - Printf("Failed to use stencil buffer!\n"); //[C] is it needed to recreate buffer in "cheapest mode"? - gl.flags|=RFL_NOSTENCIL; - } } bool SDLGLFB::CanUpdate () diff --git a/src/sdl/sdlglvideo.h b/src/sdl/sdlglvideo.h index 4fbdf3e9a..205e416c0 100644 --- a/src/sdl/sdlglvideo.h +++ b/src/sdl/sdlglvideo.h @@ -27,8 +27,8 @@ class SDLGLVideo : public IVideo bool NextMode (int *width, int *height, bool *letterbox); bool SetResolution (int width, int height, int bits); - bool SetupPixelFormat(bool allowsoftware, bool nostencil, int multisample); - bool InitHardware (bool allowsoftware, bool nostencil, int multisample); + bool SetupPixelFormat(bool allowsoftware, int multisample); + bool InitHardware (bool allowsoftware, int multisample); private: int IteratorMode; diff --git a/src/win32/win32gliface.cpp b/src/win32/win32gliface.cpp index e13dce63d..5623b7062 100644 --- a/src/win32/win32gliface.cpp +++ b/src/win32/win32gliface.cpp @@ -29,10 +29,6 @@ CUSTOM_CVAR(Int, gl_vid_multisample, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_ CVAR(Bool, gl_debug, false, 0) -RenderContext gl; - - -EXTERN_CVAR(Bool, gl_vid_compatibility) EXTERN_CVAR(Int, vid_refreshrate) //========================================================================== @@ -49,12 +45,11 @@ Win32GLVideo::Win32GLVideo(int parm) : m_Modes(NULL), m_IsFullscreen(false) I_SetWndProc(); m_DisplayWidth = vid_defwidth; m_DisplayHeight = vid_defheight; - m_DisplayBits = gl_vid_compatibility? 16:32; + m_DisplayBits = 32; m_DisplayHz = 60; GetDisplayDeviceName(); MakeModesList(); - GetContext(gl); SetPixelFormat(); } @@ -202,8 +197,8 @@ void Win32GLVideo::StartModeIterator(int bits, bool fs) { m_IteratorMode = m_Modes; // I think it's better to ignore the game-side settings of bit depth. - // The GL renderer will always default to 32 bits, except in compatibility mode - m_IteratorBits = gl_vid_compatibility? 16:32; + // The GL renderer will always default to 32 bits because 16 bit modes cannot have a stencil buffer. + m_IteratorBits = 32; m_IteratorFS = fs; } @@ -339,7 +334,7 @@ DFrameBuffer *Win32GLVideo::CreateFrameBuffer(int width, int height, bool fs, DF m_DisplayWidth = width; m_DisplayHeight = height; - m_DisplayBits = gl_vid_compatibility? 16:32; + m_DisplayBits = 32; m_DisplayHz = 60; if (vid_refreshrate == 0) @@ -604,7 +599,7 @@ bool Win32GLVideo::SetPixelFormat() // //========================================================================== -bool Win32GLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int multisample) +bool Win32GLVideo::SetupPixelFormat(bool allowsoftware, int multisample) { int colorDepth; HDC deskDC; @@ -612,154 +607,90 @@ bool Win32GLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int mult int pixelFormat; unsigned int numFormats; float attribsFloat[] = {0.0f, 0.0f}; - int stencil; deskDC = GetDC(GetDesktopWindow()); colorDepth = GetDeviceCaps(deskDC, BITSPIXEL); ReleaseDC(GetDesktopWindow(), deskDC); - /* - if (!nostencil && colorDepth < 32) + if (wglChoosePixelFormatARB) { - Printf("R_OPENGL: Desktop not in 32 bit mode!\n"); - return false; - } - */ - - if (!nostencil) - { - for (stencil=1;stencil>=0;stencil--) + attributes[0] = WGL_RED_BITS_ARB; //bits + attributes[1] = 8; + attributes[2] = WGL_GREEN_BITS_ARB; //bits + attributes[3] = 8; + attributes[4] = WGL_BLUE_BITS_ARB; //bits + attributes[5] = 8; + attributes[6] = WGL_ALPHA_BITS_ARB; + attributes[7] = 8; + attributes[8] = WGL_DEPTH_BITS_ARB; + attributes[9] = 24; + attributes[10] = WGL_STENCIL_BITS_ARB; + attributes[11] = 8; + + attributes[12] = WGL_DRAW_TO_WINDOW_ARB; //required to be true + attributes[13] = true; + attributes[14] = WGL_SUPPORT_OPENGL_ARB; + attributes[15] = true; + attributes[16] = WGL_DOUBLE_BUFFER_ARB; + attributes[17] = true; + + attributes[18] = WGL_ACCELERATION_ARB; //required to be FULL_ACCELERATION_ARB + if (allowsoftware) { - if (wglChoosePixelFormatARB && stencil) - { - attributes[0] = WGL_RED_BITS_ARB; //bits - attributes[1] = 8; - attributes[2] = WGL_GREEN_BITS_ARB; //bits - attributes[3] = 8; - attributes[4] = WGL_BLUE_BITS_ARB; //bits - attributes[5] = 8; - attributes[6] = WGL_ALPHA_BITS_ARB; - attributes[7] = 8; - attributes[8] = WGL_DEPTH_BITS_ARB; - attributes[9] = 24; - attributes[10] = WGL_STENCIL_BITS_ARB; - attributes[11] = 8; - - attributes[12] = WGL_DRAW_TO_WINDOW_ARB; //required to be true - attributes[13] = true; - attributes[14] = WGL_SUPPORT_OPENGL_ARB; - attributes[15] = true; - attributes[16] = WGL_DOUBLE_BUFFER_ARB; - attributes[17] = true; - - attributes[18] = WGL_ACCELERATION_ARB; //required to be FULL_ACCELERATION_ARB - if (allowsoftware) - { - attributes[19] = WGL_NO_ACCELERATION_ARB; - } - else - { - attributes[19] = WGL_FULL_ACCELERATION_ARB; - } - - if (multisample > 0) - { - attributes[20] = WGL_SAMPLE_BUFFERS_ARB; - attributes[21] = true; - attributes[22] = WGL_SAMPLES_ARB; - attributes[23] = multisample; - } - else - { - attributes[20] = 0; - attributes[21] = 0; - attributes[22] = 0; - attributes[23] = 0; - } - - attributes[24] = 0; - attributes[25] = 0; - - if (!wglChoosePixelFormatARB(m_hDC, attributes, attribsFloat, 1, &pixelFormat, &numFormats)) - { - Printf("R_OPENGL: Couldn't choose pixel format. Retrying in compatibility mode\n"); - goto oldmethod; - } - - if (numFormats == 0) - { - Printf("R_OPENGL: No valid pixel formats found. Retrying in compatibility mode\n"); - goto oldmethod; - } - - break; - } - else - { - oldmethod: - // If wglChoosePixelFormatARB is not found we have to do it the old fashioned way. - static PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), - 1, - PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, - PFD_TYPE_RGBA, - 32, // color depth - 0, 0, 0, 0, 0, 0, - 0, - 0, - 0, - 0, 0, 0, 0, - 32, // z depth - stencil*8, // stencil buffer - 0, - PFD_MAIN_PLANE, - 0, - 0, 0, 0 - }; - - pixelFormat = ChoosePixelFormat(m_hDC, &pfd); - DescribePixelFormat(m_hDC, pixelFormat, sizeof(pfd), &pfd); - - if (pfd.dwFlags & PFD_GENERIC_FORMAT) - { - if (!allowsoftware) - { - if (stencil==0) - { - // not accelerated! - Printf("R_OPENGL: OpenGL driver not accelerated! Falling back to software renderer.\n"); - return false; - } - else - { - Printf("R_OPENGL: OpenGL driver not accelerated! Retrying in compatibility mode\n"); - continue; - } - } - } - break; - } + attributes[19] = WGL_NO_ACCELERATION_ARB; + } + else + { + attributes[19] = WGL_FULL_ACCELERATION_ARB; + } + + if (multisample > 0) + { + attributes[20] = WGL_SAMPLE_BUFFERS_ARB; + attributes[21] = true; + attributes[22] = WGL_SAMPLES_ARB; + attributes[23] = multisample; + } + else + { + attributes[20] = 0; + attributes[21] = 0; + attributes[22] = 0; + attributes[23] = 0; + } + + attributes[24] = 0; + attributes[25] = 0; + + if (!wglChoosePixelFormatARB(m_hDC, attributes, attribsFloat, 1, &pixelFormat, &numFormats)) + { + Printf("R_OPENGL: Couldn't choose pixel format. Retrying in compatibility mode\n"); + goto oldmethod; + } + + if (numFormats == 0) + { + Printf("R_OPENGL: No valid pixel formats found. Retrying in compatibility mode\n"); + goto oldmethod; } } else { - // Use the cheapest mode available and let's hope the driver can handle this... - stencil=0; - + oldmethod: // If wglChoosePixelFormatARB is not found we have to do it the old fashioned way. static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, - 16, // color depth + 32, // color depth 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, // z depth - 0, // stencil buffer + 32, // z depth + 8, // stencil buffer 0, PFD_MAIN_PLANE, 0, @@ -773,15 +704,11 @@ bool Win32GLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int mult { if (!allowsoftware) { - Printf("R_OPENGL: OpenGL driver not accelerated! Falling back to software renderer.\n"); + Printf("R_OPENGL: OpenGL driver not accelerated! Falling back to software renderer.\n"); return false; } } } - if (stencil==0) - { - gl.flags|=RFL_NOSTENCIL; - } if (!::SetPixelFormat(m_hDC, pixelFormat, NULL)) { @@ -797,12 +724,12 @@ bool Win32GLVideo::SetupPixelFormat(bool allowsoftware, bool nostencil, int mult // //========================================================================== -bool Win32GLVideo::InitHardware (HWND Window, bool allowsoftware, bool nostencil, int multisample) +bool Win32GLVideo::InitHardware (HWND Window, bool allowsoftware, int multisample) { m_Window=Window; m_hDC = GetDC(Window); - if (!SetupPixelFormat(allowsoftware, nostencil, multisample)) + if (!SetupPixelFormat(allowsoftware, multisample)) { Printf ("R_OPENGL: Reverting to software mode...\n"); return false; @@ -965,7 +892,7 @@ Win32GLFrameBuffer::Win32GLFrameBuffer(void *hMonitor, int width, int height, in I_RestoreWindowedPos(); } - if (!static_cast(Video)->InitHardware(Window, false, gl_vid_compatibility, localmultisample)) + if (!static_cast(Video)->InitHardware(Window, false, localmultisample)) { vid_renderer = 0; return; diff --git a/src/win32/win32gliface.h b/src/win32/win32gliface.h index e4d70ba43..4457c5372 100644 --- a/src/win32/win32gliface.h +++ b/src/win32/win32gliface.h @@ -42,7 +42,7 @@ public: DFrameBuffer *CreateFrameBuffer (int width, int height, bool fs, DFrameBuffer *old); virtual bool SetResolution (int width, int height, int bits); void DumpAdapters(); - bool InitHardware (HWND Window, bool allowsoftware, bool nostencil, int multisample); + bool InitHardware (HWND Window, bool allowsoftware, int multisample); void Shutdown(); bool SetFullscreen(const char *devicename, int w, int h, int bits, int hz); @@ -83,7 +83,7 @@ protected: HWND InitDummy(); void ShutdownDummy(HWND dummy); bool SetPixelFormat(); - bool SetupPixelFormat(bool allowsoftware, bool nostencil, int multisample); + bool SetupPixelFormat(bool allowsoftware, int multisample); void GetDisplayDeviceName(); void MakeModesList();