blob: c2698f100ce3126a197ed93d7ec517f4951c1c75 [file] [log] [blame]
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <gtest/gtest.h>
#include "AndroidWindow.h"
#include "Vsync.h"
#include "android/base/memory/ScopedPtr.h"
#include "android/base/system/System.h"
#include <atomic>
#include <memory>
#include <vector>
using android::base::System;
namespace aemu {
TEST(AndroidWindow, Basic) {
const int kWidth = 1920;
const int kHeight = 1080;
auto window = android::base::makeCustomScopedPtr(
create_host_anativewindow(kWidth, kHeight),
destroy_host_anativewindow);
int width = 0;
int height = 0;
ANativeWindow_query(window.get(), ANATIVEWINDOW_QUERY_DEFAULT_WIDTH,
&width);
ANativeWindow_query(window.get(), ANATIVEWINDOW_QUERY_DEFAULT_HEIGHT,
&height);
EXPECT_EQ(kWidth, width);
EXPECT_EQ(kHeight, height);
int minSwapInterval = 0;
int maxSwapInterval = 0;
ANativeWindow_query(window.get(), ANATIVEWINDOW_QUERY_MIN_SWAP_INTERVAL,
&minSwapInterval);
ANativeWindow_query(window.get(), ANATIVEWINDOW_QUERY_MAX_SWAP_INTERVAL,
&maxSwapInterval);
EXPECT_EQ(0, minSwapInterval);
EXPECT_EQ(1, maxSwapInterval);
}
TEST(AndroidWindow, BufferQueue) {
auto window = android::base::makeCustomScopedPtr(
create_host_anativewindow(256, 256), destroy_host_anativewindow);
AndroidWindow* aWindow = AndroidWindow::getSelf(window.get());
AndroidBufferQueue toWindow;
AndroidBufferQueue fromWindow;
aWindow->setProducer(&toWindow, &fromWindow);
std::vector<AndroidBufferQueue::Item> itemsForQueueing = {
{nullptr, 0},
{nullptr, 1},
{nullptr, 2},
};
const size_t bufferCount = itemsForQueueing.size();
for (const auto& item : itemsForQueueing) {
toWindow.queueBuffer(item);
}
for (size_t i = 0; i < bufferCount; i++) {
AndroidBufferQueue::Item item;
ANativeWindow_dequeueBuffer(window.get(), &item.buffer, &item.fenceFd);
EXPECT_EQ(itemsForQueueing[i].buffer, item.buffer);
EXPECT_EQ(itemsForQueueing[i].fenceFd, item.fenceFd);
ANativeWindow_queueBuffer(window.get(), item.buffer, item.fenceFd);
}
for (size_t i = 0; i < bufferCount; i++) {
AndroidBufferQueue::Item item;
fromWindow.dequeueBuffer(&item);
EXPECT_EQ(itemsForQueueing[i].buffer, item.buffer);
EXPECT_EQ(itemsForQueueing[i].fenceFd, item.fenceFd);
}
}
// TestSystem will totally mess this up. Disable for now
TEST(Vsync, DISABLED_Basic) {
std::atomic<int> count { 0 };
Vsync vsync(1000, [&count]() { ++count; });
constexpr System::Duration kSleepIntervalMs = 20;
constexpr System::Duration kSleepLimitMs = 15000;
System::Duration totalSleepMs = 0;
while (count.load(std::memory_order_relaxed) == 0) {
totalSleepMs += kSleepIntervalMs;
System::get()->sleepMs(kSleepIntervalMs);
ASSERT_LE(totalSleepMs, kSleepLimitMs);
}
vsync.join();
}
} // namespace aemu