blob: 1d7ccfc7af76746174a6837e6df8794c08e85c91 [file] [log] [blame]
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <utility>
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/buffer_format_util.h"
namespace gfx {
class NativePixmapDmaBufTest
: public ::testing::TestWithParam<gfx::BufferFormat> {
protected:
gfx::NativePixmapHandle CreateMockNativePixmapHandle(
gfx::Size image_size,
const gfx::BufferFormat format) {
gfx::NativePixmapHandle handle;
handle.modifier = 1;
const int num_planes = gfx::NumberOfPlanesForLinearBufferFormat(format);
for (int i = 0; i < num_planes; ++i) {
// These values are arbitrarily chosen to be different from each other.
const int stride = (i + 1) * image_size.width();
const int offset = i * image_size.width() * image_size.height();
const uint64_t size = stride * image_size.height();
base::ScopedFD fd(open("/dev/zero", O_RDONLY));
EXPECT_TRUE(fd.is_valid());
handle.planes.emplace_back(stride, offset, size, std::move(fd));
}
return handle;
}
};
INSTANTIATE_TEST_SUITE_P(ConvertTest,
NativePixmapDmaBufTest,
::testing::Values(gfx::BufferFormat::RGBX_8888,
gfx::BufferFormat::YVU_420));
// Verifies NativePixmapDmaBuf conversion from and to NativePixmapHandle.
TEST_P(NativePixmapDmaBufTest, Convert) {
const gfx::BufferFormat format = GetParam();
const gfx::Size image_size(128, 64);
gfx::NativePixmapHandle handle =
CreateMockNativePixmapHandle(image_size, format);
gfx::NativePixmapHandle handle_clone = CloneHandleForIPC(handle);
// NativePixmapHandle to NativePixmapDmabuf
scoped_refptr<gfx::NativePixmap> native_pixmap_dmabuf(
new gfx::NativePixmapDmaBuf(image_size, format, std::move(handle)));
EXPECT_TRUE(native_pixmap_dmabuf->AreDmaBufFdsValid());
EXPECT_EQ(native_pixmap_dmabuf->GetBufferFormatModifier(),
handle_clone.modifier);
// NativePixmap to NativePixmapHandle.
const size_t num_planes = gfx::NumberOfPlanesForLinearBufferFormat(
native_pixmap_dmabuf->GetBufferFormat());
for (size_t i = 0; i < num_planes; ++i) {
EXPECT_EQ(native_pixmap_dmabuf->GetDmaBufPitch(i),
handle_clone.planes[i].stride);
EXPECT_EQ(native_pixmap_dmabuf->GetDmaBufOffset(i),
handle_clone.planes[i].offset);
EXPECT_EQ(native_pixmap_dmabuf->GetDmaBufPlaneSize(i),
static_cast<size_t>(handle_clone.planes[i].size));
}
}
} // namespace gfx