From 27ea6823c7b97275369bfb9455963ea4ae14ed57 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 8 Nov 2012 03:22:10 +1000 Subject: [PATCH 1/2] Blackberry 10 fully supported with working video, input and sound on Playbook, Dev Alpha and beyond. Video: http://www.youtube.com/watch?v=CdUL1DalYrw --- Common/MemArena.cpp | 4 ++-- SDL/CMakeLists.txt | 18 +++++++++++------- SDL/bar-descriptor.xml | 32 ++++++++++++++++++++++++++++++++ SDL/build_for_playbook.sh | 0 SDL/package_for_playbook.sh | 15 +++++++++++++++ android/jni/EmuScreen.cpp | 4 ++-- android/jni/NativeApp.cpp | 7 ++++++- 7 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 SDL/bar-descriptor.xml mode change 100644 => 100755 SDL/build_for_playbook.sh create mode 100755 SDL/package_for_playbook.sh diff --git a/Common/MemArena.cpp b/Common/MemArena.cpp index de57d50f57..2c3753d131 100644 --- a/Common/MemArena.cpp +++ b/Common/MemArena.cpp @@ -226,13 +226,13 @@ u8* MemArena::Find4GBBase() } return base; #else - void* base = mmap(0, 0x31000000, PROT_READ | PROT_WRITE, + void* base = mmap(0, 0x10000000, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); if (base == MAP_FAILED) { PanicAlert("Failed to map 1 GB of memory space: %s", strerror(errno)); return 0; } - munmap(base, 0x31000000); + munmap(base, 0x10000000); return static_cast(base); #endif #endif diff --git a/SDL/CMakeLists.txt b/SDL/CMakeLists.txt index d2fae5a724..0782cc494f 100644 --- a/SDL/CMakeLists.txt +++ b/SDL/CMakeLists.txt @@ -73,13 +73,13 @@ add_subdirectory(../Common Common) add_subdirectory(../GPU GPU) add_subdirectory(../Core Core) -set(LIBS ${LIBS} ${SDL_LIBRARY} ${OPENGL_LIBRARIES} file lin ${PNG_LIBRARY} z gfx gfx_es2 etcdec image stb_image mixer net ui profiler timeutil file zip base lin vjson stb_vorbis sha1 jsonwriter common core gpu kirk) +set(LIBS ${LIBS} ${SDL_LIBRARY} file lin ${PNG_LIBRARY} z gfx gfx_es2 image stb_image mixer net ui profiler timeutil file zip base lin vjson stb_vorbis sha1 jsonwriter common core gpu kirk) # TODO: Blackberry specific libs (eg. TCO) if(BLACKBERRY) - set(LIBS ${LIBS} socket) + set(LIBS ${LIBS} bps screen socket EGL GLESv2) else() - set(LIBS ${LIBS} GLEW) + set(LIBS ${LIBS} ${OPENGL_LIBRARIES} GLEW etcdec) endif() set(FILES @@ -89,12 +89,16 @@ set(FILES ../android/jni/GamepadEmu.cpp ../android/jni/UIShader.cpp ../android/jni/ui_atlas.cpp - ../native/base/PCMain.cpp ) -if(APPLE) - set(FILES ${FILES} SDLMain.m) -endif(APPLE) +if(BLACKBERRY) + set(FILES ${FILES} ../native/base/BlackberryMain.cpp) +else() + set(FILES ${FILES} ../native/base/PCMain.cpp) + if(APPLE) + set(FILES ${FILES} SDLMain.m) + endif(APPLE) +endif() add_executable(ppsspp ${FILES}) diff --git a/SDL/bar-descriptor.xml b/SDL/bar-descriptor.xml new file mode 100644 index 0000000000..67ca11344c --- /dev/null +++ b/SDL/bar-descriptor.xml @@ -0,0 +1,32 @@ + + + com.Qtness.PPSSPP + PPSSPP + ppsspp + 0.0.1 + 1 + Playstation portable emulator. + + Qtness + gYAAgGE4qaHzBnzEAu8JKe4G1OI + + + landscape + false + none + false + + + core.games + + icon-114.png + + + + + run_native + access_shared + play_audio + + + diff --git a/SDL/build_for_playbook.sh b/SDL/build_for_playbook.sh old mode 100644 new mode 100755 diff --git a/SDL/package_for_playbook.sh b/SDL/package_for_playbook.sh new file mode 100755 index 0000000000..7568897119 --- /dev/null +++ b/SDL/package_for_playbook.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +TYPE=Device-Release +PPSSPP_ROOT=${PWD}/.. +WORKSPACE=${PPSSPP_ROOT}/.. +blackberry-nativepackager -package PPSSPP.bar bar-descriptor.xml ppsspp \ +-devMode -debugToken ~/debugtoken.bar \ +-e icon-114.png icon-114.png \ +-e ../android/assets assets \ +-e ${WORKSPACE}/SDL12/${TYPE}/libSDL12.so lib/libSDL12.so \ +-e ${WORKSPACE}/TouchControlOverlay/${TYPE}/libTouchControlOverlay.so lib/libTouchControlOverlay.so \ +-e ${WORKSPACE}/SDL_image/${TYPE}/libSDL_image.so lib/libSDL_image.so \ +-e ${WORKSPACE}/SDL_mixer/${TYPE}/libSDL_mixer.so lib/libSDL_mixer.so \ +-e ${WORKSPACE}/SDL_net/${TYPE}/libSDL_net.so lib/libSDL_net.so \ +-e ${WORKSPACE}/SDL_ttf/${TYPE}/libSDL_ttf.so lib/libSDL_ttf.so diff --git a/android/jni/EmuScreen.cpp b/android/jni/EmuScreen.cpp index 4ac35c0ede..01575562ae 100644 --- a/android/jni/EmuScreen.cpp +++ b/android/jni/EmuScreen.cpp @@ -175,10 +175,10 @@ void EmuScreen::render() } // Tiled renderers like PowerVR should benefit greatly from this. However - seems I can't call it? -#ifdef ANDROID +#if defined(ANDROID) || defined(BLACKBERRY) bool hasDiscard = false; // TODO if (hasDiscard) { - //glDiscardFramebufferEXT(GL_COLOR_EXT | GL_DEPTH_EXT | GL_STENCIL_EXT); + //glDiscardFramebuffer(GL_COLOR_EXT | GL_DEPTH_EXT | GL_STENCIL_EXT); } #endif } diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 0c83120001..6b11be8e0a 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -152,7 +152,12 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co std::string user_data_path = savegame_directory; // We want this to be FIRST. +#ifdef BLACKBERRY + // Packed assets are included in app/native/ dir + VFSRegister("", new DirectoryAssetReader("app/native/assets/")); +#else VFSRegister("", new DirectoryAssetReader("assets/")); +#endif VFSRegister("", new DirectoryAssetReader(user_data_path.c_str())); host = new NativeHost(); @@ -188,7 +193,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co g_Config.Load(config_filename.c_str()); if (g_Config.currentDirectory == "") { -#ifdef ANDROID +#if defined(ANDROID) || defined(BLACKBERRY) g_Config.currentDirectory = external_directory; #else g_Config.currentDirectory = getenv("HOME"); From e02b45fd8e224b4a120f2120d597bf5d81c2a483 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 8 Nov 2012 03:40:14 +1000 Subject: [PATCH 2/2] An icon for the Blackberry packaging --- SDL/icon-114.png | Bin 0 -> 17606 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 SDL/icon-114.png diff --git a/SDL/icon-114.png b/SDL/icon-114.png new file mode 100755 index 0000000000000000000000000000000000000000..1a153b5fd1aee40884c6fb274a08d7b8c168e21d GIT binary patch literal 17606 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 literal 0 HcmV?d00001