44
55#pragma once
66
7+ void commandWork_assert (bool , const char * msg);
8+ void commandWork_updateMoved (QueueSubmitter*, uint64_t , unsigned int ,
9+ const vk::CommandBuffer&);
10+
711template <typename R>
812CommandWork<R>::CommandWork(QueueSubmitter& submitter, CommandBuffer&& cmd) :
913 cmdBuffer_ (std::move(cmd))
1014{
15+ commandWork_assert (cmdBuffer_, " invalid commandBuffer passed" );
1116 init (submitter, {{}, {}, {}, 1 , &cmdBuffer_.vkHandle (), {}, {}});
1217}
1318
1419template <typename R>
15- CommandWork<R>::CommandWork(QueueSubmitter& submitter,
16- const vk::SubmitInfo& info, CommandBuffer&& cmd) :
17- cmdBuffer_ (std::move(cmd))
20+ CommandWork<R>::CommandWork(QueueSubmitter& submitter, const vk::SubmitInfo& info)
1821{
1922 init (submitter, info);
2023}
@@ -30,30 +33,44 @@ CommandWork<R>::~CommandWork()
3033template <typename R>
3134void CommandWork<R>::init(QueueSubmitter& submitter, const vk::SubmitInfo& info)
3235{
36+ commandWork_assert (state_ == WorkBase::State::none,
37+ " already initialized" );
38+
3339 submitter_ = &submitter;
34- submitID_ = submitter.add (info);
40+ submitID_ = submitter.add (info, &infoID_ );
3541 state_ = WorkBase::State::pending;
3642}
3743
3844template <typename R>
3945void CommandWork<R>::submit()
4046{
41- // dlg_assert (state_ != WorkBase::State::none);
42- // dlg_assert(submitter_ && submitID_ );
47+ commandWork_assert (state_ != WorkBase::State::none && submitter_ && submitID_,
48+ " submit: invalid " );
4349
44- submitter_->submit (submitID_);
45- state_ = WorkBase::State::submitted;
50+ if (this ->pending ()) {
51+ submitter_->submit (submitID_);
52+ state_ = WorkBase::State::submitted;
53+ }
4654}
4755
4856template <typename R>
4957void CommandWork<R>::wait()
5058{
51- // dlg_assert(state_ != WorkBase::State::none);
52- // dlg_assert(submitter_ && submitID_);
59+ commandWork_assert (state_ != WorkBase::State::none && submitter_ && submitID_,
60+ " wait: invalid" );
61+
62+ if (!this ->executed ()) {
63+ submitter_->wait (submitID_); // will automatically submit if needed
64+ }
5365
54- submitter_->wait (submitID_); // will automatically submit if needed
5566 cmdBuffer_ = {}; // free the commandBuffer it is no longer needed
56- state_ = WorkBase::State::executed;
67+ state_ = WorkBase::State::finished;
68+ }
69+
70+ template <typename R>
71+ void CommandWork<R>::finish()
72+ {
73+ wait ();
5774}
5875
5976template <typename R>
@@ -64,15 +81,12 @@ WorkBase::State CommandWork<R>::state()
6481 }
6582
6683 // query state
67- // dlg_assert(submitID_);
68- // dlg_assert(submitter_);
69-
7084 if (state_ == WorkBase::State::pending && submitter_->submitted (submitID_)) {
7185 state_ = WorkBase::State::submitted;
7286 }
7387
7488 if (state_ == WorkBase::State::submitted && submitter_->completed (submitID_)) {
75- state_ = WorkBase::State::executed ;
89+ state_ = WorkBase::State::finished ;
7690 }
7791
7892 return state_;
@@ -81,11 +95,14 @@ WorkBase::State CommandWork<R>::state()
8195template <typename R>
8296CommandWork<R>::CommandWork(CommandWork&& rhs) noexcept :
8397 cmdBuffer_ (std::move(rhs.cmdBuffer_)), submitter_(rhs.submitter_),
84- submitID_(rhs.submitID_), state_(rhs.state_)
98+ submitID_(rhs.submitID_), infoID_(rhs.infoID_), state_(rhs.state_)
8599{
86100 rhs.submitter_ = {};
87101 rhs.submitID_ = {};
88102 rhs.state_ = WorkBase::State::none;
103+ rhs.infoID_ = {};
104+
105+ commandWork_updateMoved (submitter_, submitID_, infoID_, cmdBuffer_.vkHandle ());
89106}
90107
91108template <typename R>
@@ -98,11 +115,15 @@ CommandWork<R>& CommandWork<R>::operator=(CommandWork&& rhs) noexcept
98115 cmdBuffer_ = std::move (rhs.cmdBuffer_ );
99116 submitter_ = rhs.submitter_ ;
100117 submitID_ = rhs.submitID_ ;
118+ infoID_ = rhs.infoID_ ;
101119 state_ = rhs.state_ ;
102120
103121 rhs.submitter_ = {};
104122 rhs.submitID_ = {};
123+ rhs.infoID_ = {};
105124 rhs.state_ = WorkBase::State::none;
106125
126+ commandWork_updateMoved (submitter_, submitID_, infoID_, cmdBuffer_.vkHandle ());
127+
107128 return *this ;
108129}
0 commit comments