blob: c38c7978102801e8ba7ab3e2f06e3bcb82758aad [file] [log] [blame]
Jamie Gennis9e75ddd2012-08-31 15:32:45 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "BufferQueue_test"
18//#define LOG_NDEBUG 0
19
Dan Stozadd264162015-03-12 13:58:47 -070020#include <gui/BufferItem.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070021#include <gui/BufferQueue.h>
22#include <gui/IProducerListener.h>
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070023
24#include <ui/GraphicBuffer.h>
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070025
Dan Stoza1a0b8612014-03-20 15:36:31 -070026#include <binder/IPCThreadState.h>
Dan Stoza9f3053d2014-03-06 15:14:33 -080027#include <binder/IServiceManager.h>
Dan Stoza1a0b8612014-03-20 15:36:31 -070028#include <binder/ProcessState.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070029
30#include <utils/String8.h>
31#include <utils/threads.h>
32
33#include <gtest/gtest.h>
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070034
35namespace android {
36
37class BufferQueueTest : public ::testing::Test {
Dan Stoza9f3053d2014-03-06 15:14:33 -080038
39public:
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070040protected:
Dan Stoza9f3053d2014-03-06 15:14:33 -080041 BufferQueueTest() {
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070042 const ::testing::TestInfo* const testInfo =
43 ::testing::UnitTest::GetInstance()->current_test_info();
44 ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
45 testInfo->name());
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070046 }
47
Dan Stoza9f3053d2014-03-06 15:14:33 -080048 ~BufferQueueTest() {
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070049 const ::testing::TestInfo* const testInfo =
50 ::testing::UnitTest::GetInstance()->current_test_info();
51 ALOGV("End test: %s.%s", testInfo->test_case_name(),
52 testInfo->name());
53 }
54
Igor Murashkin7ea777f2013-11-18 16:58:36 -080055 void GetMinUndequeuedBufferCount(int* bufferCount) {
Dan Stoza9f3053d2014-03-06 15:14:33 -080056 ASSERT_TRUE(bufferCount != NULL);
57 ASSERT_EQ(OK, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
58 bufferCount));
59 ASSERT_GE(*bufferCount, 0);
Igor Murashkin7ea777f2013-11-18 16:58:36 -080060 }
61
Dan Stoza1a0b8612014-03-20 15:36:31 -070062 void createBufferQueue() {
63 BufferQueue::createBufferQueue(&mProducer, &mConsumer);
64 }
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070065
Dan Stoza1a0b8612014-03-20 15:36:31 -070066 sp<IGraphicBufferProducer> mProducer;
67 sp<IGraphicBufferConsumer> mConsumer;
68};
Dan Stoza9f3053d2014-03-06 15:14:33 -080069
Mathias Agopiana4e19522013-07-31 20:09:53 -070070struct DummyConsumer : public BnConsumerListener {
Dan Stoza8dc55392014-11-04 11:37:46 -080071 virtual void onFrameAvailable(const BufferItem& /* item */) {}
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070072 virtual void onBuffersReleased() {}
Jesse Hall49bfda12014-03-13 15:09:17 -070073 virtual void onSidebandStreamChanged() {}
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070074};
75
Dan Stoza1a0b8612014-03-20 15:36:31 -070076// XXX: Tests that fork a process to hold the BufferQueue must run before tests
77// that use a local BufferQueue, or else Binder will get unhappy
78TEST_F(BufferQueueTest, BufferQueueInAnotherProcess) {
79 const String16 PRODUCER_NAME = String16("BQTestProducer");
80 const String16 CONSUMER_NAME = String16("BQTestConsumer");
81
82 pid_t forkPid = fork();
83 ASSERT_NE(forkPid, -1);
84
85 if (forkPid == 0) {
86 // Child process
Dan Stozab3d0bdf2014-04-07 16:33:59 -070087 sp<IGraphicBufferProducer> producer;
88 sp<IGraphicBufferConsumer> consumer;
Dan Stoza1a0b8612014-03-20 15:36:31 -070089 BufferQueue::createBufferQueue(&producer, &consumer);
90 sp<IServiceManager> serviceManager = defaultServiceManager();
Marco Nelissen2ea926b2014-11-14 08:01:01 -080091 serviceManager->addService(PRODUCER_NAME, IInterface::asBinder(producer));
92 serviceManager->addService(CONSUMER_NAME, IInterface::asBinder(consumer));
Dan Stoza1a0b8612014-03-20 15:36:31 -070093 ProcessState::self()->startThreadPool();
94 IPCThreadState::self()->joinThreadPool();
95 LOG_ALWAYS_FATAL("Shouldn't be here");
96 }
97
98 sp<IServiceManager> serviceManager = defaultServiceManager();
99 sp<IBinder> binderProducer =
100 serviceManager->getService(PRODUCER_NAME);
101 mProducer = interface_cast<IGraphicBufferProducer>(binderProducer);
102 EXPECT_TRUE(mProducer != NULL);
103 sp<IBinder> binderConsumer =
104 serviceManager->getService(CONSUMER_NAME);
105 mConsumer = interface_cast<IGraphicBufferConsumer>(binderConsumer);
106 EXPECT_TRUE(mConsumer != NULL);
107
108 sp<DummyConsumer> dc(new DummyConsumer);
109 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
110 IGraphicBufferProducer::QueueBufferOutput output;
111 ASSERT_EQ(OK,
112 mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
113
114 int slot;
115 sp<Fence> fence;
116 sp<GraphicBuffer> buffer;
117 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
118 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
119 GRALLOC_USAGE_SW_WRITE_OFTEN));
120 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
121
122 uint32_t* dataIn;
123 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
124 reinterpret_cast<void**>(&dataIn)));
125 *dataIn = 0x12345678;
126 ASSERT_EQ(OK, buffer->unlock());
127
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800128 IGraphicBufferProducer::QueueBufferInput input(0, false,
129 HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
Dan Stoza1a0b8612014-03-20 15:36:31 -0700130 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
131 ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
132
Dan Stozadd264162015-03-12 13:58:47 -0700133 BufferItem item;
Dan Stoza1a0b8612014-03-20 15:36:31 -0700134 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
135
136 uint32_t* dataOut;
137 ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
138 reinterpret_cast<void**>(&dataOut)));
139 ASSERT_EQ(*dataOut, 0x12345678);
140 ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
141}
142
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700143TEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700144 createBufferQueue();
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700145 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800146 mConsumer->consumerConnect(dc, false);
Andy McFadden2adaf042012-12-18 09:49:45 -0800147 IGraphicBufferProducer::QueueBufferOutput qbo;
Dan Stozaf0eaf252014-03-21 13:05:51 -0700148 mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
149 &qbo);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800150 mProducer->setBufferCount(4);
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700151
152 int slot;
153 sp<Fence> fence;
154 sp<GraphicBuffer> buf;
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800155 IGraphicBufferProducer::QueueBufferInput qbi(0, false,
156 HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
Mathias Agopian7cdd7862013-07-18 22:10:56 -0700157 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
Dan Stozadd264162015-03-12 13:58:47 -0700158 BufferItem item;
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700159
160 for (int i = 0; i < 2; i++) {
Andy McFadden2adaf042012-12-18 09:49:45 -0800161 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
Dan Stoza9f3053d2014-03-06 15:14:33 -0800162 mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700163 GRALLOC_USAGE_SW_READ_OFTEN));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800164 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
165 ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
166 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700167 }
168
Andy McFadden2adaf042012-12-18 09:49:45 -0800169 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
Dan Stoza9f3053d2014-03-06 15:14:33 -0800170 mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700171 GRALLOC_USAGE_SW_READ_OFTEN));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800172 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
173 ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700174
175 // Acquire the third buffer, which should fail.
Dan Stoza9f3053d2014-03-06 15:14:33 -0800176 ASSERT_EQ(INVALID_OPERATION, mConsumer->acquireBuffer(&item, 0));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700177}
178
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700179TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700180 createBufferQueue();
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700181 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800182 mConsumer->consumerConnect(dc, false);
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700183
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800184 int minBufferCount;
185 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800186 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
187 minBufferCount - 1));
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800188
Dan Stoza9f3053d2014-03-06 15:14:33 -0800189 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(0));
190 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(-3));
191 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700192 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800193 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(100));
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700194}
195
196TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700197 createBufferQueue();
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700198 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800199 mConsumer->consumerConnect(dc, false);
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700200
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800201 int minBufferCount;
202 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
203
Dan Stoza9f3053d2014-03-06 15:14:33 -0800204 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
205 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(2));
206 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(minBufferCount));
207 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700208 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
209}
210
Dan Stoza9f3053d2014-03-06 15:14:33 -0800211TEST_F(BufferQueueTest, DetachAndReattachOnProducerSide) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700212 createBufferQueue();
Dan Stoza9f3053d2014-03-06 15:14:33 -0800213 sp<DummyConsumer> dc(new DummyConsumer);
214 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
215 IGraphicBufferProducer::QueueBufferOutput output;
Dan Stozaf0eaf252014-03-21 13:05:51 -0700216 ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
217 NATIVE_WINDOW_API_CPU, false, &output));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800218
219 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(-1)); // Index too low
220 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(
221 BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
222 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(0)); // Not dequeued
223
224 int slot;
225 sp<Fence> fence;
226 sp<GraphicBuffer> buffer;
227 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
228 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
229 GRALLOC_USAGE_SW_WRITE_OFTEN));
230 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not requested
231 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
232 ASSERT_EQ(OK, mProducer->detachBuffer(slot));
233 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not dequeued
234
235 sp<GraphicBuffer> safeToClobberBuffer;
236 // Can no longer request buffer from this slot
237 ASSERT_EQ(BAD_VALUE, mProducer->requestBuffer(slot, &safeToClobberBuffer));
238
239 uint32_t* dataIn;
240 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
241 reinterpret_cast<void**>(&dataIn)));
242 *dataIn = 0x12345678;
243 ASSERT_EQ(OK, buffer->unlock());
244
245 int newSlot;
246 ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(NULL, safeToClobberBuffer));
247 ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&newSlot, NULL));
248
249 ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, buffer));
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800250 IGraphicBufferProducer::QueueBufferInput input(0, false,
251 HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
Dan Stoza9f3053d2014-03-06 15:14:33 -0800252 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
253 ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
254
Dan Stozadd264162015-03-12 13:58:47 -0700255 BufferItem item;
Dan Stoza9f3053d2014-03-06 15:14:33 -0800256 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
257
258 uint32_t* dataOut;
259 ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
260 reinterpret_cast<void**>(&dataOut)));
261 ASSERT_EQ(*dataOut, 0x12345678);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700262 ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
Dan Stoza9f3053d2014-03-06 15:14:33 -0800263}
264
265TEST_F(BufferQueueTest, DetachAndReattachOnConsumerSide) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700266 createBufferQueue();
Dan Stoza9f3053d2014-03-06 15:14:33 -0800267 sp<DummyConsumer> dc(new DummyConsumer);
268 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
269 IGraphicBufferProducer::QueueBufferOutput output;
Dan Stozaf0eaf252014-03-21 13:05:51 -0700270 ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
271 NATIVE_WINDOW_API_CPU, false, &output));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800272
273 int slot;
274 sp<Fence> fence;
275 sp<GraphicBuffer> buffer;
276 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
277 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
278 GRALLOC_USAGE_SW_WRITE_OFTEN));
279 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800280 IGraphicBufferProducer::QueueBufferInput input(0, false,
281 HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
Dan Stoza9f3053d2014-03-06 15:14:33 -0800282 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
283 ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
284
285 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(-1)); // Index too low
286 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(
287 BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
288 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(0)); // Not acquired
289
Dan Stozadd264162015-03-12 13:58:47 -0700290 BufferItem item;
Dan Stoza9f3053d2014-03-06 15:14:33 -0800291 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
292
293 ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
294 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(item.mBuf)); // Not acquired
295
296 uint32_t* dataIn;
297 ASSERT_EQ(OK, item.mGraphicBuffer->lock(
298 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
299 reinterpret_cast<void**>(&dataIn)));
300 *dataIn = 0x12345678;
301 ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
302
303 int newSlot;
304 sp<GraphicBuffer> safeToClobberBuffer;
305 ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(NULL, safeToClobberBuffer));
306 ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&newSlot, NULL));
307 ASSERT_EQ(OK, mConsumer->attachBuffer(&newSlot, item.mGraphicBuffer));
308
Dan Stoza99b18b42014-03-28 15:34:33 -0700309 ASSERT_EQ(OK, mConsumer->releaseBuffer(newSlot, 0, EGL_NO_DISPLAY,
Dan Stoza9f3053d2014-03-06 15:14:33 -0800310 EGL_NO_SYNC_KHR, Fence::NO_FENCE));
311
312 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
313 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
314 GRALLOC_USAGE_SW_WRITE_OFTEN));
315 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
316
317 uint32_t* dataOut;
318 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
319 reinterpret_cast<void**>(&dataOut)));
320 ASSERT_EQ(*dataOut, 0x12345678);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700321 ASSERT_EQ(OK, buffer->unlock());
Dan Stoza9f3053d2014-03-06 15:14:33 -0800322}
323
324TEST_F(BufferQueueTest, MoveFromConsumerToProducer) {
Dan Stoza1a0b8612014-03-20 15:36:31 -0700325 createBufferQueue();
Dan Stoza9f3053d2014-03-06 15:14:33 -0800326 sp<DummyConsumer> dc(new DummyConsumer);
327 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
328 IGraphicBufferProducer::QueueBufferOutput output;
Dan Stozaf0eaf252014-03-21 13:05:51 -0700329 ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
330 NATIVE_WINDOW_API_CPU, false, &output));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800331
332 int slot;
333 sp<Fence> fence;
334 sp<GraphicBuffer> buffer;
335 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
336 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
337 GRALLOC_USAGE_SW_WRITE_OFTEN));
338 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
339
340 uint32_t* dataIn;
341 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
342 reinterpret_cast<void**>(&dataIn)));
343 *dataIn = 0x12345678;
344 ASSERT_EQ(OK, buffer->unlock());
345
Eino-Ville Talvala5b75a512015-02-19 16:10:43 -0800346 IGraphicBufferProducer::QueueBufferInput input(0, false,
347 HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
Dan Stoza9f3053d2014-03-06 15:14:33 -0800348 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
349 ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
350
Dan Stozadd264162015-03-12 13:58:47 -0700351 BufferItem item;
Dan Stoza9f3053d2014-03-06 15:14:33 -0800352 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
353 ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
354
355 int newSlot;
356 ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, item.mGraphicBuffer));
357 ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
358 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
359
360 uint32_t* dataOut;
361 ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
362 reinterpret_cast<void**>(&dataOut)));
363 ASSERT_EQ(*dataOut, 0x12345678);
Dan Stoza1a0b8612014-03-20 15:36:31 -0700364 ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
Dan Stoza9f3053d2014-03-06 15:14:33 -0800365}
366
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700367} // namespace android