From e9ee05c9825889fcad901710e5d15d5cf24e085b Mon Sep 17 00:00:00 2001 From: Sergey Kosarevsky Date: Sat, 15 Jul 2023 15:06:01 -0700 Subject: [PATCH] Forward declarations to access incomplete type IDevice --- lvk/LVK.cpp | 18 ++++++++++++++++++ lvk/LVK.h | 23 ++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lvk/LVK.cpp b/lvk/LVK.cpp index 19e071d055..432e5d4cc3 100644 --- a/lvk/LVK.cpp +++ b/lvk/LVK.cpp @@ -107,3 +107,21 @@ bool lvk::Assert(bool cond, const char* file, int line, const char* format, ...) } return cond; } + +void lvk::destroy(igl::IDevice* device, lvk::ComputePipelineHandle handle) { + if (device) { + device->destroy(handle); + } +} + +void lvk::destroy(igl::IDevice* device, lvk::RenderPipelineHandle handle) { + if (device) { + device->destroy(handle); + } +} + +void lvk::destroy(igl::IDevice* device, lvk::ShaderModuleHandle handle) { + if (device) { + device->destroy(handle); + } +} diff --git a/lvk/LVK.h b/lvk/LVK.h index 9024dda3e5..6e885992b5 100644 --- a/lvk/LVK.h +++ b/lvk/LVK.h @@ -93,15 +93,23 @@ class Handle final { static_assert(sizeof(Handle) == sizeof(uint64_t)); +// specialized with dummy structs for type safety +using ComputePipelineHandle = lvk::Handle; +using RenderPipelineHandle = lvk::Handle; +using ShaderModuleHandle = lvk::Handle; + +// forward declarations to access incomplete type IDevice +void destroy(igl::IDevice* device, lvk::ComputePipelineHandle handle); +void destroy(igl::IDevice* device, lvk::RenderPipelineHandle handle); +void destroy(igl::IDevice* device, lvk::ShaderModuleHandle handle); + template class Holder final { public: Holder() = default; Holder(igl::IDevice* device, HandleType handle) : device_(device), handle_(handle) {} ~Holder() { - if (device_) { - device_->destroy(handle_); - } + lvk::destroy(device_, handle_); } Holder(const Holder&) = delete; Holder(Holder&& other) : device_(other.device_), handle_(other.handle_) { @@ -132,9 +140,7 @@ class Holder final { } void reset() { - if (device_) { - device_->destroy(handle_); - } + lvk::destroy(device_, handle_); device_ = nullptr; handle_ = HandleType{}; } @@ -149,11 +155,6 @@ class Holder final { HandleType handle_; }; -// specialized with dummy structs for type safety -using ComputePipelineHandle = lvk::Handle; -using RenderPipelineHandle = lvk::Handle; -using ShaderModuleHandle = lvk::Handle; - } // namespace lvk // clang-format off