123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // Copyright 2015 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 <stddef.h>
- #include <stdint.h>
- #include "base/system/sys_info.h"
- #include "build/build_config.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "ui/gl/gl_image_shared_memory.h"
- #include "ui/gl/test/gl_image_test_template.h"
- namespace gl {
- namespace {
- const uint8_t kGreen[] = {0x0, 0x20, 0x0, 0xFF};
- template <gfx::BufferFormat format>
- class GLImageSharedMemoryTestDelegate : public GLImageTestDelegateBase {
- public:
- scoped_refptr<GLImage> CreateSolidColorImage(const gfx::Size& size,
- const uint8_t color[4]) const {
- DCHECK_EQ(NumberOfPlanesForLinearBufferFormat(format), 1u);
- base::UnsafeSharedMemoryRegion shared_memory_region =
- base::UnsafeSharedMemoryRegion::Create(
- gfx::BufferSizeForBufferFormat(size, format));
- base::WritableSharedMemoryMapping shared_memory_mapping =
- shared_memory_region.Map();
- DCHECK(shared_memory_mapping.IsValid());
- GLImageTestSupport::SetBufferDataToColor(
- size.width(), size.height(),
- static_cast<int>(RowSizeForBufferFormat(size.width(), format, 0)), 0,
- format, color, static_cast<uint8_t*>(shared_memory_mapping.memory()));
- auto image = base::MakeRefCounted<GLImageSharedMemory>(size);
- bool rv = image->Initialize(
- shared_memory_region, gfx::GenericSharedMemoryId(0), format, 0,
- gfx::RowSizeForBufferFormat(size.width(), format, 0));
- EXPECT_TRUE(rv);
- return image;
- }
- unsigned GetTextureTarget() const { return GL_TEXTURE_2D; }
- const uint8_t* GetImageColor() { return kGreen; }
- int GetAdmissibleError() const { return 0; }
- };
- using GLImageTestTypes = testing::Types<
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::BGR_565>,
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::RGBX_8888>,
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::RGBA_8888>,
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::BGRX_8888>,
- #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
- // Fails on Win nVidia and linux android: the test writes nothing (we read
- // back the color used to clear the buffer).
- // TODO(mcasas): enable those paltforms https://crbug.com/803451.
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::RGBA_1010102>,
- // https://crbug.com/830653
- #if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \
- !defined(THREAD_SANITIZER)
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::BGRA_1010102>,
- #endif
- #endif
- GLImageSharedMemoryTestDelegate<gfx::BufferFormat::BGRA_8888>>;
- INSTANTIATE_TYPED_TEST_SUITE_P(GLImageSharedMemory,
- GLImageTest,
- GLImageTestTypes);
- INSTANTIATE_TYPED_TEST_SUITE_P(GLImageSharedMemory,
- GLImageOddSizeTest,
- GLImageTestTypes);
- INSTANTIATE_TYPED_TEST_SUITE_P(GLImageSharedMemory,
- GLImageCopyTest,
- GLImageTestTypes);
- class GLImageSharedMemoryPoolTestDelegate : public GLImageTestDelegateBase {
- public:
- scoped_refptr<GLImage> CreateSolidColorImage(const gfx::Size& size,
- const uint8_t color[4]) const {
- // Create a shared memory segment that holds an image with a stride that is
- // twice the row size and 2 pages larger than image.
- size_t stride = gfx::RowSizeForBufferFormat(
- size.width(), gfx::BufferFormat::RGBA_8888, 0) *
- 2;
- size_t pool_size =
- stride * size.height() + base::SysInfo::VMAllocationGranularity() * 3;
- base::UnsafeSharedMemoryRegion shared_memory_region =
- base::UnsafeSharedMemoryRegion::Create(pool_size);
- base::WritableSharedMemoryMapping shared_memory_mapping =
- shared_memory_region.Map();
- DCHECK(shared_memory_mapping.IsValid());
- // Initialize memory to a value that is easy to recognize if test fails.
- memset(shared_memory_mapping.memory(), 0x55, pool_size);
- // Place buffer at a non-zero non-page-aligned offset in shared memory.
- size_t buffer_offset = 3 * base::SysInfo::VMAllocationGranularity() / 2;
- GLImageTestSupport::SetBufferDataToColor(
- size.width(), size.height(), static_cast<int>(stride), 0,
- gfx::BufferFormat::RGBA_8888, color,
- static_cast<uint8_t*>(shared_memory_mapping.memory()) + buffer_offset);
- auto image = base::MakeRefCounted<GLImageSharedMemory>(size);
- bool rv =
- image->Initialize(shared_memory_region, gfx::GenericSharedMemoryId(0),
- gfx::BufferFormat::RGBA_8888, buffer_offset, stride);
- EXPECT_TRUE(rv);
- return image;
- }
- unsigned GetTextureTarget() const { return GL_TEXTURE_2D; }
- const uint8_t* GetImageColor() { return kGreen; }
- int GetAdmissibleError() const { return 0; }
- };
- // Disabled on Windows, see crbug.com/1036138
- #if !BUILDFLAG(IS_WIN)
- INSTANTIATE_TYPED_TEST_SUITE_P(GLImageSharedMemoryPool,
- GLImageCopyTest,
- GLImageSharedMemoryPoolTestDelegate);
- #endif
- } // namespace
- } // namespace gl
|