@@ -45,9 +45,10 @@ static const size_t kNumThreads = std::max(4u, std::thread::hardware_concurrency
4545TEST (GPUUploadManagerPageTest, States)
4646{
4747 {
48- GPUUploadManagerImpl::Page Page{0 };
49- EXPECT_TRUE (Page.TryBeginWriting ()) << " Should be able to begin writing to a new page" ;
50- EXPECT_TRUE (Page.EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed after the first writer finishes" ;
48+ GPUUploadManagerImpl::Page Page{0 };
49+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
50+ EXPECT_TRUE (Writer) << " Should be able to begin writing to a new page" ;
51+ EXPECT_TRUE (Writer.EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed after the first writer finishes" ;
5152 }
5253
5354 {
@@ -57,44 +58,50 @@ TEST(GPUUploadManagerPageTest, States)
5758 EXPECT_FALSE (Page.TryBeginWriting ()) << " Should not be able to begin writing to a sealed page" ;
5859
5960 Page.Reset (nullptr );
60- EXPECT_TRUE (Page.TryBeginWriting ()) << " Should be able to begin writing after resetting the page" ;
61- EXPECT_EQ (Page.EndWriting (), GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed after the first writer finishes" ;
61+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
62+ EXPECT_TRUE (Writer) << " Should be able to begin writing after resetting the page" ;
63+ EXPECT_EQ (Writer.EndWriting (), GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed after the first writer finishes" ;
6264 EXPECT_EQ (Page.TrySeal (), GPUUploadManagerImpl::Page::SealStatus::Ready) << " Page with no active writers should be ready immediately" ;
6365 }
6466
6567 {
66- GPUUploadManagerImpl::Page Page{0 };
67- EXPECT_TRUE (Page.TryBeginWriting ()) << " Should be able to begin writing to a new page" ;
68- EXPECT_TRUE (Page.TryBeginWriting ());
68+ GPUUploadManagerImpl::Page Page{0 };
69+ GPUUploadManagerImpl::Page::Writer Writer1 = Page.TryBeginWriting ();
70+ GPUUploadManagerImpl::Page::Writer Writer2 = Page.TryBeginWriting ();
71+
72+ EXPECT_TRUE (Writer1) << " Should be able to begin writing to a new page" ;
73+ EXPECT_TRUE (Writer2);
6974 EXPECT_EQ (Page.TrySeal (), GPUUploadManagerImpl::Page::SealStatus::NotReady) << " Page with active writers should not be ready" ;
70- EXPECT_TRUE (Page .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotLastWriter) << " Writer should not be the last one to finish" ;
71- EXPECT_TRUE (Page .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::LastWriterSealed) << " Writer should be the last one to finish" ;
75+ EXPECT_TRUE (Writer1 .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotLastWriter) << " Writer should not be the last one to finish" ;
76+ EXPECT_TRUE (Writer2 .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::LastWriterSealed) << " Writer should be the last one to finish" ;
7277 }
7378
7479 {
75- GPUUploadManagerImpl::Page Page{1024 };
76- EXPECT_TRUE (Page.TryBeginWriting ()) << " Should be able to begin writing to a new page" ;
77- EXPECT_TRUE (Page.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
78- EXPECT_TRUE (Page.ScheduleBufferUpdate (nullptr , 512 , 512 , nullptr , nullptr , nullptr ));
79- EXPECT_FALSE (Page.ScheduleBufferUpdate (nullptr , 1024 , 512 , nullptr , nullptr , nullptr )) << " Should not be able to schedule an update that exceeds the page size" ;
80+ GPUUploadManagerImpl::Page Page{1024 };
81+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
82+ EXPECT_TRUE (Writer) << " Should be able to begin writing to a new page" ;
83+ EXPECT_TRUE (Writer.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
84+ EXPECT_TRUE (Writer.ScheduleBufferUpdate (nullptr , 512 , 512 , nullptr , nullptr , nullptr ));
85+ EXPECT_FALSE (Writer.ScheduleBufferUpdate (nullptr , 1024 , 512 , nullptr , nullptr , nullptr )) << " Should not be able to schedule an update that exceeds the page size" ;
8086 EXPECT_EQ (Page.GetNumPendingOps (), size_t {2 });
81- EXPECT_TRUE (Page .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed" ;
87+ EXPECT_TRUE (Writer .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed" ;
8288 EXPECT_EQ (Page.TrySeal (), GPUUploadManagerImpl::Page::SealStatus::Ready) << " Page with no active writers should be ready immediately" ;
8389 EXPECT_EQ (Page.GetNumPendingOps (), size_t {2 });
8490 Page.ExecutePendingOps (nullptr , 0 );
8591 EXPECT_EQ (Page.GetNumPendingOps (), size_t {0 });
8692 }
8793
8894 {
89- GPUUploadManagerImpl::Page Page{1024 };
90- EXPECT_TRUE (Page.TryBeginWriting ()) << " Should be able to begin writing to a new page" ;
91- EXPECT_TRUE (Page.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
92- EXPECT_FALSE (Page.ScheduleBufferUpdate (nullptr , 0 , 1024 , nullptr , nullptr , nullptr ));
93- EXPECT_TRUE (Page.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
94- EXPECT_FALSE (Page.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
95- EXPECT_TRUE (Page.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
96- EXPECT_FALSE (Page.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
97- EXPECT_EQ (Page.EndWriting (), GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed" ;
95+ GPUUploadManagerImpl::Page Page{1024 };
96+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
97+ EXPECT_TRUE (Writer) << " Should be able to begin writing to a new page" ;
98+ EXPECT_TRUE (Writer.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
99+ EXPECT_FALSE (Writer.ScheduleBufferUpdate (nullptr , 0 , 1024 , nullptr , nullptr , nullptr ));
100+ EXPECT_TRUE (Writer.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
101+ EXPECT_FALSE (Writer.ScheduleBufferUpdate (nullptr , 0 , 512 , nullptr , nullptr , nullptr ));
102+ EXPECT_TRUE (Writer.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
103+ EXPECT_FALSE (Writer.ScheduleBufferUpdate (nullptr , 0 , 256 , nullptr , nullptr , nullptr ));
104+ EXPECT_EQ (Writer.EndWriting (), GPUUploadManagerImpl::Page::WritingStatus::NotSealed) << " Page should not be sealed" ;
98105 EXPECT_EQ (Page.TrySeal (), GPUUploadManagerImpl::Page::SealStatus::Ready) << " Page with no active writers should be ready immediately" ;
99106 }
100107}
@@ -117,19 +124,20 @@ TEST(GPUUploadManagerPageTest, ParallelTryBeginWriting)
117124 threads.emplace_back ([&]() {
118125 StartSignal.Wait (true , static_cast <int >(kNumThreads ));
119126
120- Uint32 NumWrites = 0 ;
127+ std::vector<GPUUploadManagerImpl::Page::Writer> Writers;
128+ Writers.reserve (kNumIterations );
121129
122130 bool IsSealed = false ;
123131 for (size_t i = 0 ; i < kNumIterations ; ++i)
124132 {
125- bool WriteStarted = Page.TryBeginWriting ();
126- if (WriteStarted )
127- ++NumWrites ;
133+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
134+ if (Writer )
135+ Writers. emplace_back ( std::move (Writer)) ;
128136 else
129137 IsSealed = true ;
130138
131139 if (IsSealed)
132- EXPECT_FALSE (WriteStarted ) << " No writes can be started after the page is sealed" ;
140+ EXPECT_FALSE (Writer ) << " No writes can be started after the page is sealed" ;
133141 }
134142
135143 if (Page.TrySeal () == GPUUploadManagerImpl::Page::SealStatus::AlreadySealed)
@@ -140,13 +148,13 @@ TEST(GPUUploadManagerPageTest, ParallelTryBeginWriting)
140148 EXPECT_FALSE (Page.TryBeginWriting ()) << " No writes can be started after the page is sealed" ;
141149 }
142150
143- for (size_t i = 0 ; i < NumWrites; ++i )
151+ for (GPUUploadManagerImpl::Page::Writer& Writer : Writers )
144152 {
145- if (Page .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::LastWriterSealed)
153+ if (Writer .EndWriting () == GPUUploadManagerImpl::Page::WritingStatus::LastWriterSealed)
146154 NumLastWriters.fetch_add (1 );
147155 }
148156
149- TotalWrites.fetch_add (NumWrites );
157+ TotalWrites.fetch_add (static_cast <Uint32>(Writers. size ()) );
150158 });
151159 }
152160
@@ -190,12 +198,17 @@ TEST(GPUUploadManagerPageTest, NoWritesAfterSeal)
190198 {
191199 if (IsSealed.load ())
192200 {
193- EXPECT_FALSE (Page.TryBeginWriting ()) << " No writes can be started after the page is sealed" ;
201+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
202+ EXPECT_FALSE (Writer) << " No writes can be started after the page is sealed" ;
194203 }
195204 else
196205 {
197- if (Page.TryBeginWriting ())
206+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
207+ if (Writer)
208+ {
198209 NumWritesStarted.fetch_add (1 );
210+ Writer.EndWriting ();
211+ }
199212 }
200213 }
201214 }
@@ -237,16 +250,18 @@ TEST(GPUUploadManagerPageTest, ScheduleBufferUpdateParallel)
237250 threads.emplace_back (
238251 [&](size_t ThreadId) {
239252 StartSignal.Wait (true , static_cast <int >(kNumThreads ));
240- if (Page.TryBeginWriting ())
253+
254+ GPUUploadManagerImpl::Page::Writer Writer = Page.TryBeginWriting ();
255+ if (Writer)
241256 {
242257 for (size_t i = 0 ; i < kNumIterations ; ++i)
243258 {
244- if (Page .ScheduleBufferUpdate (nullptr , 0 , kUpdateSize , nullptr , Callback, Callback))
259+ if (Writer .ScheduleBufferUpdate (nullptr , 0 , kUpdateSize , nullptr , Callback, Callback))
245260 {
246261 UpdatesScheduled.fetch_add (1 );
247262 }
248263 }
249- Page .EndWriting ();
264+ Writer .EndWriting ();
250265 }
251266 },
252267 t);
0 commit comments