summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tianyu Jiang <tianyuj@google.com> 2018-11-14 15:52:38 -0800
committer Tianyu Jiang <tianyuj@google.com> 2018-12-03 13:58:49 -0800
commit60887c97c3a0635c2e971f9ee1578beb26e7b69f (patch)
tree4819a44c648bfb142f34e3e1c3fad0651ceee456
parentf669f6a2e5becd051b2829dc44bcba8043945cfe (diff)
Allow the same producer to gain a buffer twice.
This change makes the same producer gaining the same buffer the second time a no-op, and prevent other clients of the buffer from gaining it. Currently, EALREADY error will return if a producer gain a buffer which is already gained by the producer. Problem: there is an actual use case in passthrough processor that a producer may need to gain a buffer to mimic a "release" of a buffer in the consumer point of view. Test: buffer_hub-test Bug: 118718713 Change-Id: If958c95165a5ad62f51c46b01fa43b576d3b20ae
-rw-r--r--libs/vr/libbufferhub/buffer_hub-test.cpp20
-rw-r--r--libs/vr/libbufferhub/producer_buffer.cpp4
2 files changed, 15 insertions, 9 deletions
diff --git a/libs/vr/libbufferhub/buffer_hub-test.cpp b/libs/vr/libbufferhub/buffer_hub-test.cpp
index 2d9a42b3d2..9bcfaa1cde 100644
--- a/libs/vr/libbufferhub/buffer_hub-test.cpp
+++ b/libs/vr/libbufferhub/buffer_hub-test.cpp
@@ -212,9 +212,8 @@ TEST_F(LibBufferHubTest, TestStateTransitions) {
LocalHandle fence;
EXPECT_EQ(0, p->GainAsync());
- // Acquire and gain in gained state should fail.
+ // Acquire in gained state should fail.
EXPECT_EQ(-EBUSY, c->Acquire(&fence));
- EXPECT_EQ(-EALREADY, p->Gain(&fence));
// Post in gained state should succeed.
EXPECT_EQ(0, p->Post(LocalHandle()));
@@ -242,9 +241,8 @@ TEST_F(LibBufferHubTest, TestStateTransitions) {
// Gain in released state should succeed.
EXPECT_EQ(0, p->Gain(&fence));
- // Acquire and gain in gained state should fail.
+ // Acquire in gained state should fail.
EXPECT_EQ(-EBUSY, c->Acquire(&fence));
- EXPECT_EQ(-EALREADY, p->Gain(&fence));
}
TEST_F(LibBufferHubTest, TestAsyncStateTransitions) {
@@ -259,10 +257,9 @@ TEST_F(LibBufferHubTest, TestAsyncStateTransitions) {
LocalHandle invalid_fence;
EXPECT_EQ(0, p->GainAsync());
- // Acquire and gain in gained state should fail.
+ // Acquire in gained state should fail.
EXPECT_EQ(-EBUSY, c->AcquireAsync(&metadata, &invalid_fence));
EXPECT_FALSE(invalid_fence.IsValid());
- EXPECT_EQ(-EALREADY, p->GainAsync(&metadata, &invalid_fence));
EXPECT_FALSE(invalid_fence.IsValid());
// Post in gained state should succeed.
@@ -309,8 +306,15 @@ TEST_F(LibBufferHubTest, TestAsyncStateTransitions) {
// Acquire and gain in gained state should fail.
EXPECT_EQ(-EBUSY, c->AcquireAsync(&metadata, &invalid_fence));
EXPECT_FALSE(invalid_fence.IsValid());
- EXPECT_EQ(-EALREADY, p->GainAsync(&metadata, &invalid_fence));
- EXPECT_FALSE(invalid_fence.IsValid());
+}
+
+TEST_F(LibBufferHubTest, TestGainTwiceByTheSameProducer) {
+ std::unique_ptr<ProducerBuffer> p = ProducerBuffer::Create(
+ kWidth, kHeight, kFormat, kUsage, sizeof(uint64_t));
+ ASSERT_TRUE(p.get() != nullptr);
+
+ ASSERT_EQ(0, p->GainAsync());
+ ASSERT_EQ(0, p->GainAsync());
}
TEST_F(LibBufferHubTest, TestGainPostedBuffer) {
diff --git a/libs/vr/libbufferhub/producer_buffer.cpp b/libs/vr/libbufferhub/producer_buffer.cpp
index 1bfdc8f214..c17797057c 100644
--- a/libs/vr/libbufferhub/producer_buffer.cpp
+++ b/libs/vr/libbufferhub/producer_buffer.cpp
@@ -172,9 +172,10 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta,
if (BufferHubDefs::IsClientGained(current_buffer_state,
client_state_mask())) {
ALOGI("%s: already gained id=%d.", __FUNCTION__, id());
- return -EALREADY;
+ return 0;
}
if (BufferHubDefs::AnyClientAcquired(current_buffer_state) ||
+ BufferHubDefs::AnyClientGained(current_buffer_state) ||
(BufferHubDefs::AnyClientPosted(current_buffer_state) &&
!gain_posted_buffer)) {
ALOGE("%s: not released id=%d state=%" PRIx64 ".", __FUNCTION__, id(),
@@ -196,6 +197,7 @@ int ProducerBuffer::LocalGain(DvrNativeBufferMetadata* out_meta,
__FUNCTION__, current_buffer_state, updated_buffer_state);
if (BufferHubDefs::AnyClientAcquired(current_buffer_state) ||
+ BufferHubDefs::AnyClientGained(current_buffer_state) ||
(BufferHubDefs::AnyClientPosted(current_buffer_state) &&
!gain_posted_buffer)) {
ALOGE(