Index: components/viz/common/server_gpu_memory_buffer_manager_unittest.cc |
diff --git a/components/viz/common/server_gpu_memory_buffer_manager_unittest.cc b/components/viz/common/server_gpu_memory_buffer_manager_unittest.cc |
deleted file mode 100644 |
index fdf7e3f33e5c81fefe8d3341f639b61e6a0a918b..0000000000000000000000000000000000000000 |
--- a/components/viz/common/server_gpu_memory_buffer_manager_unittest.cc |
+++ /dev/null |
@@ -1,258 +0,0 @@ |
-// Copyright 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 "components/viz/common/server_gpu_memory_buffer_manager.h" |
- |
-#include "base/test/scoped_task_environment.h" |
-#include "gpu/ipc/host/gpu_memory_buffer_support.h" |
-#include "services/ui/gpu/interfaces/gpu_service.mojom.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/gfx/client_native_pixmap_factory.h" |
- |
-namespace viz { |
- |
-namespace { |
- |
-class TestGpuService : public ui::mojom::GpuService { |
- public: |
- TestGpuService() {} |
- ~TestGpuService() override {} |
- |
- bool HasAllocationRequest(gfx::GpuMemoryBufferId id, int client_id) const { |
- for (const auto& req : allocation_requests_) { |
- if (req.id == id && req.client_id == client_id) |
- return true; |
- } |
- return false; |
- } |
- |
- bool HasDestructionRequest(gfx::GpuMemoryBufferId id, int client_id) const { |
- for (const auto& req : destruction_requests_) { |
- if (req.id == id && req.client_id == client_id) |
- return true; |
- } |
- return false; |
- } |
- |
- void SatisfyAllocationRequest(gfx::GpuMemoryBufferId id, int client_id) { |
- for (const auto& req : allocation_requests_) { |
- if (req.id == id && req.client_id == client_id) { |
- gfx::GpuMemoryBufferHandle handle; |
- handle.id = id; |
- handle.type = gfx::SHARED_MEMORY_BUFFER; |
- req.callback.Run(handle); |
- return; |
- } |
- } |
- NOTREACHED(); |
- } |
- |
- // ui::mojom::GpuService: |
- void EstablishGpuChannel( |
- int32_t client_id, |
- uint64_t client_tracing_id, |
- bool is_gpu_host, |
- const EstablishGpuChannelCallback& callback) override {} |
- |
- void CloseChannel(int32_t client_id) override {} |
- |
- void CreateGpuMemoryBuffer( |
- gfx::GpuMemoryBufferId id, |
- const gfx::Size& size, |
- gfx::BufferFormat format, |
- gfx::BufferUsage usage, |
- int client_id, |
- gpu::SurfaceHandle surface_handle, |
- const CreateGpuMemoryBufferCallback& callback) override { |
- allocation_requests_.push_back( |
- {id, size, format, usage, client_id, callback}); |
- } |
- |
- void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, |
- int client_id, |
- const gpu::SyncToken& sync_token) override { |
- destruction_requests_.push_back({id, client_id}); |
- } |
- |
- void GetVideoMemoryUsageStats( |
- const GetVideoMemoryUsageStatsCallback& callback) override {} |
- |
- void RequestCompleteGpuInfo( |
- const RequestCompleteGpuInfoCallback& callback) override {} |
- |
- void LoadedShader(const std::string& data) override {} |
- |
- void DestroyingVideoSurface( |
- int32_t surface_id, |
- const DestroyingVideoSurfaceCallback& callback) override {} |
- |
- void WakeUpGpu() override {} |
- |
- void GpuSwitched() override {} |
- |
- void DestroyAllChannels() override {} |
- |
- void Crash() override {} |
- |
- void Hang() override {} |
- |
- void ThrowJavaException() override {} |
- |
- void Stop(const StopCallback& callback) override {} |
- |
- private: |
- struct AllocationRequest { |
- const gfx::GpuMemoryBufferId id; |
- const gfx::Size size; |
- const gfx::BufferFormat format; |
- const gfx::BufferUsage usage; |
- const int client_id; |
- const CreateGpuMemoryBufferCallback callback; |
- }; |
- std::vector<AllocationRequest> allocation_requests_; |
- |
- struct DestructionRequest { |
- const gfx::GpuMemoryBufferId id; |
- const int client_id; |
- }; |
- std::vector<DestructionRequest> destruction_requests_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestGpuService); |
-}; |
- |
-// It is necessary to install a custom pixmap factory which claims to support |
-// all native configurations, so that code that deals with this can be tested |
-// correctly. |
-class FakeClientNativePixmapFactory : public gfx::ClientNativePixmapFactory { |
- public: |
- FakeClientNativePixmapFactory() {} |
- ~FakeClientNativePixmapFactory() override {} |
- |
- // gfx::ClientNativePixmapFactory: |
- bool IsConfigurationSupported(gfx::BufferFormat format, |
- gfx::BufferUsage usage) const override { |
- return true; |
- } |
- std::unique_ptr<gfx::ClientNativePixmap> ImportFromHandle( |
- const gfx::NativePixmapHandle& handle, |
- const gfx::Size& size, |
- gfx::BufferUsage usage) override { |
- NOTREACHED(); |
- return nullptr; |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FakeClientNativePixmapFactory); |
-}; |
- |
-} // namespace |
- |
-class ServerGpuMemoryBufferManagerTest : public ::testing::Test { |
- public: |
- ServerGpuMemoryBufferManagerTest() = default; |
- ~ServerGpuMemoryBufferManagerTest() override = default; |
- |
- // ::testing::Test: |
- void SetUp() override { |
- gfx::ClientNativePixmapFactory::ResetInstance(); |
- gfx::ClientNativePixmapFactory::SetInstance(&pixmap_factory_); |
- } |
- |
- void TearDown() override { gfx::ClientNativePixmapFactory::ResetInstance(); } |
- |
- private: |
- base::test::ScopedTaskEnvironment env_; |
- FakeClientNativePixmapFactory pixmap_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ServerGpuMemoryBufferManagerTest); |
-}; |
- |
-// Tests that allocation requests from a client that goes away before allocation |
-// completes are cleaned up correctly. |
-TEST_F(ServerGpuMemoryBufferManagerTest, AllocationRequestsForDestroyedClient) { |
-#if !defined(USE_OZONE) && !defined(OS_MACOSX) |
- // Not all platforms support native configurations (currently only ozone and |
- // mac support it). Abort the test in those platforms. |
- DCHECK(gpu::GetNativeGpuMemoryBufferConfigurations().empty()); |
- return; |
-#else |
- // Note: ServerGpuMemoryBufferManager normally operates on a mojom::GpuService |
- // implementation over mojo. Which means the communication from SGMBManager to |
- // GpuService is asynchronous. In this test, the mojom::GpuService is not |
- // bound to a mojo pipe, which means those calls are all synchronous. |
- TestGpuService gpu_service; |
- ServerGpuMemoryBufferManager manager(&gpu_service, 1); |
- |
- const auto buffer_id = static_cast<gfx::GpuMemoryBufferId>(1); |
- const int client_id = 2; |
- const gfx::Size size(10, 20); |
- const gfx::BufferFormat format = gfx::BufferFormat::RGBA_8888; |
- const gfx::BufferUsage usage = gfx::BufferUsage::GPU_READ; |
- manager.AllocateGpuMemoryBuffer( |
- buffer_id, client_id, size, format, usage, gpu::kNullSurfaceHandle, |
- base::BindOnce([](const gfx::GpuMemoryBufferHandle& handle) {})); |
- EXPECT_TRUE(gpu_service.HasAllocationRequest(buffer_id, client_id)); |
- EXPECT_FALSE(gpu_service.HasDestructionRequest(buffer_id, client_id)); |
- |
- // Destroy the client. Since no memory has been allocated yet, there will be |
- // no request for freeing memory. |
- manager.DestroyAllGpuMemoryBufferForClient(client_id); |
- EXPECT_TRUE(gpu_service.HasAllocationRequest(buffer_id, client_id)); |
- EXPECT_FALSE(gpu_service.HasDestructionRequest(buffer_id, client_id)); |
- |
- // When the host receives the allocated memory for the destroyed client, it |
- // should request the allocated memory to be freed. |
- gpu_service.SatisfyAllocationRequest(buffer_id, client_id); |
- EXPECT_TRUE(gpu_service.HasDestructionRequest(buffer_id, client_id)); |
-#endif |
-} |
- |
-TEST_F(ServerGpuMemoryBufferManagerTest, |
- RequestsFromUntrustedClientsValidated) { |
- gfx::ClientNativePixmapFactory::ResetInstance(); |
- TestGpuService gpu_service; |
- ServerGpuMemoryBufferManager manager(&gpu_service, 1); |
- const auto buffer_id = static_cast<gfx::GpuMemoryBufferId>(1); |
- const int client_id = 2; |
- // SCANOUT cannot be used if native gpu memory buffer is not supported. |
- // When ATC is used, both width and height should be multiples of 4. |
- struct { |
- gfx::BufferUsage usage; |
- gfx::BufferFormat format; |
- gfx::Size size; |
- bool expect_null_handle; |
- } configs[] = { |
- {gfx::BufferUsage::SCANOUT, gfx::BufferFormat::YVU_420, {10, 20}, true}, |
- {gfx::BufferUsage::GPU_READ, gfx::BufferFormat::ATC, {10, 20}, true}, |
- {gfx::BufferUsage::GPU_READ, gfx::BufferFormat::YVU_420, {10, 20}, false}, |
- }; |
- for (const auto& config : configs) { |
- gfx::GpuMemoryBufferHandle allocated_handle; |
- base::RunLoop runloop; |
- manager.AllocateGpuMemoryBuffer( |
- buffer_id, client_id, config.size, config.format, config.usage, |
- gpu::kNullSurfaceHandle, |
- base::BindOnce( |
- [](gfx::GpuMemoryBufferHandle* allocated_handle, |
- const base::Closure& callback, |
- const gfx::GpuMemoryBufferHandle& handle) { |
- *allocated_handle = handle; |
- callback.Run(); |
- }, |
- &allocated_handle, runloop.QuitClosure())); |
- // Since native gpu memory buffers are not supported, the mojom.GpuService |
- // should not receive any allocation requests. |
- EXPECT_FALSE(gpu_service.HasAllocationRequest(buffer_id, client_id)); |
- runloop.Run(); |
- if (config.expect_null_handle) { |
- EXPECT_TRUE(allocated_handle.is_null()); |
- } else { |
- EXPECT_FALSE(allocated_handle.is_null()); |
- EXPECT_EQ(gfx::GpuMemoryBufferType::SHARED_MEMORY_BUFFER, |
- allocated_handle.type); |
- } |
- } |
-} |
- |
-} // namespace viz |