@@ -206,6 +206,10 @@ static VkShaderStageFlagBits getShaderStageFlag(Stages Stage) {
206206 return VK_SHADER_STAGE_COMPUTE_BIT ;
207207 case Stages::Vertex:
208208 return VK_SHADER_STAGE_VERTEX_BIT ;
209+ case Stages::Hull:
210+ return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ;
211+ case Stages::Domain:
212+ return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT ;
209213 case Stages::Geometry:
210214 return VK_SHADER_STAGE_GEOMETRY_BIT ;
211215 case Stages::Pixel:
@@ -224,6 +228,8 @@ static VkPrimitiveTopology getVkPrimitiveTopology(PrimitiveTopology Topology) {
224228 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST ;
225229 case PrimitiveTopology::PointList:
226230 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST ;
231+ case PrimitiveTopology::PatchList:
232+ return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST ;
227233 }
228234 llvm_unreachable (" All PrimitiveTopology cases handled" );
229235}
@@ -1469,6 +1475,8 @@ class VulkanDevice : public offloadtest::Device {
14691475 const TraditionalRasterPipelineCreateDesc &Desc) override {
14701476 const ShaderContainer &VS = Desc.VS ;
14711477 const ShaderContainer &PS = Desc.PS ;
1478+ const std::optional<ShaderContainer> &HS = Desc.HS ;
1479+ const std::optional<ShaderContainer> &DS = Desc.DS ;
14721480 const std::optional<ShaderContainer> &GS = Desc.GS ;
14731481 const llvm::ArrayRef<InputLayoutDesc> InputLayout = Desc.InputLayout ;
14741482 const llvm::ArrayRef<Format> RTFormats = Desc.RTFormats ;
@@ -1505,6 +1513,56 @@ class VulkanDevice : public offloadtest::Device {
15051513 ShaderStages.push_back (ShaderStage);
15061514 }
15071515
1516+ llvm::SmallVector<VkSpecializationMapEntry> HSSpecEntries;
1517+ llvm::SmallVector<char > HSSpecData;
1518+ VkSpecializationInfo HSSpecInfo = {};
1519+ if (HS ) {
1520+ if (auto Err = parseSpecializationConstants (HS ->SpecializationConstants ,
1521+ HSSpecEntries, HSSpecData,
1522+ HSSpecInfo))
1523+ return Err;
1524+
1525+ auto HSModOrErr = createShaderModule (HS ->Shader , " hull" );
1526+ if (!HSModOrErr)
1527+ return HSModOrErr.takeError ();
1528+
1529+ GraphicsFlags |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ;
1530+
1531+ VkPipelineShaderStageCreateInfo ShaderStage = {};
1532+ ShaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO ;
1533+ ShaderStage.stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ;
1534+ ShaderStage.module = *HSModOrErr;
1535+ ShaderStage.pName = HS ->EntryPoint .c_str ();
1536+ ShaderStage.pSpecializationInfo =
1537+ HS ->SpecializationConstants .empty () ? nullptr : &HSSpecInfo;
1538+ ShaderStages.push_back (ShaderStage);
1539+ }
1540+
1541+ llvm::SmallVector<VkSpecializationMapEntry> DSSpecEntries;
1542+ llvm::SmallVector<char > DSSpecData;
1543+ VkSpecializationInfo DSSpecInfo = {};
1544+ if (DS ) {
1545+ if (auto Err = parseSpecializationConstants (DS ->SpecializationConstants ,
1546+ DSSpecEntries, DSSpecData,
1547+ DSSpecInfo))
1548+ return Err;
1549+
1550+ auto DSModOrErr = createShaderModule (DS ->Shader , " domain" );
1551+ if (!DSModOrErr)
1552+ return DSModOrErr.takeError ();
1553+
1554+ GraphicsFlags |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT ;
1555+
1556+ VkPipelineShaderStageCreateInfo ShaderStage = {};
1557+ ShaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO ;
1558+ ShaderStage.stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT ;
1559+ ShaderStage.module = *DSModOrErr;
1560+ ShaderStage.pName = DS ->EntryPoint .c_str ();
1561+ ShaderStage.pSpecializationInfo =
1562+ DS ->SpecializationConstants .empty () ? nullptr : &DSSpecInfo;
1563+ ShaderStages.push_back (ShaderStage);
1564+ }
1565+
15081566 llvm::SmallVector<VkSpecializationMapEntry> GSSpecEntries;
15091567 llvm::SmallVector<char > GSSpecData;
15101568 VkSpecializationInfo GSSpecInfo = {};
@@ -1633,6 +1691,13 @@ class VulkanDevice : public offloadtest::Device {
16331691 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO ;
16341692 InputAssemblyCI.topology = getVkPrimitiveTopology (Desc.Topology );
16351693
1694+ VkPipelineTessellationStateCreateInfo TessellationCI = {};
1695+ if (Desc.PatchControlPoints ) {
1696+ TessellationCI.sType =
1697+ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO ;
1698+ TessellationCI.patchControlPoints = *Desc.PatchControlPoints ;
1699+ }
1700+
16361701 VkPipelineViewportStateCreateInfo ViewportCI = {};
16371702 ViewportCI.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO ;
16381703 ViewportCI.viewportCount = 1 ;
@@ -1683,6 +1748,8 @@ class VulkanDevice : public offloadtest::Device {
16831748 PipelineCI.pStages = ShaderStages.data ();
16841749 PipelineCI.pVertexInputState = &VertexInputCI;
16851750 PipelineCI.pInputAssemblyState = &InputAssemblyCI;
1751+ PipelineCI.pTessellationState =
1752+ Desc.PatchControlPoints ? &TessellationCI : nullptr ;
16861753 PipelineCI.pViewportState = &ViewportCI;
16871754 PipelineCI.pRasterizationState = &RastCI;
16881755 PipelineCI.pMultisampleState = &MultisampleCI;
@@ -3229,6 +3296,7 @@ class VulkanDevice : public offloadtest::Device {
32293296 } else if (P.isTraditionalRaster ()) {
32303297 TraditionalRasterPipelineCreateDesc PipelineDesc = {};
32313298 PipelineDesc.Topology = P.Bindings .Topology ;
3299+ PipelineDesc.PatchControlPoints = P.Bindings .PatchControlPoints ;
32323300 PipelineDesc.DSFormat = Format::D32FloatS8Uint;
32333301 for (auto &Shader : P.Shaders ) {
32343302 ShaderContainer SC = {};
0 commit comments