tests Add VkPipelineLayoutObj
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 05164ef..5741b61 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -1156,6 +1156,21 @@
     assert(VK_SUCCESS == err);
 }
 
+VkPipelineLayoutObj::VkPipelineLayoutObj(VkDeviceObj *device,
+                                         const std::vector<const VkDescriptorSetLayoutObj *> &descriptor_layouts,
+                                         const std::vector<VkPushConstantRange> &push_constant_ranges) {
+    VkPipelineLayoutCreateInfo pl_ci = {};
+    pl_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+    pl_ci.pushConstantRangeCount = static_cast<uint32_t>(push_constant_ranges.size());
+    pl_ci.pPushConstantRanges = push_constant_ranges.data();
+
+    auto descriptor_layouts_unwrapped = MakeTestbindingHandles<const vk_testing::DescriptorSetLayout>(descriptor_layouts);
+
+    init(*device, pl_ci, descriptor_layouts_unwrapped);
+}
+
+void VkPipelineLayoutObj::Reset() { *this = VkPipelineLayoutObj(); }
+
 VkPipelineObj::VkPipelineObj(VkDeviceObj *device) {
     m_device = device;
 
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 924ea36..a3fa049 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -383,6 +383,18 @@
     VkDeviceObj *m_device;
 };
 
+class VkPipelineLayoutObj : public vk_testing::PipelineLayout {
+   public:
+    VkPipelineLayoutObj() = default;
+    VkPipelineLayoutObj(VkDeviceObj *device, const std::vector<const VkDescriptorSetLayoutObj *> &descriptor_layouts = {},
+                        const std::vector<VkPushConstantRange> &push_constant_ranges = {});
+
+    VkPipelineLayoutObj(VkPipelineLayoutObj &&src) = default;
+    VkPipelineLayoutObj &operator=(VkPipelineLayoutObj &&src) = default;
+
+    void Reset();
+};
+
 class VkPipelineObj : public vk_testing::Pipeline {
    public:
     VkPipelineObj(VkDeviceObj *device);
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 3fa3be8..cbb1875 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -643,6 +643,7 @@
 void PipelineLayout::init(const Device &dev, VkPipelineLayoutCreateInfo &info,
                           const std::vector<const DescriptorSetLayout *> &layouts) {
     const std::vector<VkDescriptorSetLayout> layout_handles = MakeVkHandles<VkDescriptorSetLayout>(layouts);
+    info.setLayoutCount = layout_handles.size();
     info.pSetLayouts = layout_handles.data();
 
     NON_DISPATCHABLE_HANDLE_INIT(vkCreatePipelineLayout, dev, &info);
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 215cced..85b646b 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -542,8 +542,16 @@
 
 class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
    public:
+    PipelineLayout() noexcept : NonDispHandle(){};
     ~PipelineLayout();
 
+    PipelineLayout(PipelineLayout &&src) = default;
+    PipelineLayout &operator=(PipelineLayout &&src) {
+        this->~PipelineLayout();
+        this->NonDispHandle::operator=(std::move(src));
+        return *this;
+    };
+
     // vCreatePipelineLayout()
     void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
 };