Merge "[Graphics] Only validate display in PresentOrValidateDisplay."

This commit is contained in:
Treehugger Robot
2018-09-07 06:28:37 +00:00
committed by Gerrit Code Review
4 changed files with 30 additions and 11 deletions

View File

@@ -102,6 +102,7 @@ class ComposerClientImpl : public Interface {
} }
void onRefresh(Display display) { void onRefresh(Display display) {
mResources->setDisplayMustValidateState(display, true);
auto ret = mCallback->onRefresh(display); auto ret = mCallback->onRefresh(display);
ALOGE_IF(!ret.isOk(), "failed to send onRefresh: %s", ret.description().c_str()); ALOGE_IF(!ret.isOk(), "failed to send onRefresh: %s", ret.description().c_str());
} }

View File

@@ -258,6 +258,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes, auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes,
&displayRequestMask, &requestedLayers, &requestMasks); &displayRequestMask, &requestedLayers, &requestMasks);
mResources->setDisplayMustValidateState(mCurrentDisplay, false);
if (err == Error::NONE) { if (err == Error::NONE) {
mWriter.setChangedCompositionTypes(changedLayers, compositionTypes); mWriter.setChangedCompositionTypes(changedLayers, compositionTypes);
mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks); mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks);
@@ -278,7 +279,9 @@ class ComposerCommandEngine : protected CommandReaderBase {
int presentFence = -1; int presentFence = -1;
std::vector<Layer> layers; std::vector<Layer> layers;
std::vector<int> fences; std::vector<int> fences;
auto err = mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences); auto err = mResources->mustValidateDisplay(mCurrentDisplay)
? Error::NOT_VALIDATED
: mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences);
if (err == Error::NONE) { if (err == Error::NONE) {
mWriter.setPresentOrValidateResult(1); mWriter.setPresentOrValidateResult(1);
mWriter.setPresentFence(presentFence); mWriter.setPresentFence(presentFence);
@@ -296,6 +299,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes, auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes,
&displayRequestMask, &requestedLayers, &requestMasks); &displayRequestMask, &requestedLayers, &requestMasks);
mResources->setDisplayMustValidateState(mCurrentDisplay, false);
if (err == Error::NONE) { if (err == Error::NONE) {
mWriter.setPresentOrValidateResult(0); mWriter.setPresentOrValidateResult(0);
mWriter.setChangedCompositionTypes(changedLayers, compositionTypes); mWriter.setChangedCompositionTypes(changedLayers, compositionTypes);

View File

@@ -216,7 +216,8 @@ class ComposerDisplayResource {
: mType(type), : mType(type),
mClientTargetCache(importer), mClientTargetCache(importer),
mOutputBufferCache(importer, ComposerHandleCache::HandleType::BUFFER, mOutputBufferCache(importer, ComposerHandleCache::HandleType::BUFFER,
outputBufferCacheSize) {} outputBufferCacheSize),
mMustValidate(true) {}
bool initClientTargetCache(uint32_t cacheSize) { bool initClientTargetCache(uint32_t cacheSize) {
return mClientTargetCache.initCache(ComposerHandleCache::HandleType::BUFFER, cacheSize); return mClientTargetCache.initCache(ComposerHandleCache::HandleType::BUFFER, cacheSize);
@@ -263,10 +264,15 @@ class ComposerDisplayResource {
return layers; return layers;
} }
void setMustValidateState(bool mustValidate) { mMustValidate = mustValidate; }
bool mustValidate() const { return mMustValidate; }
protected: protected:
const DisplayType mType; const DisplayType mType;
ComposerHandleCache mClientTargetCache; ComposerHandleCache mClientTargetCache;
ComposerHandleCache mOutputBufferCache; ComposerHandleCache mOutputBufferCache;
bool mMustValidate;
std::unordered_map<Layer, std::unique_ptr<ComposerLayerResource>> mLayerResources; std::unordered_map<Layer, std::unique_ptr<ComposerLayerResource>> mLayerResources;
}; };
@@ -389,6 +395,23 @@ class ComposerResources {
outStreamHandle, outReplacedStream); outStreamHandle, outReplacedStream);
} }
void setDisplayMustValidateState(Display display, bool mustValidate) {
std::lock_guard<std::mutex> lock(mDisplayResourcesMutex);
auto* displayResource = findDisplayResourceLocked(display);
if (displayResource) {
displayResource->setMustValidateState(mustValidate);
}
}
bool mustValidateDisplay(Display display) {
std::lock_guard<std::mutex> lock(mDisplayResourcesMutex);
auto* displayResource = findDisplayResourceLocked(display);
if (displayResource) {
return displayResource->mustValidate();
}
return false;
}
protected: protected:
virtual std::unique_ptr<ComposerDisplayResource> createDisplayResource( virtual std::unique_ptr<ComposerDisplayResource> createDisplayResource(
ComposerDisplayResource::DisplayType type, uint32_t outputBufferCacheSize) { ComposerDisplayResource::DisplayType type, uint32_t outputBufferCacheSize) {

View File

@@ -111,7 +111,6 @@ class HwcHalImpl : public Hal {
} }
void registerEventCallback(hal::ComposerHal::EventCallback* callback) override { void registerEventCallback(hal::ComposerHal::EventCallback* callback) override {
mMustValidateDisplay = true;
mEventCallback = callback; mEventCallback = callback;
mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this, mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
@@ -331,7 +330,6 @@ class HwcHalImpl : public Hal {
uint32_t typesCount = 0; uint32_t typesCount = 0;
uint32_t reqsCount = 0; uint32_t reqsCount = 0;
int32_t err = mDispatch.validateDisplay(mDevice, display, &typesCount, &reqsCount); int32_t err = mDispatch.validateDisplay(mDevice, display, &typesCount, &reqsCount);
mMustValidateDisplay = false;
if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) { if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
return static_cast<Error>(err); return static_cast<Error>(err);
@@ -384,10 +382,6 @@ class HwcHalImpl : public Hal {
Error presentDisplay(Display display, int32_t* outPresentFence, std::vector<Layer>* outLayers, Error presentDisplay(Display display, int32_t* outPresentFence, std::vector<Layer>* outLayers,
std::vector<int32_t>* outReleaseFences) override { std::vector<int32_t>* outReleaseFences) override {
if (mMustValidateDisplay) {
return Error::NOT_VALIDATED;
}
*outPresentFence = -1; *outPresentFence = -1;
int32_t err = mDispatch.presentDisplay(mDevice, display, outPresentFence); int32_t err = mDispatch.presentDisplay(mDevice, display, outPresentFence);
if (err != HWC2_ERROR_NONE) { if (err != HWC2_ERROR_NONE) {
@@ -593,7 +587,6 @@ class HwcHalImpl : public Hal {
static void refreshHook(hwc2_callback_data_t callbackData, hwc2_display_t display) { static void refreshHook(hwc2_callback_data_t callbackData, hwc2_display_t display) {
auto hal = static_cast<HwcHalImpl*>(callbackData); auto hal = static_cast<HwcHalImpl*>(callbackData);
hal->mMustValidateDisplay = true;
hal->mEventCallback->onRefresh(display); hal->mEventCallback->onRefresh(display);
} }
@@ -654,8 +647,6 @@ class HwcHalImpl : public Hal {
} mDispatch = {}; } mDispatch = {};
hal::ComposerHal::EventCallback* mEventCallback = nullptr; hal::ComposerHal::EventCallback* mEventCallback = nullptr;
std::atomic<bool> mMustValidateDisplay{true};
}; };
} // namespace detail } // namespace detail