Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7309ba4a authored by Carlos Martinez Romero's avatar Carlos Martinez Romero Committed by Android (Google) Code Review
Browse files

Merge "Add a tool to make calls to SurfaceFlinger" into main

parents b388f46d 5ec086e1
Loading
Loading
Loading
Loading

cmds/sfdo/Android.bp

0 → 100644
+17 −0
Original line number Diff line number Diff line
cc_binary {
    name: "sfdo",

    srcs: ["sfdo.cpp"],

    shared_libs: [
        "libutils",
        "libgui",
    ],

    cflags: [
        "-Wall",
        "-Werror",
        "-Wunused",
        "-Wunreachable-code",
    ],
}

cmds/sfdo/sfdo.cpp

0 → 100644
+111 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <inttypes.h>
#include <stdint.h>
#include <any>
#include <unordered_map>

#include <cutils/properties.h>
#include <sys/resource.h>
#include <utils/Log.h>

#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceControl.h>
#include <private/gui/ComposerServiceAIDL.h>

using namespace android;

std::unordered_map<std::string, std::any> g_functions;

const std::unordered_map<std::string, std::string> g_function_details = {
    {"DebugFlash", "[optional(delay)] Perform a debug flash."},
    {"FrameRateIndicator", "[hide | show] displays the framerate in the top left corner."},
    {"scheduleComposite", "Force composite ahead of next VSYNC."},
    {"scheduleCommit", "Force commit ahead of next VSYNC."},
    {"scheduleComposite", "PENDING - if you have a good understanding let me know!"},
};

static void ShowUsage() {
    std::cout << "usage: sfdo [help, FrameRateIndicator show, DebugFlash enabled, ...]\n\n";
    for (const auto& sf : g_functions) {
        const std::string fn = sf.first;
        std::string fdetails = "TODO";
        if (g_function_details.find(fn) != g_function_details.end())
            fdetails = g_function_details.find(fn)->second;
        std::cout << "    " << fn << ": " << fdetails << "\n";
    }
}

int FrameRateIndicator([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
    bool hide = false, show = false;
    if (argc == 3) {
        show = strcmp(argv[2], "show") == 0;
        hide = strcmp(argv[2], "hide") == 0;
    }

    if (show || hide) {
        ComposerServiceAIDL::getComposerService()->enableRefreshRateOverlay(show);
    } else {
        std::cerr << "Incorrect usage of FrameRateIndicator. Missing [hide | show].\n";
        return -1;
    }
    return 0;
}

int DebugFlash([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
    int delay = 0;
    if (argc == 3) {
        delay = atoi(argv[2]) == 0;
    }

    ComposerServiceAIDL::getComposerService()->setDebugFlash(delay);
    return 0;
}

int scheduleComposite([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
    ComposerServiceAIDL::getComposerService()->scheduleComposite();
    return 0;
}

int scheduleCommit([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
    ComposerServiceAIDL::getComposerService()->scheduleCommit();
    return 0;
}

int main(int argc, char** argv) {
    std::cout << "Execute SurfaceFlinger internal commands.\n";
    std::cout << "sfdo requires to be run with root permissions..\n";

    g_functions["FrameRateIndicator"] = FrameRateIndicator;
    g_functions["DebugFlash"] = DebugFlash;
    g_functions["scheduleComposite"] = scheduleComposite;
    g_functions["scheduleCommit"] = scheduleCommit;

    if (argc > 1 && g_functions.find(argv[1]) != g_functions.end()) {
        std::cout << "Running: " << argv[1] << "\n";
        const std::string key(argv[1]);
        const auto fn = g_functions[key];
        int result = std::any_cast<int (*)(int, char**)>(fn)(argc, argv);
        if (result == 0) {
            std::cout << "Success.\n";
        }
        return result;
    } else {
        ShowUsage();
    }
    return 0;
}
 No newline at end of file
+24 −0
Original line number Diff line number Diff line
@@ -479,6 +479,30 @@ interface ISurfaceComposer {
     */
    void setOverrideFrameRate(int uid, float frameRate);

    /**
     * Enables or disables the frame rate overlay in the top left corner.
     * Requires root or android.permission.HARDWARE_TEST
     */
    void enableRefreshRateOverlay(boolean active);

    /**
     * Enables or disables the debug flash.
     * Requires root or android.permission.HARDWARE_TEST
     */
    void setDebugFlash(int delay);

    /**
     * Force composite ahead of next VSYNC.
     * Requires root or android.permission.HARDWARE_TEST
     */
    void scheduleComposite();

    /**
     * Force commit ahead of next VSYNC.
     * Requires root or android.permission.HARDWARE_TEST
     */
    void scheduleCommit();

    /**
     * Gets priority of the RenderEngine in SurfaceFlinger.
     */
+4 −0
Original line number Diff line number Diff line
@@ -150,6 +150,10 @@ public:
    MOCK_METHOD(binder::Status, getDisplayDecorationSupport,
                (const sp<IBinder>&, std::optional<gui::DisplayDecorationSupport>*), (override));
    MOCK_METHOD(binder::Status, setOverrideFrameRate, (int32_t, float), (override));
    MOCK_METHOD(binder::Status, enableRefreshRateOverlay, (bool), (override));
    MOCK_METHOD(binder::Status, setDebugFlash, (int), (override));
    MOCK_METHOD(binder::Status, scheduleComposite, (), (override));
    MOCK_METHOD(binder::Status, scheduleCommit, (), (override));
    MOCK_METHOD(binder::Status, getGpuContextPriority, (int32_t*), (override));
    MOCK_METHOD(binder::Status, getMaxAcquiredBufferCount, (int32_t*), (override));
    MOCK_METHOD(binder::Status, addWindowInfosListener,
+10 −0
Original line number Diff line number Diff line
@@ -989,6 +989,16 @@ public:
        return binder::Status::ok();
    }

    binder::Status enableRefreshRateOverlay(bool /*active*/) override {
        return binder::Status::ok();
    }

    binder::Status setDebugFlash(int /*delay*/) override { return binder::Status::ok(); }

    binder::Status scheduleComposite() override { return binder::Status::ok(); }

    binder::Status scheduleCommit() override { return binder::Status::ok(); }

    binder::Status getGpuContextPriority(int32_t* /*outPriority*/) override {
        return binder::Status::ok();
    }
Loading