diff --git a/.gitmodules b/.gitmodules index 7bcf600f8..eeae12e04 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,11 +16,11 @@ [submodule "project/toolkit/sdl/SDL"] path = project/toolkit/sdl/SDL url = https://github.com/libsdl-org/SDL.git - branch = SDL2 + branch = main [submodule "project/toolkit/sdl-mixer/SDL_mixer"] path = project/toolkit/sdl-mixer/SDL_mixer url = https://github.com/libsdl-org/SDL_mixer.git - branch = SDL2 + branch = main [submodule "project/toolkit/modplug/libmodplug"] path = project/toolkit/modplug/libmodplug url = https://github.com/Konstanty/libmodplug.git diff --git a/project/ToolkitBuild.xml b/project/ToolkitBuild.xml index de0fa45f2..6a1186bf3 100644 --- a/project/ToolkitBuild.xml +++ b/project/ToolkitBuild.xml @@ -25,7 +25,8 @@ - + + @@ -77,6 +78,7 @@ + @@ -84,7 +86,7 @@ - + @@ -176,8 +178,6 @@ - - @@ -267,6 +267,7 @@ + @@ -355,6 +356,7 @@ + @@ -394,9 +396,11 @@
- + + - + +
@@ -523,6 +527,7 @@ + @@ -683,7 +688,7 @@
- + @@ -728,7 +733,8 @@ - + + diff --git a/project/src/audio/SDLSound.cpp b/project/src/audio/SDLSound.cpp index 9653ac433..9ba0f896d 100644 --- a/project/src/audio/SDLSound.cpp +++ b/project/src/audio/SDLSound.cpp @@ -6,6 +6,12 @@ #include #include +#ifndef NME_SDL3 + #define SDL_IOFromConstMem(data, len) SDL_RWFromConstMem(data, len) +#else + #define Mix_LoadWAV_RW Mix_LoadWAV_IO + #define Mix_LoadMUS_RW Mix_LoadMUS_IO +#endif namespace nme @@ -44,7 +50,7 @@ void onMusicDone() #ifdef EMSCRIPTEN namespace { -void Mix_QuerySpec(int *frequency, Uint16 *format, int *channels) +void Mix_QuerySpec(int *frequency, SDL_AudioFormat *format, int *channels) { *frequency = 44100; *format = 32784; @@ -128,9 +134,9 @@ class SDLSoundChannel : public SoundChannel { enum { BUF_SIZE = (1<<17) }; - int mFrequency; - Uint16 mFormat; - int mChannels; + int mFrequency; + SDL_AudioFormat mFormat; + int mChannels; int mAsyncFrequency; @@ -342,7 +348,7 @@ class SDLSoundChannel : public SoundChannel mDynamicDataDue = 0; mDynamicRequestPending = 0; mFrequency = 0; - mFormat = 0; + mFormat = (SDL_AudioFormat)0; mChannels = 0; mBufferAheadSamples = 0; @@ -361,10 +367,14 @@ class SDLSoundChannel : public SoundChannel Mix_QuerySpec(&mFrequency, &mFormat, &mChannels); if (mFrequency!=44100) ELOG("Warning - Frequency mismatch %d",mFrequency); + #ifdef NME_SDL3 + if (mFormat!=SDL_AUDIO_F32) + #else if (mFormat!=32784) - ELOG("Warning - Format mismatch %d",mFormat); + #endif + ELOG("Warning - Format mismatch %d",(int)mFormat); if (mChannels!=2) - ELOG("Warning - channe mismatch %d",mChannels); + ELOG("Warning - channel mismatch %d",mChannels); if (sMusicFrequency==0) sMusicFrequency = mFrequency; @@ -651,7 +661,7 @@ class SDLSound : public Sound std::string filename; bool loaded; int frequency; - Uint16 format; + SDL_AudioFormat format; int channels; double duration; INmeSoundData *soundData; @@ -672,7 +682,7 @@ class SDLSound : public Sound initSound(); if (Init()) { - mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(inData, len), 1); + mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(inData, len), 1); if (!mChunk) { @@ -701,7 +711,7 @@ class SDLSound : public Sound mChunk = 0; loaded = false; frequency = 0; - format = 0; + format = (SDL_AudioFormat)0; channels = 0; duration = 0.0; soundData = 0; @@ -730,6 +740,25 @@ class SDLSound : public Sound int bytes = soundData->getDecodedByteCount(); if (soundData->getRate()!=frequency || !soundData->getIsStereo()) { + #ifdef NME_SDL3 + + Uint8 *dst_data = NULL; + int dst_len = 0; + const SDL_AudioSpec src_spec = { format, + soundData->getIsStereo() ? 2 : 1, + soundData->getRate() }; + const SDL_AudioSpec dst_spec = { format, channels, frequency }; + if (!SDL_ConvertAudioSamples(&src_spec, data, soundData->getDecodedByteCount(), + &dst_spec, &dst_data, &dst_len)) + { + printf("Could not convert data?\n"); + } + else + { + mChunk = Mix_QuickLoad_RAW(dst_data, dst_len); + SDL_free(dst_data); + } + #else SDL_AudioCVT wavecvt; if (SDL_BuildAudioCVT(&wavecvt, format, soundData->getIsStereo() ? 2 : 1, soundData->getRate(), @@ -744,6 +773,8 @@ class SDLSound : public Sound SDL_ConvertAudio(&wavecvt); mChunk = Mix_QuickLoad_RAW(wavecvt.buf, wavecvt.len_cvt); } + #endif + soundData->release(); soundData = 0; } @@ -787,9 +818,9 @@ class SDLSound : public Sound if (n>0) { #ifndef NME_SDL12 - mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(resource.Bytes(),n),false); + mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(resource.Bytes(),n),false); #else - mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(resource.Bytes(),2)); + mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(resource.Bytes(),2)); #endif } if (!mChunk) @@ -879,7 +910,11 @@ class SDLMusicChannel : public SoundChannel //int sdlLoops = inLoops<0 ? -1 : inLoops==0 ? 1 : inLoops; int sdlLoops = inLoops<0 ? -1 : inLoops==0 ? 0 : inLoops-1; //int sdlLoops = inLoops; + #ifdef NME_SDL3 + if (!Mix_PlayMusic( mMusic, sdlLoops )) + #else if (Mix_PlayMusic( mMusic, sdlLoops )<0) + #endif { onMusicDone(); } @@ -1021,9 +1056,9 @@ class SDLMusic : public Sound reso.resize(n); memcpy(&reso[0], resource.Bytes(), n); #ifdef NME_SDL2 - mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], reso.size()),false); + mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], reso.size()),false); #else - mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], reso.size())); + mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], reso.size())); #endif if (mMusic) @@ -1066,9 +1101,9 @@ class SDLMusic : public Sound memcpy(&reso[0], inData, len); #ifdef NME_SDL2 - mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], len),false); + mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], len),false); #else - mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], len)); + mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], len)); #endif @@ -1118,7 +1153,11 @@ void SuspendSdlSound() return; sSoundPaused = true; + #ifdef NME_SDL3 + SDL_PauseAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK); + #else SDL_PauseAudio(true); + #endif } void ResumeSdlSound() @@ -1127,7 +1166,11 @@ void ResumeSdlSound() return; sSoundPaused = false; + #ifdef NME_SDL3 + SDL_ResumeAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK); + #else SDL_PauseAudio(false); + #endif } Sound *CreateSdlSound(const std::string &inFilename,bool inForceMusic) diff --git a/project/src/opengl/OGL.h b/project/src/opengl/OGL.h index 301022a6a..a624ae747 100644 --- a/project/src/opengl/OGL.h +++ b/project/src/opengl/OGL.h @@ -1,6 +1,10 @@ #ifndef INCLUDED_OGL_H #define INCLUDED_OGL_H +#if defined(NME_DYNAMIC_ANGLE) +#define DYNAMIC_OGL +#endif + #if defined(NME_ANGLE) // Static link, not dll import #define EGLAPI @@ -56,7 +60,9 @@ #define NME_GL_LEVEL 300 #define NEED_EXTENSIONS - #define DYNAMIC_OGL + #ifndef DYNAMIC_OGL + #define DYNAMIC_OGL + #endif #define GL_GLEXT_PROTOTYPES #include @@ -110,6 +116,21 @@ typedef ptrdiff_t GLsizeiptrARB; #endif +namespace nme { +void *GetGlFunction(const char *functionName); +} + + +#if defined(NME_GLES) +const bool nmeEglMode = true; +#elif defined(NME_DYNAMIC_ANGLE) +extern bool nmeEglMode; +#else +const bool nmeEglMode = false; +#endif + + + #if defined(HX_WINDOWS) && !defined(NME_ANGLE) typedef HDC WinDC; typedef HGLRC GLCtx; diff --git a/project/src/opengl/OGLExport.cpp b/project/src/opengl/OGLExport.cpp index 081d92300..6a3810e1b 100644 --- a/project/src/opengl/OGLExport.cpp +++ b/project/src/opengl/OGLExport.cpp @@ -6,7 +6,6 @@ #define OGLEXPORT - #ifdef ANDROID #include #include @@ -506,19 +505,9 @@ DEFINE_PRIM(nme_gl_get_supported_extensions,1); value nme_gl_get_extension(value inName) { - void *result = 0; HxString name = valToHxString(inName); - #ifdef NME_ANGLE - result = (void *)eglGetProcAddress(name.c_str()); - #elif defined(HX_WINDOWS) - result = (void *)wglGetProcAddress(name.c_str()); - #elif defined(ANDROID) - result = (void *)eglGetProcAddress(name.c_str()); - //Wait until I can test this... - //#elif defined(HX_LINUX) - // result = dlsym(nme::gOGLLibraryHandle,#func); - #endif + void *result = (void *)nme::GetGlFunction(name.c_str()); if (result) { @@ -1503,30 +1492,35 @@ value nme_gl_shader_source(value inId,value inSource) // 300: in and out are used instead of attribute and varying. // GLSL 330+ texture2D to texture - #ifdef NME_GLES - buffer = "#version 100\n"; - buffer = "#define texture texture2D\n"; - #else - #ifdef HX_MACOS - buffer = "#version 120\n"; - #else - buffer = "#version 130\n"; - #endif - #endif + if (nmeEglMode) + { + buffer = "#version 100\n"; + buffer = "#define texture texture2D\n"; + } + else + { + #ifdef HX_MACOS + buffer = "#version 120\n"; + #else + buffer = "#version 130\n"; + #endif + } } - #ifdef NME_GLES - if (!precisionStart) - buffer += std::string("precision mediump float;\n") + std::string(versionEnd); - else - buffer += std::string(versionEnd); - - #else - if (precisionStart) - buffer += std::string(versionEnd, precisionStart-versionEnd) + std::string(precisionEnd, p-precisionEnd); + if (nmeEglMode) + { + if (!precisionStart) + buffer += std::string("precision mediump float;\n") + std::string(versionEnd); + else + buffer += std::string(versionEnd); + } else - buffer += std::string(versionEnd); - #endif + { + if (precisionStart) + buffer += std::string(versionEnd, precisionStart-versionEnd) + std::string(precisionEnd, p-precisionEnd); + else + buffer += std::string(versionEnd); + } lines = buffer.c_str(); //printf("===={{{\n%s\n}}}====\n", lines); @@ -1665,20 +1659,25 @@ DEFINE_PRIM(nme_gl_get_shader_parameter,2); value nme_gl_get_shader_precision_format(value inShaderType,value inPrec) { DBGFUNC("getShaderPrecisionFormat"); - #ifdef NME_GLES - int range[2]; - int precision; - glGetShaderPrecisionFormat(val_int(inShaderType), val_int(inPrec), range, &precision); + #if defined(NME_GLES) || defined(NME_DYNAMIC_ANGLE) + if (nmeEglMode) + { + int range[2]; + int precision; + glGetShaderPrecisionFormat(val_int(inShaderType), val_int(inPrec), range, &precision); - value result = alloc_empty_object( ); - alloc_field(result,val_id("rangeMin"),alloc_int(range[0])); - alloc_field(result,val_id("rangeMax"),alloc_int(range[1])); - alloc_field(result,val_id("precision"),alloc_int(precision)); + value result = alloc_empty_object( ); + alloc_field(result,val_id("rangeMin"),alloc_int(range[0])); + alloc_field(result,val_id("rangeMax"),alloc_int(range[1])); + alloc_field(result,val_id("precision"),alloc_int(precision)); - return result; - #else - return alloc_null(); + return result; + } + else #endif + { + return alloc_null(); + } } DEFINE_PRIM(nme_gl_get_shader_precision_format,2); @@ -2060,11 +2059,17 @@ DEFINE_PRIM(nme_gl_clear_color,4); value nme_gl_clear_depth(value depth) { - #ifdef NME_GLES - glClearDepthf(val_number(depth)); + #ifdef NME_DYNAMIC_ANGLE + if (nmeEglMode) + glClearDepthf(val_number(depth)); + else + glClearDepth(val_number(depth)); + #elif defined(NME_GLES) + glClearDepthf(val_number(depth)); #else - glClearDepth(val_number(depth)); + glClearDepth(val_number(depth)); #endif + return alloc_null(); } DEFINE_PRIM(nme_gl_clear_depth,1); @@ -2105,10 +2110,15 @@ DEFINE_PRIM(nme_gl_depth_mask,1); value nme_gl_depth_range(value inNear, value inFar) { - #ifdef NME_GLES - glDepthRangef(val_number(inNear), val_number(inFar)); + #ifdef NME_DYNAMIC_ANGLE + if (nmeEglMode) + glDepthRangef(val_number(inNear), val_number(inFar)); + else + glDepthRange(val_number(inNear), val_number(inFar)); + #elif defined(NME_GLES) + glDepthRangef(val_number(inNear), val_number(inFar)); #else - glDepthRange(val_number(inNear), val_number(inFar)); + glDepthRange(val_number(inNear), val_number(inFar)); #endif return alloc_null(); } diff --git a/project/src/opengl/OGLExtensions.h b/project/src/opengl/OGLExtensions.h index 9e6fd66aa..0b6c6868d 100644 --- a/project/src/opengl/OGLExtensions.h +++ b/project/src/opengl/OGLExtensions.h @@ -11,9 +11,8 @@ #endif -#ifdef DECLARE_EXTENSION -namespace nme { extern void *gOGLLibraryHandle; } +#ifdef DECLARE_EXTENSION #define OGL_EXT(func,ret,args) \ namespace nme { extern ret (CALLING_CONVENTION *func)args; } @@ -25,21 +24,12 @@ namespace nme { extern void *gOGLLibraryHandle; } #elif defined(GET_EXTENSION) -#ifdef HX_WINDOWS - #define OGL_EXT(func,ret,args) \ - {\ - *(void **)&nme::func = (void *)wglGetProcAddress(#func);\ - if (!func) \ - *(void **)&nme::func = (void *)wglGetProcAddress(#func "ARB");\ - } -#elif defined(HX_LINUX) - #define OGL_EXT(func,ret,args) \ - {\ - *(void **)&nme::func = (void *)dlsym(nme::gOGLLibraryHandle,#func);\ - if (!func) \ - *(void **)&nme::func = (void *)dlsym(nme::gOGLLibraryHandle,#func "ARB");\ - } -#endif +#define OGL_EXT(func,ret,args) \ +{\ + *(void **)&::nme::func = (void *)::nme::GetGlFunction(#func);\ + if (!func) \ + *(void **)&::nme::func = (void *)::nme::GetGlFunction(#func "ARB");\ +} #endif @@ -192,6 +182,7 @@ OGL_EXT(glClear,void, (GLbitfield mask)); OGL_EXT(glClearColor,void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)); //OGL_EXT(glClearColorx,void, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)); OGL_EXT(glClearDepth,void, (GLclampf depth)); +OGL_EXT(glClearDepthf,void, (GLclampf depth)); //OGL_EXT(glClearDepthx,void, (GLclampx depth)); OGL_EXT(glClearStencil,void, (GLint s)); OGL_EXT(glClientActiveTexture,void, (GLenum texture)); @@ -208,6 +199,7 @@ OGL_EXT(glDeleteTextures,void, (GLsizei n, const GLuint *textures)); OGL_EXT(glDepthFunc,void, (GLenum func)); OGL_EXT(glDepthMask,void, (GLboolean flag)); OGL_EXT(glDepthRange,void, (GLclampf zNear, GLclampf zFar)); +OGL_EXT(glDepthRangef,void, (GLclampf zNear, GLclampf zFar)); //OGL_EXT(glDepthRangex,void, (GLclampx zNear, GLclampx zFar)); OGL_EXT(glDisable,void, (GLenum cap)); OGL_EXT(glDisableClientState,void, (GLenum array)); @@ -293,7 +285,7 @@ OGL_EXT(glViewport,void, (GLint x, GLint y, GLsizei width, GLsizei height)); OGL_EXT(glGetTexParameteriv,void,(GLenum target, GLenum pname, GLint * params)); OGL_EXT(glIsTexture, GLboolean, ( GLuint texture) ); OGL_EXT(glIsEnabled, GLboolean, ( GLuint texture) ); - +OGL_EXT(glGetShaderPrecisionFormat, void, (GLenum shaderType, GLenum precisionType, GLint *range, GLint *precision) ); #endif diff --git a/project/src/opengl/OGLShaders.cpp b/project/src/opengl/OGLShaders.cpp index f56d0daa3..28c5c8446 100644 --- a/project/src/opengl/OGLShaders.cpp +++ b/project/src/opengl/OGLShaders.cpp @@ -53,7 +53,7 @@ GLuint OGLProg::createShader(GLuint inType, const char *inShader) GLint blen = 0; GLsizei slen = 0; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen); + glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen); if (blen > 0) { char* compiler_log = (char*)malloc(blen); @@ -64,8 +64,7 @@ GLuint OGLProg::createShader(GLuint inType, const char *inShader) } else { - ELOG("Unknown error compiling shader : \n"); - ELOG("%s\n", source); + ELOG("Unknown error compiling shader : %d\n", glGetError() ); } glDeleteShader(shader); return 0; @@ -299,9 +298,8 @@ GPUProg *GPUProg::create(unsigned int inID) std::string pixelProlog = ""; std::string blendColour = ""; - #ifdef NME_GLES - pixelVars = std::string("precision mediump float;\n"); - #endif + if (nmeEglMode) + pixelVars = std::string("precision mediump float;\n"); std::string VIN = "attribute"; std::string VOUT = "varying"; diff --git a/project/src/opengl/OGLTexture.cpp b/project/src/opengl/OGLTexture.cpp index 09e9de083..f33bd6a60 100644 --- a/project/src/opengl/OGLTexture.cpp +++ b/project/src/opengl/OGLTexture.cpp @@ -32,6 +32,9 @@ #elif defined(GCW0) #define ARGB_STORE GL_RGBA #define ARGB_PIXEL GL_BGRA_EXT +#elif defined(NME_DYNAMIC_ANGLE) + #define ARGB_STORE (nmeEglMode ? GL_BGRA : GL_RGBA) + #define ARGB_PIXEL (GL_BGRA) #elif defined(NME_GLES) #define ARGB_STORE GL_BGRA #define ARGB_PIXEL GL_BGRA @@ -69,17 +72,21 @@ bool NonPO2Supported(bool inNotRepeating) #ifdef FORCE_NON_PO2 return true; #endif + #ifdef NME_DYNAMIC_ANGLE + if (nmeEglMode) + return true; + #endif if (!tried) { tried = true; const char* extensions = (char*) glGetString(GL_EXTENSIONS); - gFullNPO2Support = strstr(extensions, "ARB_texture_non_power_of_two") != 0; + gFullNPO2Support = extensions && strstr(extensions, "ARB_texture_non_power_of_two") != 0; if (!gFullNPO2Support) { - gPartialNPO2Support = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; + gPartialNPO2Support = extensions && strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; } @@ -315,31 +322,32 @@ class OGLTexture : public Texture bool copy_required = mSurface->GetBase() && (mTextureWidth!=mPixelWidth || mTextureHeight!=mPixelHeight || buffer_format!=fmt); - #if defined(__APPLE__) && !defined(NME_GLES) + #if defined(__APPLE__) // Minimum unpack on apple? - int unpackAlign = 4; + int unpackAlign = !nmeEglMode ? 4 : 1; #else int unpackAlign = 1; #endif - #if !defined(NME_GLES) - int texStride = (mTextureWidth*pw+unpackAlign-1)/unpackAlign*unpackAlign; - int srcStride = mSurface->GetStride(); - if (texStride!=srcStride && !copy_required) + if (!nmeEglMode) { - copy_required = true; - for(int i=1;i<4;i++) + int texStride = (mTextureWidth*pw+unpackAlign-1)/unpackAlign*unpackAlign; + int srcStride = mSurface->GetStride(); + if (texStride!=srcStride && !copy_required) { - int align = 1<=unpackAlign && srcStride == ((texStride+align-1)/align)*align) + copy_required = true; + for(int i=1;i<4;i++) { - copy_required = false; - unpackAlign = align; - break; + int align = 1<=unpackAlign && srcStride == ((texStride+align-1)/align)*align) + { + copy_required = false; + unpackAlign = align; + break; + } } } } - #endif if (copy_required) { @@ -370,9 +378,8 @@ class OGLTexture : public Texture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mMipmaps ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - #ifndef NME_GLES - glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlign); - #endif + if (!nmeEglMode) + glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlign); glTexImage2D(GL_TEXTURE_2D, 0, store_format, mTextureWidth, mTextureHeight, 0, pixel_format, channel, buffer ? buffer : mSurface->GetBase()); @@ -454,8 +461,7 @@ class OGLTexture : public Texture int dh = mDirtyRect.h; bool copy_required = buffer_format!=fmt; - #if defined(NME_GLES) - if (!copy_required && dw!=mPixelWidth) + if (nmeEglMode && (!copy_required && dw!=mPixelWidth)) { // Formats match but width does not. Can't use GL_UNPACK_ROW_LENGTH. // Do we do the whole row, or copy? @@ -470,7 +476,6 @@ class OGLTexture : public Texture else copy_required = true; } - #endif if (copy_required) { @@ -505,17 +510,17 @@ class OGLTexture : public Texture } else { - #ifndef NME_GLES - glPixelStorei(GL_UNPACK_ROW_LENGTH, mSurface->Width()); - #endif + if (!nmeEglMode) + glPixelStorei(GL_UNPACK_ROW_LENGTH, mSurface->Width()); + glTexSubImage2D(GL_TEXTURE_2D, 0, x0, y0, dw, dh, pixel_format, channel, mSurface->Row(y0) + x0*pw ); - #ifndef NME_GLES - glPixelStorei(GL_UNPACK_ROW_LENGTH,0); - #endif + + if (!nmeEglMode) + glPixelStorei(GL_UNPACK_ROW_LENGTH,0); } if (mMipmaps) diff --git a/project/src/opengl/OpenGLContext.cpp b/project/src/opengl/OpenGLContext.cpp index 9a899f669..b22000b87 100644 --- a/project/src/opengl/OpenGLContext.cpp +++ b/project/src/opengl/OpenGLContext.cpp @@ -6,6 +6,10 @@ #include #endif +#ifdef NME_DYNAMIC_ANGLE +bool nmeEglMode = false; +#endif + #ifdef NEED_EXTENSIONS #define DEFINE_EXTENSION @@ -316,7 +320,8 @@ class OGLContext : public HardwareRenderer #ifndef NME_GLES #ifndef SDL_OGL #ifndef GLFW_OGL - wglMakeCurrent(mDC,mOGLCtx); + if (!nmeEglMode) + wglMakeCurrent(mDC,mOGLCtx); #endif #endif #endif @@ -451,7 +456,8 @@ class OGLContext : public HardwareRenderer #ifndef NME_GLES #ifndef SDL_OGL #ifndef GLFW_OGL - SwapBuffers(mDC); + if (!nmeEglMode) + SwapBuffers(mDC); #endif #endif #endif @@ -838,10 +844,48 @@ class OGLContext : public HardwareRenderer // ---------------------------------------------------------------------------- -void * gOGLLibraryHandle = 0; + +#ifdef HX_WINDOWS +static HMODULE gEGLLibraryHandle = 0; +static HMODULE gOGLLibraryHandle = 0; +typedef PROC (*wglGetProcAddressFunc)(const char * unnamedParam1); +wglGetProcAddressFunc dynamicGetProcAddress = nullptr; +#else +//static void * gEGLLibraryHandle = 0; +static void * gOGLLibraryHandle = 0; +#endif static bool extentions_init = false; + +void *GetGlFunction(const char *functionName) +{ + void *result = nullptr; + #if defined(NME_DYNAMIC_ANGLE) + if (dynamicGetProcAddress) + result = dynamicGetProcAddress(functionName); + #ifdef HX_WINDOWS + if (!result && gOGLLibraryHandle) + result = (void *)GetProcAddress(gOGLLibraryHandle,functionName); + #endif + #elif defined(NME_ANGLE) + //result = (void *)eglGetProcAddress(functionName); + result = nullptr; + #elif defined(HX_WINDOWS) + result = (void *)wglGetProcAddress(functionName); + if (!result && gOGLLibraryHandle) + result = (void *)GetProcAddress(gOGLLibraryHandle,functionName); + #elif defined(ANDROID) + result = (void *)eglGetProcAddress(functionName); + #elif defined(HX_LINUX) + result = dlsym(nme::gOGLLibraryHandle,functionName); + #endif + + return result; +} + +bool use_angle = false; + bool InitOGLFunctions() { static bool result = true; @@ -849,10 +893,60 @@ bool InitOGLFunctions() { extentions_init = true; + #ifdef NME_DYNAMIC_ANGLE + if (use_angle) + { + #ifdef HX_WINDOWS + gEGLLibraryHandle = LoadLibraryA("libEGL.dll"); + gOGLLibraryHandle = LoadLibraryA("libGLESv2.dll"); + if (!gEGLLibraryHandle) + { + //printf("Could not open libEGL\n"); + use_angle = false; + } + else + { + dynamicGetProcAddress = (wglGetProcAddressFunc)GetProcAddress(gEGLLibraryHandle, "eglGetProcAddress"); + //printf("eglGetProcAddress -> %p\n", dynamicGetProcAddress); + } + #endif + } + + if (!use_angle) + { + #ifdef HX_WINDOWS + gOGLLibraryHandle = LoadLibraryA("opengl32.dll"); + if (!gOGLLibraryHandle) + { + printf("Error - could not load hardware driver\n"); + result = false; + return result; + } + + dynamicGetProcAddress = (wglGetProcAddressFunc)GetProcAddress(gOGLLibraryHandle, "wglGetProcAddress"); + if (!dynamicGetProcAddress) + { + printf("Error - could not load hardware interface\n"); + result = false; + return result; + } + #endif + } + + nmeEglMode = use_angle; + #else + #ifdef HX_WINDOWS + gOGLLibraryHandle = LoadLibraryA("opengl32.dll"); + #endif + #endif + #ifdef HX_LINUX - gOGLLibraryHandle = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL); if (!gOGLLibraryHandle) - gOGLLibraryHandle = dlopen("libGL.so", RTLD_NOW|RTLD_GLOBAL); + { + gOGLLibraryHandle = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL); + if (!gOGLLibraryHandle) + gOGLLibraryHandle = dlopen("libGL.so", RTLD_NOW|RTLD_GLOBAL); + } if (!gOGLLibraryHandle) { //printf("Could not load %s (%s)\n",path, dlerror()); diff --git a/project/src/sdl2/SDL2Stage.cpp b/project/src/sdl2/SDL2Stage.cpp index 9ebbad048..ba5fc4fef 100644 --- a/project/src/sdl2/SDL2Stage.cpp +++ b/project/src/sdl2/SDL2Stage.cpp @@ -1,6 +1,9 @@ #define WINDOWS_IGNORE_PACKING_MISMATCH 1 #include #include +#ifdef NME_SDL3 + #define SDL_ENABLE_OLD_NAMES +#endif #include #include #include @@ -15,7 +18,9 @@ #endif #ifdef HX_WINDOWS -#include + #ifndef NME_SDL3 + #include + #endif #include #include #endif @@ -28,6 +33,27 @@ #define NME_WINDOWS_SINGLE_INSTANCE #endif +#ifdef NME_OGL +#include "../opengl/OGL.h" +#endif + +#ifdef NME_SDL3 +#define SDL_GL_GetDrawableSize SDL_GetWindowSizeInPixels +#define Mix_GetError SDL_GetError +#define SDL_GameControllerNameForIndex SDL_GetGamepadNameForID +#define SDL_JoystickNameForIndex SDL_GetJoystickNameForID + +SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) +{ + return SDL_CreateSurface(width, height, + SDL_GetPixelFormatForMasks(depth, Rmask, Gmask, Bmask, Amask)); +} + +typedef float MousePosType; +#else +typedef int MousePosType; +#endif + namespace nme { static int sgDesktopWidth = 0; @@ -65,6 +91,11 @@ int InitSDL() SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); #endif + #ifdef NME_DYNAMIC_ANGLE + InitOGLFunctions(); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, nmeEglMode ? "opengles2" : "opengl"); + #endif + int err = SDL_Init(SDL_INIT_VIDEO | audioFlag | SDL_INIT_TIMER); if (err == 0 && SDL_InitSubSystem (SDL_INIT_GAMECONTROLLER) == 0) @@ -93,7 +124,16 @@ static void openAudio() //int frequency = MIX_DEFAULT_FREQUENCY //22050 //The default frequency would have less latency, but is incompatible with the average MP3 file + #ifdef NME_SDL3 + SDL_AudioSpec spec; + spec.format = AUDIO_S16; + spec.channels = 2; + spec.freq = frequency; + + if (!Mix_OpenAudio(0,&spec)) + #else if (Mix_OpenAudio(frequency, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, chunksize) != 0) + #endif { fprintf(stderr,"Could not open sound: %s\n", Mix_GetError()); gSDLAudioState = sdaError; @@ -196,9 +236,15 @@ class SDLSurf : public Surface r.w = inRect->w; r.h = inRect->h; } - - SDL_FillRect(mSurf,rect_ptr,SDL_MapRGBA(mSurf->format, - inColour>>16, inColour>>8, inColour, inColour>>24 ) ); + + Uint32 rgba; + #ifdef NME_SDL3 + rgba = SDL_MapSurfaceRGBA(mSurf, inColour>>16, inColour>>8, inColour, inColour>>24 ); + #else + rgba = SDL_MapRGBA(mSurf->format, inColour>>16, inColour>>8, inColour, inColour>>24 ); + #endif + + SDL_FillRect(mSurf,rect_ptr,rgba); } uint8 *Edit(const Rect *inRect) @@ -299,12 +345,26 @@ SDL_Cursor *sDefaultCursor = 0; SDL_Cursor *sTextCursor = 0; SDL_Cursor *sHandCursor = 0; +#ifdef NME_SDL3 +#define SDL_WINDOW_FULLSCREEN_DESKTOP SDL_WINDOW_FULLSCREEN +#endif unsigned int FullscreenMode = SDL_WINDOW_FULLSCREEN_DESKTOP; //unsigned int FullscreenMode = SDL_WINDOW_FULLSCREEN; // extern void *GetMetalLayerFromRenderer(SDL_Renderer *renderer); static HardwareRenderer *sgHardwareRenderer = 0; +static void nmeShowCursor(bool show) +{ + #ifdef NME_SDL3 + if (show) + SDL_ShowCursor(); + else + SDL_HideCursor(); + #else + SDL_ShowCursor(show); + #endif +} class SDLStage : public Stage { @@ -421,6 +481,7 @@ class SDLStage : public Stage Close(false); } + bool getCaptureMouse() { return mCaptureMouse; @@ -433,7 +494,12 @@ class SDLStage : public Stage } void GetGlobalMouseState(int &outX, int &outY, int &outButtons) { - int flags = SDL_GetGlobalMouseState(&outX, &outY); + MousePosType mx = outX; + MousePosType my = outY; + int flags = SDL_GetGlobalMouseState(&mx, &my); + outX = (int)mx; + outY = (int)my; + if (flags & SDL_BUTTON(SDL_BUTTON_LEFT)) outButtons |= 0x1; if (flags & SDL_BUTTON(SDL_BUTTON_MIDDLE)) @@ -539,20 +605,26 @@ class SDLStage : public Stage } mIsFullscreen = inFullscreen; - + if (mIsFullscreen) { //SDL_SetWindowSize(mSDLWindow, sgDesktopWidth, sgDesktopHeight); + #ifdef NME_SDL3 + SDL_SetWindowFullscreen(mSDLWindow, true); + #else SDL_DisplayMode mode; SDL_GetCurrentDisplayMode(0, &mode); mode.w = sgDesktopWidth; mode.h = sgDesktopHeight; SDL_SetWindowDisplayMode(mSDLWindow, &mode); - SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode /*SDL_WINDOW_FULLSCREEN_DESKTOP*/); + #endif } else { + #ifdef NME_SDL3 + SDL_SetWindowFullscreen(mSDLWindow, false); + #else SDL_SetWindowFullscreen(mSDLWindow, 0); /* Trust sdl to restore the window position @@ -564,15 +636,20 @@ class SDLStage : public Stage } #endif */ + #endif } - SDL_ShowCursor(mShowCursor); + nmeShowCursor(mShowCursor); } } void SetResolution(int inWidth, int inHeight) { + #ifdef NME_SDL3 + + SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode); + #else fprintf(stderr, "SetResolution %i %i\n", inWidth, inHeight); SDL_DisplayMode mode; SDL_GetCurrentDisplayMode(0, &mode); @@ -582,6 +659,7 @@ class SDLStage : public Stage SDL_SetWindowFullscreen(mSDLWindow, 0); SDL_SetWindowDisplayMode(mSDLWindow, &mode); SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode); + #endif } @@ -789,10 +867,10 @@ class SDLStage : public Stage mCurrentCursor = inCursor; if (inCursor==curNone || !mShowCursor) - SDL_ShowCursor(false); + nmeShowCursor(false); else { - SDL_ShowCursor(true); + nmeShowCursor(true); if (inCursor==curPointer) SDL_SetCursor(sDefaultCursor); @@ -827,7 +905,11 @@ class SDLStage : public Stage if (inLock != mLockCursor) { mLockCursor = inLock; + #ifdef NME_SDL3 + SDL_SetWindowRelativeMouseMode(mSDLWindow, inLock ? SDL_TRUE : SDL_FALSE ); + #else SDL_SetRelativeMouseMode( inLock ? SDL_TRUE : SDL_FALSE ); + #endif } } @@ -1625,136 +1707,162 @@ static SDLFrame *getEventFrame(int inId, bool useDefault = true) return nullptr; } +static bool jButtonPressed(const SDL_JoyButtonEvent &ev) +{ + #ifdef NME_SDL3 + return ev.down; + #else + return ev.state==SDL_PRESSED; + #endif +} + +Uint32 getWindowOrEventType(SDL_Event &inEvent) +{ + #ifndef NME_SDL3 + if (inEvent.type==SDL_WINDOWEVENT) + return inEvent.window.event; + #endif + return inEvent.type; +} + void ProcessEvent(SDL_Event &inEvent) { - if (inEvent.type!=SDL_WINDOWEVENT && gCurrentFileDialog) + #ifdef NME_SDL3 + const bool isWindowEvent = inEvent.type>=SDL_EVENT_WINDOW_FIRST || inEvent.type<=SDL_EVENT_WINDOW_LAST; + auto windowEventid = inEvent.type; + #else + const bool isWindowEvent = inEvent.type==SDL_WINDOWEVENT; + auto windowEventid = inEvent.window.event; + #endif + + if (gCurrentFileDialog && !isWindowEvent) return; - switch(inEvent.type) + if (isWindowEvent) { - case SDL_QUIT: - { - Event close(etQuit); - sgSDLFrame->ProcessEvent(close); - break; - } - case SDL_WINDOWEVENT: + SDLFrame *frame = getEventFrame(inEvent.window.windowID); + switch(windowEventid) { - SDLFrame *frame = getEventFrame(inEvent.window.windowID); - - switch (inEvent.window.event) + case SDL_WINDOWEVENT_SHOWN: { - case SDL_WINDOWEVENT_SHOWN: - { - Event activate(etActivate); - frame->ProcessEvent(activate); - break; - } - case SDL_WINDOWEVENT_HIDDEN: + Event activate(etActivate); + frame->ProcessEvent(activate); + break; + } + case SDL_WINDOWEVENT_HIDDEN: + { + frame = getEventFrame(inEvent.window.windowID,false); + if (frame) { - frame = getEventFrame(inEvent.window.windowID,false); - if (frame) - { - Event deactivate(etDeactivate); - frame->ProcessEvent(deactivate); - } - // else printf("ignore dead window\n"); - break; + Event deactivate(etDeactivate); + frame->ProcessEvent(deactivate); } - case SDL_WINDOWEVENT_EXPOSED: + // else printf("ignore dead window\n"); + break; + } + case SDL_WINDOWEVENT_EXPOSED: + { + Event poll(etPoll); + sgSDLFrame->ProcessEvent(poll); + Event redraw(etRedraw); + frame->ProcessEvent(redraw); + break; + } + //case SDL_WINDOWEVENT_RESIZED: break; + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + frame = getEventFrame(inEvent.window.windowID,false); + if (frame) { - Event poll(etPoll); - sgSDLFrame->ProcessEvent(poll); + Event resize(etResize, inEvent.window.data1, inEvent.window.data2); + frame->scaleMouseDpi(resize); + frame->Resize(resize.x, resize.y); + frame->ProcessEvent(resize); Event redraw(etRedraw); frame->ProcessEvent(redraw); - break; - } - //case SDL_WINDOWEVENT_RESIZED: break; - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - frame = getEventFrame(inEvent.window.windowID,false); - if (frame) - { - Event resize(etResize, inEvent.window.data1, inEvent.window.data2); - frame->scaleMouseDpi(resize); - frame->Resize(resize.x, resize.y); - frame->ProcessEvent(resize); - Event redraw(etRedraw); - frame->ProcessEvent(redraw); - } - break; - } - case SDL_WINDOWEVENT_MINIMIZED: - { - frame->mStage->setIsFullscreen(false); - Event deactivate(etDeactivate); - frame->ProcessEvent(deactivate); - break; } + break; + } + case SDL_WINDOWEVENT_MINIMIZED: + { + frame->mStage->setIsFullscreen(false); + Event deactivate(etDeactivate); + frame->ProcessEvent(deactivate); + break; + } - case SDL_WINDOWEVENT_RESTORED: - case SDL_WINDOWEVENT_MAXIMIZED: - frame = getEventFrame(inEvent.window.windowID,false); - if (frame) - { - bool isMax = SDL_GetWindowFlags(frame->mWindow ) & + case SDL_WINDOWEVENT_RESTORED: + case SDL_WINDOWEVENT_MAXIMIZED: + { + frame = getEventFrame(inEvent.window.windowID,false); + if (frame) + { + bool isMax = SDL_GetWindowFlags(frame->mWindow ) & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_FULLSCREEN_DESKTOP); - frame->mStage->setIsFullscreen(isMax); - - Event activate(etActivate); - frame->ProcessEvent(activate); + frame->mStage->setIsFullscreen(isMax); - int width = 0; - int height = 0; - //SDL_GetWindowSize(frame->mWindow, &width, &height); - SDL_GL_GetDrawableSize(frame->mWindow, &width, &height); + Event activate(etActivate); + frame->ProcessEvent(activate); - Event resize(etResize, width, height); - frame->Resize(width,height); - frame->ProcessEvent(resize); - } - break; + int width = 0; + int height = 0; + //SDL_GetWindowSize(frame->mWindow, &width, &height); + SDL_GL_GetDrawableSize(frame->mWindow, &width, &height); - case SDL_WINDOWEVENT_MOVED: - { - Event event(etWindowMoved, inEvent.window.data1, inEvent.window.data2); - frame->ProcessEvent(event); - } - break; - - case SDL_WINDOWEVENT_ENTER: - { - Event event(etWindowEnter); - frame->ProcessEvent(event); - } - break; - case SDL_WINDOWEVENT_LEAVE: - { - Event event(etWindowLeave); - frame->ProcessEvent(event); - } - case SDL_WINDOWEVENT_FOCUS_GAINED: - { - Event inputFocus(etGotInputFocus); - frame->ProcessEvent(inputFocus); - break; - } - case SDL_WINDOWEVENT_FOCUS_LOST: - { - Event inputFocus(etLostInputFocus); - frame->ProcessEvent(inputFocus); - break; - } - case SDL_WINDOWEVENT_CLOSE: - { - Event close(etWindowClose); - frame->ProcessEvent(close); - break; + Event resize(etResize, width, height); + frame->Resize(width,height); + frame->ProcessEvent(resize); } + break; + } - default: - break; + case SDL_WINDOWEVENT_MOVED: + { + Event event(etWindowMoved, inEvent.window.data1, inEvent.window.data2); + frame->ProcessEvent(event); + break; + } + + case SDL_WINDOWEVENT_ENTER: + { + Event event(etWindowEnter); + frame->ProcessEvent(event); + break; + } + case SDL_WINDOWEVENT_LEAVE: + { + Event event(etWindowLeave); + frame->ProcessEvent(event); + } + case SDL_WINDOWEVENT_FOCUS_GAINED: + { + Event inputFocus(etGotInputFocus); + frame->ProcessEvent(inputFocus); + break; + } + case SDL_WINDOWEVENT_FOCUS_LOST: + { + Event inputFocus(etLostInputFocus); + frame->ProcessEvent(inputFocus); + break; + } + case SDL_WINDOWEVENT_CLOSE: + { + Event close(etWindowClose); + frame->ProcessEvent(close); + break; } + + default: + break; + } + } + else switch(inEvent.type) + { + case SDL_QUIT: + { + Event close(etQuit); + sgSDLFrame->ProcessEvent(close); break; } @@ -1768,8 +1876,8 @@ void ProcessEvent(SDL_Event &inEvent) case SDL_DROPCOMPLETE: { SDLFrame *frame = getEventFrame(inEvent.drop.windowID); - int x=0; - int y=0; + MousePosType x=0; + MousePosType y=0; SDL_GetMouseState(&x,&y); Event event(etDropEnd, x, y); frame->scaleMouseDpi(event); @@ -1781,10 +1889,16 @@ void ProcessEvent(SDL_Event &inEvent) { SDLFrame *frame = getEventFrame(inEvent.drop.windowID); Event event(etDropFile); + #ifdef NME_SDL3 + event.utf8Text = inEvent.drop.data; + event.utf8Length = strlen(inEvent.drop.data); + frame->ProcessEvent(event); + #else event.utf8Text = inEvent.drop.file; event.utf8Length = strlen(inEvent.drop.file); frame->ProcessEvent(event); SDL_free(inEvent.drop.file); + #endif break; } @@ -1793,12 +1907,17 @@ void ProcessEvent(SDL_Event &inEvent) { SDLFrame *frame = getEventFrame(inEvent.motion.windowID); //default to 0 - int deltaX = 0; - int deltaY = 0; + MousePosType deltaX = 0; + MousePosType deltaY = 0; //but if we are locking the cursor, //pass the delta in as well through as deltaX - if(SDL_GetRelativeMouseMode()) { + #ifdef NME_SDL3 + if (SDL_GetWindowRelativeMouseMode(frame->mWindow)) + #else + if (SDL_GetRelativeMouseMode()) + #endif + { SDL_GetRelativeMouseState( &deltaX, &deltaY ); deltaX = (int)(deltaX * frame->retinaScale); deltaY = (int)(deltaY * frame->retinaScale); @@ -1853,8 +1972,8 @@ void ProcessEvent(SDL_Event &inEvent) //previous behavior in nme was fake button 3 for down, 4 for up int event_dir = (inEvent.wheel.y > 0) ? 3 : 4; //space to get the current mouse position, to make sure the values are sane - int _x = 0; - int _y = 0; + MousePosType _x = 0; + MousePosType _y = 0; //fetch the mouse position SDL_GetMouseState(&_x,&_y); //create the event @@ -1931,19 +2050,15 @@ void ProcessEvent(SDL_Event &inEvent) SDLFrame *frame = getEventFrame(inEvent.key.windowID); Event key(inEvent.type == SDL_KEYDOWN ? etKeyDown : etKeyUp ); bool right; + + #ifdef NME_SDL3 + key.value = SDLKeyToFlash(inEvent.key.key, right); + AddModStates(key.flags, inEvent.key.mod); + #else key.value = SDLKeyToFlash(inEvent.key.keysym.sym, right); - /*if (inEvent.type == SDL_KEYDOWN) - { - //key.code = key.value==keyBACKSPACE ? keyBACKSPACE : inEvent.key.keysym.unicode; - key.code = inEvent.key.keysym.scancode; - sLastUnicode[inEvent.key.keysym.scancode] = key.code; - } - else - // SDL does not provide unicode on key up, so remember it, - // keyed by scancode - key.code = sLastUnicode[inEvent.key.keysym.scancode];*/ - //key.code = 0; AddModStates(key.flags, inEvent.key.keysym.mod); + #endif + if (right) key.flags |= efLocationRight; @@ -1970,7 +2085,7 @@ void ProcessEvent(SDL_Event &inEvent) if(inEvent.jbutton.button>=SDL_CONTROLLER_BUTTON_DPAD_UP) controller->controllerHatEvent(); else - controller->controllerButtonEvent(inEvent.jbutton.button, inEvent.jbutton.state==SDL_PRESSED); + controller->controllerButtonEvent(inEvent.jbutton.button, jButtonPressed(inEvent.jbutton) ); } break; } @@ -1997,7 +2112,7 @@ void ProcessEvent(SDL_Event &inEvent) break; } case SDL_JOYAXISMOTION: - { + { ControllerState* controller = sgJoysticksState[inEvent.jbutton.which]; if(controller != NULL && !controller->isGameController) controller->joyAxisMove(inEvent.jaxis.axis, inEvent.jaxis.value); @@ -2005,10 +2120,10 @@ void ProcessEvent(SDL_Event &inEvent) } case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: - { + { ControllerState* controller = sgJoysticksState[inEvent.jbutton.which]; if(controller!=NULL && !controller->isGameController) - controller->joyButtonEvent(inEvent.jbutton.button, inEvent.jbutton.state==SDL_PRESSED); + controller->joyButtonEvent(inEvent.jbutton.button, jButtonPressed(inEvent.jbutton) ); break; } case SDL_JOYBALLMOTION: @@ -2148,14 +2263,6 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, bool tryHighDpi = (inFlags & wfHighDpi) != 0; //WindowScaleMode scaleMode = (WindowScaleMode)( (inFlags & wfScaleMask)/wfScaleBase ); - #ifdef HX_LINUX - if (opengl && isMain) - { - if (!InitOGLFunctions()) - opengl = false; - } - #endif - #ifdef NME_WINDOWS_SINGLE_INSTANCE bool singleInstance = (inFlags & wfSingleInstance) != 0; if (singleInstance) @@ -2195,14 +2302,23 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, openAudio(); #endif + #ifndef NME_SDL3 if (SDL_GetNumVideoDisplays() > 0) { - SDL_DisplayMode currentMode; SDL_GetDesktopDisplayMode(0, ¤tMode); sgDesktopWidth = currentMode.w; sgDesktopHeight = currentMode.h; } + #else + SDL_DisplayID display_id = SDL_GetPrimaryDisplay(); + const SDL_DisplayMode *modePtr = SDL_GetDesktopDisplayMode(display_id); + if (modePtr) + { + sgDesktopWidth = modePtr->w; + sgDesktopHeight = modePtr->h; + } + #endif int windowFlags, requestWindowFlags = 0; @@ -2219,15 +2335,26 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, if (inFlags & wfAlwaysOnTop) requestWindowFlags |= SDL_WINDOW_ALWAYS_ON_TOP; - #ifdef NME_ANGLE - SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + #ifdef NME_OGL + if (nmeEglMode) + { + //#ifdef NME_DYNAMIC_ANGLE + //SDL_setenv("SDL_VIDEO_GL_DRIVER", "libEGL.dll", 1); + //#endif + #ifndef NME_SDL3 + SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1); + #endif + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + } #endif if (opengl) { + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 ); + SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); @@ -2318,7 +2445,19 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, window = NULL; } + #ifdef NME_SDL3 + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, inTitle); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X_NUMBER, targetX); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, targetY); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, setWidth); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, setHeight); + SDL_SetNumberProperty(props, "flags", requestWindowFlags); + window = SDL_CreateWindowWithProperties(props); + SDL_DestroyProperties(props); + #else window = SDL_CreateWindow(inTitle, targetX, targetY, setWidth, setHeight, requestWindowFlags); + #endif #if (defined(HX_WINDOWS) && !defined(HX_WINRT)) HINSTANCE handle = ::GetModuleHandle(0); @@ -2328,11 +2467,18 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, LPARAM smicon = (LPARAM)::LoadImage(handle, resource, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); + #ifdef NME_SDL3 + HWND hWin = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + #else SDL_SysWMinfo wminfo; SDL_VERSION (&wminfo.version); + HWND hWin = (HWND)0; if (SDL_GetWindowWMInfo(window, &wminfo) == 1) - { hWin = wminfo.info.win.window; + #endif + + if (hWin) + { if (icon) { ::SendMessage(hWin, WM_SETICON, ICON_BIG, icon); @@ -2342,6 +2488,7 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, ::SendMessage(hWin, WM_SETICON, ICON_SMALL, icon); } } + #endif // retrieve the actual window flags (as opposed to the requested ones) @@ -2350,17 +2497,23 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, bool hardware = metal||opengl; - int renderFlags = 0; - if (hardware) renderFlags |= SDL_RENDERER_ACCELERATED; - if (hardware && vsync) renderFlags |= SDL_RENDERER_PRESENTVSYNC; + //printf("hardware: %d\n", hardware); if (hardware && sgMainRenderer) { renderer = sgMainRenderer; break; } - renderer = SDL_CreateRenderer (window, -1, renderFlags); - + + #ifdef NME_SDL3 + renderer = SDL_CreateRenderer(window, nullptr); + #else + int renderFlags = 0; + if (hardware) renderFlags |= SDL_RENDERER_ACCELERATED; + if (hardware && vsync) renderFlags |= SDL_RENDERER_PRESENTVSYNC; + renderer = SDL_CreateRenderer(window, -1, renderFlags); + #endif + if (opengl) { sgIsOGL2 = (inFlags & (wfAllowShaders | wfRequireShaders)); @@ -2369,7 +2522,7 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, { sgIsOGL2 = false; } - + if (!renderer && (inFlags & wfHW_AA_HIRES || inFlags & wfHW_AA)) { // if no window was created and AA was enabled, disable AA and try again fprintf(stderr, "Multisampling is not available. Retrying without. (%s)\n", SDL_GetError()); @@ -2405,6 +2558,16 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight, fprintf(stderr, "Failed to create SDL renderer: %s\n", SDL_GetError()); return; } + + #ifdef NME_OGL + if (opengl && isMain) + { + if (!InitOGLFunctions()) + opengl = false; + } + #endif + + int width, height; /* @@ -2469,11 +2632,14 @@ HWND GetApplicationWindow() if (!sgSDLFrame) return (HWND)gNativeWindowHandle; + #ifdef NME_SDL3 + return (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(sgSDLFrame->mWindow), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + #else SDL_SysWMinfo wminfo; SDL_VERSION (&wminfo.version); if (SDL_GetWindowWMInfo(sgSDLFrame->mWindow, &wminfo) == 1) return wminfo.info.win.window; - + #endif return 0; } #endif @@ -2484,6 +2650,19 @@ QuickVec* CapabilitiesGetScreenResolutions() InitSDL(); QuickVec *out = new QuickVec(); + #ifdef NME_SDL3 + + SDL_DisplayID display_id = SDL_GetPrimaryDisplay(); + + int count = 0; + SDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display_id, &count); + for(int i=0;ipush_back(modes[i]->w); + out->push_back(modes[i]->h); + } + #else + int numModes = SDL_GetNumDisplayModes(0); SDL_DisplayMode mode; @@ -2493,7 +2672,8 @@ QuickVec* CapabilitiesGetScreenResolutions() out->push_back(mode.w); out->push_back(mode.h); } - + #endif + return out; } @@ -2503,16 +2683,31 @@ QuickVec* CapabilitiesGetScreenModes() InitSDL(); QuickVec *out = new QuickVec(); + + #ifdef NME_SDL3 + SDL_DisplayID display_id = SDL_GetPrimaryDisplay(); + int numModes = 0; + SDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display_id, &numModes); + #else + int numModes = SDL_GetNumDisplayModes(0); SDL_DisplayMode mode; + SDL_DisplayMode *modePtr = &mode; + #endif for (int i = 0; i < numModes; i++) { - SDL_GetDisplayMode(0, i, &mode); + #ifdef NME_SDL3 + SDL_DisplayMode *modePtr = modes[i]; + #else + SDL_GetDisplayMode(0, i, modePtr); + #endif + ScreenMode screenMode; - screenMode.width = mode.w; - screenMode.height = mode.h; - switch (mode.format) { + screenMode.width = modePtr->w; + screenMode.height = modePtr->h; + switch (modePtr->format) + { case SDL_PIXELFORMAT_UNKNOWN: screenMode.format = PIXELFORMAT_UNKNOWN; break; @@ -2622,7 +2817,7 @@ QuickVec* CapabilitiesGetScreenModes() screenMode.format = PIXELFORMAT_YVYU; break; } - screenMode.refreshRate = mode.refresh_rate; + screenMode.refreshRate = modePtr->refresh_rate; out->push_back(screenMode); } @@ -2680,7 +2875,11 @@ void StartAnimation() event.type = SDL_NOEVENT; //SDL_EventState(SDL_DROPTEXT, SDL_ENABLE); + #if NME_SDL3 + SDL_SetEventEnabled(SDL_DROPFILE, true); + #else SDL_EventState(SDL_DROPFILE, SDL_ENABLE); + #endif double nextWake = GetTimeStamp(); while(!sgDead) diff --git a/project/toolkit/sdl-mixer/SDL_mixer b/project/toolkit/sdl-mixer/SDL_mixer index 59caf947b..124831c87 160000 --- a/project/toolkit/sdl-mixer/SDL_mixer +++ b/project/toolkit/sdl-mixer/SDL_mixer @@ -1 +1 @@ -Subproject commit 59caf947bd0b024c1790a4b3c6320793b467c165 +Subproject commit 124831c87e6e546ee905db38e1c2f6086fc3c18c diff --git a/project/toolkit/sdl/SDL b/project/toolkit/sdl/SDL index 295266c70..640559eba 160000 --- a/project/toolkit/sdl/SDL +++ b/project/toolkit/sdl/SDL @@ -1 +1 @@ -Subproject commit 295266c7080a0ae5f8d19decadc76e593c498321 +Subproject commit 640559eba68e9d3cc0840fa745cff38f41adcc3f diff --git a/project/toolkit/sdl/configs/windows/SDL_config.h b/project/toolkit/sdl/configs/windows/SDL_config.h index 88ec5b3dd..1f4e71da4 100644 --- a/project/toolkit/sdl/configs/windows/SDL_config.h +++ b/project/toolkit/sdl/configs/windows/SDL_config.h @@ -221,43 +221,67 @@ typedef unsigned int uintptr_t; #define SDL_VIDEO_RENDER_D3D11 0 #endif -#ifndef NATIVE_TOOLKIT_SDL_ANGLE -/* Enable OpenGL support */ +#if defined(NME_DYNAMIC_ANGLE) + +/* Enable OpenGL support (ES2/ANGLE) */ #ifndef SDL_VIDEO_OPENGL #define SDL_VIDEO_OPENGL 1 #endif -#ifndef SDL_VIDEO_OPENGL_WGL -#define SDL_VIDEO_OPENGL_WGL 1 -#endif +//#ifndef SDL_VIDEO_OPENGL_WGL +//#define SDL_VIDEO_OPENGL_WGL 1 +//#endif #ifndef SDL_VIDEO_RENDER_OGL #define SDL_VIDEO_RENDER_OGL 1 #endif #ifndef SDL_VIDEO_RENDER_OGL_ES2 -#define SDL_VIDEO_RENDER_OGL_ES2 0 +#define SDL_VIDEO_RENDER_OGL_ES2 1 #endif #ifndef SDL_VIDEO_OPENGL_ES2 -#define SDL_VIDEO_OPENGL_ES2 0 +#define SDL_VIDEO_OPENGL_ES2 1 #endif #ifndef SDL_VIDEO_OPENGL_EGL -#define SDL_VIDEO_OPENGL_EGL 0 +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + +#elif !defined(NATIVE_TOOLKIT_SDL_ANGLE) + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 #endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +//#ifndef SDL_VIDEO_RENDER_OGL_ES2 +//#define SDL_VIDEO_RENDER_OGL_ES2 0 +//#endif +//#ifndef SDL_VIDEO_OPENGL_ES2 +//#define SDL_VIDEO_OPENGL_ES2 0 +//#endif +//#ifndef SDL_VIDEO_OPENGL_EGL +//#define SDL_VIDEO_OPENGL_EGL 0 +//#endif /* Enable Vulkan support */ #define SDL_VIDEO_VULKAN 1 + #else /* Enable OpenGL support (ES2/ANGLE) */ #ifndef SDL_VIDEO_OPENGL #define SDL_VIDEO_OPENGL 1 #endif -#ifndef SDL_VIDEO_OPENGL_WGL -#define SDL_VIDEO_OPENGL_WGL 0 -#endif -#ifndef SDL_VIDEO_RENDER_OGL -#define SDL_VIDEO_RENDER_OGL 0 -#endif +//#ifndef SDL_VIDEO_OPENGL_WGL +//#define SDL_VIDEO_OPENGL_WGL 0 +//#endif +//#ifndef SDL_VIDEO_RENDER_OGL +//#define SDL_VIDEO_RENDER_OGL 0 +//#endif #ifndef SDL_VIDEO_RENDER_OGL_ES2 #define SDL_VIDEO_RENDER_OGL_ES2 1 #endif diff --git a/project/toolkit/sdl/files.xml b/project/toolkit/sdl/files.xml index be2a31a55..2018a045c 100644 --- a/project/toolkit/sdl/files.xml +++ b/project/toolkit/sdl/files.xml @@ -15,64 +15,64 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -90,11 +89,9 @@ - @@ -102,6 +99,7 @@ + --> @@ -117,8 +115,8 @@ - - + + @@ -132,6 +130,7 @@ +
@@ -319,7 +318,6 @@
-