[composer] Add createCommandWriter to command engine.

Command engine always uses V2.1 CommandWriterBase, change the creation of
command writer inside command engine so that we can use the right version of
command writer.

BUG: b/147365206
Test: build and boot.
Change-Id: I61fbbce19a44244725621e9a1cef750bd4c78b4d
This commit is contained in:
Peiyong Lin
2020-01-09 13:42:15 -08:00
parent a8cc19186a
commit ad96dd9f12
3 changed files with 64 additions and 48 deletions

View File

@@ -39,8 +39,10 @@ namespace hal {
// TODO own a CommandReaderBase rather than subclassing
class ComposerCommandEngine : protected CommandReaderBase {
public:
ComposerCommandEngine(ComposerHal* hal, ComposerResources* resources)
: mHal(hal), mResources(resources) {}
ComposerCommandEngine(ComposerHal* hal, ComposerResources* resources)
: mHal(hal), mResources(resources) {
mWriter = createCommandWriter(kWriterInitialSize);
}
virtual ~ComposerCommandEngine() = default;
@@ -74,16 +76,16 @@ class ComposerCommandEngine : protected CommandReaderBase {
return Error::BAD_PARAMETER;
}
return mWriter.writeQueue(outQueueChanged, outCommandLength, outCommandHandles)
? Error::NONE
: Error::NO_RESOURCES;
return mWriter->writeQueue(outQueueChanged, outCommandLength, outCommandHandles)
? Error::NONE
: Error::NO_RESOURCES;
}
const MQDescriptorSync<uint32_t>* getOutputMQDescriptor() { return mWriter.getMQDescriptor(); }
const MQDescriptorSync<uint32_t>* getOutputMQDescriptor() { return mWriter->getMQDescriptor(); }
void reset() {
CommandReaderBase::reset();
mWriter.reset();
mWriter->reset();
}
protected:
@@ -140,13 +142,17 @@ class ComposerCommandEngine : protected CommandReaderBase {
}
}
virtual std::unique_ptr<CommandWriterBase> createCommandWriter(size_t writerInitialSize) {
return std::make_unique<CommandWriterBase>(writerInitialSize);
}
bool executeSelectDisplay(uint16_t length) {
if (length != CommandWriterBase::kSelectDisplayLength) {
return false;
}
mCurrentDisplay = read64();
mWriter.selectDisplay(mCurrentDisplay);
mWriter->selectDisplay(mCurrentDisplay);
return true;
}
@@ -174,7 +180,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setColorTransform(mCurrentDisplay, matrix, transform);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -208,7 +214,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
close(fence);
}
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -239,7 +245,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
close(fence);
}
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -260,10 +266,10 @@ class ComposerCommandEngine : protected CommandReaderBase {
&displayRequestMask, &requestedLayers, &requestMasks);
mResources->setDisplayMustValidateState(mCurrentDisplay, false);
if (err == Error::NONE) {
mWriter.setChangedCompositionTypes(changedLayers, compositionTypes);
mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks);
mWriter->setChangedCompositionTypes(changedLayers, compositionTypes);
mWriter->setDisplayRequests(displayRequestMask, requestedLayers, requestMasks);
} else {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -283,9 +289,9 @@ class ComposerCommandEngine : protected CommandReaderBase {
? Error::NOT_VALIDATED
: mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences);
if (err == Error::NONE) {
mWriter.setPresentOrValidateResult(1);
mWriter.setPresentFence(presentFence);
mWriter.setReleaseFences(layers, fences);
mWriter->setPresentOrValidateResult(1);
mWriter->setPresentFence(presentFence);
mWriter->setReleaseFences(layers, fences);
return true;
}
}
@@ -301,11 +307,11 @@ class ComposerCommandEngine : protected CommandReaderBase {
&displayRequestMask, &requestedLayers, &requestMasks);
mResources->setDisplayMustValidateState(mCurrentDisplay, false);
if (err == Error::NONE) {
mWriter.setPresentOrValidateResult(0);
mWriter.setChangedCompositionTypes(changedLayers, compositionTypes);
mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks);
mWriter->setPresentOrValidateResult(0);
mWriter->setChangedCompositionTypes(changedLayers, compositionTypes);
mWriter->setDisplayRequests(displayRequestMask, requestedLayers, requestMasks);
} else {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -318,7 +324,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->acceptDisplayChanges(mCurrentDisplay);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -334,10 +340,10 @@ class ComposerCommandEngine : protected CommandReaderBase {
std::vector<int> fences;
auto err = mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences);
if (err == Error::NONE) {
mWriter.setPresentFence(presentFence);
mWriter.setReleaseFences(layers, fences);
mWriter->setPresentFence(presentFence);
mWriter->setReleaseFences(layers, fences);
} else {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -351,7 +357,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerCursorPosition(mCurrentDisplay, mCurrentLayer, readSigned(),
readSigned());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -382,7 +388,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
close(fence);
}
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -397,7 +403,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto damage = readRegion(length / 4);
auto err = mHal->setLayerSurfaceDamage(mCurrentDisplay, mCurrentLayer, damage);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -410,7 +416,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerBlendMode(mCurrentDisplay, mCurrentLayer, readSigned());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -423,7 +429,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerColor(mCurrentDisplay, mCurrentLayer, readColor());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -436,7 +442,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerCompositionType(mCurrentDisplay, mCurrentLayer, readSigned());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -449,7 +455,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerDataspace(mCurrentDisplay, mCurrentLayer, readSigned());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -462,7 +468,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerDisplayFrame(mCurrentDisplay, mCurrentLayer, readRect());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -475,7 +481,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerPlaneAlpha(mCurrentDisplay, mCurrentLayer, readFloat());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -496,7 +502,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
err = mHal->setLayerSidebandStream(mCurrentDisplay, mCurrentLayer, stream);
}
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -509,7 +515,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerSourceCrop(mCurrentDisplay, mCurrentLayer, readFRect());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -522,7 +528,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerTransform(mCurrentDisplay, mCurrentLayer, readSigned());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -537,7 +543,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto region = readRegion(length / 4);
auto err = mHal->setLayerVisibleRegion(mCurrentDisplay, mCurrentLayer, region);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -550,7 +556,7 @@ class ComposerCommandEngine : protected CommandReaderBase {
auto err = mHal->setLayerZOrder(mCurrentDisplay, mCurrentLayer, read());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -579,12 +585,12 @@ class ComposerCommandEngine : protected CommandReaderBase {
};
}
ComposerHal* mHal;
ComposerResources* mResources;
// 64KiB minus a small space for metadata such as read/write pointers
static constexpr size_t kWriterInitialSize = 64 * 1024 / sizeof(uint32_t) - 16;
CommandWriterBase mWriter{kWriterInitialSize};
ComposerHal* mHal;
ComposerResources* mResources;
std::unique_ptr<CommandWriterBase> mWriter;
Display mCurrentDisplay = 0;
Layer mCurrentLayer = 0;

View File

@@ -49,6 +49,11 @@ class ComposerCommandEngine : public V2_1::hal::ComposerCommandEngine {
}
}
std::unique_ptr<V2_1::CommandWriterBase> createCommandWriter(
size_t writerInitialSize) override {
return std::make_unique<CommandWriterBase>(writerInitialSize);
}
bool executeSetLayerPerFrameMetadata(uint16_t length) {
// (key, value) pairs
if (length % 2 != 0) {
@@ -65,7 +70,7 @@ class ComposerCommandEngine : public V2_1::hal::ComposerCommandEngine {
auto err = mHal->setLayerPerFrameMetadata(mCurrentDisplay, mCurrentLayer, metadata);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -78,7 +83,7 @@ class ComposerCommandEngine : public V2_1::hal::ComposerCommandEngine {
auto err = mHal->setLayerFloatColor(mCurrentDisplay, mCurrentLayer, readFloatColor());
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;

View File

@@ -50,6 +50,11 @@ class ComposerCommandEngine : public V2_2::hal::ComposerCommandEngine {
}
}
std::unique_ptr<V2_1::CommandWriterBase> createCommandWriter(
size_t writerInitialSize) override {
return std::make_unique<CommandWriterBase>(writerInitialSize);
}
bool executeSetLayerColorTransform(uint16_t length) {
if (length != CommandWriterBase::kSetLayerColorTransformLength) {
return false;
@@ -61,7 +66,7 @@ class ComposerCommandEngine : public V2_2::hal::ComposerCommandEngine {
}
auto err = mHal->setLayerColorTransform(mCurrentDisplay, mCurrentLayer, matrix);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
@@ -97,7 +102,7 @@ class ComposerCommandEngine : public V2_2::hal::ComposerCommandEngine {
}
auto err = mHal->setLayerPerFrameMetadataBlobs(mCurrentDisplay, mCurrentLayer, metadata);
if (err != Error::NONE) {
mWriter.setError(getCommandLoc(), err);
mWriter->setError(getCommandLoc(), err);
}
return true;
}
@@ -111,8 +116,8 @@ class ComposerCommandEngine : public V2_2::hal::ComposerCommandEngine {
private:
using BaseType2_1 = V2_1::hal::ComposerCommandEngine;
using BaseType2_1::mWriter;
using BaseType2_2 = V2_2::hal::ComposerCommandEngine;
using BaseType2_1::mWriter;
ComposerHal* mHal;
};