tests: Add ability to override tessellation state, use it.

This fixes the remaining issue with the tess positive test.

Signed-off-by: Chris Forbes <chrisforbes@google.com>
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index e6f5391..9a1d29a 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -5958,8 +5958,15 @@
         VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
         VK_FALSE};
 
+    VkPipelineTessellationStateCreateInfo tsci{
+        VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
+        nullptr,
+        0,
+        3};
+
     VkPipelineObj pipe(m_device);
     pipe.SetInputAssembly(&iasci);
+    pipe.SetTessellation(&tsci);
     pipe.AddColorAttachment();
     pipe.AddShader(&vs);
     pipe.AddShader(&tcs);
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 29b834b..d933a0b 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -1252,21 +1252,25 @@
 
 void VkPipelineObj::SetMSAA(
     const VkPipelineMultisampleStateCreateInfo *ms_state) {
-    memcpy(&m_ms_state, ms_state, sizeof(VkPipelineMultisampleStateCreateInfo));
+    m_ms_state = *ms_state;
 }
 
 void VkPipelineObj::SetInputAssembly(
     const VkPipelineInputAssemblyStateCreateInfo *ia_state) {
-    memcpy(&m_ia_state, ia_state,
-           sizeof(VkPipelineInputAssemblyStateCreateInfo));
+    m_ia_state = *ia_state;
 }
 
 void VkPipelineObj::SetRasterization(
     const VkPipelineRasterizationStateCreateInfo *rs_state) {
-    memcpy(&m_rs_state, rs_state,
-           sizeof(VkPipelineRasterizationStateCreateInfo));
+    m_rs_state = *rs_state;
 }
 
+void VkPipelineObj::SetTessellation(
+    const VkPipelineTessellationStateCreateInfo *te_state) {
+    m_te_state = *te_state;
+}
+
+
 VkResult VkPipelineObj::CreateVKPipeline(VkPipelineLayout layout,
                                          VkRenderPass render_pass) {
     VkGraphicsPipelineCreateInfo info = {};
@@ -1314,7 +1318,6 @@
 
     info.renderPass = render_pass;
     info.subpass = 0;
-    info.pTessellationState = NULL;
     info.pInputAssemblyState = &m_ia_state;
     info.pViewportState = &m_vp_state;
     info.pRasterizationState = &m_rs_state;
@@ -1322,6 +1325,14 @@
     info.pDepthStencilState = &m_ds_state;
     info.pColorBlendState = &m_cb_state;
 
+    if (m_ia_state.topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) {
+        m_te_state.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
+        info.pTessellationState = &m_te_state;
+    }
+    else {
+        info.pTessellationState = nullptr;
+    }
+
     return init_try(*m_device, info);
 }
 
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index f5f8b4d..164fb50 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -429,10 +429,9 @@
 
     void SetDepthStencil(const VkPipelineDepthStencilStateCreateInfo *);
     void SetMSAA(const VkPipelineMultisampleStateCreateInfo *ms_state);
-    void
-    SetInputAssembly(const VkPipelineInputAssemblyStateCreateInfo *ia_state);
-    void
-    SetRasterization(const VkPipelineRasterizationStateCreateInfo *rs_state);
+    void SetInputAssembly(const VkPipelineInputAssemblyStateCreateInfo *ia_state);
+    void SetRasterization(const VkPipelineRasterizationStateCreateInfo *rs_state);
+    void SetTessellation(const VkPipelineTessellationStateCreateInfo *te_state);
     void SetViewport(const vector<VkViewport> viewports);
     void SetScissor(const vector<VkRect2D> scissors);
     VkResult CreateVKPipeline(VkPipelineLayout layout,
@@ -446,6 +445,7 @@
     VkPipelineDepthStencilStateCreateInfo m_ds_state;
     VkPipelineViewportStateCreateInfo m_vp_state;
     VkPipelineMultisampleStateCreateInfo m_ms_state;
+    VkPipelineTessellationStateCreateInfo m_te_state;
     vector<VkDynamicState> m_dynamic_state_enables;
     vector<VkViewport> m_viewports;
     vector<VkRect2D> m_scissors;