Skip to content

Commit 3a6d2e7

Browse files
committed
Added an atomic flag to ensure correct order on capture start/end
1 parent d2f6963 commit 3a6d2e7

File tree

6 files changed

+26
-18
lines changed

6 files changed

+26
-18
lines changed

include/nbl/video/CThreadSafeQueueAdapter.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,6 @@ class CThreadSafeQueueAdapter final : public IQueue
2121
: IQueue(originDevice,original->getFamilyIndex(),original->getFlags(),original->getPriority()), originalQueue(original) {}
2222
inline CThreadSafeQueueAdapter() : IQueue(nullptr, 0, CREATE_FLAGS::PROTECTED_BIT, 0.f) {}
2323

24-
inline bool startCapture() override
25-
{
26-
std::lock_guard g(m);
27-
return originalQueue->startCapture();
28-
}
29-
inline bool endCapture() override
30-
{
31-
std::lock_guard g(m);
32-
return originalQueue->endCapture();
33-
}
34-
3524
virtual bool insertDebugMarker(const char* name, const core::vector4df_SIMD& color=core::vector4df_SIMD(1.0, 1.0, 1.0, 1.0)) override
3625
{
3726
std::lock_guard g(m);
@@ -94,7 +83,6 @@ class CThreadSafeQueueAdapter final : public IQueue
9483
return originalQueue->waitIdle_impl();
9584
}
9685

97-
9886
// used to use unique_ptr here, but it needed `~IQueue` to be public, which requires a custom deleter, etc.
9987
IQueue* const originalQueue = nullptr;
10088
mutable std::mutex m;

include/nbl/video/CVulkanConnection.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@ class NBL_API2 CVulkanConnection final : public IAPIConnection
3232

3333
protected:
3434
explicit inline CVulkanConnection(const VkInstance instance, const SFeatures& enabledFeatures, std::unique_ptr<CVulkanDebugCallback>&& debugCallback, const VkDebugUtilsMessengerEXT vk_debugMessenger)
35-
: IAPIConnection(enabledFeatures), m_vkInstance(instance), m_debugCallback(std::move(debugCallback)), m_vkDebugUtilsMessengerEXT(vk_debugMessenger) {}
35+
: IAPIConnection(enabledFeatures), m_vkInstance(instance), m_debugCallback(std::move(debugCallback)), m_vkDebugUtilsMessengerEXT(vk_debugMessenger)
36+
{
37+
flag.clear();
38+
}
3639

3740
virtual ~CVulkanConnection();
3841

3942
private:
4043
const VkInstance m_vkInstance;
4144
const VkDebugUtilsMessengerEXT m_vkDebugUtilsMessengerEXT;
4245
const std::unique_ptr<CVulkanDebugCallback> m_debugCallback; // this needs to live longer than VkDebugUtilsMessengerEXT handle above
46+
std::atomic_flag flag;
4347
};
4448

4549
}

include/nbl/video/IQueue.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ class IQueue : public core::Interface, public core::Unmovable
6060
#endif
6161

6262
// for renderdoc and friends
63-
virtual bool startCapture() = 0;
64-
virtual bool endCapture() = 0;
6563
virtual bool insertDebugMarker(const char* name, const core::vector4df_SIMD& color = core::vector4df_SIMD(1.0, 1.0, 1.0, 1.0)) = 0;
6664
virtual bool beginDebugMarker(const char* name, const core::vector4df_SIMD& color = core::vector4df_SIMD(1.0, 1.0, 1.0, 1.0)) = 0;
6765
virtual bool endDebugMarker() = 0;

src/nbl/video/CVulkanConnection.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,16 @@ bool CVulkanConnection::startCapture()
325325
{
326326
if (!isRunningInRenderdoc())
327327
return false;
328+
if (flag.test())
329+
{
330+
auto logger = m_debugCallback->getLogger();
331+
if(logger)
332+
logger->log("Only one capture can be running at a time.", system::ILogger::ELL_ERROR);
333+
334+
return false;
335+
}
336+
337+
flag.test_and_set();
328338
m_rdoc_api->StartFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(m_vkInstance), NULL);
329339
return true;
330340
}
@@ -333,7 +343,17 @@ bool CVulkanConnection::endCapture()
333343
{
334344
if (!isRunningInRenderdoc())
335345
return false;
346+
if (!flag.test())
347+
{
348+
auto logger = m_debugCallback->getLogger();
349+
if (logger)
350+
logger->log("No ongoing caputre to end.", system::ILogger::ELL_ERROR);
351+
352+
return false;
353+
}
354+
336355
m_rdoc_api->EndFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(m_vkInstance), NULL);
356+
flag.clear();
337357
return true;
338358
}
339359

src/nbl/video/CVulkanQueue.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ class CVulkanQueue final : public IQueue
3434
return RESULT::OTHER_ERROR;
3535
}
3636

37-
bool startCapture() override { return false; }
38-
bool endCapture() override { return false; }
3937
bool insertDebugMarker(const char* name, const core::vector4df_SIMD& color) override;
4038
bool beginDebugMarker(const char* name, const core::vector4df_SIMD& color) override;
4139
bool endDebugMarker() override;

0 commit comments

Comments
 (0)