blob: b859fcbde4acfb38d8d4cf4268d0540d420fbabc [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
20#include <gtest/gtest.h>
21
22#include <utils/String8.h>
23#include <utils/threads.h>
24
25#include <ui/GraphicBuffer.h>
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070026
Dan Stoza9f3053d2014-03-06 15:14:33 -080027#include <binder/IServiceManager.h>
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070028#include <gui/BufferQueue.h>
29
30namespace android {
31
32class BufferQueueTest : public ::testing::Test {
Dan Stoza9f3053d2014-03-06 15:14:33 -080033
34public:
35 static const String16 PRODUCER_NAME;
36 static const String16 CONSUMER_NAME;
37
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070038protected:
Dan Stoza9f3053d2014-03-06 15:14:33 -080039 BufferQueueTest() {
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070040 const ::testing::TestInfo* const testInfo =
41 ::testing::UnitTest::GetInstance()->current_test_info();
42 ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
43 testInfo->name());
44
Dan Stoza9f3053d2014-03-06 15:14:33 -080045 BufferQueue::createBufferQueue(&mProducer, &mConsumer);
46 sp<IServiceManager> serviceManager = defaultServiceManager();
47 serviceManager->addService(PRODUCER_NAME, mProducer.get());
48 serviceManager->addService(CONSUMER_NAME, mConsumer.get());
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070049 }
50
Dan Stoza9f3053d2014-03-06 15:14:33 -080051 ~BufferQueueTest() {
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070052 const ::testing::TestInfo* const testInfo =
53 ::testing::UnitTest::GetInstance()->current_test_info();
54 ALOGV("End test: %s.%s", testInfo->test_case_name(),
55 testInfo->name());
56 }
57
Igor Murashkin7ea777f2013-11-18 16:58:36 -080058 void GetMinUndequeuedBufferCount(int* bufferCount) {
Dan Stoza9f3053d2014-03-06 15:14:33 -080059 ASSERT_TRUE(bufferCount != NULL);
60 ASSERT_EQ(OK, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
61 bufferCount));
62 ASSERT_GE(*bufferCount, 0);
Igor Murashkin7ea777f2013-11-18 16:58:36 -080063 }
64
Dan Stoza9f3053d2014-03-06 15:14:33 -080065 sp<BnGraphicBufferProducer> mProducer;
66 sp<BnGraphicBufferConsumer> mConsumer;
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070067};
68
Dan Stoza9f3053d2014-03-06 15:14:33 -080069const String16 BufferQueueTest::PRODUCER_NAME = String16("BQTestProducer");
70const String16 BufferQueueTest::CONSUMER_NAME = String16("BQTestConsumer");
71
Mathias Agopiana4e19522013-07-31 20:09:53 -070072struct DummyConsumer : public BnConsumerListener {
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070073 virtual void onFrameAvailable() {}
74 virtual void onBuffersReleased() {}
75};
76
77TEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
78 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -080079 mConsumer->consumerConnect(dc, false);
Andy McFadden2adaf042012-12-18 09:49:45 -080080 IGraphicBufferProducer::QueueBufferOutput qbo;
Dan Stoza9f3053d2014-03-06 15:14:33 -080081 mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &qbo);
82 mProducer->setBufferCount(4);
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070083
84 int slot;
85 sp<Fence> fence;
86 sp<GraphicBuffer> buf;
Andy McFadden8b308ed2013-08-19 08:56:07 -070087 IGraphicBufferProducer::QueueBufferInput qbi(0, false, Rect(0, 0, 1, 1),
Mathias Agopian7cdd7862013-07-18 22:10:56 -070088 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070089 BufferQueue::BufferItem item;
90
91 for (int i = 0; i < 2; i++) {
Andy McFadden2adaf042012-12-18 09:49:45 -080092 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
Dan Stoza9f3053d2014-03-06 15:14:33 -080093 mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070094 GRALLOC_USAGE_SW_READ_OFTEN));
Dan Stoza9f3053d2014-03-06 15:14:33 -080095 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
96 ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
97 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -070098 }
99
Andy McFadden2adaf042012-12-18 09:49:45 -0800100 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
Dan Stoza9f3053d2014-03-06 15:14:33 -0800101 mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700102 GRALLOC_USAGE_SW_READ_OFTEN));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800103 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
104 ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700105
106 // Acquire the third buffer, which should fail.
Dan Stoza9f3053d2014-03-06 15:14:33 -0800107 ASSERT_EQ(INVALID_OPERATION, mConsumer->acquireBuffer(&item, 0));
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700108}
109
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700110TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
111 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800112 mConsumer->consumerConnect(dc, false);
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700113
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800114 int minBufferCount;
115 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800116 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
117 minBufferCount - 1));
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800118
Dan Stoza9f3053d2014-03-06 15:14:33 -0800119 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(0));
120 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(-3));
121 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700122 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
Dan Stoza9f3053d2014-03-06 15:14:33 -0800123 EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(100));
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700124}
125
126TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
127 sp<DummyConsumer> dc(new DummyConsumer);
Dan Stoza9f3053d2014-03-06 15:14:33 -0800128 mConsumer->consumerConnect(dc, false);
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700129
Igor Murashkin7ea777f2013-11-18 16:58:36 -0800130 int minBufferCount;
131 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
132
Dan Stoza9f3053d2014-03-06 15:14:33 -0800133 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
134 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(2));
135 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(minBufferCount));
136 EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(
Jamie Gennisc68f2ec2012-08-30 18:36:22 -0700137 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
138}
139
Dan Stoza9f3053d2014-03-06 15:14:33 -0800140TEST_F(BufferQueueTest, DetachAndReattachOnProducerSide) {
141 sp<DummyConsumer> dc(new DummyConsumer);
142 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
143 IGraphicBufferProducer::QueueBufferOutput output;
144 ASSERT_EQ(OK,
145 mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
146
147 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(-1)); // Index too low
148 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(
149 BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
150 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(0)); // Not dequeued
151
152 int slot;
153 sp<Fence> fence;
154 sp<GraphicBuffer> buffer;
155 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
156 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
157 GRALLOC_USAGE_SW_WRITE_OFTEN));
158 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not requested
159 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
160 ASSERT_EQ(OK, mProducer->detachBuffer(slot));
161 ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not dequeued
162
163 sp<GraphicBuffer> safeToClobberBuffer;
164 // Can no longer request buffer from this slot
165 ASSERT_EQ(BAD_VALUE, mProducer->requestBuffer(slot, &safeToClobberBuffer));
166
167 uint32_t* dataIn;
168 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
169 reinterpret_cast<void**>(&dataIn)));
170 *dataIn = 0x12345678;
171 ASSERT_EQ(OK, buffer->unlock());
172
173 int newSlot;
174 ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(NULL, safeToClobberBuffer));
175 ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&newSlot, NULL));
176
177 ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, buffer));
178 IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
179 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
180 ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
181
182 IGraphicBufferConsumer::BufferItem item;
183 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
184
185 uint32_t* dataOut;
186 ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
187 reinterpret_cast<void**>(&dataOut)));
188 ASSERT_EQ(*dataOut, 0x12345678);
189}
190
191TEST_F(BufferQueueTest, DetachAndReattachOnConsumerSide) {
192 sp<DummyConsumer> dc(new DummyConsumer);
193 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
194 IGraphicBufferProducer::QueueBufferOutput output;
195 ASSERT_EQ(OK,
196 mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
197
198 int slot;
199 sp<Fence> fence;
200 sp<GraphicBuffer> buffer;
201 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
202 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
203 GRALLOC_USAGE_SW_WRITE_OFTEN));
204 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
205 IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
206 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
207 ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
208
209 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(-1)); // Index too low
210 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(
211 BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
212 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(0)); // Not acquired
213
214 IGraphicBufferConsumer::BufferItem item;
215 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
216
217 ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
218 ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(item.mBuf)); // Not acquired
219
220 uint32_t* dataIn;
221 ASSERT_EQ(OK, item.mGraphicBuffer->lock(
222 GraphicBuffer::USAGE_SW_WRITE_OFTEN,
223 reinterpret_cast<void**>(&dataIn)));
224 *dataIn = 0x12345678;
225 ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
226
227 int newSlot;
228 sp<GraphicBuffer> safeToClobberBuffer;
229 ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(NULL, safeToClobberBuffer));
230 ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&newSlot, NULL));
231 ASSERT_EQ(OK, mConsumer->attachBuffer(&newSlot, item.mGraphicBuffer));
232
233 ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mBuf, 0, EGL_NO_DISPLAY,
234 EGL_NO_SYNC_KHR, Fence::NO_FENCE));
235
236 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
237 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
238 GRALLOC_USAGE_SW_WRITE_OFTEN));
239 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
240
241 uint32_t* dataOut;
242 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
243 reinterpret_cast<void**>(&dataOut)));
244 ASSERT_EQ(*dataOut, 0x12345678);
245}
246
247TEST_F(BufferQueueTest, MoveFromConsumerToProducer) {
248 sp<DummyConsumer> dc(new DummyConsumer);
249 ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
250 IGraphicBufferProducer::QueueBufferOutput output;
251 ASSERT_EQ(OK,
252 mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
253
254 int slot;
255 sp<Fence> fence;
256 sp<GraphicBuffer> buffer;
257 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
258 mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
259 GRALLOC_USAGE_SW_WRITE_OFTEN));
260 ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
261
262 uint32_t* dataIn;
263 ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
264 reinterpret_cast<void**>(&dataIn)));
265 *dataIn = 0x12345678;
266 ASSERT_EQ(OK, buffer->unlock());
267
268 IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
269 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
270 ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
271
272 IGraphicBufferConsumer::BufferItem item;
273 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
274 ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
275
276 int newSlot;
277 ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, item.mGraphicBuffer));
278 ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
279 ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
280
281 uint32_t* dataOut;
282 ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
283 reinterpret_cast<void**>(&dataOut)));
284 ASSERT_EQ(*dataOut, 0x12345678);
285}
286
Jamie Gennis9e75ddd2012-08-31 15:32:45 -0700287} // namespace android