Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
pipeline_compile_queue_vulkan_unittests.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <atomic>
8#include <memory>
9#include <mutex>
10#include <vector>
11
16
17namespace impeller {
18namespace testing {
19
20TEST(PipelineCompileQueueVulkanTest, CreateSucceedsWithValidTaskRunner) {
22 auto queue = PipelineCompileQueueVulkan::Create(loop->GetTaskRunner());
23 EXPECT_NE(queue, nullptr);
24}
25
26TEST(PipelineCompileQueueVulkanTest, PostJobDoesNothingWithNullClosure) {
28 auto queue = PipelineCompileQueueVulkan::Create(loop->GetTaskRunner());
29 ASSERT_NE(queue, nullptr);
30
31 queue->PostJob(nullptr);
32}
33
34TEST(PipelineCompileQueueVulkanTest, OnJobAddedProcessesJobsInParallel) {
36 auto queue = PipelineCompileQueueVulkan::Create(loop->GetTaskRunner());
37 ASSERT_NE(queue, nullptr);
38
39 std::atomic<int> concurrent_jobs{0};
40 std::atomic<int> max_concurrent{0};
41 fml::CountDownLatch latch(3);
42
46
50
54
55 queue->PostJobForDescriptor(desc1, [&]() {
56 int current = ++concurrent_jobs;
57 int prev_max = max_concurrent.load();
58 while (current > prev_max &&
59 !max_concurrent.compare_exchange_weak(prev_max, current)) {
60 }
61 std::this_thread::sleep_for(std::chrono::milliseconds(10));
62 concurrent_jobs--;
63 latch.CountDown();
64 });
65
66 queue->PostJobForDescriptor(desc2, [&]() {
67 int current = ++concurrent_jobs;
68 int prev_max = max_concurrent.load();
69 while (current > prev_max &&
70 !max_concurrent.compare_exchange_weak(prev_max, current)) {
71 }
72 std::this_thread::sleep_for(std::chrono::milliseconds(10));
73 concurrent_jobs--;
74 latch.CountDown();
75 });
76
77 queue->PostJobForDescriptor(desc3, [&]() {
78 int current = ++concurrent_jobs;
79 int prev_max = max_concurrent.load();
80 while (current > prev_max &&
81 !max_concurrent.compare_exchange_weak(prev_max, current)) {
82 }
83 std::this_thread::sleep_for(std::chrono::milliseconds(10));
84 concurrent_jobs--;
85 latch.CountDown();
86 });
87
88 latch.Wait();
89
90 EXPECT_GE(max_concurrent.load(), 1);
91}
92
93TEST(PipelineCompileQueueVulkanTest,
94 PostJobForDescriptorWithDuplicateRunsEagerly) {
96 auto queue = PipelineCompileQueueVulkan::Create(loop->GetTaskRunner());
97 ASSERT_NE(queue, nullptr);
98
99 std::atomic<int> first_job_count{0};
100 std::atomic<int> second_job_count{0};
101 fml::CountDownLatch latch(2);
102
104
105 queue->PostJobForDescriptor(desc, [&]() {
106 first_job_count++;
107 latch.CountDown();
108 });
109
110 queue->PostJobForDescriptor(desc, [&]() {
111 second_job_count++;
112 latch.CountDown();
113 });
114
115 latch.Wait();
116
117 EXPECT_EQ(first_job_count, 1);
118 EXPECT_EQ(second_job_count, 1);
119}
120
121TEST(PipelineCompileQueueVulkanTest, MultipleJobsCompleteSuccessfully) {
123 auto queue = PipelineCompileQueueVulkan::Create(loop->GetTaskRunner());
124 ASSERT_NE(queue, nullptr);
125
126 std::atomic<int> completed_jobs{0};
127 fml::CountDownLatch latch(5);
128
129 PipelineDescriptor desc1;
132
133 PipelineDescriptor desc2;
136
137 PipelineDescriptor desc3;
140
141 PipelineDescriptor desc4;
144
145 PipelineDescriptor desc5;
148
149 // Post 5 jobs with distinct descriptors
150 queue->PostJobForDescriptor(desc1, [&]() {
151 completed_jobs++;
152 latch.CountDown();
153 });
154
155 queue->PostJobForDescriptor(desc2, [&]() {
156 completed_jobs++;
157 latch.CountDown();
158 });
159
160 queue->PostJobForDescriptor(desc3, [&]() {
161 completed_jobs++;
162 latch.CountDown();
163 });
164
165 queue->PostJobForDescriptor(desc4, [&]() {
166 completed_jobs++;
167 latch.CountDown();
168 });
169
170 queue->PostJobForDescriptor(desc5, [&]() {
171 completed_jobs++;
172 latch.CountDown();
173 });
174
175 latch.Wait();
176
177 EXPECT_EQ(completed_jobs, 5);
178}
179
180} // namespace testing
181} // namespace impeller
static std::shared_ptr< ConcurrentMessageLoop > Create(size_t worker_count=std::thread::hardware_concurrency())
static std::shared_ptr< PipelineCompileQueueVulkan > Create(std::shared_ptr< fml::BasicTaskRunner > worker_task_runner)
PipelineDescriptor & SetSampleCount(SampleCount samples)
VkQueue queue
Definition main.cc:71
TEST(FrameTimingsRecorderTest, RecordVsync)