diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd8cb5c730..49d34581f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,14 +19,15 @@ on: - 'appveyor.yml' env: - # Configuration type to build. - # You can convert this to a build matrix if you need coverage of multiple configuration types. - # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix BUILD_CONFIGURATION: Release - BUILD_PLATFORM: x64 jobs: build-windows: + strategy: + fail-fast: false + matrix: + platform: [x64, ARM64] + runs-on: windows-latest steps: - uses: actions/checkout@v2 @@ -38,7 +39,7 @@ jobs: - name: Build Windows working-directory: ${{ env.GITHUB_WORKSPACE }} - run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=${{ env.BUILD_PLATFORM }} Windows/PPSSPP.sln + run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=${{ matrix.platform }} Windows/PPSSPP.sln - name: Package build working-directory: ${{ env.GITHUB_WORKSPACE }} @@ -49,18 +50,18 @@ jobs: cp Windows/*.bat ppsspp/ cp -r assets ppsspp/assets - - name: Package headless (x86_64) - if: env.BUILD_PLATFORM == 'x64' - run: cp Windows/x64/Release/*.exe ppsspp/ + - name: Package headless (non-Win32) + if: matrix.platform != 'Win32' + run: cp Windows/${{ matrix.platform }}/Release/*.exe ppsspp/ - - name: Package headless (x86_32) - if: env.BUILD_PLATFORM != 'x64' + - name: Package headless (Win32) + if: matrix.platform == 'Win32' run: cp Windows/Release/*.exe ppsspp/ - name: Upload build uses: actions/upload-artifact@v1 with: - name: Windows x64 build + name: Windows ${{ matrix.platform }} build path: ppsspp/ build-uwp: @@ -75,7 +76,7 @@ jobs: - name: Build UWP working-directory: ${{ env.GITHUB_WORKSPACE }} - run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=${{ env.BUILD_PLATFORM }} /p:AppxPackageSigningEnabled=false UWP/PPSSPP_UWP.sln + run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=x64 /p:AppxPackageSigningEnabled=false UWP/PPSSPP_UWP.sln test-windows: runs-on: windows-latest @@ -99,8 +100,7 @@ jobs: - name: Execute tests working-directory: ${{ env.GITHUB_WORKSPACE }} - # GitHub Actions runners don't have graphics. - run: python test.py --graphics=null + run: python test.py --graphics=software build: strategy: @@ -275,5 +275,4 @@ jobs: - name: Execute tests working-directory: ${{ env.GITHUB_WORKSPACE }} - # GitHub Actions runners don't have graphics. - run: python test.py --graphics=null + run: python test.py --graphics=software diff --git a/CMakeLists.txt b/CMakeLists.txt index d001d98e12..0e10a35025 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1425,8 +1425,6 @@ set(GPU_SOURCES GPU/GPUState.h GPU/Math3D.cpp GPU/Math3D.h - GPU/Null/NullGpu.cpp - GPU/Null/NullGpu.h GPU/Software/Clipper.cpp GPU/Software/Clipper.h GPU/Software/Lighting.cpp diff --git a/Common/Buffer.cpp b/Common/Buffer.cpp index 423c2cfb3c..68c7e7682e 100644 --- a/Common/Buffer.cpp +++ b/Common/Buffer.cpp @@ -196,7 +196,7 @@ bool Buffer::ReadAll(int fd, int hintSize) { } while (true) { - int retval = recv(fd, &buf[0], (int)buf.size(), 0); + int retval = recv(fd, &buf[0], (int)buf.size(), MSG_NOSIGNAL); if (retval == 0) { break; } else if (retval < 0) { @@ -228,7 +228,7 @@ bool Buffer::ReadAllWithProgress(int fd, int knownSize, float *progress, bool *c return false; ready = fd_util::WaitUntilReady(fd, CANCEL_INTERVAL, false); } - int retval = recv(fd, &buf[0], (int)buf.size(), 0); + int retval = recv(fd, &buf[0], (int)buf.size(), MSG_NOSIGNAL); if (retval == 0) { return true; } else if (retval < 0) { @@ -248,7 +248,7 @@ int Buffer::Read(int fd, size_t sz) { char buf[1024]; int retval; size_t received = 0; - while ((retval = recv(fd, buf, (int)std::min(sz, sizeof(buf)), 0)) > 0) { + while ((retval = recv(fd, buf, (int)std::min(sz, sizeof(buf)), MSG_NOSIGNAL)) > 0) { if (retval < 0) { return retval; } diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index bd62aaf2ed..394a6eed32 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -6,6 +6,17 @@ #include "ext/glslang/SPIRV/GlslangToSpv.h" +const char *ShaderLanguageAsString(ShaderLanguage lang) { + switch (lang) { + case GLSL_1xx: return "GLSL 1.x"; + case GLSL_3xx: return "GLSL 3.x"; + case GLSL_VULKAN: return "GLSL-VK"; + case HLSL_D3D9: return "HLSL-D3D9"; + case HLSL_D3D11: return "HLSL-D3D11"; + default: return "(combination)"; + } +} + ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { Init(lang); } diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 20bf482239..36bfbe36ce 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -19,6 +19,8 @@ inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { return lang == GLSL_1xx || lang == GLSL_3xx; } +const char *ShaderLanguageAsString(ShaderLanguage lang); + enum class ShaderStage { Vertex, Fragment, diff --git a/Common/GPU/ShaderTranslation.cpp b/Common/GPU/ShaderTranslation.cpp index 827dfd7ab1..842863a5e5 100644 --- a/Common/GPU/ShaderTranslation.cpp +++ b/Common/GPU/ShaderTranslation.cpp @@ -75,11 +75,6 @@ void ShaderTranslationShutdown() { #endif } -std::string Preprocess(std::string code, ShaderLanguage lang, ShaderStage stage) { - // This takes GL up to the version we need. - return code; -} - struct Builtin { const char *needle; const char *replacement; @@ -218,7 +213,10 @@ bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetada } bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLanguageDesc &desc, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, ShaderStage stage, std::string *errorMessage) { + _assert_(errorMessage != nullptr); + if (srcLang != GLSL_3xx && srcLang != GLSL_1xx) { + *errorMessage = StringFromFormat("Bad src shader language: %s", ShaderLanguageAsString(srcLang)); return false; } @@ -227,14 +225,14 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan bool result = ConvertToVulkanGLSL(dest, destMetadata, src, stage, errorMessage); return result; } - if (errorMessage) { - *errorMessage = ""; - } #if PPSSPP_PLATFORM(UWP) + *errorMessage = "No shader translation available (UWP)"; return false; #endif + *errorMessage = ""; + glslang::TProgram program; const char *shaderStrings[1]; @@ -247,17 +245,12 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan EShLanguage shaderStage = GetLanguage(stage); glslang::TShader shader(shaderStage); - std::string preprocessed = Preprocess(src, srcLang, stage); - shaderStrings[0] = src.c_str(); shader.setStrings(shaderStrings, 1); + + // TODO: Should set settings here based on srcLang. if (!shader.parse(&Resources, 100, EProfile::ECompatibilityProfile, false, false, messages)) { - ERROR_LOG(G3D, "%s", shader.getInfoLog()); - ERROR_LOG(G3D, "%s", shader.getInfoDebugLog()); - if (errorMessage) { - *errorMessage = shader.getInfoLog(); - (*errorMessage) += shader.getInfoDebugLog(); - } + *errorMessage = std::string("GLSL parser failure: ") + shader.getInfoLog() + shader.getInfoDebugLog(); return false; // something didn't work } @@ -265,12 +258,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan program.addShader(&shader); if (!program.link(messages)) { - ERROR_LOG(G3D, "%s", shader.getInfoLog()); - ERROR_LOG(G3D, "%s", shader.getInfoDebugLog()); - if (errorMessage) { - *errorMessage = shader.getInfoLog(); - (*errorMessage) += shader.getInfoDebugLog(); - } + *errorMessage = std::string("Linker failure: ") + shader.getInfoLog() + shader.getInfoDebugLog(); return false; } @@ -286,7 +274,6 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan // Patch it up so spirv-cross accepts it. spirv[1] = glslang::EShTargetSpv_1_0; - // Alright, step 1 done. Now let's take this SPIR-V shader and output in our desired format. switch (destLang) { @@ -369,6 +356,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan return true; } default: + *errorMessage = StringFromFormat("Unsupported destination language: %s", ShaderLanguageAsString(destLang)); return false; } } diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 5bbb091f1c..8d8c27c49d 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -205,7 +205,7 @@ void ShaderWriter::BeginFSMain(Slice uniforms, Slice var break; case HLSL_D3D9: for (auto &uniform : uniforms) { - F(" %s %s : %s;\n", uniform.type, uniform.name, uniform.index); + F(" %s %s : register(c%d);\n", uniform.type, uniform.name, uniform.index); } // Let's do the varyings as parameters to main, no struct. C("vec4 main("); diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 33f8cd2e94..1f4fe4433f 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -349,17 +349,25 @@ void VulkanRenderManager::DestroyBackbuffers() { for (uint32_t i = 0; i < swapchainImageCount_; i++) { vulkan_->Delete().QueueDeleteImageView(swapchainImages_[i].view); } - vulkan_->Delete().QueueDeleteImageView(depth_.view); - vulkan_->Delete().QueueDeleteImage(depth_.image); - vulkan_->Delete().QueueDeleteDeviceMemory(depth_.mem); + swapchainImages_.clear(); + + if (depth_.view) { + vulkan_->Delete().QueueDeleteImageView(depth_.view); + } + if (depth_.image) { + vulkan_->Delete().QueueDeleteImage(depth_.image); + } + if (depth_.mem) { + vulkan_->Delete().QueueDeleteDeviceMemory(depth_.mem); + } + depth_ = {}; for (uint32_t i = 0; i < framebuffers_.size(); i++) { _dbg_assert_(framebuffers_[i] != VK_NULL_HANDLE); vulkan_->Delete().QueueDeleteFramebuffer(framebuffers_[i]); } framebuffers_.clear(); - swapchainImages_.clear(); - VLOG("Backbuffers Destroyed"); + INFO_LOG(G3D, "Backbuffers destroyed"); } VulkanRenderManager::~VulkanRenderManager() { diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index 1a7c6cffaa..113dc8200a 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -156,6 +156,9 @@ LogManager::~LogManager() { #endif } + // Make sure we don't shutdown while logging. RemoveListener locks too, but there are gaps. + std::lock_guard listeners_lock(listeners_lock_); + if (fileLog_) delete fileLog_; #if !defined(MOBILE_DEVICE) || defined(_DEBUG) @@ -262,6 +265,7 @@ bool LogManager::IsEnabled(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type) } void LogManager::Init(bool *enabledSetting) { + _assert_(logManager_ == nullptr); logManager_ = new LogManager(enabledSetting); } diff --git a/Common/Math/expression_parser.cpp b/Common/Math/expression_parser.cpp index 9499cce7e0..e24c056a07 100644 --- a/Common/Math/expression_parser.cpp +++ b/Common/Math/expression_parser.cpp @@ -462,7 +462,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_SIGNMINUS: // -0 if (useFloat) - valueStack.push_back(0.0 - fArg[0]); + valueStack.push_back((uint32_t)(0.0f - fArg[0])); else valueStack.push_back(0-arg[0]); break; @@ -474,7 +474,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_MUL: // a*b if (useFloat) - valueStack.push_back(fArg[1]*fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] * fArg[0])); else valueStack.push_back(arg[1]*arg[0]); break; @@ -485,7 +485,7 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, return false; } if (useFloat) - valueStack.push_back(fArg[1]/fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] / fArg[0])); else valueStack.push_back(arg[1]/arg[0]); break; @@ -499,13 +499,13 @@ bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, break; case EXOP_ADD: // a+b if (useFloat) - valueStack.push_back(fArg[1]+fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] + fArg[0])); else valueStack.push_back(arg[1]+arg[0]); break; case EXOP_SUB: // a-b if (useFloat) - valueStack.push_back(fArg[1]-fArg[0]); + valueStack.push_back((uint32_t)(fArg[1] - fArg[0])); else valueStack.push_back(arg[1]-arg[0]); break; diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index b8be625400..7193582fa5 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -366,6 +366,7 @@ int Client::ReadResponseHeaders(Buffer *readbuf, std::vector &respo if (code_pos != line.npos) { code = atoi(&line[code_pos]); } else { + ERROR_LOG(IO, "Code not parse HTTP status code"); return -1; } @@ -377,6 +378,7 @@ int Client::ReadResponseHeaders(Buffer *readbuf, std::vector &respo } if (responseHeaders.size() == 0) { + ERROR_LOG(IO, "No HTTP response headers"); return -1; } diff --git a/Common/Net/HTTPHeaders.cpp b/Common/Net/HTTPHeaders.cpp index acb554ee70..ef19d3bc9d 100644 --- a/Common/Net/HTTPHeaders.cpp +++ b/Common/Net/HTTPHeaders.cpp @@ -33,7 +33,7 @@ bool RequestHeader::GetParamValue(const char *param_name, std::string *value) co for (size_t i = 0; i < v.size(); i++) { std::vector parts; SplitString(v[i], '=', parts); - INFO_LOG(IO, "Param: %s Value: %s", parts[0].c_str(), parts[1].c_str()); + DEBUG_LOG(IO, "Param: %s Value: %s", parts[0].c_str(), parts[1].c_str()); if (parts[0] == param_name) { *value = parts[1]; return true; @@ -121,13 +121,13 @@ int RequestHeader::ParseHttpHeader(const char *buffer) { if (!strncasecmp(key, "User-Agent", key_len)) { user_agent = new char[value_len + 1]; memcpy(user_agent, buffer, value_len + 1); - INFO_LOG(IO, "user-agent: %s", user_agent); + VERBOSE_LOG(IO, "user-agent: %s", user_agent); } else if (!strncasecmp(key, "Referer", key_len)) { referer = new char[value_len + 1]; memcpy(referer, buffer, value_len + 1); } else if (!strncasecmp(key, "Content-Length", key_len)) { content_length = atoi(buffer); - INFO_LOG(IO, "Content-Length: %i", (int)content_length); + VERBOSE_LOG(IO, "Content-Length: %i", (int)content_length); } else { std::string key_str(key, key_len); std::transform(key_str.begin(), key_str.end(), key_str.begin(), tolower); @@ -150,12 +150,12 @@ void RequestHeader::ParseHeaders(net::InputSink *sink) { line_count++; if (type == SIMPLE) { // Done! - INFO_LOG(IO, "Simple: Done parsing http request."); + VERBOSE_LOG(IO, "Simple: Done parsing http request."); break; } } - INFO_LOG(IO, "finished parsing request."); + VERBOSE_LOG(IO, "finished parsing request."); ok = line_count > 1; } diff --git a/Common/Net/HTTPServer.cpp b/Common/Net/HTTPServer.cpp index da114da85a..1deb45f72c 100644 --- a/Common/Net/HTTPServer.cpp +++ b/Common/Net/HTTPServer.cpp @@ -54,7 +54,7 @@ Request::Request(int fd) header_.ParseHeaders(in_); if (header_.ok) { - INFO_LOG(IO, "The request carried with it %i bytes", (int)header_.content_length); + VERBOSE_LOG(IO, "The request carried with it %i bytes", (int)header_.content_length); } else { Close(); } @@ -171,8 +171,13 @@ bool Server::Listen4(int port) { setsockopt(listener_, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(opt)); if (bind(listener_, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); +#else + int err = errno; +#endif + ERROR_LOG(IO, "Failed to bind to port %d, error=%d - Bailing (ipv4)", port, err); closesocket(listener_); - ERROR_LOG(IO, "Failed to bind to port %d. Bailing.", port); return false; } @@ -216,8 +221,13 @@ bool Server::Listen6(int port, bool ipv6_only) { setsockopt(listener_, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&opt, sizeof(opt)); if (bind(listener_, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); +#else + int err = errno; +#endif + ERROR_LOG(IO, "Failed to bind to port %d, error=%d - Bailing (ipv6)", port, err); closesocket(listener_); - ERROR_LOG(IO, "Failed to bind to port %d. Bailing.", port); return false; } diff --git a/Common/Net/Sinks.cpp b/Common/Net/Sinks.cpp index ff1e09aa63..86f3841e26 100644 --- a/Common/Net/Sinks.cpp +++ b/Common/Net/Sinks.cpp @@ -176,7 +176,7 @@ void InputSink::Fill() { // Whatever isn't valid and follows write_ is what's available. size_t avail = BUFFER_SIZE - std::max(write_, valid_); - int bytes = recv(fd_, buf_ + write_, (int)avail, 0); + int bytes = recv(fd_, buf_ + write_, (int)avail, MSG_NOSIGNAL); AccountFill(bytes); } } @@ -399,6 +399,14 @@ void OutputSink::AccountPush(size_t bytes) { void OutputSink::AccountDrain(int bytes) { if (bytes < 0) { +#if PPSSPP_PLATFORM(WINDOWS) + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK) + return; +#else + if (errno == EWOULDBLOCK || errno == EAGAIN) + return; +#endif ERROR_LOG(IO, "Error writing to socket"); return; } diff --git a/Core/CoreParameter.h b/Core/CoreParameter.h index abfb9e40e6..b45384a002 100644 --- a/Core/CoreParameter.h +++ b/Core/CoreParameter.h @@ -23,7 +23,6 @@ #include "Core/Config.h" enum GPUCore { - GPUCORE_NULL, GPUCORE_GLES, GPUCORE_SOFTWARE, GPUCORE_DIRECTX9, diff --git a/Core/Debugger/WebSocket/DisasmSubscriber.cpp b/Core/Debugger/WebSocket/DisasmSubscriber.cpp index 172abf5f57..f8820cee48 100644 --- a/Core/Debugger/WebSocket/DisasmSubscriber.cpp +++ b/Core/Debugger/WebSocket/DisasmSubscriber.cpp @@ -262,7 +262,7 @@ uint32_t WebSocketDisasmState::RoundAddressUp(uint32_t addr) { // - addressHex: string indicating base address in hexadecimal (may be 64 bit.) void WebSocketDisasmState::Base(DebuggerRequest &req) { JsonWriter &json = req.Respond(); - json.writeString("addressHex", StringFromFormat("%016llx", Memory::base)); + json.writeString("addressHex", StringFromFormat("%016llx", (uintptr_t)Memory::base)); } // Disassemble a range of memory as CPU instructions (memory.disasm) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 2a65cb03a7..561b818684 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -209,6 +209,12 @@ PPGeStyle PSPDialog::FadedStyle(PPGeAlign align, float scale) { return textStyle; } +PPGeImageStyle PSPDialog::FadedImageStyle() { + PPGeImageStyle style; + style.color = CalcFadedColor(style.color); + return style; +} + void PSPDialog::DisplayButtons(int flags, const char *caption) { bool useCaption = false; diff --git a/Core/Dialog/PSPDialog.h b/Core/Dialog/PSPDialog.h index abf652f18c..5aaeea0dcc 100644 --- a/Core/Dialog/PSPDialog.h +++ b/Core/Dialog/PSPDialog.h @@ -85,6 +85,7 @@ public: void EndDraw(); protected: PPGeStyle FadedStyle(PPGeAlign align, float scale); + PPGeImageStyle FadedImageStyle(); void UpdateButtons(); bool IsButtonPressed(int checkButton); bool IsButtonHeld(int checkButton, int &framesHeld, int framesHeldThreshold = 30, int framesHeldRepeatRate = 10); diff --git a/Core/Dialog/PSPNetconfDialog.cpp b/Core/Dialog/PSPNetconfDialog.cpp index 1de5deb3d0..4e3fe9ae1c 100644 --- a/Core/Dialog/PSPNetconfDialog.cpp +++ b/Core/Dialog/PSPNetconfDialog.cpp @@ -104,15 +104,14 @@ void PSPNetconfDialog::DrawBanner() { textStyle.hasShadow = false; // TODO: Draw a hexagon icon - PPGeDrawImage(10, 5, 11.0f, 10.0f, 1, 10, 1, 10, 10, 10, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(10, 5, 11.0f, 10.0f, 1, 10, 1, 10, 10, 10, FadedImageStyle()); auto di = GetI18NCategory("Dialog"); PPGeDrawText(di->T("Network Connection"), 31, 10, textStyle); } void PSPNetconfDialog::DrawIndicator() { - // TODO: Draw animated circle as processing indicator - PPGeDrawImage(456, 248, 20.0f, 20.0f, 1, 10, 1, 10, 10, 10, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(456, 248, 20.0f, 20.0f, 1, 10, 1, 10, 10, 10, FadedImageStyle()); } void PSPNetconfDialog::DisplayMessage(std::string text1, std::string text2a, std::string text2b, std::string text3a, std::string text3b, bool hasYesNo, bool hasOK) { diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index b21b7ca42a..ee584cd698 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -331,7 +331,7 @@ void PSPSaveDialog::DisplayBanner(int which) break; } // TODO: Draw a hexagon icon - PPGeDrawImage(10, 6, 12.0f, 12.0f, 1, 10, 1, 10, 10, 10, textStyle.color); + PPGeDrawImage(10, 6, 12.0f, 12.0f, 1, 10, 1, 10, 10, 10, FadedImageStyle()); PPGeDrawText(title, 30, 11, textStyle); } @@ -340,13 +340,12 @@ void PSPSaveDialog::DisplaySaveList(bool canMove) { static int upFramesHeld = 0; static int downFramesHeld = 0; - for (int displayCount = 0; displayCount < param.GetFilenameCount(); displayCount++) - { - int textureColor = 0xFFFFFFFF; + for (int displayCount = 0; displayCount < param.GetFilenameCount(); displayCount++) { + PPGeImageStyle imageStyle = FadedImageStyle(); auto fileInfo = param.GetFileInfo(displayCount); if (fileInfo.size == 0 && fileInfo.texture != NULL) - textureColor = 0xFF777777; + imageStyle.color = CalcFadedColor(0xFF777777); // Calc save image position on screen float w, h , x, b; @@ -380,7 +379,7 @@ void PSPSaveDialog::DisplaySaveList(bool canMove) { fileInfo.texture->SetTexture(); tw = fileInfo.texture->Width(); th = fileInfo.texture->Height(); - PPGeDrawImage(x, y, w, h, 0, 0, 1, 1, tw, th, textureColor); + PPGeDrawImage(x, y, w, h, 0, 0, 1, 1, tw, th, imageStyle); } PPGeSetDefaultTexture(); } @@ -397,11 +396,11 @@ void PSPSaveDialog::DisplaySaveList(bool canMove) { void PSPSaveDialog::DisplaySaveIcon(bool checkExists) { std::lock_guard guard(paramLock); - int textureColor = CalcFadedColor(0xFFFFFFFF); + PPGeImageStyle imageStyle = FadedImageStyle(); auto curSave = param.GetFileInfo(currentSelectedSave); if (curSave.size == 0 && checkExists) - textureColor = CalcFadedColor(0xFF777777); + imageStyle.color = CalcFadedColor(0xFF777777); // Calc save image position on screen float w = 144; @@ -418,7 +417,7 @@ void PSPSaveDialog::DisplaySaveIcon(bool checkExists) } else { PPGeDisableTexture(); } - PPGeDrawImage(x, y, w, h, 0, 0, 1, 1, tw, th, textureColor); + PPGeDrawImage(x, y, w, h, 0, 0, 1, 1, tw, th, imageStyle); PPGeSetDefaultTexture(); } diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 985b36d18e..847d8b0035 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -217,6 +217,7 @@ public: } PsmfPlayer(const PsmfPlayerCreateData *data); ~PsmfPlayer() { + AbortFinish(); if (mediaengine) delete mediaengine; pspFileSystem.CloseFile(filehandle); diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index ab232a939a..f127336228 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -685,9 +685,9 @@ const KeyMap_IntStrPair psp_button_names[] = { {VIRTKEY_PAUSE, "Pause"}, #ifndef MOBILE_DEVICE {VIRTKEY_FRAME_ADVANCE, "Frame Advance"}, - {VIRTKEY_REWIND, "Rewind"}, {VIRTKEY_RECORD, "Audio/Video Recording"}, #endif + {VIRTKEY_REWIND, "Rewind"}, {VIRTKEY_SAVE_STATE, "Save State"}, {VIRTKEY_LOAD_STATE, "Load State"}, {VIRTKEY_NEXT_SLOT, "Next Slot"}, diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 6be7191e37..a31274dab9 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -677,7 +677,6 @@ namespace SaveState return false; } -#ifndef MOBILE_DEVICE static inline void CheckRewindState() { if (gpuStats.numFlips % g_Config.iRewindFlipFrequency != 0) @@ -690,10 +689,9 @@ namespace SaveState return; rewindLastTime = now; - DEBUG_LOG(BOOT, "saving rewind state"); + DEBUG_LOG(BOOT, "Saving rewind state"); rewindStates.Save(); } -#endif bool HasLoadedState() { return hasLoadedState; @@ -720,10 +718,8 @@ namespace SaveState void Process() { -#ifndef MOBILE_DEVICE if (g_Config.iRewindFlipFrequency != 0 && gpuStats.numFlips != 0) CheckRewindState(); -#endif if (!needsProcess) return; diff --git a/Core/Util/PPGeDraw.cpp b/Core/Util/PPGeDraw.cpp index 3dfccb86ad..f7b608d737 100644 --- a/Core/Util/PPGeDraw.cpp +++ b/Core/Util/PPGeDraw.cpp @@ -219,7 +219,7 @@ void __PPGeSetupListArgs() void __PPGeInit() { // PPGe isn't really important for headless, and LoadZIM takes a long time. - bool skipZIM = PSP_CoreParameter().gpuCore == GPUCORE_NULL || host->ShouldSkipUI(); + bool skipZIM = host->ShouldSkipUI(); u8 *imageData[12]{}; int width[12]{}; @@ -1130,13 +1130,12 @@ void PPGeDrawImage(ImageID atlasImage, float x, float y, float w, float h, const EndVertexDataAndDraw(GE_PRIM_RECTANGLES); } -void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, u32 color) -{ +void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, const PPGeImageStyle &style) { if (!dlPtr) return; BeginVertexData(); - Vertex(x, y, u1, v1, tw, th, color); - Vertex(x + w, y + h, u2, v2, tw, th, color); + Vertex(x, y, u1, v1, tw, th, style.color); + Vertex(x + w, y + h, u2, v2, tw, th, style.color); EndVertexDataAndDraw(GE_PRIM_RECTANGLES); } @@ -1222,7 +1221,8 @@ bool PPGeImage::Load() { return false; } - u32 texSize = width_ * height_ * 4; + u32 dataSize = width_ * height_ * 4; + u32 texSize = dataSize + width_ * 4; texture_ = __PPGeDoAlloc(texSize, true, "Savedata Icon"); if (texture_ == 0) { free(textureData); @@ -1230,7 +1230,8 @@ bool PPGeImage::Load() { return false; } - Memory::Memcpy(texture_, textureData, texSize); + Memory::Memcpy(texture_, textureData, dataSize); + Memory::Memset(texture_ + dataSize, 0, texSize - dataSize); free(textureData); lastFrame_ = gpuStats.numFlips; diff --git a/Core/Util/PPGeDraw.h b/Core/Util/PPGeDraw.h index 462c65fe82..564f1e27ec 100644 --- a/Core/Util/PPGeDraw.h +++ b/Core/Util/PPGeDraw.h @@ -65,9 +65,7 @@ enum class PPGeAlign { ANY = 0xFF, }; -inline bool operator &(const PPGeAlign &lhs, const PPGeAlign &rhs) { - return ((int)lhs & (int)rhs) != 0; -} +ENUM_CLASS_BITOPS(PPGeAlign); enum { PPGE_LINE_NONE = 0, @@ -84,6 +82,10 @@ struct PPGeStyle { uint32_t shadowColor = 0x80000000; }; +struct PPGeImageStyle { + uint32_t color = 0xFFFFFFFF; +}; + // Get the metrics of the bounding box of the text without changing the buffer or state. void PPGeMeasureText(float *w, float *h, const char *text, float scale, int WrapType = PPGE_LINE_NONE, int wrapWidth = 0); @@ -98,7 +100,7 @@ void PPGeDraw4Patch(ImageID atlasImage, float x, float y, float w, float h, u32 // Just blits an image to the screen, multiplied with the color. void PPGeDrawImage(ImageID atlasImage, float x, float y, const PPGeStyle &style); void PPGeDrawImage(ImageID atlasImage, float x, float y, float w, float h, const PPGeStyle &style); -void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, u32 color); +void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, const PPGeImageStyle &style); // Note: x2/y2 are exclusive. void PPGeScissor(int x1, int y1, int x2, int y2); diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 22af75c14a..e4afd7868a 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -81,12 +81,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool doFlatShading = id.Bit(FS_BIT_FLATSHADE) && !bugs.Has(Draw::Bugs::BROKEN_FLAT_IN_SHADER); bool shaderDepal = id.Bit(FS_BIT_SHADER_DEPAL); bool bgraTexture = id.Bit(FS_BIT_BGRA_TEXTURE); - bool colorWriteMask = id.Bit(FS_BIT_COLOR_WRITEMASK); - - if (colorWriteMask && !compat.bitwiseOps) { - *errorString = "Color Write Mask requires bitwise ops"; - return false; - } + bool colorWriteMask = id.Bit(FS_BIT_COLOR_WRITEMASK) && compat.bitwiseOps; GEComparison alphaTestFunc = (GEComparison)id.Bits(FS_BIT_ALPHA_TEST_FUNC, 3); GEComparison colorTestFunc = (GEComparison)id.Bits(FS_BIT_COLOR_TEST_FUNC, 2); @@ -299,7 +294,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); } } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { - if (shaderDepal && gl_extensions.IsGLES) { + if ((shaderDepal || colorWriteMask) && gl_extensions.IsGLES) { WRITE(p, "precision highp int;\n"); } @@ -426,14 +421,15 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // Provide implementations of packUnorm4x8 and unpackUnorm4x8 if not available. if (colorWriteMask && !hasPackUnorm4x8) { WRITE(p, "uint packUnorm4x8(vec4 v) {\n"); - WRITE(p, " v = clamp(v, 0.0, 1.0);\n"); - WRITE(p, " uvec4 u = uvec4(255.0 * v);\n"); + WRITE(p, " highp vec4 f = clamp(v, 0.0, 1.0);\n"); + WRITE(p, " uvec4 u = uvec4(255.0 * f);\n"); WRITE(p, " return u.x | (u.y << 8) | (u.z << 16) | (u.w << 24);\n"); WRITE(p, "}\n"); - WRITE(p, "vec4 unpackUnorm4x8(uint x) {\n"); - WRITE(p, " uvec4 u = uvec4(x & 0xFFU, (x >> 8) & 0xFFU, (x >> 16) & 0xFFU, (x >> 24) & 0xFFU);\n"); - WRITE(p, " return vec4(u) * (1.0 / 255.0);\n"); + WRITE(p, "vec4 unpackUnorm4x8(highp uint x) {\n"); + WRITE(p, " highp uvec4 u = uvec4(x & 0xFFU, (x >> 8) & 0xFFU, (x >> 16) & 0xFFU, (x >> 24) & 0xFFU);\n"); + WRITE(p, " highp vec4 f = vec4(u);\n"); + WRITE(p, " return f * (1.0 / 255.0);\n"); WRITE(p, "}\n"); } @@ -819,10 +815,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " vec3 colortest = roundAndScaleTo255v(v.rgb);\n"); WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) %s\n", test, test, test, discardStatement); } else if (compat.bitwiseOps) { - // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); if (compat.shaderLanguage == GLSL_VULKAN) { - // TODO: Use this for GL as well? + // Apparently GLES3 does not support vector bitwise ops, but Vulkan does? WRITE(p, " if ((v_scaled & u_alphacolormask.rgb) %s (u_alphacolorref.rgb & u_alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); } else { const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 4336773cde..571c396846 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -204,7 +204,7 @@ static std::string ReadShaderSrc(const std::string &filename) { return ""; std::string src(data, sz); - free(data); + delete[] data; return src; } @@ -240,6 +240,8 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha } std::string vsError, fsError; + + // All post shaders are written in GLSL 1.0 so that's what we pass in here as a "from" language. Draw::ShaderModule *vs = CompileShaderModule(ShaderStage::Vertex, GLSL_1xx, vsSourceGLSL, &vsError); Draw::ShaderModule *fs = CompileShaderModule(ShaderStage::Fragment, GLSL_1xx, fsSourceGLSL, &fsError); @@ -471,7 +473,7 @@ Draw::ShaderModule *PresentationCommon::CompileShaderModule(ShaderStage stage, S if (lang != lang_) { // Gonna have to upconvert the shader. if (!TranslateShader(&translated, lang_, draw_->GetShaderLanguageDesc(), nullptr, src, lang, stage, errorString)) { - ERROR_LOG(FRAMEBUF, "Failed to translate post-shader: %s", errorString->c_str()); + ERROR_LOG(FRAMEBUF, "Failed to translate post-shader. Error string: '%s'\nSource code:\n%s\n", errorString->c_str(), src.c_str()); return nullptr; } } diff --git a/GPU/GPU.cpp b/GPU/GPU.cpp index f731ee6cbb..02ef795fb7 100644 --- a/GPU/GPU.cpp +++ b/GPU/GPU.cpp @@ -28,7 +28,6 @@ #include "GPU/GLES/GPU_GLES.h" #endif #include "GPU/Vulkan/GPU_Vulkan.h" -#include "GPU/Null/NullGpu.h" #include "GPU/Software/SoftGpu.h" #if PPSSPP_API(D3D9) @@ -60,15 +59,17 @@ bool GPU_IsReady() { } bool GPU_Init(GraphicsContext *ctx, Draw::DrawContext *draw) { - _assert_(draw || PSP_CoreParameter().gpuCore == GPUCORE_NULL); + const auto &gpuCore = PSP_CoreParameter().gpuCore; + _assert_(draw || gpuCore == GPUCORE_SOFTWARE); #if PPSSPP_PLATFORM(UWP) - SetGPU(new GPU_D3D11(ctx, draw)); + if (gpuCore == GPUCORE_SOFTWARE) { + SetGPU(new SoftGPU(ctx, draw)); + } else { + SetGPU(new GPU_D3D11(ctx, draw)); + } return true; #else - switch (PSP_CoreParameter().gpuCore) { - case GPUCORE_NULL: - SetGPU(new NullGPU()); - break; + switch (gpuCore) { case GPUCORE_GLES: // Disable GLES on ARM Windows (but leave it enabled on other ARM platforms). #if PPSSPP_API(ANY_GL) diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 8f9e2404b6..ddaaa6e7ef 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -452,7 +452,6 @@ - @@ -628,7 +627,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index fff4ea4a51..ba8b72b871 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -10,9 +10,6 @@ {21783292-4dd7-447b-af93-356cd2eaa4d6} - - {b31aa5a1-da08-47e6-9467-ab1d547b6ff3} - {88629970-4774-4122-b031-2128244b795c} @@ -36,9 +33,6 @@ Common - - Null - Common @@ -278,9 +272,6 @@ Common - - Null - Common diff --git a/GPU/Null/NullGpu.cpp b/GPU/Null/NullGpu.cpp deleted file mode 100644 index 34f6b1d77d..0000000000 --- a/GPU/Null/NullGpu.cpp +++ /dev/null @@ -1,730 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include "GPU/Common/DrawEngineCommon.h" -#include "GPU/Null/NullGpu.h" -#include "GPU/GPUState.h" -#include "GPU/ge_constants.h" -#include "Core/Debugger/Breakpoints.h" -#include "Core/MemMap.h" -#include "Core/MIPS/MIPS.h" -#include "Core/HLE/sceKernelInterrupt.h" -#include "Core/HLE/sceGe.h" - -class NullDrawEngine : public DrawEngineCommon { -public: - void DispatchFlush() override { - } - void DispatchSubmitPrim(void *verts, void *inds, GEPrimitiveType prim, int vertexCount, u32 vertTypeID, int cullMode, int *bytesRead) override { - } -}; - -NullGPU::NullGPU() : GPUCommon(nullptr, nullptr) { - drawEngineCommon_ = new NullDrawEngine(); -} -NullGPU::~NullGPU() { } - -void NullGPU::FastRunLoop(DisplayList &list) { - for (; downcount > 0; --downcount) { - u32 op = Memory::ReadUnchecked_U32(list.pc); - u32 cmd = op >> 24; - - u32 diff = op ^ gstate.cmdmem[cmd]; - gstate.cmdmem[cmd] = op; - ExecuteOp(op, diff); - - list.pc += 4; - } -} - -void NullGPU::ExecuteOp(u32 op, u32 diff) { - u32 cmd = op >> 24; - u32 data = op & 0xFFFFFF; - - // Handle control and drawing commands here directly. The others we delegate. - switch (cmd) - { - case GE_CMD_BASE: - DEBUG_LOG(G3D,"DL BASE: %06x", data); - break; - - case GE_CMD_VADDR: - gstate_c.vertexAddr = gstate_c.getRelativeAddress(data); - break; - - case GE_CMD_IADDR: - gstate_c.indexAddr = gstate_c.getRelativeAddress(data); - break; - - case GE_CMD_PRIM: - { - u32 count = data & 0xFFFF; - u32 type = data >> 16; - static const char* types[7] = { - "POINTS=0,", - "LINES=1,", - "LINE_STRIP=2,", - "TRIANGLES=3,", - "TRIANGLE_STRIP=4,", - "TRIANGLE_FAN=5,", - "RECTANGLES=6,", - }; - DEBUG_LOG(G3D, "DL DrawPrim type: %s count: %i vaddr= %08x, iaddr= %08x", type<7 ? types[type] : "INVALID", count, gstate_c.vertexAddr, gstate_c.indexAddr); - } - break; - - case GE_CMD_BEZIER: - { - int bz_ucount = data & 0xFF; - int bz_vcount = (data >> 8) & 0xFF; - DEBUG_LOG(G3D,"DL DRAW BEZIER: %i x %i", bz_ucount, bz_vcount); - } - break; - - case GE_CMD_SPLINE: - { - int sp_ucount = data & 0xFF; - int sp_vcount = (data >> 8) & 0xFF; - int sp_utype = (data >> 16) & 0x3; - int sp_vtype = (data >> 18) & 0x3; - DEBUG_LOG(G3D,"DL DRAW SPLINE: %i x %i, %i x %i", sp_ucount, sp_vcount, sp_utype, sp_vtype); - } - break; - - case GE_CMD_BOUNDINGBOX: - if (data != 0) { - DEBUG_LOG(G3D, "Unsupported bounding box: %06x", data); - // Bounding box test. Let's assume the box was within the drawing region. - currentList->bboxResult = true; - } else { - currentList->bboxResult = false; - } - break; - - case GE_CMD_VERTEXTYPE: - DEBUG_LOG(G3D,"DL SetVertexType: %06x", data); - // This sets through-mode or not, as well. - break; - - case GE_CMD_REGION1: - { - int x1 = data & 0x3ff; - int y1 = data >> 10; - //topleft - DEBUG_LOG(G3D,"DL Region TL: %d %d", x1, y1); - } - break; - - case GE_CMD_REGION2: - { - int x2 = data & 0x3ff; - int y2 = data >> 10; - DEBUG_LOG(G3D,"DL Region BR: %d %d", x2, y2); - } - break; - - case GE_CMD_DEPTHCLAMPENABLE: - DEBUG_LOG(G3D, "DL Depth Clamp Enable: %i (ignoring)", data); - //we always clip, this is opengl - break; - - case GE_CMD_CULLFACEENABLE: - DEBUG_LOG(G3D, "DL CullFace Enable: %i (ignoring)", data); - break; - - case GE_CMD_TEXTUREMAPENABLE: - DEBUG_LOG(G3D, "DL Texture map enable: %i", data); - break; - - case GE_CMD_LIGHTINGENABLE: - DEBUG_LOG(G3D, "DL Lighting enable: %i", data); - data += 1; - //We don't use OpenGL lighting - break; - - case GE_CMD_FOGENABLE: - DEBUG_LOG(G3D, "DL Fog Enable: %i", gstate.fogEnable); - break; - - case GE_CMD_DITHERENABLE: - DEBUG_LOG(G3D, "DL Dither Enable: %i", gstate.ditherEnable); - break; - - case GE_CMD_OFFSETX: - DEBUG_LOG(G3D, "DL Offset X: %i", gstate.offsetx); - break; - - case GE_CMD_OFFSETY: - DEBUG_LOG(G3D, "DL Offset Y: %i", gstate.offsety); - break; - - case GE_CMD_TEXSCALEU: - gstate_c.uv.uScale = getFloat24(data); - DEBUG_LOG(G3D, "DL Texture U Scale: %f", gstate_c.uv.uScale); - break; - - case GE_CMD_TEXSCALEV: - gstate_c.uv.vScale = getFloat24(data); - DEBUG_LOG(G3D, "DL Texture V Scale: %f", gstate_c.uv.vScale); - break; - - case GE_CMD_TEXOFFSETU: - gstate_c.uv.uOff = getFloat24(data); - DEBUG_LOG(G3D, "DL Texture U Offset: %f", gstate_c.uv.uOff); - break; - - case GE_CMD_TEXOFFSETV: - gstate_c.uv.vOff = getFloat24(data); - DEBUG_LOG(G3D, "DL Texture V Offset: %f", gstate_c.uv.vOff); - break; - - case GE_CMD_SCISSOR1: - { - int x1 = data & 0x3ff; - int y1 = data >> 10; - DEBUG_LOG(G3D, "DL Scissor TL: %i, %i", x1,y1); - } - break; - case GE_CMD_SCISSOR2: - { - int x2 = data & 0x3ff; - int y2 = data >> 10; - DEBUG_LOG(G3D, "DL Scissor BR: %i, %i", x2, y2); - } - break; - - case GE_CMD_MINZ: - DEBUG_LOG(G3D, "DL MinZ: %i", data); - break; - - case GE_CMD_MAXZ: - DEBUG_LOG(G3D, "DL MaxZ: %i", data); - break; - - case GE_CMD_FRAMEBUFPTR: - DEBUG_LOG(G3D, "DL FramebufPtr: %08x", data); - break; - - case GE_CMD_FRAMEBUFWIDTH: - DEBUG_LOG(G3D, "DL FramebufWidth: %i", data); - break; - - case GE_CMD_FRAMEBUFPIXFORMAT: - break; - - case GE_CMD_TEXADDR0: - gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - case GE_CMD_TEXADDR1: - case GE_CMD_TEXADDR2: - case GE_CMD_TEXADDR3: - case GE_CMD_TEXADDR4: - case GE_CMD_TEXADDR5: - case GE_CMD_TEXADDR6: - case GE_CMD_TEXADDR7: - DEBUG_LOG(G3D,"DL Texture address %i: %06x", cmd-GE_CMD_TEXADDR0, data); - break; - - case GE_CMD_TEXBUFWIDTH0: - gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - case GE_CMD_TEXBUFWIDTH1: - case GE_CMD_TEXBUFWIDTH2: - case GE_CMD_TEXBUFWIDTH3: - case GE_CMD_TEXBUFWIDTH4: - case GE_CMD_TEXBUFWIDTH5: - case GE_CMD_TEXBUFWIDTH6: - case GE_CMD_TEXBUFWIDTH7: - DEBUG_LOG(G3D,"DL Texture BUFWIDTH %i: %06x", cmd-GE_CMD_TEXBUFWIDTH0, data); - break; - - case GE_CMD_CLUTADDR: - //DEBUG_LOG(G3D,"CLUT base addr: %06x", data); - break; - - case GE_CMD_CLUTADDRUPPER: - DEBUG_LOG(G3D,"DL CLUT addr: %08x", ((gstate.clutaddrupper & 0xFF0000)<<8) | (gstate.clutaddr & 0xFFFFFF)); - break; - - case GE_CMD_LOADCLUT: - // This could be used to "dirty" textures with clut. - { - u32 clutAddr = gstate.getClutAddress(); - if (clutAddr) - { - DEBUG_LOG(G3D,"DL Clut load: %08x", clutAddr); - } - else - { - DEBUG_LOG(G3D,"DL Empty Clut load"); - } - // Should hash and invalidate all paletted textures on use - } - break; - -//case GE_CMD_TRANSFERSRC: - - case GE_CMD_TRANSFERSRCW: - { - u32 xferSrc = (gstate.transfersrc & 0x00FFFFFF) | ((data & 0xFF0000) << 8); - u32 xferSrcW = data & 0x3FF; - DEBUG_LOG(G3D,"Block Transfer Src: %08x W: %i", xferSrc, xferSrcW); - break; - } -// case GE_CMD_TRANSFERDST: - - case GE_CMD_TRANSFERDSTW: - { - u32 xferDst = (gstate.transferdst & 0x00FFFFFF) | ((data & 0xFF0000) << 8); - u32 xferDstW = data & 0x3FF; - DEBUG_LOG(G3D,"Block Transfer Dest: %08x W: %i", xferDst, xferDstW); - break; - } - - case GE_CMD_TRANSFERSRCPOS: - { - u32 x = (data & 1023)+1; - u32 y = ((data>>10) & 1023)+1; - DEBUG_LOG(G3D, "DL Block Transfer Src Rect TL: %i, %i", x, y); - break; - } - - case GE_CMD_TRANSFERDSTPOS: - { - u32 x = (data & 1023)+1; - u32 y = ((data>>10) & 1023)+1; - DEBUG_LOG(G3D, "DL Block Transfer Dest Rect TL: %i, %i", x, y); - break; - } - - case GE_CMD_TRANSFERSIZE: - { - u32 w = (data & 1023)+1; - u32 h = ((data>>10) & 1023)+1; - DEBUG_LOG(G3D, "DL Block Transfer Rect Size: %i x %i", w, h); - break; - } - - case GE_CMD_TRANSFERSTART: - { - u32 srcBasePtr = gstate.getTransferSrcAddress(); - u32 srcStride = gstate.getTransferSrcStride(); - - u32 dstBasePtr = gstate.getTransferDstAddress(); - u32 dstStride = gstate.getTransferDstStride(); - - int srcX = gstate.getTransferSrcX(); - int srcY = gstate.getTransferSrcY(); - - int dstX = gstate.getTransferDstX(); - int dstY = gstate.getTransferDstY(); - - int width = gstate.getTransferWidth(); - int height = gstate.getTransferHeight(); - - int bpp = gstate.getTransferBpp(); - - DEBUG_LOG(G3D, "Block transfer: %08x/%x -> %08x/%x, %ix%ix%i (%i,%i)->(%i,%i)", srcBasePtr, srcStride, dstBasePtr, dstStride, width, height, bpp, srcX, srcY, dstX, dstY); - - for (int y = 0; y < height; y++) { - const u8 *src = Memory::GetPointer(srcBasePtr + ((y + srcY) * srcStride + srcX) * bpp); - u8 *dst = Memory::GetPointer(dstBasePtr + ((y + dstY) * dstStride + dstX) * bpp); - memcpy(dst, src, width * bpp); - } - - CBreakPoints::ExecMemCheck(srcBasePtr + (srcY * srcStride + srcX) * bpp, false, height * srcStride * bpp, currentMIPS->pc); - CBreakPoints::ExecMemCheck(dstBasePtr + (srcY * dstStride + srcX) * bpp, true, height * dstStride * bpp, currentMIPS->pc); - - // TODO: Correct timing appears to be 1.9, but erring a bit low since some of our other timing is inaccurate. - cyclesExecuted += ((height * width * bpp) * 16) / 10; - break; - } - - case GE_CMD_TEXSIZE0: - gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - gstate_c.curTextureWidth = 1 << (gstate.texsize[0] & 0xf); - gstate_c.curTextureHeight = 1 << ((gstate.texsize[0]>>8) & 0xf); - //fall thru - ignoring the mipmap sizes for now - case GE_CMD_TEXSIZE1: - case GE_CMD_TEXSIZE2: - case GE_CMD_TEXSIZE3: - case GE_CMD_TEXSIZE4: - case GE_CMD_TEXSIZE5: - case GE_CMD_TEXSIZE6: - case GE_CMD_TEXSIZE7: - DEBUG_LOG(G3D,"DL Texture Size: %06x", data); - break; - - case GE_CMD_ZBUFPTR: - DEBUG_LOG(G3D,"Zbuf Ptr: %06x", data); - break; - - case GE_CMD_ZBUFWIDTH: - DEBUG_LOG(G3D,"Zbuf Width: %i", data); - break; - - case GE_CMD_AMBIENTCOLOR: - DEBUG_LOG(G3D,"DL Ambient Color: %06x", data); - break; - - case GE_CMD_AMBIENTALPHA: - DEBUG_LOG(G3D,"DL Ambient Alpha: %06x", data); - break; - - case GE_CMD_MATERIALAMBIENT: - DEBUG_LOG(G3D,"DL Material Ambient Color: %06x", data); - break; - - case GE_CMD_MATERIALDIFFUSE: - DEBUG_LOG(G3D,"DL Material Diffuse Color: %06x", data); - break; - - case GE_CMD_MATERIALEMISSIVE: - DEBUG_LOG(G3D,"DL Material Emissive Color: %06x", data); - break; - - case GE_CMD_MATERIALSPECULAR: - DEBUG_LOG(G3D,"DL Material Specular Color: %06x", data); - break; - - case GE_CMD_MATERIALALPHA: - DEBUG_LOG(G3D,"DL Material Alpha Color: %06x", data); - break; - - case GE_CMD_MATERIALSPECULARCOEF: - DEBUG_LOG(G3D,"DL Material specular coef: %f", getFloat24(data)); - break; - - case GE_CMD_LIGHTTYPE0: - case GE_CMD_LIGHTTYPE1: - case GE_CMD_LIGHTTYPE2: - case GE_CMD_LIGHTTYPE3: - DEBUG_LOG(G3D,"DL Light %i type: %06x", cmd-GE_CMD_LIGHTTYPE0, data); - break; - - case GE_CMD_LX0:case GE_CMD_LY0:case GE_CMD_LZ0: - case GE_CMD_LX1:case GE_CMD_LY1:case GE_CMD_LZ1: - case GE_CMD_LX2:case GE_CMD_LY2:case GE_CMD_LZ2: - case GE_CMD_LX3:case GE_CMD_LY3:case GE_CMD_LZ3: - { - int n = cmd - GE_CMD_LX0; - int l = n / 3; - int c = n % 3; - float val = getFloat24(data); - DEBUG_LOG(G3D,"DL Light %i %c pos: %f", l, c+'X', val); - } - break; - - case GE_CMD_LDX0:case GE_CMD_LDY0:case GE_CMD_LDZ0: - case GE_CMD_LDX1:case GE_CMD_LDY1:case GE_CMD_LDZ1: - case GE_CMD_LDX2:case GE_CMD_LDY2:case GE_CMD_LDZ2: - case GE_CMD_LDX3:case GE_CMD_LDY3:case GE_CMD_LDZ3: - { - int n = cmd - GE_CMD_LDX0; - int l = n / 3; - int c = n % 3; - float val = getFloat24(data); - DEBUG_LOG(G3D,"DL Light %i %c dir: %f", l, c+'X', val); - } - break; - - case GE_CMD_LKA0:case GE_CMD_LKB0:case GE_CMD_LKC0: - case GE_CMD_LKA1:case GE_CMD_LKB1:case GE_CMD_LKC1: - case GE_CMD_LKA2:case GE_CMD_LKB2:case GE_CMD_LKC2: - case GE_CMD_LKA3:case GE_CMD_LKB3:case GE_CMD_LKC3: - { - int n = cmd - GE_CMD_LKA0; - int l = n / 3; - int c = n % 3; - float val = getFloat24(data); - DEBUG_LOG(G3D,"DL Light %i %c att: %f", l, c+'X', val); - } - break; - - - case GE_CMD_LAC0:case GE_CMD_LAC1:case GE_CMD_LAC2:case GE_CMD_LAC3: - case GE_CMD_LDC0:case GE_CMD_LDC1:case GE_CMD_LDC2:case GE_CMD_LDC3: - case GE_CMD_LSC0:case GE_CMD_LSC1:case GE_CMD_LSC2:case GE_CMD_LSC3: - { - float r = (float)(data>>16)/255.0f; - float g = (float)((data>>8) & 0xff)/255.0f; - float b = (float)(data & 0xff)/255.0f; - - int l = (cmd - GE_CMD_LAC0) / 3; - int t = (cmd - GE_CMD_LAC0) % 3; - // DEBUG_LOG(G3D, "DL Light color %i %c att: %f", l, c + 'X', val); - } - break; - - case GE_CMD_VIEWPORTXSCALE: - case GE_CMD_VIEWPORTYSCALE: - case GE_CMD_VIEWPORTZSCALE: - case GE_CMD_VIEWPORTXCENTER: - case GE_CMD_VIEWPORTYCENTER: - case GE_CMD_VIEWPORTZCENTER: - DEBUG_LOG(G3D,"DL Viewport param %i: %f", cmd-GE_CMD_VIEWPORTXSCALE, getFloat24(data)); - break; - case GE_CMD_LIGHTENABLE0: - case GE_CMD_LIGHTENABLE1: - case GE_CMD_LIGHTENABLE2: - case GE_CMD_LIGHTENABLE3: - DEBUG_LOG(G3D,"DL Light %i enable: %d", cmd-GE_CMD_LIGHTENABLE0, data); - break; - case GE_CMD_CULL: - DEBUG_LOG(G3D,"DL cull: %06x", data); - break; - - case GE_CMD_LIGHTMODE: - DEBUG_LOG(G3D,"DL Shade mode: %06x", data); - break; - - case GE_CMD_PATCHDIVISION: - break; - - case GE_CMD_MATERIALUPDATE: - DEBUG_LOG(G3D,"DL Material Update: %d", data); - break; - - - ////////////////////////////////////////////////////////////////// - // CLEARING - ////////////////////////////////////////////////////////////////// - case GE_CMD_CLEARMODE: - // If it becomes a performance problem, check diff&1 - DEBUG_LOG(G3D,"DL Clear mode: %06x", data); - break; - - - ////////////////////////////////////////////////////////////////// - // ALPHA BLENDING - ////////////////////////////////////////////////////////////////// - case GE_CMD_ALPHABLENDENABLE: - DEBUG_LOG(G3D,"DL Alpha blend enable: %d", data); - break; - - case GE_CMD_BLENDMODE: - DEBUG_LOG(G3D,"DL Blend mode: %06x", data); - break; - - case GE_CMD_BLENDFIXEDA: - DEBUG_LOG(G3D,"DL Blend fix A: %06x", data); - break; - - case GE_CMD_BLENDFIXEDB: - DEBUG_LOG(G3D,"DL Blend fix B: %06x", data); - break; - - case GE_CMD_ALPHATESTENABLE: - DEBUG_LOG(G3D,"DL Alpha test enable: %d", data); - // This is done in the shader. - break; - - case GE_CMD_ALPHATEST: - DEBUG_LOG(G3D,"DL Alpha test settings"); - break; - - case GE_CMD_TEXFUNC: - { - DEBUG_LOG(G3D,"DL TexFunc %i", data&7); - /* - int m=GL_MODULATE; - switch (data & 7) - { - case 0: m=GL_MODULATE; break; - case 1: m=GL_DECAL; break; - case 2: m=GL_BLEND; break; - case 3: m=GL_REPLACE; break; - case 4: m=GL_ADD; break; - }*/ - - /* - 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_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1); - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);*/ - break; - } - case GE_CMD_TEXFILTER: - { - int min = data & 7; - int mag = (data >> 8) & 1; - DEBUG_LOG(G3D,"DL TexFilter min: %i mag: %i", min, mag); - } - - break; - ////////////////////////////////////////////////////////////////// - // Z/STENCIL TESTING - ////////////////////////////////////////////////////////////////// - - case GE_CMD_ZTESTENABLE: - DEBUG_LOG(G3D,"DL Z test enable: %d", data & 1); - break; - - case GE_CMD_STENCILTESTENABLE: - DEBUG_LOG(G3D,"DL Stencil test enable: %d", data); - break; - - case GE_CMD_ZTEST: - { - DEBUG_LOG(G3D,"DL Z test mode: %i", data); - } - break; - - case GE_CMD_MORPHWEIGHT0: - case GE_CMD_MORPHWEIGHT1: - case GE_CMD_MORPHWEIGHT2: - case GE_CMD_MORPHWEIGHT3: - case GE_CMD_MORPHWEIGHT4: - case GE_CMD_MORPHWEIGHT5: - case GE_CMD_MORPHWEIGHT6: - case GE_CMD_MORPHWEIGHT7: - { - int index = cmd - GE_CMD_MORPHWEIGHT0; - float weight = getFloat24(data); - DEBUG_LOG(G3D,"DL MorphWeight %i = %f", index, weight); - gstate_c.morphWeights[index] = weight; - } - break; - - case GE_CMD_DITH0: - case GE_CMD_DITH1: - case GE_CMD_DITH2: - case GE_CMD_DITH3: - DEBUG_LOG(G3D,"DL DitherMatrix %i = %06x",cmd-GE_CMD_DITH0,data); - break; - - case GE_CMD_WORLDMATRIXNUMBER: - gstate.worldmtxnum = data&0xF; - break; - - case GE_CMD_WORLDMATRIXDATA: - { - int num = gstate.worldmtxnum & 0xF; - if (num < 12) { - gstate.worldMatrix[num] = getFloat24(data); - } - gstate.worldmtxnum = (++num) & 0xF; - } - break; - - case GE_CMD_VIEWMATRIXNUMBER: - gstate.viewmtxnum = data&0xF; - break; - - case GE_CMD_VIEWMATRIXDATA: - { - int num = gstate.viewmtxnum & 0xF; - if (num < 12) { - gstate.viewMatrix[num] = getFloat24(data); - } - gstate.viewmtxnum = (++num) & 0xF; - } - break; - - case GE_CMD_PROJMATRIXNUMBER: - gstate.projmtxnum = data&0xF; - break; - - case GE_CMD_PROJMATRIXDATA: - { - int num = gstate.projmtxnum & 0xF; - gstate.projMatrix[num] = getFloat24(data); - gstate.projmtxnum = (++num) & 0xF; - } - break; - - case GE_CMD_TGENMATRIXNUMBER: - gstate.texmtxnum = data&0xF; - break; - - case GE_CMD_TGENMATRIXDATA: - { - int num = gstate.texmtxnum & 0xF; - if (num < 12) { - gstate.tgenMatrix[num] = getFloat24(data); - } - gstate.texmtxnum = (++num) & 0xF; - } - break; - - case GE_CMD_BONEMATRIXNUMBER: - gstate.boneMatrixNumber = data & 0x7F; - break; - - case GE_CMD_BONEMATRIXDATA: - { - int num = gstate.boneMatrixNumber & 0x7F; - if (num < 96) { - gstate.boneMatrix[num] = getFloat24(data); - } - gstate.boneMatrixNumber = (++num) & 0x7F; - } - break; - - default: - GPUCommon::ExecuteOp(op, diff); - break; - } -} - -void NullGPU::GetStats(char *buffer, size_t bufsize) { - snprintf(buffer, bufsize, "NullGPU: (N/A)"); -} - -void NullGPU::InvalidateCache(u32 addr, int size, GPUInvalidationType type) { - // Nothing to invalidate. -} - -void NullGPU::NotifyVideoUpload(u32 addr, int size, int width, int format) { - // Nothing to do. -} - -bool NullGPU::PerformMemoryCopy(u32 dest, u32 src, int size) { - // Nothing to update. - InvalidateCache(dest, size, GPU_INVALIDATE_HINT); - return false; -} - -bool NullGPU::PerformMemorySet(u32 dest, u8 v, int size) { - // Nothing to update. - InvalidateCache(dest, size, GPU_INVALIDATE_HINT); - return false; -} - -bool NullGPU::PerformMemoryDownload(u32 dest, int size) { - // Nothing to update. - InvalidateCache(dest, size, GPU_INVALIDATE_HINT); - return false; -} - -bool NullGPU::PerformMemoryUpload(u32 dest, int size) { - // Nothing to update. - InvalidateCache(dest, size, GPU_INVALIDATE_HINT); - return false; -} - -bool NullGPU::PerformStencilUpload(u32 dest, int size) { - return false; -} - -bool NullGPU::FramebufferReallyDirty() { - return !(gstate_c.skipDrawReason & SKIPDRAW_SKIPFRAME); -} diff --git a/GPU/Null/NullGpu.h b/GPU/Null/NullGpu.h deleted file mode 100644 index 5969dcfc8f..0000000000 --- a/GPU/Null/NullGpu.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "GPU/GPUState.h" -#include "GPU/GPUCommon.h" - -class ShaderManagerGLES; - -class NullGPU : public GPUCommon { -public: - NullGPU(); - ~NullGPU(); - - void CheckGPUFeatures() override {} - void InitClear() override {} - void ExecuteOp(u32 op, u32 diff) override; - - void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format) override {} - void CopyDisplayToOutput(bool reallyDirty) override {} - void GetStats(char *buffer, size_t bufsize) override; - void InvalidateCache(u32 addr, int size, GPUInvalidationType type) override; - void NotifyVideoUpload(u32 addr, int size, int width, int format) override; - bool PerformMemoryCopy(u32 dest, u32 src, int size) override; - bool PerformMemorySet(u32 dest, u8 v, int size) override; - bool PerformMemoryDownload(u32 dest, int size) override; - bool PerformMemoryUpload(u32 dest, int size) override; - bool PerformStencilUpload(u32 dest, int size) override; - void ClearCacheNextFrame() override {} - bool FramebufferDirty() override { return true; } - - void DeviceLost() override {} - void DeviceRestore() override {} - void DumpNextFrame() override {} - - void Resized() override {} - void GetReportingInfo(std::string &primaryInfo, std::string &fullInfo) override { - primaryInfo = "NULL"; - fullInfo = "NULL"; - } - - bool FramebufferReallyDirty() override; - -protected: - void FastRunLoop(DisplayList &list) override; -}; diff --git a/GPU/Software/Sampler.cpp b/GPU/Software/Sampler.cpp index 0442cde30d..63a0f79b0d 100644 --- a/GPU/Software/Sampler.cpp +++ b/GPU/Software/Sampler.cpp @@ -15,6 +15,7 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "ppsspp_config.h" #include #include #include "Common/ColorConv.h" @@ -88,7 +89,7 @@ SamplerJitCache::SamplerJitCache() AllocCodeSpace(1024 * 64 * 4); // Add some random code to "help" MSVC's buggy disassembler :( -#if defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64)) +#if defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64)) && !PPSSPP_PLATFORM(UWP) using namespace Gen; for (int i = 0; i < 100; i++) { MOV(32, R(EAX), R(EBX)); @@ -214,8 +215,7 @@ NearestFunc SamplerJitCache::GetNearest(const SamplerID &id) { Clear(); } - // TODO -#ifdef _M_X64 +#if defined(_M_X64) && !PPSSPP_PLATFORM(UWP) addresses_[id] = GetCodePointer(); NearestFunc func = Compile(id); cache_[id] = func; @@ -239,7 +239,7 @@ LinearFunc SamplerJitCache::GetLinear(const SamplerID &id) { } // TODO -#ifdef _M_X64 +#if defined(_M_X64) && !PPSSPP_PLATFORM(UWP) addresses_[id] = GetCodePointer(); LinearFunc func = CompileLinear(id); cache_[id] = (NearestFunc)func; diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 364001bd26..cd9d443945 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -25,13 +25,14 @@ #include "Common/GraphicsContext.h" #include "Core/Config.h" #include "Core/ConfigValues.h" +#include "Core/Core.h" #include "Core/Debugger/Breakpoints.h" #include "Core/MemMap.h" #include "Core/HLE/sceKernelInterrupt.h" #include "Core/HLE/sceGe.h" #include "Core/MIPS/MIPS.h" #include "Core/Reporting.h" -#include "Core/Core.h" +#include "Core/Util/PPGeDraw.h" #include "Common/Profiler/Profiler.h" #include "Common/GPU/thin3d.h" @@ -68,29 +69,33 @@ SoftGPU::SoftGPU(GraphicsContext *gfxCtx, Draw::DrawContext *draw) Sampler::Init(); drawEngine_ = new SoftwareDrawEngine(); drawEngineCommon_ = drawEngine_; - presentation_ = new PresentationCommon(draw_); - switch (GetGPUBackend()) { - case GPUBackend::OPENGL: - presentation_->SetLanguage(draw_->GetShaderLanguageDesc().shaderLanguage); - break; - case GPUBackend::DIRECT3D9: - ShaderTranslationInit(); - presentation_->SetLanguage(HLSL_D3D9); - break; - case GPUBackend::DIRECT3D11: - ShaderTranslationInit(); - presentation_->SetLanguage(HLSL_D3D11); - break; - case GPUBackend::VULKAN: - presentation_->SetLanguage(GLSL_VULKAN); - break; + if (gfxCtx && draw) { + presentation_ = new PresentationCommon(draw_); + + switch (GetGPUBackend()) { + case GPUBackend::OPENGL: + presentation_->SetLanguage(draw_->GetShaderLanguageDesc().shaderLanguage); + break; + case GPUBackend::DIRECT3D9: + ShaderTranslationInit(); + presentation_->SetLanguage(HLSL_D3D9); + break; + case GPUBackend::DIRECT3D11: + ShaderTranslationInit(); + presentation_->SetLanguage(HLSL_D3D11); + break; + case GPUBackend::VULKAN: + presentation_->SetLanguage(GLSL_VULKAN); + break; + } } Resized(); } void SoftGPU::DeviceLost() { - presentation_->DeviceLost(); + if (presentation_) + presentation_->DeviceLost(); draw_ = nullptr; if (fbTex) { fbTex->Release(); @@ -99,8 +104,11 @@ void SoftGPU::DeviceLost() { } void SoftGPU::DeviceRestore() { - draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); - presentation_->DeviceRestore(draw_); + if (PSP_CoreParameter().graphicsContext) + draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); + if (presentation_) + presentation_->DeviceRestore(draw_); + PPGeSetDrawContext(draw_); } SoftGPU::~SoftGPU() { @@ -109,15 +117,17 @@ SoftGPU::~SoftGPU() { fbTex = nullptr; } - delete presentation_; - switch (GetGPUBackend()) { - case GPUBackend::DIRECT3D9: - case GPUBackend::DIRECT3D11: - ShaderTranslationShutdown(); - break; - case GPUBackend::OPENGL: - case GPUBackend::VULKAN: - break; + if (presentation_) { + delete presentation_; + switch (GetGPUBackend()) { + case GPUBackend::DIRECT3D9: + case GPUBackend::DIRECT3D11: + ShaderTranslationShutdown(); + break; + case GPUBackend::OPENGL: + case GPUBackend::VULKAN: + break; + } } Sampler::Shutdown(); @@ -169,7 +179,7 @@ void SoftGPU::ConvertTextureDescFrom16(Draw::TextureDesc &desc, int srcwidth, in // Copies RGBA8 data from RAM to the currently bound render target. void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) { - if (!draw_) + if (!draw_ || !presentation_) return; float u0 = 0.0f; float u1; @@ -198,7 +208,7 @@ void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) { bool hasImage = true; OutputFlags outputFlags = g_Config.iBufFilter == SCALE_NEAREST ? OutputFlags::NEAREST : OutputFlags::LINEAR; - bool hasPostShader = presentation_->HasPostShader(); + bool hasPostShader = presentation_ && presentation_->HasPostShader(); if (PSP_CoreParameter().compat.flags().DarkStalkersPresentHack && displayFormat_ == GE_FORMAT_5551 && g_DarkStalkerStretch != DSStretch::Off) { u8 *data = Memory::GetPointer(0x04088000); @@ -298,8 +308,10 @@ void SoftGPU::Resized() { PSP_CoreParameter().renderHeight = 272; } - presentation_->UpdateSize(PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight); - presentation_->UpdatePostShader(); + if (presentation_) { + presentation_->UpdateSize(PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight); + presentation_->UpdatePostShader(); + } } void SoftGPU::FastRunLoop(DisplayList &list) { diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 8fdcd6d8f5..273043185e 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -383,7 +383,7 @@ static std::string ReadShaderSrc(const std::string &filename) { return ""; std::string src(data, sz); - free(data); + delete[] data; return src; } diff --git a/README.md b/README.md index dfb30088c6..bc8d4b1b9c 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,22 @@ Additional code by many contributors, see the Credits screen Originally released under the GPL 2.0 (and later) in November 2012 +Official website: +https://www.ppsspp.org/ + +Discord: +https://discord.gg/5NJB6dD + No BIOS file required to play, PPSSPP is an "HLE" emulator. Default settings balance good compatibility and speed. +To contribute, see [the development page](https://www.ppsspp.org/development.html). Help testing, investigating, or fixing is always welcome. See [the list of issues](https://github.com/hrydgard/ppsspp/issues). For the latest source code, see [our GitHub page](https://github.com/hrydgard/ppsspp). - Luna version includes various compatibility improvements(hackfixes) as well as features to make testing and working around some problems easier. - Includes adhoc between multiply instances of PPSSPP on same PC with some additional options to make that easier. - ~ LunaMoo + +Luna version includes various compatibility improvements(hackfixes) as well as features to make testing and working around some problems easier. +By default it runs with limited settings hiding most options and features that are rarely changed for clarity and easier access of the commonly changed settings. +Includes some additional options to make adhoc between multiply instances on same pc easier. +~ LunaMoo For build instructions and other development tutorials, see [the wiki](https://github.com/hrydgard/ppsspp/wiki). @@ -23,55 +32,55 @@ For game compatibility, see [community compatibility feedback](https://report.pp What's new in 1.10.3 -------------------- -* Fix for control layout editor ([#13125][]) +* Fix for control layout editor ([#13125]) What's new in 1.10.2 -------------------- -* More crashfixes ([#13094][], [#13093][]) -* Improve download performance and cancel behavior ([#13095][]) -* Restore the removed I/O on Thread option ([#13096][]) +* More crashfixes ([#13094], [#13093]) +* Improve download performance and cancel behavior ([#13095]) +* Restore the removed I/O on Thread option ([#13096]) What's new in 1.10.1 -------------------- -* Fixes for common crashes ([#13077][], [#13076][], see [#13057][]) -* Fix for offset rendering in D3D9 ([#13071][]) +* Fixes for common crashes ([#13077], [#13076], see [#13057]) +* Fix for offset rendering in D3D9 ([#13071]) What's new in 1.10.0 -------------------- -* Graphics and compatibility fixes ([#12800][], [#12670][], [#12635][], [#12857][], [#12941][], [#11898][], [#12695][], more) -* Assorted minor performance improvements, game load speedup ([#12462][], [#12652][]) -* Screen inset (notch) support on Android ([#12779][]) -* Analog stick support for menu navigation ([#12685][]) -* Fixed audio glitches in SDL builds ([#12916][], [#12920][]) -* Support more languages in in-game dialogs ([#12702][]). Croatian language added to PPSSPP. -* Simple multiplayer chat ([#12667][]) -* More advanced postprocessing (multipass, parameters) ([#12905][], [#12901][]) -* Add PPSSPP-specific CWCheat ([#12816][], [#12912][]) -* Reintroduce Cardboard VR, allow more resolutions ([#12449][], [#8714][]) -* Fix some crashes ([#12908][], [#12876][]) -* Ghost in the Shell graphics fixed (JIT inaccuracy with inf*0) ([#12519][]) -* Mac build now supports Vulkan on top of MoltenVK ([#12583][]) -* Raspberry Pi 4 EGL crash fixed ([#12474][]) -* VSync now supported on all backends, frame duplication option added for 30 Hz games ([#12659][], [#12602][]) -* Camera supported on Windows, Linux and Mac (still no microphone though) ([#12572][], [#12580][], [#12607][]) -* Darkstalkers fixed and working through software rendering. SW rendering fixed on GLES 2.0 ([#12443][], [#12898][]) -* Hot Shots Golf slowdown and flicker on Vulkan fixed ([#12873][], [#12746][]) -* Pangya Golf crashes and hangs fixed ([#12718][]) -* Allow rebinding of right touch screen analog ([#12486][]) -* Add option to prevent mipmaps from being dumped ([#12818][]) -* Tilt control now have a base radius to help with deadzone ([#12756][]) -* Mappable auto rotating analog stick to pass some game checks ([#12749][]) -* Touch control position can now be snapped to a grid ([#12517][]) -* HiDPI retina display support ([#12552][]) -* Rapid-fire on touch control ([#12601][]) -* Toggle mute button ([#12643][]) -* Add option to resize game icons and more ([#12646][], [#12637][]) -* Frames in-flight now configurable to reduce input lag at the cost of speed ([#12660][]) -* Add toggle mode to combo button ([#12623][]) -* SDL mouse support, Qt menu upgrades ([#12612][], [#12817][]) -* Real support for chinese patched version of Hatsune Miku Project Diva Extend ([#13007][]) -* Some minor kernel module support ([#13028][], [#12225][], [#13026][], [#13004][], [#13038][], [#13023][]) -* Fixed fullscreen toggling with Vulkan in SDL builds ([#11974][]) +* Graphics and compatibility fixes ([#12800], [#12670], [#12635], [#12857], [#12941], [#11898], [#12695], more) +* Assorted minor performance improvements, game load speedup ([#12462], [#12652]) +* Screen inset (notch) support on Android ([#12779]) +* Analog stick support for menu navigation ([#12685]) +* Fixed audio glitches in SDL builds ([#12916], [#12920]) +* Support more languages in in-game dialogs ([#12702]). Croatian language added to PPSSPP. +* Simple multiplayer chat ([#12667]) +* More advanced postprocessing (multipass, parameters) ([#12905], [#12901]) +* Add PPSSPP-specific CWCheat ([#12816], [#12912]) +* Reintroduce Cardboard VR, allow more resolutions ([#12449], [#8714]) +* Fix some crashes ([#12908], [#12876]) +* Ghost in the Shell graphics fixed (JIT inaccuracy with inf*0) ([#12519]) +* Mac build now supports Vulkan on top of MoltenVK ([#12583]) +* Raspberry Pi 4 EGL crash fixed ([#12474]) +* VSync now supported on all backends, frame duplication option added for 30 Hz games ([#12659], [#12602]) +* Camera supported on Windows, Linux and Mac (still no microphone though) ([#12572], [#12580], [#12607]) +* Darkstalkers fixed and working through software rendering. SW rendering fixed on GLES 2.0 ([#12443], [#12898]) +* Hot Shots Golf slowdown and flicker on Vulkan fixed ([#12873], [#12746]) +* Pangya Golf crashes and hangs fixed ([#12718]) +* Allow rebinding of right touch screen analog ([#12486]) +* Add option to prevent mipmaps from being dumped ([#12818]) +* Tilt control now have a base radius to help with deadzone ([#12756]) +* Mappable auto rotating analog stick to pass some game checks ([#12749]) +* Touch control position can now be snapped to a grid ([#12517]) +* HiDPI retina display support ([#12552]) +* Rapid-fire on touch control ([#12601]) +* Toggle mute button ([#12643]) +* Add option to resize game icons and more ([#12646], [#12637]) +* Frames in-flight now configurable to reduce input lag at the cost of speed ([#12660]) +* Add toggle mode to combo button ([#12623]) +* SDL mouse support, Qt menu upgrades ([#12612], [#12817]) +* Real support for chinese patched version of Hatsune Miku Project Diva Extend ([#13007]) +* Some minor kernel module support ([#13028], [#12225], [#13026], [#13004], [#13038], [#13023]) +* Fixed fullscreen toggling with Vulkan in SDL builds ([#11974]) What's new in 1.9.0/1.9.3 ------------------------- @@ -80,62 +89,62 @@ What's new in 1.9.0/1.9.3 What's new in 1.9.0/1.9.2 ------------------------- -* Flicker fixed in God of War that appeared with newer drivers for Mali GPUs ([#12224][]) -* Improve performance of God of War on Vulkan ([#12242][]), implement built-in GPU profiler ([#12262][], [#12266][]) -* Vertex range culling fixed on ARM Mali ([#12227][]) -* Started to improve VFPU precision, resulting so far in a fix for the long standing Tekken 6 leg shaking problem ([#12217][]) -* Fixed a VFPU precision snafu on ARM64, fixing disappearing officers in Warriors Orochi ([#11299][]) and some problems in Tomb Raider ([#11179][]). +* Flicker fixed in God of War that appeared with newer drivers for Mali GPUs ([#12224]) +* Improve performance of God of War on Vulkan ([#12242]), implement built-in GPU profiler ([#12262], [#12266]) +* Vertex range culling fixed on ARM Mali ([#12227]) +* Started to improve VFPU precision, resulting so far in a fix for the long standing Tekken 6 leg shaking problem ([#12217]) +* Fixed a VFPU precision snafu on ARM64, fixing disappearing officers in Warriors Orochi ([#11299]) and some problems in Tomb Raider ([#11179]). * Vulkan is the default again on Android versions newer than Pie * Fix various homebrew store issues -* GPU pause signal handling fixed, fixing some hangs in Bleach and Armored Core games ([#12160][]) -* Audio sample rate conversion handling fixes ([#12147][]) -* Some Vulkan optimizations (pre-rotation ([#12216][]), perf fix in Metal Gear Acid, etc) -* Multiple fixes for the UWP build ([#12036][], others) -* MP3 playback fixes ([#12005][]) -* Audio in Motorstorm: Arctic Edge fixed by returning errors correctly ([#12121][]) -* Audio glitches in Final Fantasy Tactics fixed ([#9956][]) -* Camera display in Invizimals fixed ([#12278][], [#8521][]) -* Added hotkeys for texture dump and replace ([#11938][]) -* Added Visual Studio 2019 support. Windows XP is no longer supported ([#11995][], others) -* Fixes for video capture ([#12069][]) -* Added a separate sound volume for alternative speed ([#12124][]) -* Improved mouse control (Windows only) ([#12173][], [#12176][]) -* Support for installing texture packs and ISOs from zips ([#12175][]) -* Right analog support for touch controls (only used by patched games and some HD remasters) ([#12182][]) -* Android: Fix OpenSL initialization, possibly helps audio crackle a little. ([#12333][]). +* GPU pause signal handling fixed, fixing some hangs in Bleach and Armored Core games ([#12160]) +* Audio sample rate conversion handling fixes ([#12147]) +* Some Vulkan optimizations (pre-rotation ([#12216]), perf fix in Metal Gear Acid, etc) +* Multiple fixes for the UWP build ([#12036], others) +* MP3 playback fixes ([#12005]) +* Audio in Motorstorm: Arctic Edge fixed by returning errors correctly ([#12121]) +* Audio glitches in Final Fantasy Tactics fixed ([#9956]) +* Camera display in Invizimals fixed ([#12278], [#8521]) +* Added hotkeys for texture dump and replace ([#11938]) +* Added Visual Studio 2019 support. Windows XP is no longer supported ([#11995], others) +* Fixes for video capture ([#12069]) +* Added a separate sound volume for alternative speed ([#12124]) +* Improved mouse control (Windows only) ([#12173], [#12176]) +* Support for installing texture packs and ISOs from zips ([#12175]) +* Right analog support for touch controls (only used by patched games and some HD remasters) ([#12182]) +* Android: Fix OpenSL initialization, possibly helps audio crackle a little. ([#12333]). * Fix graphics on Amazon Fire TV Stick 4K -* Fixed strange vehicle behavior in MGS:PW (somehow) ([#12342][]) +* Fixed strange vehicle behavior in MGS:PW (somehow) ([#12342]) What's new in 1.8.0 ------------------- -* Avoid crash when starting PPSSPP due to bad AMD Vulkan drivers ([#11802][]) -* PowerVR Vulkan display corruption fixed ([#11744][], [#11747][]) -* Naruto Shippuden 3 hang fixed ([#11780][]) -* Fixes to various lighting bugs ([#11567][], [#11574][], [#11577][]) -* Fix control issue in Sonic Rivals and Rock Band ([#11878][], [#11798][], [#11879][]) -* Significant performance improvement in Earth Defense Force 2 ([#11172][]) -* Fix "real clock sync" setting (helps with latency for music games - [#11813][]) -* More speed in FF4 effects and other generated curves ([#11425][]) -* Support for resizing Vulkan on Linux ([#11451][]) -* Improved support for GLES on Linux/IoT ([#11507][], [#11537][], [#11541][], [#11632][], [#11746][], [#11806][], [#11845][]) -* Percentage based frameskipping ([#11523][]) -* DXT accuracy improved, fixing thick white line in Gran Turismo sky ([#11530][]) -* Fix Motorstorm freeze on non-Windows ([#11618][]) -* Faster block transfer in some games like Digimon Adventures ([#11531][], [#11553][], [#11776][]) -* Blending optimizations and improvements ([#11543][], [#11620][]) -* Improve D3D11 rendering issues ([#11584][]) -* Change default graphics backend to D3D11 or OpenGL ([#11621][], [#11658][]) -* Remove some outdated settings ([#11665][], [#11666][], [#11667][]) -* Fix remote disc streaming with ipv6 ([#11689][], [#11700][]) -* Vulkan: Workarounds for some driver bugs for 5xx series Qualcomm GPUs ([#11691][], [#11694][]) -* Fix some Qt port issues with recent performance improvements ([#11720][], [#11807][], [#11808][]) -* UWP Xbox One: fix X/Back button confusion ([#11740][]) -* Fix Formula 1 2006 timing issue ([#11767][]) -* Fixes and workarounds for some vertex range culling bugs that broke a few games ([#11785][], [#11859][]), and disable it on older GPUs ([#11712][], [#11773][], [#11787][]) -* Android: Allow putting PSP storage on custom paths like SD cards ([#11812][]) -* Corrected vocp instruction, fixing models in Artdink games ([#11822][], [#11835][]) -* Bundle SDL in binary for macOS builds ([#11831][]) -* Prevent keeping games open on Windows ([#11842][]) +* Avoid crash when starting PPSSPP due to bad AMD Vulkan drivers ([#11802]) +* PowerVR Vulkan display corruption fixed ([#11744], [#11747]) +* Naruto Shippuden 3 hang fixed ([#11780]) +* Fixes to various lighting bugs ([#11567], [#11574], [#11577]) +* Fix control issue in Sonic Rivals and Rock Band ([#11878], [#11798], [#11879]) +* Significant performance improvement in Earth Defense Force 2 ([#11172]) +* Fix "real clock sync" setting (helps with latency for music games - [#11813]) +* More speed in FF4 effects and other generated curves ([#11425]) +* Support for resizing Vulkan on Linux ([#11451]) +* Improved support for GLES on Linux/IoT ([#11507], [#11537], [#11541], [#11632], [#11746], [#11806], [#11845]) +* Percentage based frameskipping ([#11523]) +* DXT accuracy improved, fixing thick white line in Gran Turismo sky ([#11530]) +* Fix Motorstorm freeze on non-Windows ([#11618]) +* Faster block transfer in some games like Digimon Adventures ([#11531], [#11553], [#11776]) +* Blending optimizations and improvements ([#11543], [#11620]) +* Improve D3D11 rendering issues ([#11584]) +* Change default graphics backend to D3D11 or OpenGL ([#11621], [#11658]) +* Remove some outdated settings ([#11665], [#11666], [#11667]) +* Fix remote disc streaming with ipv6 ([#11689], [#11700]) +* Vulkan: Workarounds for some driver bugs for 5xx series Qualcomm GPUs ([#11691], [#11694]) +* Fix some Qt port issues with recent performance improvements ([#11720], [#11807], [#11808]) +* UWP Xbox One: fix X/Back button confusion ([#11740]) +* Fix Formula 1 2006 timing issue ([#11767]) +* Fixes and workarounds for some vertex range culling bugs that broke a few games ([#11785], [#11859]), and disable it on older GPUs ([#11712], [#11773], [#11787]) +* Android: Allow putting PSP storage on custom paths like SD cards ([#11812]) +* Corrected vocp instruction, fixing models in Artdink games ([#11822], [#11835]) +* Bundle SDL in binary for macOS builds ([#11831]) +* Prevent keeping games open on Windows ([#11842]) What's new in 1.7.3/1.7.4/1.7.5 ------------------- @@ -150,22 +159,24 @@ What's new in 1.7.2 What's new in 1.7.1 ------------------- * Minor crashfixes, lang updates -* Save bug fixed ([#11508][]) +* Save bug fixed ([#11508]) What's new in 1.7.0 ------------------- -* Fix for insta-crash on Galaxy Note 9, some Xiaomi devices, and the new nVidia Shield ([#11441][]) -* Vertex range culling on most platforms, fixes DTM: Race Driver and similar ([#11393][]) -* Major speed boost in some Gundam and Earth Defense Force games ([#10973][]) -* Fix for issues with post processing shaders in GL 3+ ([#11182][]) -* Fixes to sound output switching on Windows (WASAPI) ([#11438][]) -* Detects DirectInput devices when running ([#11461][]) -* Simple Discord integration ([#11307][]) -* New debugging APIs ([#10909][]) -* Task switching made a lot more robust (fixes GPD XD problems) ([#11447][]) -* Texture decoding optimizations ([#11350][]) +* Fix for insta-crash on Galaxy Note 9, some Xiaomi devices, and the new nVidia Shield ([#11441]) +* Vertex range culling on most platforms, fixes DTM: Race Driver and similar ([#11393]) +* Major speed boost in some Gundam and Earth Defense Force games ([#10973]) +* Fix for issues with post processing shaders in GL 3+ ([#11182]) +* Fixes to sound output switching on Windows (WASAPI) ([#11438]) +* Detects DirectInput devices when running ([#11461]) +* Simple Discord integration ([#11307]) +* New debugging APIs ([#10909]) +* Task switching made a lot more robust (fixes GPD XD problems) ([#11447]) +* Texture decoding optimizations ([#11350]) * Tons and tons of miscellaneous bugfixes and compatibility fixes + +[comment]: # (LINK_LIST_BEGIN_HERE) [#13125]: https://github.com/hrydgard/ppsspp/issues/13125 "Refactor and fix touch control layout screen for notch" [#13094]: https://github.com/hrydgard/ppsspp/issues/13094 "Camera initialization crash fix" [#13093]: https://github.com/hrydgard/ppsspp/issues/13093 "Add a try/catch to Android camera device listing." diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 86db05c510..17f0afd652 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -68,11 +68,6 @@ #include "Common/CommonWindows.h" #endif -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - #include bool MainScreen::showHomebrewTab = false; @@ -1131,7 +1126,11 @@ void MainScreen::CreateViews() { UI::Drawable solid(0xFFbd9939); upgradeBar_->SetBG(solid); upgradeBar_->Add(new TextView(u->T("New version of PPSSPP available") + std::string(": ") + g_Config.upgradeVersion, new LinearLayoutParams(1.0f, textMargins))); +#if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(WINDOWS) upgradeBar_->Add(new Button(u->T("Download"), new LinearLayoutParams(buttonMargins)))->OnClick.Handle(this, &MainScreen::OnDownloadUpgrade); +#else + upgradeBar_->Add(new Button(u->T("Details"), new LinearLayoutParams(buttonMargins)))->OnClick.Handle(this, &MainScreen::OnDownloadUpgrade); +#endif upgradeBar_->Add(new Button(u->T("Dismiss"), new LinearLayoutParams(buttonMargins)))->OnClick.Handle(this, &MainScreen::OnDismissUpgrade); // Slip in under root_ @@ -1156,9 +1155,12 @@ UI::EventReturn MainScreen::OnDownloadUpgrade(UI::EventParams &e) { } else { LaunchBrowser("market://details?id=org.ppsspp.ppsspp"); } +#elif PPSSPP_PLATFORM(WINDOWS) + LaunchBrowser("https://www.ppsspp.org/downloads.html"); #else // Go directly to ppsspp.org and let the user sort it out - LaunchBrowser("https://www.ppsspp.org/downloads.html"); + // (for details and in case downloads doesn't have their platform.) + LaunchBrowser("https://www.ppsspp.org/"); #endif return UI::EVENT_DONE; } @@ -1376,12 +1378,6 @@ UI::EventReturn MainScreen::OnExit(UI::EventParams &e) { // Request the framework to exit cleanly. System_SendMessage("finish", ""); -#ifdef __ANDROID__ -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif -#endif - UpdateUIState(UISTATE_EXIT); return UI::EVENT_DONE; } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 7ac3478727..79e64fe73d 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -137,12 +137,6 @@ Atlas g_ui_atlas; #include #endif -// https://github.com/richq/android-ndk-profiler -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - ScreenManager *screenManager; std::string config_filename; @@ -952,14 +946,12 @@ void NativeShutdownGraphics() { #if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) if (winCamera) { - winCamera->sendMessage({ CAPTUREDEVIDE_COMMAND::SHUTDOWN, nullptr }); - while (!winCamera->isShutDown()) {};// Wait for shutting down. + winCamera->waitShutDown(); delete winCamera; winCamera = nullptr; } if (winMic) { - winMic->sendMessage({ CAPTUREDEVIDE_COMMAND::SHUTDOWN, nullptr }); - while (!winMic->isShutDown()) {};// Wait for shutting down. + winMic->waitShutDown(); delete winMic; winMic = nullptr; } @@ -1402,14 +1394,6 @@ void NativeShutdown() { #endif g_Config.Save("NativeShutdown"); - // Avoid shutting this down when restarting core. - if (!restarting) - LogManager::Shutdown(); - -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif - INFO_LOG(SYSTEM, "NativeShutdown called"); ShutdownWebServer(); @@ -1420,6 +1404,10 @@ void NativeShutdown() { g_Discord.Shutdown(); + // Avoid shutting this down when restarting core. + if (!restarting) + LogManager::Shutdown(); + if (logger) { delete logger; logger = nullptr; diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 47909ea812..3d52c42410 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -103,7 +103,7 @@ public: LinearLayout *topright = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 1.0f)); topright->SetSpacing(1.0f); topright->Add(new TextView(savedata_title, ALIGN_LEFT | FLAG_WRAP_TEXT, false))->SetTextColor(textStyle.fgColor); - topright->Add(new TextView(StringFromFormat("%d kB", ginfo->gameSize / 1024), 0, true))->SetTextColor(textStyle.fgColor); + topright->Add(new TextView(StringFromFormat("%lld kB", ginfo->gameSize / 1024), 0, true))->SetTextColor(textStyle.fgColor); topright->Add(new TextView(GetFileDateAsString(savePath_ + "/PARAM.SFO"), 0, true))->SetTextColor(textStyle.fgColor); toprow->Add(topright); content->Add(new Spacer(3.0)); @@ -292,7 +292,7 @@ void SavedataButton::Draw(UIContext &dc) { } if (subtitle_.empty() && ginfo->gameSize > 0) { std::string savedata_title = ginfo->paramSFO.GetValueString("SAVEDATA_TITLE"); - subtitle_ = CleanSaveString(savedata_title) + StringFromFormat(" (%d kB)", ginfo->gameSize / 1024); + subtitle_ = CleanSaveString(savedata_title) + StringFromFormat(" (%lld kB)", ginfo->gameSize / 1024); } dc.MeasureText(dc.GetFontStyle(), 1.0f, 1.0f, title_.c_str(), &tw, &th, 0); diff --git a/Windows/CaptureDevice.cpp b/Windows/CaptureDevice.cpp index 45cbc33fb2..6d511f8b90 100644 --- a/Windows/CaptureDevice.cpp +++ b/Windows/CaptureDevice.cpp @@ -854,6 +854,21 @@ CAPTUREDEVIDE_MESSAGE WindowsCaptureDevice::getMessage() { return message; } +void WindowsCaptureDevice::updateState(const CAPTUREDEVIDE_STATE &newState) { + std::unique_lock guard(stateMutex_); + state = newState; + stateCond_.notify_all(); +} + +void WindowsCaptureDevice::waitShutDown() { + sendMessage({ CAPTUREDEVIDE_COMMAND::SHUTDOWN, nullptr }); + + std::unique_lock guard(stateMutex_); + while (!isShutDown()) { + stateCond_.wait(guard); + } +} + void WindowsCaptureDevice::messageHandler() { CoInitializeEx(NULL, COINIT_MULTITHREADED); MFStartup(MF_VERSION); diff --git a/Windows/CaptureDevice.h b/Windows/CaptureDevice.h index 5c5224f9c8..64ef4926a6 100644 --- a/Windows/CaptureDevice.h +++ b/Windows/CaptureDevice.h @@ -194,11 +194,11 @@ public: void setError(const CAPTUREDEVIDE_ERROR &newError, const std::string &newErrorMessage) { error = newError; errorMessage = newErrorMessage; } void setSelction(const UINT32 &selection) { param.selection = selection; } - void updateState(const CAPTUREDEVIDE_STATE &newState) { state = newState; } HRESULT setDeviceParam(IMFMediaType *pType); bool isShutDown() const { return state == CAPTUREDEVIDE_STATE::SHUTDOWN; } bool isStarted() const { return state == CAPTUREDEVIDE_STATE::STARTED; } + void waitShutDown(); void sendMessage(CAPTUREDEVIDE_MESSAGE message); CAPTUREDEVIDE_MESSAGE getMessage(); @@ -210,7 +210,8 @@ public: friend class ReaderCallback; protected: -// Handle message here. + void updateState(const CAPTUREDEVIDE_STATE &newState); + // Handle message here. void messageHandler(); CAPTUREDEVIDE_TYPE type; @@ -239,6 +240,8 @@ protected: // Param updating synchronously. std::mutex paramMutex; + std::mutex stateMutex_; + std::condition_variable stateCond_; // Camera only unsigned char *imageRGB = nullptr; diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index d59874d680..4d415b7c8a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -203,7 +203,7 @@ DinputDevice::~DinputDevice() { } } -void SendNativeAxis(int deviceId, short value, short &lastValue, int axisId) { +void SendNativeAxis(int deviceId, int value, int &lastValue, int axisId) { if (value == lastValue) return; @@ -216,11 +216,14 @@ void SendNativeAxis(int deviceId, short value, short &lastValue, int axisId) { lastValue = value; } -inline float Signs(short val) { +inline int Signs(int val) { return (0 < val) - (val < 0); } -inline float LinearMaps(short val, short a0, short a1, short b0, short b1) { +inline int LinearMaps(int val, int a0, int a1, int b0, int b1) { + return b0 + (((val - a0) * (b1 - b0)) / (a1 - a0)); +} +inline float LinearMaps(float val, float a0, float a1, float b0, float b1) { return b0 + (((val - a0) * (b1 - b0)) / (a1 - a0)); } @@ -244,11 +247,11 @@ int DinputDevice::UpdateState() { axis.deviceId = DEVICE_ID_PAD_0 + pDevNum; // Circle to Square mapping, cribbed from XInputDevice - float sx = js.lX; - float sy = js.lY; + float sx = (float)js.lX; + float sy = (float)js.lY; float scaleFactor = sqrtf((sx * sx + sy * sy) / std::max(sx * sx, sy * sy)); - js.lX = (short)(sx * scaleFactor); - js.lY = (short)(sy * scaleFactor); + js.lX = (int)(sx * scaleFactor); + js.lY = (int)(sy * scaleFactor); // Linear range mapping (used to invert deadzones) float dz = g_Config.fDInputAnalogDeadzone; @@ -257,20 +260,20 @@ int DinputDevice::UpdateState() { float md = std::max(dz, idz); float st = g_Config.fDInputAnalogSensitivity; - float magnitude = sqrtf(js.lX * js.lX + js.lY * js.lY); + float magnitude = sqrtf((float)(js.lX * js.lX + js.lY * js.lY)); if (magnitude > dz * 10000.0f) { if (idzm == 1) { - short xSign = Signs(js.lX); - if (xSign != 0.0f) { - js.lX = LinearMaps(js.lX, xSign * (short)(dz * 10000), xSign * 10000, xSign * (short)(md * 10000), xSign * 10000 * st); + int xSign = Signs(js.lX); + if (xSign != 0) { + js.lX = LinearMaps(js.lX, xSign * (int)(dz * 10000), xSign * 10000, xSign * (int)(md * 10000), xSign * (int)(st * 10000)); } } else if (idzm == 2) { - short ySign = Signs(js.lY); - if (ySign != 0.0f) { - js.lY = LinearMaps(js.lY, ySign * (short)(dz * 10000.0f), ySign * 10000, ySign * (short)(md * 10000.0f), ySign * 10000 * st); + int ySign = Signs(js.lY); + if (ySign != 0) { + js.lY = LinearMaps(js.lY, ySign * (int)(dz * 10000.0f), ySign * 10000, ySign * (int)(md * 10000.0f), ySign * (int)(st * 10000)); } } else if (idzm == 3) diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 796b5e265c..d8ecc8762f 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -62,10 +62,10 @@ private: bool analog; BYTE lastButtons_[128]; WORD lastPOV_[4]; - short last_lX_; - short last_lY_; - short last_lZ_; - short last_lRx_; - short last_lRy_; - short last_lRz_; + int last_lX_; + int last_lY_; + int last_lZ_; + int last_lRx_; + int last_lRy_; + int last_lRz_; }; diff --git a/Windows/GPU/D3D11Context.cpp b/Windows/GPU/D3D11Context.cpp index 3275b64277..128033f722 100644 --- a/Windows/GPU/D3D11Context.cpp +++ b/Windows/GPU/D3D11Context.cpp @@ -136,7 +136,6 @@ bool D3D11Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { } if (FAILED(hr)) { - const char *defaultError = "Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead?"; auto err = GetI18NCategory("Error"); @@ -285,12 +284,20 @@ void D3D11Context::Shutdown() { context_ = nullptr; #ifdef _DEBUG - d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, false); - d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, false); - d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, false); - d3dDebug_->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL); - d3dDebug_->Release(); - d3dInfoQueue_->Release(); + if (d3dInfoQueue_) { + d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, false); + d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, false); + d3dInfoQueue_->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, false); + } + if (d3dDebug_) { + d3dDebug_->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL); + d3dDebug_->Release(); + d3dDebug_ = nullptr; + } + if (d3dInfoQueue_) { + d3dInfoQueue_->Release(); + d3dInfoQueue_ = nullptr; + } #endif hWnd_ = nullptr; diff --git a/Windows/PPSSPP.sln b/Windows/PPSSPP.sln index 5db1fec703..8859935282 100644 --- a/Windows/PPSSPP.sln +++ b/Windows/PPSSPP.sln @@ -74,7 +74,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "discord-rpc", "..\ext\disco EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AtlasTool", "..\ext\native\tools\AtlasTool\AtlasTool.vcxproj", "{FBE46262-7C2C-400C-92F9-F8A9E72594DD}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZimTool", "..\ext\native\tools\ZimTool\ZimTool.vcxproj", "{B7DED405-40A2-48F8-9382-538F10D442F1}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZimTool", "..\ext\native\tools\zimtool\ZimTool.vcxproj", "{B7DED405-40A2-48F8-9382-538F10D442F1}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc", "..\ext\miniupnpc.vcxproj", "{D8A71225-178B-424E-96C1-CC3BE2C1B047}" EndProject @@ -316,14 +316,18 @@ Global {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|Win32.ActiveCfg = Release|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|x64.ActiveCfg = Release|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|x64.Build.0 = Release|x64 - {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM.ActiveCfg = Debug|Win32 - {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM64.ActiveCfg = Debug|Win32 + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM.ActiveCfg = Debug|ARM + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM.Build.0 = Debug|ARM + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|ARM64.Build.0 = Debug|ARM64 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|Win32.ActiveCfg = Debug|Win32 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|Win32.Build.0 = Debug|Win32 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|x64.ActiveCfg = Debug|x64 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Debug|x64.Build.0 = Debug|x64 - {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM.ActiveCfg = Release|Win32 - {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM64.ActiveCfg = Release|Win32 + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM.ActiveCfg = Release|ARM + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM.Build.0 = Release|ARM + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM64.ActiveCfg = Release|ARM64 + {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|ARM64.Build.0 = Release|ARM64 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|Win32.ActiveCfg = Release|Win32 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|Win32.Build.0 = Release|Win32 {D8A71225-178B-424E-96C1-CC3BE2C1B047}.Release|x64.ActiveCfg = Release|x64 diff --git a/android/android-ndk-profiler/Android.mk b/android/android-ndk-profiler/Android.mk deleted file mode 100644 index 6637e64853..0000000000 --- a/android/android-ndk-profiler/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -TARGET_thumb_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_thumb_release_CFLAGS)) -TARGET_thumb_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_thumb_release_CFLAGS)) -TARGET_arm_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_arm_release_CFLAGS)) -TARGET_arm_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_arm_release_CFLAGS)) -TARGET_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_CFLAGS)) - -LOCAL_PATH := $(call my-dir) - -# include libandprof.a in the build -include $(CLEAR_VARS) -LOCAL_MODULE := android-ndk-profiler -LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libandroid-ndk-profiler.a -LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) -LOCAL_EXPORT_LDLIBS := -llog -include $(PREBUILT_STATIC_LIBRARY) diff --git a/android/android-ndk-profiler/COPYING b/android/android-ndk-profiler/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/android/android-ndk-profiler/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/android/android-ndk-profiler/README.mkd b/android/android-ndk-profiler/README.mkd deleted file mode 100644 index 1897a2895b..0000000000 --- a/android/android-ndk-profiler/README.mkd +++ /dev/null @@ -1,5 +0,0 @@ -Profile Android NDK code. Further instructions here: - -http://code.google.com/p/android-ndk-profiler/wiki/Usage - -[![Build Status](https://travis-ci.org/richq/android-ndk-profiler.png)](https://travis-ci.org/richq/android-ndk-profiler) diff --git a/android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a b/android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a deleted file mode 100644 index 39479f1653..0000000000 Binary files a/android/android-ndk-profiler/armeabi-v7a/libandroid-ndk-profiler.a and /dev/null differ diff --git a/android/android-ndk-profiler/armeabi/libandroid-ndk-profiler.a b/android/android-ndk-profiler/armeabi/libandroid-ndk-profiler.a deleted file mode 100644 index 2ab6d9ce7a..0000000000 Binary files a/android/android-ndk-profiler/armeabi/libandroid-ndk-profiler.a and /dev/null differ diff --git a/android/android-ndk-profiler/prof.h b/android/android-ndk-profiler/prof.h deleted file mode 100644 index 2448612761..0000000000 --- a/android/android-ndk-profiler/prof.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Part of the android-ndk-profiler library. - * Copyright (C) Richard Quirk - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - */ -#ifndef prof_h_seen -#define prof_h_seen -#ifdef __cplusplus -extern "C" { -#endif - -void monstartup(const char *libname); -void moncleanup(void); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/android/jni/Android.mk b/android/jni/Android.mk index a6cdedb5bd..c527ea2524 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -346,7 +346,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/GLES/ShaderManagerGLES.cpp.arm \ $(SRC)/GPU/GLES/FragmentTestCacheGLES.cpp.arm \ $(SRC)/GPU/GLES/TextureScalerGLES.cpp \ - $(SRC)/GPU/Null/NullGpu.cpp \ $(SRC)/GPU/Software/Clipper.cpp \ $(SRC)/GPU/Software/Lighting.cpp \ $(SRC)/GPU/Software/Rasterizer.cpp.arm \ @@ -696,10 +695,6 @@ $(call import-module,libzip) $(call import-module,glslang-build) $(call import-module,miniupnp-build) -ifeq ($(ANDROID_NDK_PROFILER),1) - $(call import-module,android-ndk-profiler) -endif - jni/$(SRC)/git-version.cpp: -./git-version-gen.sh -..\Windows\git-version-gen.cmd diff --git a/android/jni/Locals.mk b/android/jni/Locals.mk index d18d5d6e85..532693d05b 100644 --- a/android/jni/Locals.mk +++ b/android/jni/Locals.mk @@ -80,9 +80,3 @@ ifeq ($(TARGET_ARCH_ABI),arm64-v8a) LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/arm64/lib/libavutil.a LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ffmpeg/android/arm64/include endif - -# Compile with profiling. -ifeq ($(ANDROID_NDK_PROFILER),1) - LOCAL_CFLAGS += -pg -DANDROID_NDK_PROFILER - LOCAL_STATIC_LIBRARIES += android-ndk-profiler -endif diff --git a/android/jni/TestRunner.cpp b/android/jni/TestRunner.cpp index e5489fd0c1..e2908badb9 100644 --- a/android/jni/TestRunner.cpp +++ b/android/jni/TestRunner.cpp @@ -86,7 +86,7 @@ bool RunTests() { CoreParameter coreParam; coreParam.cpuCore = (CPUCore)g_Config.iCpuCore; - coreParam.gpuCore = GPUCORE_NULL; + coreParam.gpuCore = GPUCORE_SOFTWARE; coreParam.enableSound = g_Config.bEnableSound; coreParam.graphicsContext = nullptr; coreParam.mountIso = ""; diff --git a/ext/miniupnpc.vcxproj b/ext/miniupnpc.vcxproj index 686ca48b1d..b8dd274e50 100644 --- a/ext/miniupnpc.vcxproj +++ b/ext/miniupnpc.vcxproj @@ -136,6 +136,34 @@ false Unicode + + StaticLibrary + false + Unicode + $(DefaultPlatformToolset) + true + + + StaticLibrary + false + Unicode + $(DefaultPlatformToolset) + true + + + StaticLibrary + true + Unicode + $(DefaultPlatformToolset) + true + + + StaticLibrary + true + Unicode + $(DefaultPlatformToolset) + true + @@ -171,6 +199,18 @@ false $(Platform)\$(Configuration)\$(ProjectName)\ + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + NotUsing @@ -299,6 +339,17 @@ cd..\..\.. genminiupnpcstrings.vbs cd..\..\.. + + Level3 + true + Disabled + DEBUG;_DEBUG;WIN32;_LIB;MINIUPNP_STATICLIB;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_UNICODE;UNICODE;%(PreprocessorDefinitions) + MultiThreadedDebug + false + + + iphlpapi.lib + @@ -306,6 +357,17 @@ cd..\..\.. genminiupnpcstrings.vbs cd..\..\.. + + Level3 + true + Disabled + DEBUG;_DEBUG;WIN32;_LIB;MINIUPNP_STATICLIB;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_ARM64_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + MultiThreadedDebug + false + + + iphlpapi.lib + @@ -313,6 +375,22 @@ cd..\..\.. genminiupnpcstrings.vbs cd..\..\.. + + Level3 + + + true + true + Speed + NDEBUG;WIN32;_LIB;MINIUPNP_STATICLIB;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_UNICODE;UNICODE;%(PreprocessorDefinitions) + MultiThreaded + true + false + false + + + iphlpapi.lib + @@ -320,6 +398,21 @@ cd..\..\.. genminiupnpcstrings.vbs cd..\..\.. + + Level3 + + + true + Speed + NDEBUG;WIN32;_LIB;MINIUPNP_STATICLIB;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;_ARM64_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + MultiThreaded + true + false + false + + + iphlpapi.lib + diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 39b3f2af64..14fd7e38cc 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -38,12 +38,6 @@ #include "SDLHeadlessHost.h" #endif -// https://github.com/richq/android-ndk-profiler -#ifdef ANDROID_NDK_PROFILER -#include -#include "android/android-ndk-profiler/prof.h" -#endif - #if defined(ANDROID) JNIEnv *getEnv() { return nullptr; @@ -134,7 +128,7 @@ int printUsage(const char *progname, const char *reason) static HeadlessHost *getHost(GPUCore gpuCore) { switch (gpuCore) { - case GPUCORE_NULL: + case GPUCORE_SOFTWARE: return new HeadlessHost(); #ifdef HEADLESSHOST_CLASS default: @@ -230,17 +224,11 @@ int main(int argc, const char* argv[]) _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif -#ifdef ANDROID_NDK_PROFILER - setenv("CPUPROFILE_FREQUENCY", "500", 1); - setenv("CPUPROFILE", "/sdcard/gmon.out", 1); - monstartup("ppsspp_headless"); -#endif - bool fullLog = false; bool autoCompare = false; bool verbose = false; const char *stateToLoad = 0; - GPUCore gpuCore = GPUCORE_NULL; + GPUCore gpuCore = GPUCORE_SOFTWARE; CPUCore cpuCore = CPUCore::JIT; std::vector testFilenames; @@ -280,7 +268,8 @@ int main(int argc, const char* argv[]) const char *gpuName = argv[i] + strlen("--graphics="); if (!strcasecmp(gpuName, "gles")) gpuCore = GPUCORE_GLES; - else if (!strcasecmp(gpuName, "software")) + // There used to be a separate "null" rendering core - just use software. + else if (!strcasecmp(gpuName, "software") || !strcasecmp(gpuName, "null")) gpuCore = GPUCORE_SOFTWARE; else if (!strcasecmp(gpuName, "directx9")) gpuCore = GPUCORE_DIRECTX9; @@ -288,8 +277,6 @@ int main(int argc, const char* argv[]) gpuCore = GPUCORE_DIRECTX11; else if (!strcasecmp(gpuName, "vulkan")) gpuCore = GPUCORE_VULKAN; - else if (!strcasecmp(gpuName, "null")) - gpuCore = GPUCORE_NULL; else return printUsage(argv[0], "Unknown gpu backend specified after --graphics=. Allowed: software, directx9, directx11, vulkan, gles, null."); } @@ -350,7 +337,7 @@ int main(int argc, const char* argv[]) CoreParameter coreParameter; coreParameter.cpuCore = cpuCore; - coreParameter.gpuCore = glWorking ? gpuCore : GPUCORE_NULL; + coreParameter.gpuCore = glWorking ? gpuCore : GPUCORE_SOFTWARE; coreParameter.graphicsContext = graphicsContext; coreParameter.enableSound = false; coreParameter.mountIso = mountIso ? mountIso : ""; @@ -480,9 +467,5 @@ int main(int argc, const char* argv[]) LogManager::Shutdown(); delete printfLogger; -#ifdef ANDROID_NDK_PROFILER - moncleanup(); -#endif - return 0; } diff --git a/headless/Headless.vcxproj b/headless/Headless.vcxproj index 29d26051d5..ec1d4b2e76 100644 --- a/headless/Headless.vcxproj +++ b/headless/Headless.vcxproj @@ -255,7 +255,7 @@ Console true - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;%(AdditionalDependencies) + ole32.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) /ignore:4049 /ignore:4217 %(AdditionalOptions) ../ffmpeg/Windows/aarch64/lib @@ -285,7 +285,7 @@ Console true - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) + ole32.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) /ignore:4049 /ignore:4217 %(AdditionalOptions) ../ffmpeg/Windows/arm/lib @@ -323,7 +323,7 @@ false true /ignore:4049 /ignore:4217 %(AdditionalOptions) - ../ffmpeg/Windows/x86/lib + ../ffmpeg/Windows/x86/lib;%(AdditionalLibraryDirectories) ../Windows/git-version-gen.cmd Headless @@ -361,7 +361,7 @@ false true /ignore:4049 /ignore:4217 %(AdditionalOptions) - ../ffmpeg/Windows/x86_64/lib + ../ffmpeg/Windows/x86_64/lib;%(AdditionalLibraryDirectories) ../Windows/git-version-gen.cmd Headless @@ -393,9 +393,9 @@ true true true - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;%(AdditionalDependencies) + ole32.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) /ignore:4049 /ignore:4217 %(AdditionalOptions) - ../ffmpeg/Windows/aarch64/lib + ../ffmpeg/Windows/aarch64/lib;%(AdditionalLibraryDirectories) ../Windows/git-version-gen.cmd Headless @@ -427,9 +427,9 @@ true true true - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) + ole32.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;comctl32.lib;d3d9.lib;dxguid.lib;shell32.lib;advapi32.lib;gdi32.lib;%(AdditionalDependencies) /ignore:4049 /ignore:4217 %(AdditionalOptions) - ../ffmpeg/Windows/arm/lib + ../ffmpeg/Windows/arm/lib;%(AdditionalLibraryDirectories) ../Windows/git-version-gen.cmd Headless diff --git a/headless/WindowsHeadlessHost.cpp b/headless/WindowsHeadlessHost.cpp index af5548bf84..27b06ea7b7 100644 --- a/headless/WindowsHeadlessHost.cpp +++ b/headless/WindowsHeadlessHost.cpp @@ -91,7 +91,6 @@ bool WindowsHeadlessHost::InitGraphics(std::string *error_message, GraphicsConte WindowsGraphicsContext *graphicsContext = nullptr; bool needRenderThread = false; switch (gpuCore_) { - case GPUCORE_NULL: case GPUCORE_GLES: #if PPSSPP_API(ANY_GL) case GPUCORE_SOFTWARE: diff --git a/history.md b/history.md index c6f48dca3f..29256df154 100644 --- a/history.md +++ b/history.md @@ -14,16 +14,16 @@ What's new in 1.6.1, 1.6.2 What's new in 1.6.0 ------------------- * OpenGL backend now properly multithreaded, giving a good speed boost. -* Various Vulkan performance improvements (like [#10911][]) and memory allocation fixes. -* GPU command interpreter performance improvements ([#10658][]) -* Various fixes for app switching and widgets ([#10855][]) on Android +* Various Vulkan performance improvements (like [#10911]) and memory allocation fixes. +* GPU command interpreter performance improvements ([#10658]) +* Various fixes for app switching and widgets ([#10855]) on Android * Bugfixes and some performance improvements in the ARM64 JIT compiler and IR interpreter * Shader cache enabled for Vulkan -* Multiple iOS fixes, including JIT ([#10465][]) and file browser ([#10921][]). -* Improved compatibility on Mac ([#10113][]) +* Multiple iOS fixes, including JIT ([#10465]) and file browser ([#10921]). +* Improved compatibility on Mac ([#10113]) * Texture replacement ID bugfix (note: some textures from 1.5.4 may become incompatible) -* Adhoc multiplayer fixes ([#8975][]) -* Vulkan support on Linux/SDL ([#10413][]) +* Adhoc multiplayer fixes ([#8975]) +* Vulkan support on Linux/SDL ([#10413]) * Retroarch support What's new in 1.5.4 @@ -32,18 +32,18 @@ What's new in 1.5.4 What's new in 1.5.0 ------------------- -* Full Vulkan support, also for Android now. Very fast on supported devices. ([#10033][], [#10049][]) -* Smarter graphics state management, reduced CPU consumption on all backends ([#9899][]) +* Full Vulkan support, also for Android now. Very fast on supported devices. ([#10033], [#10049]) +* Smarter graphics state management, reduced CPU consumption on all backends ([#9899]) * Android: Support for Arabic and other scripts we couldn't support before -* Fix Android widgets, screen scaling ([#10145][]) +* Fix Android widgets, screen scaling ([#10145]) * Fixes to video dumping * Geometry problems fixed in Medal of Honor -* Implement immediate draws, fixing Thrillville ([#7459][]) +* Implement immediate draws, fixing Thrillville ([#7459]) * Software rendering improvements, speed and accuracy * Hardware tesselation of PSP Beziers and Splines (used by a few games) * Partial sceUsbGps and sceUsbCam support (Android) -* Android "Sustained performance mode" to avoid thermal throttling ([#9901][]) -* Linux controller mapping fixes ([#9997][]) +* Android "Sustained performance mode" to avoid thermal throttling ([#9901]) +* Linux controller mapping fixes ([#9997]) * Assorted bugfixes and compatibility improvements What's new in 1.4.2 @@ -55,15 +55,15 @@ What's new in 1.4.2 What's new in 1.4.1 ------------------- -* Fixes for some common hangs and crashes ([#9698][], ...) -* Vertex decoder optimizations ([#9674][]) -* Corrections to mipmap bias and selection function ([#9633][]) -* Major improvements and fixes to software renderer, including mipmap support ([#9635][], ...) +* Fixes for some common hangs and crashes ([#9698], ...) +* Vertex decoder optimizations ([#9674]) +* Corrections to mipmap bias and selection function ([#9633]) +* Major improvements and fixes to software renderer, including mipmap support ([#9635], ...) * UI background image support * Basic mouse input support on Windows -* Windows desktop touch fixes ([#9560][]) +* Windows desktop touch fixes ([#9560]) * D3D11 "depal" color fixes, fixing Sonic Rivals -* Fix crash in framebuffer blits affecting Persona 3 ([#9566][]) +* Fix crash in framebuffer blits affecting Persona 3 ([#9566]) What's new in 1.4-2 ------------------- @@ -72,12 +72,12 @@ What's new in 1.4-2 What's new in 1.4 ----------------- * Support D3D11 (performs better than OpenGL or D3D9 on most hardware) -* Audio quality improvement (linear interpolation) ([#8950][]) +* Audio quality improvement (linear interpolation) ([#8950]) * Hardware spline/bezier tesselation in OpenGL, D3D11 and Vulkan (...) * Post-processing shaders in D3D11 -* Prescale UV setting removed, now the default (improves perf) ([#9176][]) +* Prescale UV setting removed, now the default (improves perf) ([#9176]) * High DPI display fixes -* Various fixes for UMD switching for multi-UMD games ([#9245][], [#9256][]) +* Various fixes for UMD switching for multi-UMD games ([#9245], [#9256]) * New audio setting to improve compatibility with Bluetooth headsets * Various desktop gamepad compatibility fixes * Workaround for mipmap issue, fixing fonts in Tactics Ogre Japanese @@ -87,25 +87,25 @@ Support for Symbian, Maemo and Blackberry has been removed. What's new in 1.3.0 ------------------- -* Fix JIT problems on Galaxy S7 and iOS 9+ devices. ([#8965][], [#8937][]) -* Fix Android TV support and use latest FFmpeg. ([#8651][], [#8870][]) -* Texture replacement support - for custom textures and upscaling. ([#8715][], [#8821][]) -* Initial game recording / TAS features. ([#8939][], [#8945][]) -* Correctly map memory on Raspberry Pi 3, much better performance. ([#8801][]) +* Fix JIT problems on Galaxy S7 and iOS 9+ devices. ([#8965], [#8937]) +* Fix Android TV support and use latest FFmpeg. ([#8651], [#8870]) +* Texture replacement support - for custom textures and upscaling. ([#8715], [#8821]) +* Initial game recording / TAS features. ([#8939], [#8945]) +* Correctly map memory on Raspberry Pi 3, much better performance. ([#8801]) * Workaround rendering issues on Tegra K1/X1. (8294a54) -* Disc streaming to play quickly from tablet/phone on wifi. ([#8845][]) -* Initial Vulkan support - not full featured yet. ([#8601][], etc.) -* Experimental new CPU backend and CPU fixes. ([#8725][]) -* Allow insert/eject of memstick - required by some games. ([#8889][]) -* Better support for ps3 controller mapping. ([#8949][]) -* Better UI handling for settings with long names in some languages. ([#8900][], [#8898][]) -* Screenshots in compatibility reporting, better website. ([#8812][]) -* Fix type D cheat codes, allow for homebrew. ([#8818][]) -* Graphic glitch fixes in several games. ([#8686][], [#8757][], [#8804][]) -* Fix video playback glitches in several games. ([#8793][], [#8803][], [#8867][], [#8914][]) -* Various performance and compatibility improvements. ([#8868][], [#8884][], [#8932][], [#8934][], [#8813][], [#8701][], [#8960][]) -* Various debugger and GE debugger improvements. ([#8882][], [#8762][]) -* Fix some problems when switching away from and back to the app ([#8968][]) +* Disc streaming to play quickly from tablet/phone on wifi. ([#8845]) +* Initial Vulkan support - not full featured yet. ([#8601], etc.) +* Experimental new CPU backend and CPU fixes. ([#8725]) +* Allow insert/eject of memstick - required by some games. ([#8889]) +* Better support for ps3 controller mapping. ([#8949]) +* Better UI handling for settings with long names in some languages. ([#8900], [#8898]) +* Screenshots in compatibility reporting, better website. ([#8812]) +* Fix type D cheat codes, allow for homebrew. ([#8818]) +* Graphic glitch fixes in several games. ([#8686], [#8757], [#8804]) +* Fix video playback glitches in several games. ([#8793], [#8803], [#8867], [#8914]) +* Various performance and compatibility improvements. ([#8868], [#8884], [#8932], [#8934], [#8813], [#8701], [#8960]) +* Various debugger and GE debugger improvements. ([#8882], [#8762]) +* Fix some problems when switching away from and back to the app ([#8968]) What's new in 1.2.2 ------------------- @@ -320,6 +320,8 @@ go to see there http://forums.ppsspp.org/showthread.php?tid=3595&pid=59241#pid59 * Got it tested windows <-> mac osx <-> psp, it works * Monster Hunter 3rd HD works too, as well as God Eater Burst. + +[comment]: # (LINK_LIST_BEGIN_HERE) [#10911]: https://github.com/hrydgard/ppsspp/issues/10911 "Vulkan: Depalettize in shaders" [#10658]: https://github.com/hrydgard/ppsspp/issues/10658 "Execute_Prim: Add a smaller \"inner interpreter\" to speed long up sequences of PRIM commands" [#10855]: https://github.com/hrydgard/ppsspp/issues/10855 "PPSSPP 1.5.4 on Android. Shortcuts do not work the first time." diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 1f665e4b37..7ba5a84878 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -673,6 +673,38 @@ static LocationHelper *locationHelper; extendedProfile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_10]; // Start }; + +#if defined(__IPHONE_12_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_1 + if (extendedProfile.leftThumbstickButton != nil) { + extendedProfile.leftThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { + [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_11]; + }; + } + if (extendedProfile.rightThumbstickButton != nil) { + extendedProfile.rightThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { + [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_12]; + }; + } +#endif +#if defined(__IPHONE_13) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13 + if (extendedProfile.buttonOptions != nil) { + extendedProfile.buttonOptions.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { + [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_13]; + }; + } + if (extendedProfile.buttonMenu != nil) { + extendedProfile.buttonMenu.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { + [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_14]; + }; + } +#endif +#if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0 + if (extendedProfile.buttonHome != nil) { + extendedProfile.buttonHome.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { + [self controllerButtonPressed:pressed keyCode:NKCODE_BUTTON_15]; + }; + } +#endif extendedProfile.leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *axis, float value) { AxisInput axisInput; diff --git a/libretro/LibretroGraphicsContext.cpp b/libretro/LibretroGraphicsContext.cpp index 01ce61068d..693d769ddf 100644 --- a/libretro/LibretroGraphicsContext.cpp +++ b/libretro/LibretroGraphicsContext.cpp @@ -140,14 +140,7 @@ LibretroGraphicsContext *LibretroGraphicsContext::CreateGraphicsContext() { } #endif -#if 1 ctx = new LibretroSoftwareContext(); - - if (ctx->Init()) { - return ctx; - } - delete ctx; -#endif - - return new LibretroNullContext(); + ctx->Init(); + return ctx; } diff --git a/libretro/LibretroGraphicsContext.h b/libretro/LibretroGraphicsContext.h index 1a87429003..ca684a71c3 100644 --- a/libretro/LibretroGraphicsContext.h +++ b/libretro/LibretroGraphicsContext.h @@ -87,16 +87,6 @@ public: const char *Ident() override { return "Software"; } }; -class LibretroNullContext : public LibretroGraphicsContext { -public: - LibretroNullContext() {} - - bool Init() override { return true; } - void SwapBuffers() override { video_cb(NULL, 0, 0, 0); } - GPUCore GetGPUCore() override { return GPUCORE_NULL; } - const char *Ident() override { return "NULL"; } -}; - namespace Libretro { extern LibretroGraphicsContext *ctx; extern retro_environment_t environ_cb; diff --git a/libretro/Makefile.common b/libretro/Makefile.common index c14fde2553..2c24b22b84 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -266,7 +266,6 @@ SOURCES_CXX += \ $(GPUDIR)/GPU.cpp \ $(GPUDIR)/GPUState.cpp \ $(GPUDIR)/Math3D.cpp \ - $(GPUDIR)/Null/NullGpu.cpp \ $(GPUDIR)/Software/Clipper.cpp \ $(GPUDIR)/Software/Lighting.cpp \ $(GPUDIR)/Software/Rasterizer.cpp \ diff --git a/link_readme.py b/link_readme.py index a0df5b9883..58abf16d07 100755 --- a/link_readme.py +++ b/link_readme.py @@ -1,42 +1,48 @@ #!/usr/bin/env python import re -import time -import urllib.request +from time import sleep +from urllib.request import urlopen from urllib.error import HTTPError -import time from lxml.html import parse +footer_delimiter = "\n\n[comment]: # (LINK_LIST_BEGIN_HERE)\n" footer = "" def replace_foo(match): first_char = match.group(1) id = match.group(2) - replace = first_char + "[#"+id+"][]" + replace = first_char + "[#"+id+"]" url = "https://github.com/hrydgard/ppsspp/issues/"+id title = None while title is None: try: - page = urllib.request.urlopen(url) - p = parse(page) + p = parse(urlopen(url)) title = p.find(".//title").text.split('by')[0].split('ยท')[0].strip() title = re.sub(r"\"", r'\\"', title) except HTTPError: print("Something went wrong, retrying in 10 sec...") - time.sleep(10) - pass + sleep(10) global footer addition = "[#"+id+"]: https://github.com/hrydgard/ppsspp/issues/"+id+" \""+title+"\"" - print("Done: " + addition) footer += addition+"\n" + print("Done: " + addition) return replace f = open("README.md", "r+") cont = f.read() + +# We don't want to match issues id in title so stop before the link list +d = cont.find(footer_delimiter) +if (d != -1): + footer = cont[d + len(footer_delimiter):] + cont = cont[0 : d] + updated = re.sub(r"([^[])#(\d+)", replace_foo, cont) f.seek(0) f.write(updated) +f.write(footer_delimiter) f.write(footer) f.truncate() f.close() diff --git a/pspautotests b/pspautotests index 879e7959eb..7e4a1e7509 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit 879e7959eb3251133fcc4ccf26b0ef35d9d43f8e +Subproject commit 7e4a1e750997e95df8a1f04f9a6396801adf7113