From 019156ee0e6e7ae13ccdfba746f7fe61233407e8 Mon Sep 17 00:00:00 2001 From: premek <1145361+premek@users.noreply.github.com> Date: Thu, 20 Oct 2022 23:44:45 +0200 Subject: [PATCH 1/3] print usage when there is no game and when --help option is used --- src/love.cpp | 22 ++++++++++++++++++++++ src/modules/love/boot.lua | 11 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/love.cpp b/src/love.cpp index 0833aa2f4..4f235cf61 100644 --- a/src/love.cpp +++ b/src/love.cpp @@ -141,6 +141,21 @@ enum DoneAction DONE_RESTART, }; +static void print_usage() +{ + // when editing this message, change it at boot.lua too + printf("LÖVE is an *awesome* framework you can use to make 2D games in Lua\n" + "https://love2d.org\n" + "\n" + "usage:\n" + " love --version prints LÖVE version and quits\n" + " love --help prints this message and quits\n" + " love path/to/gamedir runs the game from the given directory which contains a main.lua file\n" + " love path/to/packagedgame.love runs the packaged game from the provided .love file\n" + " love path/to/file.lua runs the game from the given .lua file\n" + ); +} + static DoneAction runlove(int argc, char **argv, int &retval, love::Variant &restartvalue) { // Oh, you just want the version? Okay! @@ -155,6 +170,13 @@ static DoneAction runlove(int argc, char **argv, int &retval, love::Variant &res return DONE_QUIT; } + if (argc > 1 && strcmp(argv[1], "--help") == 0) + { + print_usage(); + retval = 0; + return DONE_QUIT; + } + // Create the virtual machine. lua_State *L = luaL_newstate(); luaL_openlibs(L); diff --git a/src/modules/love/boot.lua b/src/modules/love/boot.lua index 736950476..8eb030604 100644 --- a/src/modules/love/boot.lua +++ b/src/modules/love/boot.lua @@ -135,6 +135,17 @@ function love.boot() end if not can_has_game then + -- when editing this message, change it at love.cpp too + print([[LÖVE is an *awesome* framework you can use to make 2D games in Lua +https://love2d.org + +usage: + love --version prints LÖVE version and quits + love --help prints this message and quits + love path/to/gamedir runs the game from the given directory which contains a main.lua file + love path/to/packagedgame.love runs the packaged game from the provided .love file + love path/to/file.lua runs the game from the given .lua file +]]); local nogame = require("love.nogame") nogame() end From 79c879a6b1eba769a27949ccef5ed6118281c9e3 Mon Sep 17 00:00:00 2001 From: slime Date: Tue, 25 Oct 2022 17:08:10 -0300 Subject: [PATCH 2/3] Fix love.filesystem.newFileData crashing when an invalid filename is used. --- src/modules/filesystem/wrap_Filesystem.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/modules/filesystem/wrap_Filesystem.cpp b/src/modules/filesystem/wrap_Filesystem.cpp index 9d6f45907..c90d9495e 100644 --- a/src/modules/filesystem/wrap_Filesystem.cpp +++ b/src/modules/filesystem/wrap_Filesystem.cpp @@ -305,10 +305,11 @@ File *luax_getfile(lua_State *L, int idx) return file; } -FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror) +FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror, int &nresults) { FileData *data = nullptr; File *file = nullptr; + nresults = 0; if (lua_isstring(L, idx) || luax_istype(L, idx, File::type)) { @@ -322,7 +323,7 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror) if (!data && !file) { - luaL_argerror(L, idx, "filename, File, or FileData expected"); + nresults = luaL_argerror(L, idx, "filename, File, or FileData expected"); return nullptr; // Never reached. } else if (file && !data) @@ -335,10 +336,10 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror) { file->release(); if (ioerror) - luax_ioError(L, "%s", e.what()); + nresults = luax_ioError(L, "%s", e.what()); else - luaL_error(L, "%s", e.what()); - return nullptr; // Never reached. + nresults = luaL_error(L, "%s", e.what()); + return nullptr; // Never reached if ioerror is false. } file->release(); @@ -349,7 +350,8 @@ FileData *luax_getfiledata(lua_State *L, int idx, bool ioerror) FileData *luax_getfiledata(lua_State *L, int idx) { - return luax_getfiledata(L, idx, false); + int nresults = 0; + return luax_getfiledata(L, idx, false, nresults); } Data *luax_getdata(lua_State *L, int idx) @@ -404,7 +406,10 @@ int w_newFileData(lua_State *L) // Single argument: treat as filepath or File. if (lua_gettop(L) == 1) { - FileData *data = luax_getfiledata(L, 1, true); + int nresults = 0; + FileData *data = luax_getfiledata(L, 1, true, nresults); + if (data == nullptr) + return nresults; luax_pushtype(L, data); data->release(); return 1; From ae0688c83456b3f82ddba78d2fb5e8ae190393b3 Mon Sep 17 00:00:00 2001 From: slime Date: Tue, 25 Oct 2022 19:51:03 -0300 Subject: [PATCH 3/3] macOS/metal: workaround for bug where high power GPU won't fully activate --- src/modules/graphics/metal/Graphics.mm | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/modules/graphics/metal/Graphics.mm b/src/modules/graphics/metal/Graphics.mm index 7e15cf15b..d0e6b1b58 100644 --- a/src/modules/graphics/metal/Graphics.mm +++ b/src/modules/graphics/metal/Graphics.mm @@ -31,6 +31,11 @@ #import +#ifdef LOVE_MACOS +// Needed for the GPU dynamic switching hack below. +#import +#endif + namespace love { namespace graphics @@ -291,6 +296,33 @@ Graphics::Graphics() throw love::Exception("LOVE's Metal graphics backend requires macOS 10.15+ or iOS 13+."); } +#ifdef LOVE_MACOS + // On multi-GPU macOS systems with a low and high power GPU (e.g. a 2016 + // Macbook Pro), the OS doesn't activate the high power GPU for final + // monitor blitting even when MTLCreateSystemDefaultDevice is called, on + // newer macOS versions. https://developer.apple.com/forums/thread/675411 + // But it does when an OpenGL context is created, so this big hack forces it + // when we want it to happen. + if (!device.isLowPower && MTLCopyAllDevices().count > 1) + { + NSOpenGLPixelFormatAttribute attributes[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 24, + NSOpenGLPFAStencilSize, 8, + NSOpenGLPFASampleBuffers, 0, + 0, + }; + + auto pixelformat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; + auto glcontext = [[NSOpenGLContext alloc] initWithFormat:pixelformat shareContext:nullptr]; + LOVE_UNUSED(glcontext); + } +#endif + commandQueue = [device newCommandQueue]; passDesc = [MTLRenderPassDescriptor new];