diff options
| -rw-r--r-- | include/gui/IGraphicBufferProducer.h | 1 | ||||
| -rw-r--r-- | include/gui/SurfaceComposerClient.h | 1 | ||||
| -rw-r--r-- | include/gui/SurfaceControl.h | 1 | ||||
| -rw-r--r-- | include/private/gui/LayerState.h | 5 | ||||
| -rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 3 | ||||
| -rw-r--r-- | libs/gui/IGraphicBufferProducer.cpp | 5 | ||||
| -rw-r--r-- | libs/gui/LayerState.cpp | 4 | ||||
| -rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 18 | ||||
| -rw-r--r-- | libs/gui/SurfaceControl.cpp | 5 | ||||
| -rw-r--r-- | libs/gui/tests/BufferQueue_test.cpp | 41 | ||||
| -rw-r--r-- | services/sensorservice/SensorDevice.cpp | 16 | ||||
| -rw-r--r-- | services/sensorservice/SensorDevice.h | 3 | ||||
| -rw-r--r-- | services/sensorservice/SensorDeviceTreble.cpp | 7 |
13 files changed, 108 insertions, 2 deletions
diff --git a/include/gui/IGraphicBufferProducer.h b/include/gui/IGraphicBufferProducer.h index 304a0c04bd..258cd2f9aa 100644 --- a/include/gui/IGraphicBufferProducer.h +++ b/include/gui/IGraphicBufferProducer.h @@ -385,6 +385,7 @@ public: uint32_t numPendingBuffers{0}; uint64_t nextFrameNumber{0}; FrameEventHistoryDelta frameTimestamps; + bool bufferReplaced{false}; }; virtual status_t queueBuffer(int slot, const QueueBufferInput& input, diff --git a/include/gui/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h index b86c72cc0e..183b42d9c3 100644 --- a/include/gui/SurfaceComposerClient.h +++ b/include/gui/SurfaceComposerClient.h @@ -143,6 +143,7 @@ public: status_t setFlags(const sp<IBinder>& id, uint32_t flags, uint32_t mask); status_t setTransparentRegionHint(const sp<IBinder>& id, const Region& transparent); status_t setLayer(const sp<IBinder>& id, uint32_t layer); + status_t setLayerInfo(const sp<IBinder>& id, uint32_t type, uint32_t appid); status_t setAlpha(const sp<IBinder>& id, float alpha=1.0f); status_t setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, float dsdy, float dtdy); status_t setPosition(const sp<IBinder>& id, float x, float y); diff --git a/include/gui/SurfaceControl.h b/include/gui/SurfaceControl.h index 5e731c3964..456bde40f3 100644 --- a/include/gui/SurfaceControl.h +++ b/include/gui/SurfaceControl.h @@ -62,6 +62,7 @@ public: status_t setLayerStack(uint32_t layerStack); status_t setLayer(uint32_t layer); + status_t setLayerInfo(uint32_t type, uint32_t appid); status_t setPosition(float x, float y); status_t setSize(uint32_t w, uint32_t h); status_t hide(); diff --git a/include/private/gui/LayerState.h b/include/private/gui/LayerState.h index 292dd3b8df..b6487517a8 100644 --- a/include/private/gui/LayerState.h +++ b/include/private/gui/LayerState.h @@ -56,6 +56,7 @@ struct layer_state_t { eFinalCropChanged = 0x00000400, eOverrideScalingModeChanged = 0x00000800, eGeometryAppliesWithResize = 0x00001000, + eLayerInfoChanged = 0x00002000, }; layer_state_t() @@ -64,7 +65,7 @@ struct layer_state_t { alpha(0), flags(0), mask(0), reserved(0), crop(Rect::INVALID_RECT), finalCrop(Rect::INVALID_RECT), frameNumber(0), - overrideScalingMode(-1) + overrideScalingMode(-1), type(0), appid(0) { matrix.dsdx = matrix.dtdy = 1.0f; matrix.dsdy = matrix.dtdx = 0.0f; @@ -97,6 +98,8 @@ struct layer_state_t { sp<IBinder> handle; uint64_t frameNumber; int32_t overrideScalingMode; + uint32_t type; + uint32_t appid; // non POD must be last. see write/read Region transparentRegion; }; diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 39b9a0b480..3f69b1f602 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -879,6 +879,7 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCore->mSharedBufferCache.dataspace = dataSpace; } + output->bufferReplaced = false; if (mCore->mQueue.empty()) { // When the queue is empty, we can ignore mDequeueBufferCannotBlock // and simply queue this buffer @@ -905,6 +906,7 @@ status_t BufferQueueProducer::queueBuffer(int slot, if (!mSlots[last.mSlot].mBufferState.isShared()) { mCore->mActiveBuffers.erase(last.mSlot); mCore->mFreeBuffers.push_back(last.mSlot); + output->bufferReplaced = true; } } @@ -1158,6 +1160,7 @@ status_t BufferQueueProducer::connect(const sp<IProducerListener>& listener, output->numPendingBuffers = static_cast<uint32_t>(mCore->mQueue.size()); output->nextFrameNumber = mCore->mFrameCounter + 1; + output->bufferReplaced = false; if (listener != NULL) { // Set up a death notification so that we can disconnect diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 18a80e80b9..abdf649bb1 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -831,7 +831,8 @@ constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { sizeof(height) + sizeof(transformHint) + sizeof(numPendingBuffers) + - sizeof(nextFrameNumber); + sizeof(nextFrameNumber) + + sizeof(bufferReplaced); } size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { @@ -854,6 +855,7 @@ status_t IGraphicBufferProducer::QueueBufferOutput::flatten( FlattenableUtils::write(buffer, size, transformHint); FlattenableUtils::write(buffer, size, numPendingBuffers); FlattenableUtils::write(buffer, size, nextFrameNumber); + FlattenableUtils::write(buffer, size, bufferReplaced); return frameTimestamps.flatten(buffer, size, fds, count); } @@ -870,6 +872,7 @@ status_t IGraphicBufferProducer::QueueBufferOutput::unflatten( FlattenableUtils::read(buffer, size, transformHint); FlattenableUtils::read(buffer, size, numPendingBuffers); FlattenableUtils::read(buffer, size, nextFrameNumber); + FlattenableUtils::read(buffer, size, bufferReplaced); return frameTimestamps.unflatten(buffer, size, fds, count); } diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index d1c576e4c5..3949186f2b 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -42,6 +42,8 @@ status_t layer_state_t::write(Parcel& output) const output.writeStrongBinder(handle); output.writeUint64(frameNumber); output.writeInt32(overrideScalingMode); + output.writeUint32(type); + output.writeUint32(appid); output.write(transparentRegion); return NO_ERROR; } @@ -70,6 +72,8 @@ status_t layer_state_t::read(const Parcel& input) handle = input.readStrongBinder(); frameNumber = input.readUint64(); overrideScalingMode = input.readInt32(); + type = input.readUint32(); + appid = input.readUint32(); input.read(transparentRegion); return NO_ERROR; } diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 58b2a8737a..3346a83f3a 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -149,6 +149,8 @@ public: uint32_t w, uint32_t h); status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, uint32_t z); + status_t setLayerInfo(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, + uint32_t type, uint32_t appid); status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, uint32_t flags, uint32_t mask); status_t setTransparentRegionHint( @@ -335,6 +337,18 @@ status_t Composer::setLayer(const sp<SurfaceComposerClient>& client, return NO_ERROR; } +status_t Composer::setLayerInfo(const sp<SurfaceComposerClient>& client, + const sp<IBinder>& id, uint32_t type, uint32_t appid) { + Mutex::Autolock _l(mLock); + layer_state_t* s = getLayerStateLocked(client, id); + if (!s) + return BAD_INDEX; + s->what |= layer_state_t::eLayerInfoChanged; + s->type = type; + s->appid = appid; + return NO_ERROR; +} + status_t Composer::setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, uint32_t flags, uint32_t mask) { @@ -704,6 +718,10 @@ status_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, uint32_t z) { return getComposer().setLayer(this, id, z); } +status_t SurfaceComposerClient::setLayerInfo(const sp<IBinder>& id, uint32_t type, uint32_t appid) { + return getComposer().setLayerInfo(this, id, type, appid); +} + status_t SurfaceComposerClient::hide(const sp<IBinder>& id) { return getComposer().setFlags(this, id, layer_state_t::eLayerHidden, diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp index 33c1d906e6..b47e434561 100644 --- a/libs/gui/SurfaceControl.cpp +++ b/libs/gui/SurfaceControl.cpp @@ -107,6 +107,11 @@ status_t SurfaceControl::setLayer(uint32_t layer) { if (err < 0) return err; return mClient->setLayer(mHandle, layer); } +status_t SurfaceControl::setLayerInfo(uint32_t type, uint32_t appid) { + status_t err = validate(); + if (err < 0) return err; + return mClient->setLayerInfo(mHandle, type, appid); +} status_t SurfaceControl::setPosition(float x, float y) { status_t err = validate(); if (err < 0) return err; diff --git a/libs/gui/tests/BufferQueue_test.cpp b/libs/gui/tests/BufferQueue_test.cpp index 98c0449706..91ce531cf5 100644 --- a/libs/gui/tests/BufferQueue_test.cpp +++ b/libs/gui/tests/BufferQueue_test.cpp @@ -1076,4 +1076,45 @@ TEST_F(BufferQueueTest, TestDiscardFreeBuffers) { } } +TEST_F(BufferQueueTest, TestBufferReplacedInQueueBuffer) { + createBufferQueue(); + sp<DummyConsumer> dc(new DummyConsumer); + ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true)); + IGraphicBufferProducer::QueueBufferOutput output; + ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener, + NATIVE_WINDOW_API_CPU, true, &output)); + ASSERT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1)); + + int slot = BufferQueue::INVALID_BUFFER_SLOT; + sp<Fence> fence = Fence::NO_FENCE; + sp<GraphicBuffer> buffer = nullptr; + IGraphicBufferProducer::QueueBufferInput input(0ull, true, + HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT, + NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE); + BufferItem item{}; + + // Preallocate, dequeue, request, and cancel 2 buffers so we don't get + // BUFFER_NEEDS_REALLOCATION below + int slots[2] = {}; + ASSERT_EQ(OK, mProducer->setMaxDequeuedBufferCount(2)); + for (size_t i = 0; i < 2; ++i) { + status_t result = mProducer->dequeueBuffer(&slots[i], &fence, + 0, 0, 0, 0, nullptr); + ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result); + ASSERT_EQ(OK, mProducer->requestBuffer(slots[i], &buffer)); + } + for (size_t i = 0; i < 2; ++i) { + ASSERT_EQ(OK, mProducer->cancelBuffer(slots[i], Fence::NO_FENCE)); + } + + // Fill 2 buffers without consumer consuming them. Verify that all + // queued buffer returns proper bufferReplaced flag + ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr)); + ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output)); + ASSERT_EQ(false, output.bufferReplaced); + ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr)); + ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output)); + ASSERT_EQ(true, output.bufferReplaced); +} + } // namespace android diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index 41ad918a12..de0321db67 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -491,6 +491,11 @@ void SensorDevice::notifyConnectionDestroyed(void* ident) { } int32_t SensorDevice::registerDirectChannel(const sensors_direct_mem_t* memory) { + + if (!isDirectReportSupported()) { + return INVALID_OPERATION; + } + Mutex::Autolock _l(mLock); int32_t channelHandle = mSensorDevice->register_direct_channel( @@ -506,6 +511,11 @@ void SensorDevice::unregisterDirectChannel(int32_t channelHandle) { int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle, const struct sensors_direct_cfg_t *config) { + + if (!isDirectReportSupported()) { + return INVALID_OPERATION; + } + Mutex::Autolock _l(mLock); int32_t ret = mSensorDevice->config_direct_report( @@ -513,6 +523,12 @@ int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t chann ALOGE_IF(ret < 0, "SensorDevice::configureDirectChannel ret %d", ret); return ret; } + +bool SensorDevice::isDirectReportSupported() const { + bool ret = mSensorDevice->register_direct_channel != nullptr + && mSensorDevice->config_direct_report != nullptr; + return ret; +} // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h index b6886a20fc..7dd256aaa1 100644 --- a/services/sensorservice/SensorDevice.h +++ b/services/sensorservice/SensorDevice.h @@ -59,6 +59,7 @@ public: status_t flush(void* ident, int handle); status_t setMode(uint32_t mode); + bool isDirectReportSupported() const; int32_t registerDirectChannel(const sensors_direct_mem_t *memory); void unregisterDirectChannel(int32_t channelHandle); int32_t configureDirectChannel(int32_t sensorHandle, @@ -147,6 +148,8 @@ private: const hardware::hidl_vec<Event> &src, const hardware::hidl_vec<SensorInfo> &dynamicSensorsAdded, sensors_event_t *dst); + + bool mIsDirectReportSupported; #endif // ENABLE_TREBLE }; diff --git a/services/sensorservice/SensorDeviceTreble.cpp b/services/sensorservice/SensorDeviceTreble.cpp index 0a754006bd..3edd50bd81 100644 --- a/services/sensorservice/SensorDeviceTreble.cpp +++ b/services/sensorservice/SensorDeviceTreble.cpp @@ -77,6 +77,9 @@ SensorDevice::SensorDevice() { mSensors->activate(list[i].sensorHandle, 0 /* enabled */); } }); + + mIsDirectReportSupported = + (mSensors->unregisterDirectChannel(-1) != Result::INVALID_OPERATION); } void SensorDevice::handleDynamicSensorConnection(int handle, bool connected) { @@ -581,6 +584,10 @@ int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, return ret; } +bool SensorDevice::isDirectReportSupported() const { + return mIsDirectReportSupported; +} + void SensorDevice::convertToSensorEvent( const Event &src, sensors_event_t *dst) { ::android::hardware::sensors::V1_0::implementation::convertToSensorEvent( |