summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gui/IGraphicBufferProducer.h1
-rw-r--r--include/gui/SurfaceComposerClient.h1
-rw-r--r--include/gui/SurfaceControl.h1
-rw-r--r--include/private/gui/LayerState.h5
-rw-r--r--libs/gui/BufferQueueProducer.cpp3
-rw-r--r--libs/gui/IGraphicBufferProducer.cpp5
-rw-r--r--libs/gui/LayerState.cpp4
-rw-r--r--libs/gui/SurfaceComposerClient.cpp18
-rw-r--r--libs/gui/SurfaceControl.cpp5
-rw-r--r--libs/gui/tests/BufferQueue_test.cpp41
-rw-r--r--services/sensorservice/SensorDevice.cpp16
-rw-r--r--services/sensorservice/SensorDevice.h3
-rw-r--r--services/sensorservice/SensorDeviceTreble.cpp7
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(