|
25 | 25 | #include "WebGPURenderTarget.h" |
26 | 26 | #include "WebGPUSwapChain.h" |
27 | 27 | #include "WebGPUTexture.h" |
| 28 | +#include "WebGPUTimerQueries.h" |
28 | 29 | #include "WebGPUVertexBuffer.h" |
29 | 30 | #include "WebGPUVertexBufferInfo.h" |
30 | 31 | #include <backend/platforms/WebGPUPlatform.h> |
@@ -216,9 +217,6 @@ void WebGPUDriver::destroyStream(Handle<HwStream> sh) { |
216 | 217 | //TODO |
217 | 218 | } |
218 | 219 |
|
219 | | -void WebGPUDriver::destroyTimerQuery(Handle<HwTimerQuery> tqh) { |
220 | | -} |
221 | | - |
222 | 220 | void WebGPUDriver::destroyDescriptorSetLayout( |
223 | 221 | Handle<HwDescriptorSetLayout> descriptorSetLayoutHandle) { |
224 | 222 | if (descriptorSetLayoutHandle) { |
@@ -268,7 +266,29 @@ Handle<HwFence> WebGPUDriver::createFenceS() noexcept { |
268 | 266 | } |
269 | 267 |
|
270 | 268 | Handle<HwTimerQuery> WebGPUDriver::createTimerQueryS() noexcept { |
271 | | - return Handle<HwTimerQuery>((Handle<HwTimerQuery>::HandleId) mNextFakeHandle++); |
| 269 | + return allocAndConstructHandle<WebGPUTimerQueries, HwTimerQuery>(); |
| 270 | +} |
| 271 | + |
| 272 | +void WebGPUDriver::createTimerQueryR(Handle<HwTimerQuery> timerQueryHandle, int) {} |
| 273 | + |
| 274 | +void WebGPUDriver::destroyTimerQuery(Handle<HwTimerQuery> timerQueryHandle) { |
| 275 | + if (timerQueryHandle) { |
| 276 | + destructHandle<WebGPUTimerQueries>(timerQueryHandle); |
| 277 | + } |
| 278 | +} |
| 279 | + |
| 280 | +TimerQueryResult WebGPUDriver::getTimerQueryValue(Handle<HwTimerQuery> timerQueryHandle, uint64_t* elapsedTime) { |
| 281 | + auto* tq = handleCast<WebGPUTimerQueries>(timerQueryHandle); |
| 282 | + return tq->getQueryResult(elapsedTime) ? TimerQueryResult::AVAILABLE |
| 283 | + : TimerQueryResult::NOT_READY; |
| 284 | +} |
| 285 | + |
| 286 | +void WebGPUDriver::beginTimerQuery(Handle<HwTimerQuery> timerQueryHandle) { |
| 287 | + mTimerQuery = handleCast<WebGPUTimerQueries>(timerQueryHandle); |
| 288 | +} |
| 289 | + |
| 290 | +void WebGPUDriver::endTimerQuery(Handle<HwTimerQuery> timerQueryHandle) { |
| 291 | + mTimerQuery = handleCast<WebGPUTimerQueries>(timerQueryHandle); |
272 | 292 | } |
273 | 293 |
|
274 | 294 | Handle<HwIndexBuffer> WebGPUDriver::createIndexBufferS() noexcept { |
@@ -462,8 +482,6 @@ void WebGPUDriver::createFenceR(Handle<HwFence> fh, int) { |
462 | 482 | //todo |
463 | 483 | } |
464 | 484 |
|
465 | | -void WebGPUDriver::createTimerQueryR(Handle<HwTimerQuery> tqh, int) {} |
466 | | - |
467 | 485 | void WebGPUDriver::createDescriptorSetLayoutR( |
468 | 486 | Handle<HwDescriptorSetLayout> descriptorSetLayoutHandle, |
469 | 487 | backend::DescriptorSetLayout&& info) { |
@@ -727,10 +745,6 @@ void WebGPUDriver::setupExternalImage(void* image) { |
727 | 745 | //todo |
728 | 746 | } |
729 | 747 |
|
730 | | -TimerQueryResult WebGPUDriver::getTimerQueryValue(Handle<HwTimerQuery> tqh, uint64_t* elapsedTime) { |
731 | | - return TimerQueryResult::ERROR; |
732 | | -} |
733 | | - |
734 | 748 | void WebGPUDriver::setupExternalImage2(Platform::ExternalImageHandleRef image) { |
735 | 749 | //todo |
736 | 750 | } |
@@ -924,14 +938,20 @@ void WebGPUDriver::commit(Handle<HwSwapChain> sch) { |
924 | 938 | mCommandBuffer = mCommandEncoder.Finish(&commandBufferDescriptor); |
925 | 939 | assert_invariant(mCommandBuffer); |
926 | 940 | mCommandEncoder = nullptr; |
| 941 | + mTimerQuery->beginTimeElapsedQuery(); |
927 | 942 | mQueue.Submit(1, &mCommandBuffer); |
928 | | - |
929 | 943 | static bool firstRender = true; |
930 | 944 | // For the first frame rendered, we need to make sure the work is done before presenting or we |
931 | 945 | // get a purple flash |
| 946 | + auto f = mQueue.OnSubmittedWorkDone(wgpu::CallbackMode::WaitAnyOnly, |
| 947 | + [=](wgpu::QueueWorkDoneStatus status) { |
| 948 | + if (status == wgpu::QueueWorkDoneStatus::Success) { |
| 949 | + if (mTimerQuery) { |
| 950 | + mTimerQuery->endTimeElapsedQuery(); |
| 951 | + } |
| 952 | + } |
| 953 | + }); |
932 | 954 | if (firstRender) { |
933 | | - auto f = mQueue.OnSubmittedWorkDone(wgpu::CallbackMode::WaitAnyOnly, |
934 | | - [=](wgpu::QueueWorkDoneStatus) {}); |
935 | 955 | const wgpu::Instance instance = mAdapter.GetInstance(); |
936 | 956 | auto wStatus = instance.WaitAny(f, |
937 | 957 | std::chrono::duration_cast<std::chrono::nanoseconds>(1s).count()); |
@@ -1151,12 +1171,6 @@ void WebGPUDriver::scissor( |
1151 | 1171 | //todo |
1152 | 1172 | } |
1153 | 1173 |
|
1154 | | -void WebGPUDriver::beginTimerQuery(Handle<HwTimerQuery> tqh) { |
1155 | | -} |
1156 | | - |
1157 | | -void WebGPUDriver::endTimerQuery(Handle<HwTimerQuery> tqh) { |
1158 | | -} |
1159 | | - |
1160 | 1174 | void WebGPUDriver::resetState(int) { |
1161 | 1175 | //todo |
1162 | 1176 | } |
|
0 commit comments