From 5fc132c12464190ac612ecbf94728b88b368f56c Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Thu, 13 Feb 2020 20:39:45 +0000 Subject: [PATCH 1/5] Improve logging and OS X support (jmarsh). Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4322 --- src/gui/sdlmain.cpp | 92 ++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index c4e0209a..e4973bbb 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -93,8 +93,9 @@ PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL; PFNGLMAPBUFFERARBPROC glMapBufferARB = NULL; PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL; -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 +/* Don't guard these with GL_VERSION_2_0 - Apple defines it but not these typedefs. + * If they're already defined they should match these definitions, so no conflicts. + */ typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); @@ -109,13 +110,18 @@ typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLin typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar **string, const GLint *length); typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif +/* Apple defines these functions in their GL header (as core functions) + * so we can't use their names as function pointers. We can't link + * directly as some platforms may not have them. So they get their own + * namespace here to keep the official names but avoid collisions. + */ +namespace gl2 { PFNGLATTACHSHADERPROC glAttachShader = NULL; PFNGLCOMPILESHADERPROC glCompileShader = NULL; PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; @@ -135,10 +141,30 @@ PFNGLUNIFORM2FPROC glUniform2f = NULL; PFNGLUNIFORM1IPROC glUniform1i = NULL; PFNGLUSEPROGRAMPROC glUseProgram = NULL; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL; +} -#ifndef GL_SHADER_COMPILER -#define GL_SHADER_COMPILER 0x8DFA -#endif +/* "using" is meant to hide identical names declared in outer scope + * but is unreliable, so just redefine instead. + */ +#define glAttachShader gl2::glAttachShader +#define glCompileShader gl2::glCompileShader +#define glCreateProgram gl2::glCreateProgram +#define glCreateShader gl2::glCreateShader +#define glDeleteProgram gl2::glDeleteProgram +#define glDeleteShader gl2::glDeleteShader +#define glEnableVertexAttribArray gl2::glEnableVertexAttribArray +#define glGetAttribLocation gl2::glGetAttribLocation +#define glGetProgramiv gl2::glGetProgramiv +#define glGetProgramInfoLog gl2::glGetProgramInfoLog +#define glGetShaderiv gl2::glGetShaderiv +#define glGetShaderInfoLog gl2::glGetShaderInfoLog +#define glGetUniformLocation gl2::glGetUniformLocation +#define glLinkProgram gl2::glLinkProgram +#define glShaderSource gl2::glShaderSource +#define glUniform2f gl2::glUniform2f +#define glUniform1i gl2::glUniform1i +#define glUseProgram gl2::glUseProgram +#define glVertexAttribPointer gl2::glVertexAttribPointer #endif //C_OPENGL @@ -699,18 +725,16 @@ static GLuint BuildShader ( GLenum type, const char *shaderSrc ) { glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); if (!compiled) { + char* infoLog = NULL; GLint infoLen = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); - if (infoLen>1) { - char* infoLog = (char*)malloc(infoLen); - if (infoLog==NULL) LOG_MSG("Error getting shader compilation log"); - else { - glGetShaderInfoLog(shader, infoLen, NULL, infoLog); - LOG_MSG("Error compiling shader: %s", infoLog); - free(infoLog); - } - } + if (infoLen>1) infoLog = (char*)malloc(infoLen); + if (infoLog) { + glGetShaderInfoLog(shader, infoLen, NULL, infoLog); + LOG_MSG("Error compiling shader: %s", infoLog); + free(infoLog); + } else LOG_MSG("Error getting shader compilation log"); glDeleteShader(shader); return 0; @@ -718,7 +742,7 @@ static GLuint BuildShader ( GLenum type, const char *shaderSrc ) { return shader; } -static bool GFX_LoadGLShaders(const char *src, GLuint *vertex, GLuint *fragment) { +static bool LoadGLShaders(const char *src, GLuint *vertex, GLuint *fragment) { GLuint s = BuildShader(GL_VERTEX_SHADER, src); if (s) { *vertex = s; @@ -918,14 +942,14 @@ dosurface: } if (sdl.opengl.use_shader) { - GLboolean t; - // confirm current context supports shaders - glGetBooleanv(GL_SHADER_COMPILER, &t); - if (t) { + GLuint prog=0; + // reset error + glGetError(); + glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&prog); + // if there was an error this context doesn't support shaders + if (glGetError()==GL_NO_ERROR && (sdl.opengl.program_object==0 || prog!=sdl.opengl.program_object)) { // check if existing program is valid if (sdl.opengl.program_object) { - // reset error - glGetError(); glUseProgram(sdl.opengl.program_object); if (glGetError() != GL_NO_ERROR) { // program is not usable (probably new context), purge it @@ -938,11 +962,11 @@ dosurface: if (sdl.opengl.program_object == 0) { GLuint vertexShader, fragmentShader; const char *src = sdl.opengl.shader_src; - if (src && !GFX_LoadGLShaders(src, &vertexShader, &fragmentShader)) { + if (src && !LoadGLShaders(src, &vertexShader, &fragmentShader)) { LOG_MSG("SDL:OPENGL:Failed to compile shader, falling back to default"); src = NULL; } - if (src == NULL && !GFX_LoadGLShaders(shader_src_default, &vertexShader, &fragmentShader)) { + if (src == NULL && !LoadGLShaders(shader_src_default, &vertexShader, &fragmentShader)) { LOG_MSG("SDL:OPENGL:Failed to compile default shader!"); goto dosurface; } @@ -966,18 +990,16 @@ dosurface: GLint isProgramLinked; glGetProgramiv(sdl.opengl.program_object, GL_LINK_STATUS, &isProgramLinked); if (!isProgramLinked) { + char * infoLog = NULL; GLint infoLen = 0; glGetProgramiv(sdl.opengl.program_object, GL_INFO_LOG_LENGTH, &infoLen); - if (infoLen>1) { - char *infoLog = (char*)malloc(infoLen); - if (infoLog==NULL) LOG_MSG("SDL:OPENGL:Failed to retrieve program link log"); - else { - glGetProgramInfoLog(sdl.opengl.program_object, infoLen, NULL, infoLog); - LOG_MSG("SDL:OPENGL:Error linking program:\n %s", infoLog); - free(infoLog); - } - } + if (infoLen>1) infoLog = (char*)malloc(infoLen); + if (infoLog) { + glGetProgramInfoLog(sdl.opengl.program_object, infoLen, NULL, infoLog); + LOG_MSG("SDL:OPENGL:Error linking program:\n %s", infoLog); + free(infoLog); + } else LOG_MSG("SDL:OPENGL:Failed to retrieve program link log"); glDeleteProgram(sdl.opengl.program_object); sdl.opengl.program_object = 0; @@ -1100,7 +1122,7 @@ dosurface: if (sdl.opengl.pixel_buffer_object) retFlags |= GFX_HARDWARE; break; - }//OPENGL + }//OPENGL #endif //C_OPENGL default: goto dosurface; From a2f473cebd7d7fbdae547b2b22b3c173790b34ef Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 14 Feb 2020 16:53:52 +0000 Subject: [PATCH 2/5] Fix compilation for platforms where the include guard is different and the exported symbol was changed by Khronos. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4323 --- src/gui/sdlmain.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index e4973bbb..b2551fdc 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -110,7 +110,8 @@ typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLin typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar **string, const GLint *length); +//Change to NP, as Khronos changes include guard :( +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC_NP) (GLuint shader, GLsizei count, const GLchar **string, const GLint *length); typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); @@ -136,7 +137,7 @@ PFNGLGETSHADERIVPROC glGetShaderiv = NULL; PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL; PFNGLLINKPROGRAMPROC glLinkProgram = NULL; -PFNGLSHADERSOURCEPROC glShaderSource = NULL; +PFNGLSHADERSOURCEPROC_NP glShaderSource = NULL; PFNGLUNIFORM2FPROC glUniform2f = NULL; PFNGLUNIFORM1IPROC glUniform1i = NULL; PFNGLUSEPROGRAMPROC glUseProgram = NULL; @@ -1757,7 +1758,7 @@ static void GUI_StartUp(Section * sec) { glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)SDL_GL_GetProcAddress("glGetShaderInfoLog"); glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)SDL_GL_GetProcAddress("glGetUniformLocation"); glLinkProgram = (PFNGLLINKPROGRAMPROC)SDL_GL_GetProcAddress("glLinkProgram"); - glShaderSource = (PFNGLSHADERSOURCEPROC)SDL_GL_GetProcAddress("glShaderSource"); + glShaderSource = (PFNGLSHADERSOURCEPROC_NP)SDL_GL_GetProcAddress("glShaderSource"); glUniform2f = (PFNGLUNIFORM2FPROC)SDL_GL_GetProcAddress("glUniform2f"); glUniform1i = (PFNGLUNIFORM1IPROC)SDL_GL_GetProcAddress("glUniform1i"); glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram"); From 5d7c4f0540d9ef118622d797421c4bc8c2a557fa Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 14 Feb 2020 19:02:29 +0000 Subject: [PATCH 3/5] Fix bug 469. Give 640x480 and upwards square pixels and several fixes for high colour modes. (jmarsh) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4324 --- src/hardware/vga_draw.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index 168d9dc0..3d36da91 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -1371,8 +1371,13 @@ void VGA_SetupDrawing(Bitu /*val*/) { // fall-through case M_LIN32: width<<=3; - if (vga.crtc.mode_control & 0x8) + if (vga.crtc.mode_control & 0x8) { doublewidth = true; + if (vga.mode == M_LIN32) { + // vesa modes 10f/190/191/192 + aspect_ratio *= 2.0; + } + } /* Use HW mouse cursor drawer if enabled */ VGA_ActivateHardwareCursor(); break; @@ -1382,6 +1387,10 @@ void VGA_SetupDrawing(Bitu /*val*/) { width<<=2; if ((vga.crtc.mode_control & 0x8) || (svgaCard == SVGA_S3Trio && (vga.s3.pll.cmd & 0x10))) doublewidth = true; + else { + // vesa modes 165/175 + aspect_ratio /= 2.0; + } /* Use HW mouse cursor drawer if enabled */ VGA_ActivateHardwareCursor(); break; @@ -1539,11 +1548,11 @@ void VGA_SetupDrawing(Bitu /*val*/) { vga.changes.frame = 0; vga.changes.writeMask = 1; #endif - /* - Cheap hack to just make all > 640x480 modes have 4:3 aspect ratio + /* + Cheap hack to just make all > 640x480 modes have square pixels */ if ( width >= 640 && height >= 480 ) { - aspect_ratio = ((float)width / (float)height) * ( 3.0 / 4.0); + aspect_ratio = 1.0;//((float)width / (float)height) * ( 3.0 / 4.0); } // LOG_MSG("ht %d vt %d ratio %f", htotal, vtotal, aspect_ratio ); From 4d4c738ca7aeff51e11f5160a88f8ee26c9a0c13 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 14 Feb 2020 21:20:31 +0000 Subject: [PATCH 4/5] fix two tiny bugs introduced by 4065. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4325 --- src/hardware/joystick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/joystick.cpp b/src/hardware/joystick.cpp index f1dc22a1..a0a4bcc9 100644 --- a/src/hardware/joystick.cpp +++ b/src/hardware/joystick.cpp @@ -247,7 +247,7 @@ void JOYSTICK_Button(Bitu which,Bitu num,bool pressed) { } void JOYSTICK_Move_X(Bitu which,float x) { - if(which > 2) return; + if (which > 1) return; if (stick[which].xpos == x) return; stick[which].xpos = x; stick[which].transformed = false; @@ -256,7 +256,7 @@ void JOYSTICK_Move_X(Bitu which,float x) { } void JOYSTICK_Move_Y(Bitu which,float y) { - if(which > 2) return; + if (which > 1) return; if (stick[which].ypos == y) return; stick[which].ypos = y; stick[which].transformed = false; From 9912151a890846a7a2356f2d4b9fab3a28c9b701 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 14 Feb 2020 21:52:10 +0000 Subject: [PATCH 5/5] Add patch 285 from MHM to fix bug 367, mimics the normal event.gain code Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4326 --- src/gui/sdlmain.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index b2551fdc..15f2f8cf 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -2073,6 +2073,8 @@ void GFX_Events() { if (ev.active.gain) { paused = false; GFX_SetTitle(-1,-1,false); + SetPriority(sdl.priority.focus); + CPU_Disable_SkipAutoAdjust(); } /* Now poke a "release ALT" command into the keyboard buffer