Ady Abraham 7bb70faa04 Remove render ahead from hwui
As HWUI uses vsync id to send buffers to SF, SF applies the right
amount of render ahead by latching the buffers at the configured time.

Test: launch an app and observe systrace
Bug: 178148035
Change-Id: Ifd3e1a2971aad0a085cb35d33e950194046aa634
2021-02-08 18:13:45 +00:00

109 lines
3.9 KiB
C++

/*
* Copyright (C) 2015 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.
*/
#ifndef DEVICEINFO_H
#define DEVICEINFO_H
#include <SkImageInfo.h>
#include <android/data_space.h>
#include <mutex>
#include "utils/Macros.h"
namespace android {
namespace uirenderer {
namespace renderthread {
class RenderThread;
}
class DeviceInfo {
PREVENT_COPY_AND_ASSIGN(DeviceInfo);
public:
static DeviceInfo* get();
static int32_t getWidth() { return get()->mWidth; }
static int32_t getHeight() { return get()->mHeight; }
// Gets the density in density-independent pixels
static float getDensity() { return sDensity.load(); }
static int64_t getVsyncPeriod() { return get()->mVsyncPeriod; }
static int64_t getCompositorOffset() { return get()->getCompositorOffsetInternal(); }
static int64_t getAppOffset() { return get()->mAppVsyncOffsetNanos; }
// Sets the density in density-independent pixels
static void setDensity(float density) { sDensity.store(density); }
static void setWidth(int32_t width) { get()->mWidth = width; }
static void setHeight(int32_t height) { get()->mHeight = height; }
static void setRefreshRate(float refreshRate) {
get()->mVsyncPeriod = static_cast<int64_t>(1000000000 / refreshRate);
}
static void setPresentationDeadlineNanos(int64_t deadlineNanos) {
get()->mPresentationDeadlineNanos = deadlineNanos;
}
static void setAppVsyncOffsetNanos(int64_t offsetNanos) {
get()->mAppVsyncOffsetNanos = offsetNanos;
}
static void setWideColorDataspace(ADataSpace dataspace);
// this value is only valid after the GPU has been initialized and there is a valid graphics
// context or if you are using the HWUI_NULL_GPU
int maxTextureSize() const;
sk_sp<SkColorSpace> getWideColorSpace() const { return mWideColorSpace; }
SkColorType getWideColorType() {
static std::once_flag kFlag;
// lazily update display info from SF here, so that the call is performed by RenderThread.
std::call_once(kFlag, [&, this]() { updateDisplayInfo(); });
return mWideColorType;
}
// This method should be called whenever the display refresh rate changes.
void onRefreshRateChanged(int64_t vsyncPeriod);
private:
friend class renderthread::RenderThread;
static void setMaxTextureSize(int maxTextureSize);
void updateDisplayInfo();
int64_t getCompositorOffsetInternal() const {
// Assume that SF takes around a millisecond to latch buffers after
// waking up
return mVsyncPeriod - (mPresentationDeadlineNanos - 1000000);
}
DeviceInfo();
~DeviceInfo() = default;
int mMaxTextureSize;
sk_sp<SkColorSpace> mWideColorSpace = SkColorSpace::MakeSRGB();
SkColorType mWideColorType = SkColorType::kN32_SkColorType;
int mDisplaysSize = 0;
int mPhysicalDisplayIndex = -1;
int32_t mWidth = 1080;
int32_t mHeight = 1920;
int64_t mVsyncPeriod = 16666666;
// Magically corresponds with an sf offset of 0 for a sane default.
int64_t mPresentationDeadlineNanos = 17666666;
int64_t mAppVsyncOffsetNanos = 0;
// Density is not retrieved from the ADisplay apis, so this may potentially
// be called on multiple threads.
// Unit is density-independent pixels
static std::atomic<float> sDensity;
};
} /* namespace uirenderer */
} /* namespace android */
#endif /* DEVICEINFO_H */