[Vulkan] Add tesselation support

Pretty much just following the D3D12 implementation
This commit is contained in:
Herman S.
2025-12-10 14:19:47 +09:00
parent 3e3aee1ef2
commit 83d776fa39
33 changed files with 3269 additions and 75 deletions

View File

@@ -0,0 +1,68 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for adaptive quad tessellation.
// Edge factors come from the vertex shader (read from the index buffer).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - edge tessellation factor (already processed:
// 1.0 added and clamped to range in the vertex shader).
layout(location = 0) in float in_edge_factor[];
// Output to tessellation evaluation shader - patch index as float.
layout(location = 0) out float out_index[];
void main() {
// 1.0 added to the factors according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0), to the min/max it
// has already been added on the CPU.
// Vulkan/OpenGL (goes in a direction along the perimeter):
// [0] - between U0V1 and U0V0.
// [1] - between U0V0 and U1V0.
// [2] - between U1V0 and U1V1.
// [3] - between U1V1 and U0V1.
//
// Xbox 360 factors go along the perimeter too according to the example of
// edge factors in Next Generation Graphics Programming on Xbox 360.
// However, if v0->v1... that seems to be working for triangle patches applies
// here too, with the swizzle Xenia uses in domain shaders:
// [0] - between U0V0 and U1V0.
// [1] - between U1V0 and U1V1.
// [2] - between U1V1 and U0V1.
// [3] - between U0V1 and U0V0.
gl_TessLevelOuter[0] = in_edge_factor[3];
gl_TessLevelOuter[1] = in_edge_factor[0];
gl_TessLevelOuter[2] = in_edge_factor[1];
gl_TessLevelOuter[3] = in_edge_factor[2];
// On the Xbox 360, according to the presentation, the inside factor is the
// minimum of the factors of the edges along the axis.
// Vulkan/OpenGL:
// [0] - along U.
// [1] - along V.
gl_TessLevelInner[0] = min(gl_TessLevelOuter[1], gl_TessLevelOuter[3]);
gl_TessLevelInner[1] = min(gl_TessLevelOuter[0], gl_TessLevelOuter[2]);
// Output the patch index.
// Only the lower 24 bits of the vertex index are used (tested on an Adreno
// 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as
// `(index + offset) & 0xFFFFFF`.
out_index[gl_InvocationID] =
float(clamp((gl_PrimitiveID + xe_vertex_index_offset) & 0xFFFFFFu,
xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));
}

View File

@@ -0,0 +1,71 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for adaptive triangle tessellation.
// Edge factors come from the vertex shader (read from the index buffer).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - edge tessellation factor (already processed:
// 1.0 added and clamped to range in the vertex shader).
layout(location = 0) in float in_edge_factor[];
// Output to tessellation evaluation shader - patch index as float.
layout(location = 0) out float out_index[];
void main() {
// Factors for adaptive tessellation are taken from the index buffer.
//
// 1.0 added to the factors according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0), to the min/max it
// has already been added on the CPU.
// It appears that on the Xbox 360:
// - [0] is the factor for the v0->v1 edge.
// - [1] is the factor for the v1->v2 edge.
// - [2] is the factor for the v2->v0 edge.
// Where v0 is the U1V0W0 vertex, v1 is the U0V1W0 vertex, and v2 is the
// U0V0W1 vertex.
// The hint at the order was provided in the Code Listing 15 of:
// http://www.uraldev.ru/files/download/21/Real-Time_Tessellation_on_GPU.pdf
//
// In Vulkan/OpenGL:
// - gl_TessLevelOuter[0] is the factor for the U0 edge (v1->v2).
// - gl_TessLevelOuter[1] is the factor for the V0 edge (v2->v0).
// - gl_TessLevelOuter[2] is the factor for the W0 edge (v0->v1).
//
// In Xenia's domain shaders, the barycentric coordinates are handled as:
// 1) gl_TessCoord.xyz -> r0.zyx by Xenia.
// 2) r0.zyx -> r0.zyx by the guest (because r1.y is set to 0 by Xenia, which
// apparently means identity swizzle to games).
// 3) r0.z * v0 + r0.y * v1 + r0.x * v2 by the guest.
// With this order, there are no cracks in 4D5307E6 water.
gl_TessLevelOuter[0] = in_edge_factor[1]; // v1->v2 edge
gl_TessLevelOuter[1] = in_edge_factor[2]; // v2->v0 edge
gl_TessLevelOuter[2] = in_edge_factor[0]; // v0->v1 edge
// Inside factor is the minimum of edge factors.
gl_TessLevelInner[0] = min(min(gl_TessLevelOuter[0], gl_TessLevelOuter[1]),
gl_TessLevelOuter[2]);
// Output the patch index.
// Only the lower 24 bits of the vertex index are used (tested on an Adreno
// 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as
// `(index + offset) & 0xFFFFFF`.
out_index[gl_InvocationID] =
float(clamp((gl_PrimitiveID + xe_vertex_index_offset) & 0xFFFFFFu,
xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));
}

View File

@@ -0,0 +1,191 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24500
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %gl_TessLevelOuter %4243 %gl_TessLevelInner %3307 %gl_InvocationID %gl_PrimitiveID
OpExecutionMode %5663 OutputVertices 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %4243 Location 0
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%4243 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%int_3 = OpConstant %int 3
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%gl_PrimitiveID = OpVariable %_ptr_Input_int Input
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%uint_16777215 = OpConstant %uint 16777215
%int_4 = OpConstant %int 4
%uint_0 = OpConstant %uint 0
%5663 = OpFunction %void None %1282
%23915 = OpLabel
%7129 = OpAccessChain %_ptr_Input_float %4243 %int_3
%15646 = OpLoad %float %7129
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19905 = OpAccessChain %_ptr_Input_float %4243 %int_0
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19982 %7391
%19906 = OpAccessChain %_ptr_Input_float %4243 %int_1
%7392 = OpLoad %float %19906
%19983 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19983 %7392
%19907 = OpAccessChain %_ptr_Input_float %4243 %int_2
%7393 = OpLoad %float %19907
%19908 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
OpStore %19908 %7393
%13565 = OpLoad %float %19982
%12692 = OpLoad %float %19908
%7944 = OpExtInst %float %1 FMin %13565 %12692
%14721 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %14721 %7944
%13566 = OpLoad %float %19981
%12693 = OpLoad %float %19983
%7945 = OpExtInst %float %1 FMin %13566 %12693
%14722 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
OpStore %14722 %7945
%15656 = OpLoad %int %gl_InvocationID
%23765 = OpLoad %int %gl_PrimitiveID
%9548 = OpBitcast %uint %23765
%7395 = OpAccessChain %_ptr_Uniform_uint %4930 %int_3
%22970 = OpLoad %uint %7395
%7652 = OpIAdd %uint %9548 %22970
%18847 = OpBitwiseAnd %uint %7652 %uint_16777215
%10702 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_0
%24236 = OpLoad %uint %10702
%19191 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_1
%22108 = OpLoad %uint %19191
%23780 = OpExtInst %uint %1 UClamp %18847 %24236 %22108
%24499 = OpConvertUToF %float %23780
%12694 = OpAccessChain %_ptr_Output_float %3307 %15656
OpStore %12694 %24499
OpReturn
OpFunctionEnd
#endif
const uint32_t adaptive_quad_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00005FB4, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000B000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00001548, 0x00001093, 0x00000CDA,
0x00000CEB, 0x000011E9, 0x000014CB, 0x00040010, 0x0000161F, 0x0000001A,
0x00000001, 0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047,
0x00001548, 0x0000000F, 0x00040047, 0x00001093, 0x0000001E, 0x00000000,
0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047, 0x00000CDA,
0x0000000F, 0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047,
0x000011E9, 0x0000000B, 0x00000008, 0x00040047, 0x000014CB, 0x0000000B,
0x00000007, 0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001,
0x00000023, 0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023,
0x00000010, 0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014,
0x00050048, 0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047,
0x00001342, 0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022,
0x00000001, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,
0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B, 0x00000020,
0x00000000, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x00000225, 0x0000000D, 0x00000A16, 0x00040020, 0x000004A2, 0x00000003,
0x00000225, 0x0004003B, 0x000004A2, 0x00001548, 0x00000003, 0x00040015,
0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B,
0x00000000, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C,
0x00000243, 0x0000000D, 0x00000A6A, 0x00040020, 0x000004C0, 0x00000001,
0x00000243, 0x0004003B, 0x000004C0, 0x00001093, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A14, 0x00000003, 0x00040020, 0x0000028A, 0x00000001,
0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004001C,
0x000002AC, 0x0000000D, 0x00000A10, 0x00040020, 0x00000529, 0x00000003,
0x000002AC, 0x0004003B, 0x00000529, 0x00000CDA, 0x00000003, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004001C, 0x000002FC, 0x0000000D,
0x00000A0D, 0x00040020, 0x00000579, 0x00000003, 0x000002FC, 0x0004003B,
0x00000579, 0x00000CEB, 0x00000003, 0x00040020, 0x00000289, 0x00000001,
0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001, 0x0004003B,
0x00000289, 0x000014CB, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,
0x00000002, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x0007001E,
0x00000457, 0x00000013, 0x00000013, 0x0000000B, 0x0000000B, 0x00000011,
0x00040020, 0x000006D4, 0x00000002, 0x00000457, 0x0004003B, 0x000006D4,
0x00001342, 0x00000002, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x0004002B, 0x0000000B, 0x00000923, 0x00FFFFFF, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,
0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,
0x00005D6B, 0x00050041, 0x0000028A, 0x00001BD9, 0x00001093, 0x00000A14,
0x0004003D, 0x0000000D, 0x00003D1E, 0x00001BD9, 0x00050041, 0x0000028B,
0x00004E0D, 0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0D, 0x00003D1E,
0x00050041, 0x0000028A, 0x00004DC1, 0x00001093, 0x00000A0B, 0x0004003D,
0x0000000D, 0x00001CDF, 0x00004DC1, 0x00050041, 0x0000028B, 0x00004E0E,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004E0E, 0x00001CDF, 0x00050041,
0x0000028A, 0x00004DC2, 0x00001093, 0x00000A0E, 0x0004003D, 0x0000000D,
0x00001CE0, 0x00004DC2, 0x00050041, 0x0000028B, 0x00004E0F, 0x00001548,
0x00000A11, 0x0003003E, 0x00004E0F, 0x00001CE0, 0x00050041, 0x0000028A,
0x00004DC3, 0x00001093, 0x00000A11, 0x0004003D, 0x0000000D, 0x00001CE1,
0x00004DC3, 0x00050041, 0x0000028B, 0x00004DC4, 0x00001548, 0x00000A14,
0x0003003E, 0x00004DC4, 0x00001CE1, 0x0004003D, 0x0000000D, 0x000034FD,
0x00004E0E, 0x0004003D, 0x0000000D, 0x00003194, 0x00004DC4, 0x0007000C,
0x0000000D, 0x00001F08, 0x00000001, 0x00000025, 0x000034FD, 0x00003194,
0x00050041, 0x0000028B, 0x00003981, 0x00000CDA, 0x00000A0B, 0x0003003E,
0x00003981, 0x00001F08, 0x0004003D, 0x0000000D, 0x000034FE, 0x00004E0D,
0x0004003D, 0x0000000D, 0x00003195, 0x00004E0F, 0x0007000C, 0x0000000D,
0x00001F09, 0x00000001, 0x00000025, 0x000034FE, 0x00003195, 0x00050041,
0x0000028B, 0x00003982, 0x00000CDA, 0x00000A0E, 0x0003003E, 0x00003982,
0x00001F09, 0x0004003D, 0x0000000C, 0x00003D28, 0x000011E9, 0x0004003D,
0x0000000C, 0x00005CD5, 0x000014CB, 0x0004007C, 0x0000000B, 0x0000254C,
0x00005CD5, 0x00050041, 0x00000288, 0x00001CE3, 0x00001342, 0x00000A14,
0x0004003D, 0x0000000B, 0x000059BA, 0x00001CE3, 0x00050080, 0x0000000B,
0x00001DE4, 0x0000254C, 0x000059BA, 0x000500C7, 0x0000000B, 0x0000499F,
0x00001DE4, 0x00000923, 0x00060041, 0x00000288, 0x000029CE, 0x00001342,
0x00000A17, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00005EAC, 0x000029CE,
0x00060041, 0x00000288, 0x00004AF7, 0x00001342, 0x00000A17, 0x00000A0D,
0x0004003D, 0x0000000B, 0x0000565C, 0x00004AF7, 0x0008000C, 0x0000000B,
0x00005CE4, 0x00000001, 0x0000002C, 0x0000499F, 0x00005EAC, 0x0000565C,
0x00040070, 0x0000000D, 0x00005FB3, 0x00005CE4, 0x00050041, 0x0000028B,
0x00003196, 0x00000CEB, 0x00003D28, 0x0003003E, 0x00003196, 0x00005FB3,
0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,179 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24500
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %gl_TessLevelOuter %4243 %gl_TessLevelInner %3307 %gl_InvocationID %gl_PrimitiveID
OpExecutionMode %5663 OutputVertices 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %4243 Location 0
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%4243 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%int_1 = OpConstant %int 1
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%gl_PrimitiveID = OpVariable %_ptr_Input_int Input
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_3 = OpConstant %int 3
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%uint_16777215 = OpConstant %uint 16777215
%int_4 = OpConstant %int 4
%uint_0 = OpConstant %uint 0
%5663 = OpFunction %void None %1282
%23915 = OpLabel
%7129 = OpAccessChain %_ptr_Input_float %4243 %int_1
%15646 = OpLoad %float %7129
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19905 = OpAccessChain %_ptr_Input_float %4243 %int_2
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19982 %7391
%19906 = OpAccessChain %_ptr_Input_float %4243 %int_0
%7392 = OpLoad %float %19906
%19907 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19907 %7392
%13565 = OpLoad %float %19981
%12616 = OpLoad %float %19982
%7723 = OpExtInst %float %1 FMin %13565 %12616
%6699 = OpLoad %float %19907
%21028 = OpExtInst %float %1 FMin %7723 %6699
%14721 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %14721 %21028
%15656 = OpLoad %int %gl_InvocationID
%23765 = OpLoad %int %gl_PrimitiveID
%9548 = OpBitcast %uint %23765
%7395 = OpAccessChain %_ptr_Uniform_uint %4930 %int_3
%22970 = OpLoad %uint %7395
%7652 = OpIAdd %uint %9548 %22970
%18847 = OpBitwiseAnd %uint %7652 %uint_16777215
%10702 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_0
%24236 = OpLoad %uint %10702
%19191 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_1
%22108 = OpLoad %uint %19191
%23780 = OpExtInst %uint %1 UClamp %18847 %24236 %22108
%24499 = OpConvertUToF %float %23780
%12692 = OpAccessChain %_ptr_Output_float %3307 %15656
OpStore %12692 %24499
OpReturn
OpFunctionEnd
#endif
const uint32_t adaptive_triangle_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00005FB4, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000B000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00001548, 0x00001093, 0x00000CDA,
0x00000CEB, 0x000011E9, 0x000014CB, 0x00040010, 0x0000161F, 0x0000001A,
0x00000001, 0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047,
0x00001548, 0x0000000F, 0x00040047, 0x00001093, 0x0000001E, 0x00000000,
0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047, 0x00000CDA,
0x0000000F, 0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047,
0x000011E9, 0x0000000B, 0x00000008, 0x00040047, 0x000014CB, 0x0000000B,
0x00000007, 0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001,
0x00000023, 0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023,
0x00000010, 0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014,
0x00050048, 0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047,
0x00001342, 0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022,
0x00000001, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,
0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B, 0x00000020,
0x00000000, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x00000225, 0x0000000D, 0x00000A16, 0x00040020, 0x000004A2, 0x00000003,
0x00000225, 0x0004003B, 0x000004A2, 0x00001548, 0x00000003, 0x00040015,
0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B,
0x00000000, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C,
0x00000243, 0x0000000D, 0x00000A6A, 0x00040020, 0x000004C0, 0x00000001,
0x00000243, 0x0004003B, 0x000004C0, 0x00001093, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x00040020, 0x0000028A, 0x00000001,
0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D, 0x0004002B,
0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A10,
0x00000002, 0x0004001C, 0x00000298, 0x0000000D, 0x00000A10, 0x00040020,
0x00000515, 0x00000003, 0x00000298, 0x0004003B, 0x00000515, 0x00000CDA,
0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004001C,
0x000002D9, 0x0000000D, 0x00000A0D, 0x00040020, 0x00000556, 0x00000003,
0x000002D9, 0x0004003B, 0x00000556, 0x00000CEB, 0x00000003, 0x00040020,
0x00000289, 0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9,
0x00000001, 0x0004003B, 0x00000289, 0x000014CB, 0x00000001, 0x00040017,
0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011, 0x0000000B,
0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013, 0x0000000B,
0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002, 0x00000457,
0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B, 0x0000000C,
0x00000A14, 0x00000003, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x0004002B, 0x0000000B, 0x00000923, 0x00FFFFFF, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,
0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,
0x00005D6B, 0x00050041, 0x0000028A, 0x00001BD9, 0x00001093, 0x00000A0E,
0x0004003D, 0x0000000D, 0x00003D1E, 0x00001BD9, 0x00050041, 0x0000028B,
0x00004E0D, 0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0D, 0x00003D1E,
0x00050041, 0x0000028A, 0x00004DC1, 0x00001093, 0x00000A11, 0x0004003D,
0x0000000D, 0x00001CDF, 0x00004DC1, 0x00050041, 0x0000028B, 0x00004E0E,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004E0E, 0x00001CDF, 0x00050041,
0x0000028A, 0x00004DC2, 0x00001093, 0x00000A0B, 0x0004003D, 0x0000000D,
0x00001CE0, 0x00004DC2, 0x00050041, 0x0000028B, 0x00004DC3, 0x00001548,
0x00000A11, 0x0003003E, 0x00004DC3, 0x00001CE0, 0x0004003D, 0x0000000D,
0x000034FD, 0x00004E0D, 0x0004003D, 0x0000000D, 0x00003148, 0x00004E0E,
0x0007000C, 0x0000000D, 0x00001E2B, 0x00000001, 0x00000025, 0x000034FD,
0x00003148, 0x0004003D, 0x0000000D, 0x00001A2B, 0x00004DC3, 0x0007000C,
0x0000000D, 0x00005224, 0x00000001, 0x00000025, 0x00001E2B, 0x00001A2B,
0x00050041, 0x0000028B, 0x00003981, 0x00000CDA, 0x00000A0B, 0x0003003E,
0x00003981, 0x00005224, 0x0004003D, 0x0000000C, 0x00003D28, 0x000011E9,
0x0004003D, 0x0000000C, 0x00005CD5, 0x000014CB, 0x0004007C, 0x0000000B,
0x0000254C, 0x00005CD5, 0x00050041, 0x00000288, 0x00001CE3, 0x00001342,
0x00000A14, 0x0004003D, 0x0000000B, 0x000059BA, 0x00001CE3, 0x00050080,
0x0000000B, 0x00001DE4, 0x0000254C, 0x000059BA, 0x000500C7, 0x0000000B,
0x0000499F, 0x00001DE4, 0x00000923, 0x00060041, 0x00000288, 0x000029CE,
0x00001342, 0x00000A17, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00005EAC,
0x000029CE, 0x00060041, 0x00000288, 0x00004AF7, 0x00001342, 0x00000A17,
0x00000A0D, 0x0004003D, 0x0000000B, 0x0000565C, 0x00004AF7, 0x0008000C,
0x0000000B, 0x00005CE4, 0x00000001, 0x0000002C, 0x0000499F, 0x00005EAC,
0x0000565C, 0x00040070, 0x0000000D, 0x00005FB3, 0x00005CE4, 0x00050041,
0x0000028B, 0x00003194, 0x00000CEB, 0x00003D28, 0x0003003E, 0x00003194,
0x00005FB3, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,143 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 1
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%19981 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %19981 %22427
%19905 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19982 %7391
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %7391
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %7391
%19734 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
OpStore %19734 %7391
%19735 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %19735 %7391
%23304 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
OpStore %23304 %7391
OpReturn
OpFunctionEnd
#endif
const uint32_t continuous_quad_1cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000001,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A0D, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002B6, 0x0000000D, 0x00000A16, 0x00040020, 0x00000533, 0x00000003,
0x000002B6, 0x0004003B, 0x00000533, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004001C, 0x00000301, 0x0000000D,
0x00000A10, 0x00040020, 0x0000057E, 0x00000003, 0x00000301, 0x0004003B,
0x0000057E, 0x00000CDA, 0x00000003, 0x00050036, 0x00000008, 0x0000161F,
0x00000000, 0x00000502, 0x000200F8, 0x0000606B, 0x0004003D, 0x0000000C,
0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A, 0x000027A3, 0x00000F2C,
0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B, 0x000027A3, 0x00050041,
0x0000028B, 0x00004E0D, 0x00000CEB, 0x00004E5E, 0x0003003E, 0x00004E0D,
0x0000579B, 0x00060041, 0x0000028C, 0x00004DC1, 0x00001342, 0x00000A0B,
0x00000A0D, 0x0004003D, 0x0000000D, 0x00001CDF, 0x00004DC1, 0x00050041,
0x0000028B, 0x00004E0E, 0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0E,
0x00001CDF, 0x00050041, 0x0000028B, 0x00004D14, 0x00001548, 0x00000A0E,
0x0003003E, 0x00004D14, 0x00001CDF, 0x00050041, 0x0000028B, 0x00004D15,
0x00001548, 0x00000A11, 0x0003003E, 0x00004D15, 0x00001CDF, 0x00050041,
0x0000028B, 0x00004D16, 0x00001548, 0x00000A14, 0x0003003E, 0x00004D16,
0x00001CDF, 0x00050041, 0x0000028B, 0x00004D17, 0x00000CDA, 0x00000A0B,
0x0003003E, 0x00004D17, 0x00001CDF, 0x00050041, 0x0000028B, 0x00005B08,
0x00000CDA, 0x00000A0E, 0x0003003E, 0x00005B08, 0x00001CDF, 0x000100FD,
0x00010038,
};

View File

@@ -0,0 +1,150 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 4
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%3307 = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_0 = OpConstant %int 0
%bool = OpTypeBool
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_float = OpTypePointer Uniform %float
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%21976 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %21976 %22427
%20857 = OpIEqual %bool %20062 %int_0
OpSelectionMerge %19578 None
OpBranchConditional %20857 %12129 %19578
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%15646 = OpLoad %float %18210
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %15646
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %15646
%19734 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
OpStore %19734 %15646
%19735 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %19735 %15646
%23228 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
OpStore %23228 %15646
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t continuous_quad_4cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000004,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A16, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00020014, 0x00000009,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004003B, 0x000004A2, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004001C, 0x00000310, 0x0000000D,
0x00000A10, 0x00040020, 0x0000058D, 0x00000003, 0x00000310, 0x0004003B,
0x0000058D, 0x00000CDA, 0x00000003, 0x00050036, 0x00000008, 0x0000161F,
0x00000000, 0x00000502, 0x000200F8, 0x0000606B, 0x0004003D, 0x0000000C,
0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A, 0x000027A3, 0x00000F2C,
0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B, 0x000027A3, 0x00050041,
0x0000028B, 0x000055D8, 0x00000CEB, 0x00004E5E, 0x0003003E, 0x000055D8,
0x0000579B, 0x000500AA, 0x00000009, 0x00005179, 0x00004E5E, 0x00000A0B,
0x000300F7, 0x00004C7A, 0x00000000, 0x000400FA, 0x00005179, 0x00002F61,
0x00004C7A, 0x000200F8, 0x00002F61, 0x00060041, 0x0000028C, 0x00004722,
0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D, 0x0000000D, 0x00003D1E,
0x00004722, 0x00050041, 0x0000028B, 0x00004E0D, 0x00001548, 0x00000A0B,
0x0003003E, 0x00004E0D, 0x00003D1E, 0x00050041, 0x0000028B, 0x00004D14,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14, 0x00003D1E, 0x00050041,
0x0000028B, 0x00004D15, 0x00001548, 0x00000A11, 0x0003003E, 0x00004D15,
0x00003D1E, 0x00050041, 0x0000028B, 0x00004D16, 0x00001548, 0x00000A14,
0x0003003E, 0x00004D16, 0x00003D1E, 0x00050041, 0x0000028B, 0x00004D17,
0x00000CDA, 0x00000A0B, 0x0003003E, 0x00004D17, 0x00003D1E, 0x00050041,
0x0000028B, 0x00005ABC, 0x00000CDA, 0x00000A0E, 0x0003003E, 0x00005ABC,
0x00003D1E, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@@ -0,0 +1,134 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 1
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%19981 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %19981 %22427
%19905 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19982 %7391
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %7391
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %7391
%23304 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %23304 %7391
OpReturn
OpFunctionEnd
#endif
const uint32_t continuous_triangle_1cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000001,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A0D, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002B6, 0x0000000D, 0x00000A16, 0x00040020, 0x00000533, 0x00000003,
0x000002B6, 0x0004003B, 0x00000533, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004001C,
0x000002F2, 0x0000000D, 0x00000A10, 0x00040020, 0x0000056F, 0x00000003,
0x000002F2, 0x0004003B, 0x0000056F, 0x00000CDA, 0x00000003, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x0000606B,
0x0004003D, 0x0000000C, 0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A,
0x000027A3, 0x00000F2C, 0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B,
0x000027A3, 0x00050041, 0x0000028B, 0x00004E0D, 0x00000CEB, 0x00004E5E,
0x0003003E, 0x00004E0D, 0x0000579B, 0x00060041, 0x0000028C, 0x00004DC1,
0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D, 0x0000000D, 0x00001CDF,
0x00004DC1, 0x00050041, 0x0000028B, 0x00004E0E, 0x00001548, 0x00000A0B,
0x0003003E, 0x00004E0E, 0x00001CDF, 0x00050041, 0x0000028B, 0x00004D14,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14, 0x00001CDF, 0x00050041,
0x0000028B, 0x00004D15, 0x00001548, 0x00000A11, 0x0003003E, 0x00004D15,
0x00001CDF, 0x00050041, 0x0000028B, 0x00005B08, 0x00000CDA, 0x00000A0B,
0x0003003E, 0x00005B08, 0x00001CDF, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,146 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 3
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_3 = OpConstant %uint 3
%_arr_float_uint_3 = OpTypeArray %float %uint_3
%_ptr_Output__arr_float_uint_3 = OpTypePointer Output %_arr_float_uint_3
%3307 = OpVariable %_ptr_Output__arr_float_uint_3 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_0 = OpConstant %int 0
%bool = OpTypeBool
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%21976 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %21976 %22427
%20857 = OpIEqual %bool %20062 %int_0
OpSelectionMerge %19578 None
OpBranchConditional %20857 %12129 %19578
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%15646 = OpLoad %float %18210
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %15646
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %15646
%23228 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %23228 %15646
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t continuous_triangle_3cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000003,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A13, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00020014, 0x00000009,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002D4, 0x0000000D, 0x00000A16, 0x00040020, 0x00000551, 0x00000003,
0x000002D4, 0x0004003B, 0x00000551, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004001C,
0x00000310, 0x0000000D, 0x00000A10, 0x00040020, 0x0000058D, 0x00000003,
0x00000310, 0x0004003B, 0x0000058D, 0x00000CDA, 0x00000003, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x0000606B,
0x0004003D, 0x0000000C, 0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A,
0x000027A3, 0x00000F2C, 0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B,
0x000027A3, 0x00050041, 0x0000028B, 0x000055D8, 0x00000CEB, 0x00004E5E,
0x0003003E, 0x000055D8, 0x0000579B, 0x000500AA, 0x00000009, 0x00005179,
0x00004E5E, 0x00000A0B, 0x000300F7, 0x00004C7A, 0x00000000, 0x000400FA,
0x00005179, 0x00002F61, 0x00004C7A, 0x000200F8, 0x00002F61, 0x00060041,
0x0000028C, 0x00004722, 0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D,
0x0000000D, 0x00003D1E, 0x00004722, 0x00050041, 0x0000028B, 0x00004E0D,
0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0D, 0x00003D1E, 0x00050041,
0x0000028B, 0x00004D14, 0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14,
0x00003D1E, 0x00050041, 0x0000028B, 0x00004D15, 0x00001548, 0x00000A11,
0x0003003E, 0x00004D15, 0x00003D1E, 0x00050041, 0x0000028B, 0x00005ABC,
0x00000CDA, 0x00000A0B, 0x0003003E, 0x00005ABC, 0x00003D1E, 0x000200F9,
0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,143 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 1
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%19981 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %19981 %22427
%19905 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19982 %7391
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %7391
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %7391
%19734 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
OpStore %19734 %7391
%19735 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %19735 %7391
%23304 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
OpStore %23304 %7391
OpReturn
OpFunctionEnd
#endif
const uint32_t discrete_quad_1cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000001,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A0D, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002B6, 0x0000000D, 0x00000A16, 0x00040020, 0x00000533, 0x00000003,
0x000002B6, 0x0004003B, 0x00000533, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004001C, 0x00000301, 0x0000000D,
0x00000A10, 0x00040020, 0x0000057E, 0x00000003, 0x00000301, 0x0004003B,
0x0000057E, 0x00000CDA, 0x00000003, 0x00050036, 0x00000008, 0x0000161F,
0x00000000, 0x00000502, 0x000200F8, 0x0000606B, 0x0004003D, 0x0000000C,
0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A, 0x000027A3, 0x00000F2C,
0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B, 0x000027A3, 0x00050041,
0x0000028B, 0x00004E0D, 0x00000CEB, 0x00004E5E, 0x0003003E, 0x00004E0D,
0x0000579B, 0x00060041, 0x0000028C, 0x00004DC1, 0x00001342, 0x00000A0B,
0x00000A0D, 0x0004003D, 0x0000000D, 0x00001CDF, 0x00004DC1, 0x00050041,
0x0000028B, 0x00004E0E, 0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0E,
0x00001CDF, 0x00050041, 0x0000028B, 0x00004D14, 0x00001548, 0x00000A0E,
0x0003003E, 0x00004D14, 0x00001CDF, 0x00050041, 0x0000028B, 0x00004D15,
0x00001548, 0x00000A11, 0x0003003E, 0x00004D15, 0x00001CDF, 0x00050041,
0x0000028B, 0x00004D16, 0x00001548, 0x00000A14, 0x0003003E, 0x00004D16,
0x00001CDF, 0x00050041, 0x0000028B, 0x00004D17, 0x00000CDA, 0x00000A0B,
0x0003003E, 0x00004D17, 0x00001CDF, 0x00050041, 0x0000028B, 0x00005B08,
0x00000CDA, 0x00000A0E, 0x0003003E, 0x00005B08, 0x00001CDF, 0x000100FD,
0x00010038,
};

View File

@@ -0,0 +1,150 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 4
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%3307 = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_0 = OpConstant %int 0
%bool = OpTypeBool
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_float = OpTypePointer Uniform %float
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%21976 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %21976 %22427
%20857 = OpIEqual %bool %20062 %int_0
OpSelectionMerge %19578 None
OpBranchConditional %20857 %12129 %19578
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%15646 = OpLoad %float %18210
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %15646
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %15646
%19734 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
OpStore %19734 %15646
%19735 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %19735 %15646
%23228 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
OpStore %23228 %15646
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t discrete_quad_4cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000004,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A16, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00020014, 0x00000009,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004003B, 0x000004A2, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004001C, 0x00000310, 0x0000000D,
0x00000A10, 0x00040020, 0x0000058D, 0x00000003, 0x00000310, 0x0004003B,
0x0000058D, 0x00000CDA, 0x00000003, 0x00050036, 0x00000008, 0x0000161F,
0x00000000, 0x00000502, 0x000200F8, 0x0000606B, 0x0004003D, 0x0000000C,
0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A, 0x000027A3, 0x00000F2C,
0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B, 0x000027A3, 0x00050041,
0x0000028B, 0x000055D8, 0x00000CEB, 0x00004E5E, 0x0003003E, 0x000055D8,
0x0000579B, 0x000500AA, 0x00000009, 0x00005179, 0x00004E5E, 0x00000A0B,
0x000300F7, 0x00004C7A, 0x00000000, 0x000400FA, 0x00005179, 0x00002F61,
0x00004C7A, 0x000200F8, 0x00002F61, 0x00060041, 0x0000028C, 0x00004722,
0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D, 0x0000000D, 0x00003D1E,
0x00004722, 0x00050041, 0x0000028B, 0x00004E0D, 0x00001548, 0x00000A0B,
0x0003003E, 0x00004E0D, 0x00003D1E, 0x00050041, 0x0000028B, 0x00004D14,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14, 0x00003D1E, 0x00050041,
0x0000028B, 0x00004D15, 0x00001548, 0x00000A11, 0x0003003E, 0x00004D15,
0x00003D1E, 0x00050041, 0x0000028B, 0x00004D16, 0x00001548, 0x00000A14,
0x0003003E, 0x00004D16, 0x00003D1E, 0x00050041, 0x0000028B, 0x00004D17,
0x00000CDA, 0x00000A0B, 0x0003003E, 0x00004D17, 0x00003D1E, 0x00050041,
0x0000028B, 0x00005ABC, 0x00000CDA, 0x00000A0E, 0x0003003E, 0x00005ABC,
0x00003D1E, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@@ -0,0 +1,134 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 1
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%_ptr_Output__arr_float_uint_1 = OpTypePointer Output %_arr_float_uint_1
%3307 = OpVariable %_ptr_Output__arr_float_uint_1 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%19981 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %19981 %22427
%19905 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%7391 = OpLoad %float %19905
%19982 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19982 %7391
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %7391
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %7391
%23304 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %23304 %7391
OpReturn
OpFunctionEnd
#endif
const uint32_t discrete_triangle_1cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000001,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A0D, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002B6, 0x0000000D, 0x00000A16, 0x00040020, 0x00000533, 0x00000003,
0x000002B6, 0x0004003B, 0x00000533, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004001C,
0x000002F2, 0x0000000D, 0x00000A10, 0x00040020, 0x0000056F, 0x00000003,
0x000002F2, 0x0004003B, 0x0000056F, 0x00000CDA, 0x00000003, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x0000606B,
0x0004003D, 0x0000000C, 0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A,
0x000027A3, 0x00000F2C, 0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B,
0x000027A3, 0x00050041, 0x0000028B, 0x00004E0D, 0x00000CEB, 0x00004E5E,
0x0003003E, 0x00004E0D, 0x0000579B, 0x00060041, 0x0000028C, 0x00004DC1,
0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D, 0x0000000D, 0x00001CDF,
0x00004DC1, 0x00050041, 0x0000028B, 0x00004E0E, 0x00001548, 0x00000A0B,
0x0003003E, 0x00004E0E, 0x00001CDF, 0x00050041, 0x0000028B, 0x00004D14,
0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14, 0x00001CDF, 0x00050041,
0x0000028B, 0x00004D15, 0x00001548, 0x00000A11, 0x0003003E, 0x00004D15,
0x00001CDF, 0x00050041, 0x0000028B, 0x00005B08, 0x00000CDA, 0x00000A0B,
0x0003003E, 0x00005B08, 0x00001CDF, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,146 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 24684
; Schema: 0
OpCapability Tessellation
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint TessellationControl %5663 "main" %3307 %gl_InvocationID %3884 %gl_TessLevelOuter %gl_TessLevelInner
OpExecutionMode %5663 OutputVertices 3
OpDecorate %3307 Location 0
OpDecorate %gl_InvocationID BuiltIn InvocationId
OpDecorate %3884 Location 0
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
OpDecorate %gl_TessLevelOuter Patch
OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
OpDecorate %gl_TessLevelInner Patch
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%uint_3 = OpConstant %uint 3
%_arr_float_uint_3 = OpTypeArray %float %uint_3
%_ptr_Output__arr_float_uint_3 = OpTypePointer Output %_arr_float_uint_3
%3307 = OpVariable %_ptr_Output__arr_float_uint_3 Output
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_InvocationID = OpVariable %_ptr_Input_int Input
%uint_32 = OpConstant %uint 32
%_arr_float_uint_32 = OpTypeArray %float %uint_32
%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
%3884 = OpVariable %_ptr_Input__arr_float_uint_32 Input
%_ptr_Input_float = OpTypePointer Input %float
%_ptr_Output_float = OpTypePointer Output %float
%int_0 = OpConstant %int 0
%bool = OpTypeBool
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_float = OpTypePointer Uniform %float
%uint_4 = OpConstant %uint 4
%_arr_float_uint_4 = OpTypeArray %float %uint_4
%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%_arr_float_uint_2 = OpTypeArray %float %uint_2
%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
%5663 = OpFunction %void None %1282
%24683 = OpLabel
%20062 = OpLoad %int %gl_InvocationID
%10147 = OpAccessChain %_ptr_Input_float %3884 %20062
%22427 = OpLoad %float %10147
%21976 = OpAccessChain %_ptr_Output_float %3307 %20062
OpStore %21976 %22427
%20857 = OpIEqual %bool %20062 %int_0
OpSelectionMerge %19578 None
OpBranchConditional %20857 %12129 %19578
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%15646 = OpLoad %float %18210
%19981 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
OpStore %19981 %15646
%19732 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
OpStore %19732 %15646
%19733 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
OpStore %19733 %15646
%23228 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
OpStore %23228 %15646
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t discrete_triangle_3cp_hs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x0000606C, 0x00000000, 0x00020011,
0x00000003, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000A000F, 0x00000001,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000CEB, 0x000011E9, 0x00000F2C,
0x00001548, 0x00000CDA, 0x00040010, 0x0000161F, 0x0000001A, 0x00000003,
0x00040047, 0x00000CEB, 0x0000001E, 0x00000000, 0x00040047, 0x000011E9,
0x0000000B, 0x00000008, 0x00040047, 0x00000F2C, 0x0000001E, 0x00000000,
0x00030047, 0x00000457, 0x00000002, 0x00050048, 0x00000457, 0x00000000,
0x00000023, 0x00000000, 0x00050048, 0x00000457, 0x00000001, 0x00000023,
0x00000008, 0x00050048, 0x00000457, 0x00000002, 0x00000023, 0x00000010,
0x00050048, 0x00000457, 0x00000003, 0x00000023, 0x00000014, 0x00050048,
0x00000457, 0x00000004, 0x00000023, 0x00000018, 0x00040047, 0x00001342,
0x00000021, 0x00000006, 0x00040047, 0x00001342, 0x00000022, 0x00000001,
0x00040047, 0x00001548, 0x0000000B, 0x0000000B, 0x00030047, 0x00001548,
0x0000000F, 0x00040047, 0x00000CDA, 0x0000000B, 0x0000000C, 0x00030047,
0x00000CDA, 0x0000000F, 0x00020013, 0x00000008, 0x00030021, 0x00000502,
0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B,
0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,
0x0004001C, 0x00000225, 0x0000000D, 0x00000A13, 0x00040020, 0x000004A2,
0x00000003, 0x00000225, 0x0004003B, 0x000004A2, 0x00000CEB, 0x00000003,
0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040020, 0x00000289,
0x00000001, 0x0000000C, 0x0004003B, 0x00000289, 0x000011E9, 0x00000001,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004001C, 0x0000024D,
0x0000000D, 0x00000A6A, 0x00040020, 0x000004CA, 0x00000001, 0x0000024D,
0x0004003B, 0x000004CA, 0x00000F2C, 0x00000001, 0x00040020, 0x0000028A,
0x00000001, 0x0000000D, 0x00040020, 0x0000028B, 0x00000003, 0x0000000D,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00020014, 0x00000009,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013,
0x0000000B, 0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002,
0x00000457, 0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x00040020, 0x0000028C, 0x00000002,
0x0000000D, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004001C,
0x000002D4, 0x0000000D, 0x00000A16, 0x00040020, 0x00000551, 0x00000003,
0x000002D4, 0x0004003B, 0x00000551, 0x00001548, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004001C,
0x00000310, 0x0000000D, 0x00000A10, 0x00040020, 0x0000058D, 0x00000003,
0x00000310, 0x0004003B, 0x0000058D, 0x00000CDA, 0x00000003, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x0000606B,
0x0004003D, 0x0000000C, 0x00004E5E, 0x000011E9, 0x00050041, 0x0000028A,
0x000027A3, 0x00000F2C, 0x00004E5E, 0x0004003D, 0x0000000D, 0x0000579B,
0x000027A3, 0x00050041, 0x0000028B, 0x000055D8, 0x00000CEB, 0x00004E5E,
0x0003003E, 0x000055D8, 0x0000579B, 0x000500AA, 0x00000009, 0x00005179,
0x00004E5E, 0x00000A0B, 0x000300F7, 0x00004C7A, 0x00000000, 0x000400FA,
0x00005179, 0x00002F61, 0x00004C7A, 0x000200F8, 0x00002F61, 0x00060041,
0x0000028C, 0x00004722, 0x00001342, 0x00000A0B, 0x00000A0D, 0x0004003D,
0x0000000D, 0x00003D1E, 0x00004722, 0x00050041, 0x0000028B, 0x00004E0D,
0x00001548, 0x00000A0B, 0x0003003E, 0x00004E0D, 0x00003D1E, 0x00050041,
0x0000028B, 0x00004D14, 0x00001548, 0x00000A0E, 0x0003003E, 0x00004D14,
0x00003D1E, 0x00050041, 0x0000028B, 0x00004D15, 0x00001548, 0x00000A11,
0x0003003E, 0x00004D15, 0x00003D1E, 0x00050041, 0x0000028B, 0x00005ABC,
0x00000CDA, 0x00000A0B, 0x0003003E, 0x00005ABC, 0x00003D1E, 0x000200F9,
0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,203 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 25239
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %5663 "main" %gl_VertexIndex %5229
OpDecorate %gl_VertexIndex BuiltIn VertexIndex
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %5229 Location 0
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%bool = OpTypeBool
%uint_1 = OpConstant %uint 1
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_2 = OpConstant %uint 2
%uint_255 = OpConstant %uint 255
%uint_24 = OpConstant %uint 24
%uint_65280 = OpConstant %uint 65280
%uint_16711680 = OpConstant %uint 16711680
%uint_4278190080 = OpConstant %uint 4278190080
%uint_65535 = OpConstant %uint 65535
%uint_16 = OpConstant %uint 16
%uint_4294901760 = OpConstant %uint 4294901760
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_VertexIndex = OpVariable %_ptr_Input_int Input
%float = OpTypeFloat 32
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_2 = OpConstant %int 2
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%float_1 = OpConstant %float 1
%_ptr_Output_float = OpTypePointer Output %float
%5229 = OpVariable %_ptr_Output_float Output
%int_0 = OpConstant %int 0
%_ptr_Uniform_float = OpTypePointer Uniform %float
%5663 = OpFunction %void None %1282
%6733 = OpLabel
%9931 = OpLoad %int %gl_VertexIndex
%15381 = OpBitcast %uint %9931
%9656 = OpAccessChain %_ptr_Uniform_uint %4930 %int_2
%22442 = OpLoad %uint %9656
OpSelectionMerge %10204 None
OpSwitch %uint_0 %16320
%16320 = OpLabel
%23197 = OpIEqual %bool %22442 %uint_0
OpSelectionMerge %25238 None
OpBranchConditional %23197 %11868 %16569
%16569 = OpLabel
%19162 = OpIEqual %bool %22442 %uint_1
OpSelectionMerge %13164 None
OpBranchConditional %19162 %19530 %16570
%16570 = OpLabel
%19163 = OpIEqual %bool %22442 %uint_2
OpSelectionMerge %13163 None
OpBranchConditional %19163 %21863 %10583
%10583 = OpLabel
%18271 = OpBitwiseAnd %uint %15381 %uint_65535
%9425 = OpShiftLeftLogical %uint %18271 %uint_16
%20652 = OpBitwiseAnd %uint %15381 %uint_4294901760
%17549 = OpShiftRightLogical %uint %20652 %uint_16
%16376 = OpBitwiseOr %uint %9425 %17549
OpBranch %10204
%21863 = OpLabel
%20693 = OpBitwiseAnd %uint %15381 %uint_255
%9463 = OpShiftLeftLogical %uint %20693 %uint_24
%20306 = OpBitwiseAnd %uint %15381 %uint_65280
%19284 = OpShiftLeftLogical %uint %20306 %uint_8
%17045 = OpBitwiseOr %uint %9463 %19284
%21212 = OpBitwiseAnd %uint %15381 %uint_16711680
%20634 = OpShiftRightLogical %uint %21212 %uint_8
%24000 = OpBitwiseOr %uint %17045 %20634
%19599 = OpBitwiseAnd %uint %15381 %uint_4278190080
%21584 = OpShiftRightLogical %uint %19599 %uint_24
%16377 = OpBitwiseOr %uint %24000 %21584
OpBranch %10204
%13163 = OpLabel
OpUnreachable
%19530 = OpLabel
%19075 = OpBitwiseAnd %uint %15381 %uint_16711935
%9426 = OpShiftLeftLogical %uint %19075 %uint_8
%20653 = OpBitwiseAnd %uint %15381 %uint_4278255360
%17550 = OpShiftRightLogical %uint %20653 %uint_8
%16378 = OpBitwiseOr %uint %9426 %17550
OpBranch %10204
%13164 = OpLabel
OpUnreachable
%11868 = OpLabel
OpBranch %10204
%25238 = OpLabel
OpUnreachable
%10204 = OpLabel
%15672 = OpPhi %uint %15381 %11868 %16378 %19530 %16377 %21863 %16376 %10583
%24496 = OpBitcast %float %15672
%21708 = OpFAdd %float %24496 %float_1
%7335 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_0
%12980 = OpLoad %float %7335
%19190 = OpAccessChain %_ptr_Uniform_float %4930 %int_0 %uint_1
%10126 = OpLoad %float %19190
%23029 = OpExtInst %float %1 FClamp %21708 %12980 %10126
OpStore %5229 %23029
OpReturn
OpFunctionEnd
#endif
const uint32_t tessellation_adaptive_vs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00006297, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000000,
0x0000161F, 0x6E69616D, 0x00000000, 0x00001029, 0x0000146D, 0x00040047,
0x00001029, 0x0000000B, 0x0000002A, 0x00030047, 0x00000457, 0x00000002,
0x00050048, 0x00000457, 0x00000000, 0x00000023, 0x00000000, 0x00050048,
0x00000457, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000457,
0x00000002, 0x00000023, 0x00000010, 0x00050048, 0x00000457, 0x00000003,
0x00000023, 0x00000014, 0x00050048, 0x00000457, 0x00000004, 0x00000023,
0x00000018, 0x00040047, 0x00001342, 0x00000021, 0x00000006, 0x00040047,
0x00001342, 0x00000022, 0x00000001, 0x00040047, 0x0000146D, 0x0000001E,
0x00000000, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,
0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x0004002B, 0x0000000B,
0x00000A0A, 0x00000000, 0x00020014, 0x00000009, 0x0004002B, 0x0000000B,
0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF,
0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B,
0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,
0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,
0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A87, 0x0000FF00,
0x0004002B, 0x0000000B, 0x000005A9, 0x00FF0000, 0x0004002B, 0x0000000B,
0x00000580, 0xFF000000, 0x0004002B, 0x0000000B, 0x000001C1, 0x0000FFFF,
0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,
0x0000068D, 0xFFFF0000, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,
0x00040020, 0x00000289, 0x00000001, 0x0000000C, 0x0004003B, 0x00000289,
0x00001029, 0x00000001, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011, 0x0000000B,
0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013, 0x0000000B,
0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002, 0x00000457,
0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B, 0x0000000C,
0x00000A11, 0x00000002, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x00040020, 0x0000028A,
0x00000003, 0x0000000D, 0x0004003B, 0x0000028A, 0x0000146D, 0x00000003,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028B,
0x00000002, 0x0000000D, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,
0x00000502, 0x000200F8, 0x00001A4D, 0x0004003D, 0x0000000C, 0x000026CB,
0x00001029, 0x0004007C, 0x0000000B, 0x00003C15, 0x000026CB, 0x00050041,
0x00000288, 0x000025B8, 0x00001342, 0x00000A11, 0x0004003D, 0x0000000B,
0x000057AA, 0x000025B8, 0x000300F7, 0x000027DC, 0x00000000, 0x000300FB,
0x00000A0A, 0x00003FC0, 0x000200F8, 0x00003FC0, 0x000500AA, 0x00000009,
0x00005A9D, 0x000057AA, 0x00000A0A, 0x000300F7, 0x00006296, 0x00000000,
0x000400FA, 0x00005A9D, 0x00002E5C, 0x000040B9, 0x000200F8, 0x000040B9,
0x000500AA, 0x00000009, 0x00004ADA, 0x000057AA, 0x00000A0D, 0x000300F7,
0x0000336C, 0x00000000, 0x000400FA, 0x00004ADA, 0x00004C4A, 0x000040BA,
0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB, 0x000057AA,
0x00000A10, 0x000300F7, 0x0000336B, 0x00000000, 0x000400FA, 0x00004ADB,
0x00005567, 0x00002957, 0x000200F8, 0x00002957, 0x000500C7, 0x0000000B,
0x0000475F, 0x00003C15, 0x000001C1, 0x000500C4, 0x0000000B, 0x000024D1,
0x0000475F, 0x00000A3A, 0x000500C7, 0x0000000B, 0x000050AC, 0x00003C15,
0x0000068D, 0x000500C2, 0x0000000B, 0x0000448D, 0x000050AC, 0x00000A3A,
0x000500C5, 0x0000000B, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,
0x000027DC, 0x000200F8, 0x00005567, 0x000500C7, 0x0000000B, 0x000050D5,
0x00003C15, 0x00000144, 0x000500C4, 0x0000000B, 0x000024F7, 0x000050D5,
0x00000A52, 0x000500C7, 0x0000000B, 0x00004F52, 0x00003C15, 0x00000A87,
0x000500C4, 0x0000000B, 0x00004B54, 0x00004F52, 0x00000A22, 0x000500C5,
0x0000000B, 0x00004295, 0x000024F7, 0x00004B54, 0x000500C7, 0x0000000B,
0x000052DC, 0x00003C15, 0x000005A9, 0x000500C2, 0x0000000B, 0x0000509A,
0x000052DC, 0x00000A22, 0x000500C5, 0x0000000B, 0x00005DC0, 0x00004295,
0x0000509A, 0x000500C7, 0x0000000B, 0x00004C8F, 0x00003C15, 0x00000580,
0x000500C2, 0x0000000B, 0x00005450, 0x00004C8F, 0x00000A52, 0x000500C5,
0x0000000B, 0x00003FF9, 0x00005DC0, 0x00005450, 0x000200F9, 0x000027DC,
0x000200F8, 0x0000336B, 0x000100FF, 0x000200F8, 0x00004C4A, 0x000500C7,
0x0000000B, 0x00004A83, 0x00003C15, 0x000008A6, 0x000500C4, 0x0000000B,
0x000024D2, 0x00004A83, 0x00000A22, 0x000500C7, 0x0000000B, 0x000050AD,
0x00003C15, 0x000005FD, 0x000500C2, 0x0000000B, 0x0000448E, 0x000050AD,
0x00000A22, 0x000500C5, 0x0000000B, 0x00003FFA, 0x000024D2, 0x0000448E,
0x000200F9, 0x000027DC, 0x000200F8, 0x0000336C, 0x000100FF, 0x000200F8,
0x00002E5C, 0x000200F9, 0x000027DC, 0x000200F8, 0x00006296, 0x000100FF,
0x000200F8, 0x000027DC, 0x000B00F5, 0x0000000B, 0x00003D38, 0x00003C15,
0x00002E5C, 0x00003FFA, 0x00004C4A, 0x00003FF9, 0x00005567, 0x00003FF8,
0x00002957, 0x0004007C, 0x0000000D, 0x00005FB0, 0x00003D38, 0x00050081,
0x0000000D, 0x000054CC, 0x00005FB0, 0x0000008A, 0x00060041, 0x0000028B,
0x00001CA7, 0x00001342, 0x00000A0B, 0x00000A0A, 0x0004003D, 0x0000000D,
0x000032B4, 0x00001CA7, 0x00060041, 0x0000028B, 0x00004AF6, 0x00001342,
0x00000A0B, 0x00000A0D, 0x0004003D, 0x0000000D, 0x0000278E, 0x00004AF6,
0x0008000C, 0x0000000D, 0x000059F5, 0x00000001, 0x0000002B, 0x000054CC,
0x000032B4, 0x0000278E, 0x0003003E, 0x0000146D, 0x000059F5, 0x000100FD,
0x00010038,
};

View File

@@ -0,0 +1,208 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 25239
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %5663 "main" %gl_VertexIndex %3307
OpDecorate %gl_VertexIndex BuiltIn VertexIndex
OpDecorate %_struct_1111 Block
OpMemberDecorate %_struct_1111 0 Offset 0
OpMemberDecorate %_struct_1111 1 Offset 8
OpMemberDecorate %_struct_1111 2 Offset 16
OpMemberDecorate %_struct_1111 3 Offset 20
OpMemberDecorate %_struct_1111 4 Offset 24
OpDecorate %4930 Binding 6
OpDecorate %4930 DescriptorSet 1
OpDecorate %3307 Location 0
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%bool = OpTypeBool
%uint_1 = OpConstant %uint 1
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_2 = OpConstant %uint 2
%uint_255 = OpConstant %uint 255
%uint_24 = OpConstant %uint 24
%uint_65280 = OpConstant %uint 65280
%uint_16711680 = OpConstant %uint 16711680
%uint_4278190080 = OpConstant %uint 4278190080
%uint_65535 = OpConstant %uint 65535
%uint_16 = OpConstant %uint 16
%uint_4294901760 = OpConstant %uint 4294901760
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%gl_VertexIndex = OpVariable %_ptr_Input_int Input
%float = OpTypeFloat 32
%v2float = OpTypeVector %float 2
%v2uint = OpTypeVector %uint 2
%_struct_1111 = OpTypeStruct %v2float %v2float %uint %uint %v2uint
%_ptr_Uniform__struct_1111 = OpTypePointer Uniform %_struct_1111
%4930 = OpVariable %_ptr_Uniform__struct_1111 Uniform
%int_2 = OpConstant %int 2
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Output_float = OpTypePointer Output %float
%3307 = OpVariable %_ptr_Output_float Output
%int_3 = OpConstant %int 3
%uint_16777215 = OpConstant %uint 16777215
%int_4 = OpConstant %int 4
%5663 = OpFunction %void None %1282
%6733 = OpLabel
%9931 = OpLoad %int %gl_VertexIndex
%15381 = OpBitcast %uint %9931
%9656 = OpAccessChain %_ptr_Uniform_uint %4930 %int_2
%22442 = OpLoad %uint %9656
OpSelectionMerge %9083 None
OpSwitch %uint_0 %16320
%16320 = OpLabel
%23197 = OpIEqual %bool %22442 %uint_0
OpSelectionMerge %25238 None
OpBranchConditional %23197 %11868 %16569
%16569 = OpLabel
%19162 = OpIEqual %bool %22442 %uint_1
OpSelectionMerge %13164 None
OpBranchConditional %19162 %19530 %16570
%16570 = OpLabel
%19163 = OpIEqual %bool %22442 %uint_2
OpSelectionMerge %13163 None
OpBranchConditional %19163 %21863 %10583
%10583 = OpLabel
%18271 = OpBitwiseAnd %uint %15381 %uint_65535
%9425 = OpShiftLeftLogical %uint %18271 %uint_16
%20652 = OpBitwiseAnd %uint %15381 %uint_4294901760
%17549 = OpShiftRightLogical %uint %20652 %uint_16
%16376 = OpBitwiseOr %uint %9425 %17549
OpBranch %9083
%21863 = OpLabel
%20693 = OpBitwiseAnd %uint %15381 %uint_255
%9463 = OpShiftLeftLogical %uint %20693 %uint_24
%20306 = OpBitwiseAnd %uint %15381 %uint_65280
%19284 = OpShiftLeftLogical %uint %20306 %uint_8
%17045 = OpBitwiseOr %uint %9463 %19284
%21212 = OpBitwiseAnd %uint %15381 %uint_16711680
%20634 = OpShiftRightLogical %uint %21212 %uint_8
%24000 = OpBitwiseOr %uint %17045 %20634
%19599 = OpBitwiseAnd %uint %15381 %uint_4278190080
%21584 = OpShiftRightLogical %uint %19599 %uint_24
%16377 = OpBitwiseOr %uint %24000 %21584
OpBranch %9083
%13163 = OpLabel
OpUnreachable
%19530 = OpLabel
%19075 = OpBitwiseAnd %uint %15381 %uint_16711935
%9426 = OpShiftLeftLogical %uint %19075 %uint_8
%20653 = OpBitwiseAnd %uint %15381 %uint_4278255360
%17550 = OpShiftRightLogical %uint %20653 %uint_8
%16378 = OpBitwiseOr %uint %9426 %17550
OpBranch %9083
%13164 = OpLabel
OpUnreachable
%11868 = OpLabel
OpBranch %9083
%25238 = OpLabel
OpUnreachable
%9083 = OpLabel
%24587 = OpPhi %uint %15381 %11868 %16378 %19530 %16377 %21863 %16376 %10583
%24998 = OpAccessChain %_ptr_Uniform_uint %4930 %int_3
%8159 = OpLoad %uint %24998
%7652 = OpIAdd %uint %24587 %8159
%18847 = OpBitwiseAnd %uint %7652 %uint_16777215
%10702 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_0
%24236 = OpLoad %uint %10702
%19191 = OpAccessChain %_ptr_Uniform_uint %4930 %int_4 %uint_1
%22108 = OpLoad %uint %19191
%23723 = OpExtInst %uint %1 UClamp %18847 %24236 %22108
%9576 = OpConvertUToF %float %23723
OpStore %3307 %9576
OpReturn
OpFunctionEnd
#endif
const uint32_t tessellation_indexed_vs[] = {
0x07230203, 0x00010000, 0x0008000B, 0x00006297, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000000,
0x0000161F, 0x6E69616D, 0x00000000, 0x00001029, 0x00000CEB, 0x00040047,
0x00001029, 0x0000000B, 0x0000002A, 0x00030047, 0x00000457, 0x00000002,
0x00050048, 0x00000457, 0x00000000, 0x00000023, 0x00000000, 0x00050048,
0x00000457, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000457,
0x00000002, 0x00000023, 0x00000010, 0x00050048, 0x00000457, 0x00000003,
0x00000023, 0x00000014, 0x00050048, 0x00000457, 0x00000004, 0x00000023,
0x00000018, 0x00040047, 0x00001342, 0x00000021, 0x00000006, 0x00040047,
0x00001342, 0x00000022, 0x00000001, 0x00040047, 0x00000CEB, 0x0000001E,
0x00000000, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,
0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x0004002B, 0x0000000B,
0x00000A0A, 0x00000000, 0x00020014, 0x00000009, 0x0004002B, 0x0000000B,
0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF,
0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B,
0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,
0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,
0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A87, 0x0000FF00,
0x0004002B, 0x0000000B, 0x000005A9, 0x00FF0000, 0x0004002B, 0x0000000B,
0x00000580, 0xFF000000, 0x0004002B, 0x0000000B, 0x000001C1, 0x0000FFFF,
0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,
0x0000068D, 0xFFFF0000, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,
0x00040020, 0x00000289, 0x00000001, 0x0000000C, 0x0004003B, 0x00000289,
0x00001029, 0x00000001, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000011, 0x0000000B,
0x00000002, 0x0007001E, 0x00000457, 0x00000013, 0x00000013, 0x0000000B,
0x0000000B, 0x00000011, 0x00040020, 0x000006D4, 0x00000002, 0x00000457,
0x0004003B, 0x000006D4, 0x00001342, 0x00000002, 0x0004002B, 0x0000000C,
0x00000A11, 0x00000002, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x00040020, 0x0000028A, 0x00000003, 0x0000000D, 0x0004003B, 0x0000028A,
0x00000CEB, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,
0x0004002B, 0x0000000B, 0x00000923, 0x00FFFFFF, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,
0x00000502, 0x000200F8, 0x00001A4D, 0x0004003D, 0x0000000C, 0x000026CB,
0x00001029, 0x0004007C, 0x0000000B, 0x00003C15, 0x000026CB, 0x00050041,
0x00000288, 0x000025B8, 0x00001342, 0x00000A11, 0x0004003D, 0x0000000B,
0x000057AA, 0x000025B8, 0x000300F7, 0x0000237B, 0x00000000, 0x000300FB,
0x00000A0A, 0x00003FC0, 0x000200F8, 0x00003FC0, 0x000500AA, 0x00000009,
0x00005A9D, 0x000057AA, 0x00000A0A, 0x000300F7, 0x00006296, 0x00000000,
0x000400FA, 0x00005A9D, 0x00002E5C, 0x000040B9, 0x000200F8, 0x000040B9,
0x000500AA, 0x00000009, 0x00004ADA, 0x000057AA, 0x00000A0D, 0x000300F7,
0x0000336C, 0x00000000, 0x000400FA, 0x00004ADA, 0x00004C4A, 0x000040BA,
0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB, 0x000057AA,
0x00000A10, 0x000300F7, 0x0000336B, 0x00000000, 0x000400FA, 0x00004ADB,
0x00005567, 0x00002957, 0x000200F8, 0x00002957, 0x000500C7, 0x0000000B,
0x0000475F, 0x00003C15, 0x000001C1, 0x000500C4, 0x0000000B, 0x000024D1,
0x0000475F, 0x00000A3A, 0x000500C7, 0x0000000B, 0x000050AC, 0x00003C15,
0x0000068D, 0x000500C2, 0x0000000B, 0x0000448D, 0x000050AC, 0x00000A3A,
0x000500C5, 0x0000000B, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,
0x0000237B, 0x000200F8, 0x00005567, 0x000500C7, 0x0000000B, 0x000050D5,
0x00003C15, 0x00000144, 0x000500C4, 0x0000000B, 0x000024F7, 0x000050D5,
0x00000A52, 0x000500C7, 0x0000000B, 0x00004F52, 0x00003C15, 0x00000A87,
0x000500C4, 0x0000000B, 0x00004B54, 0x00004F52, 0x00000A22, 0x000500C5,
0x0000000B, 0x00004295, 0x000024F7, 0x00004B54, 0x000500C7, 0x0000000B,
0x000052DC, 0x00003C15, 0x000005A9, 0x000500C2, 0x0000000B, 0x0000509A,
0x000052DC, 0x00000A22, 0x000500C5, 0x0000000B, 0x00005DC0, 0x00004295,
0x0000509A, 0x000500C7, 0x0000000B, 0x00004C8F, 0x00003C15, 0x00000580,
0x000500C2, 0x0000000B, 0x00005450, 0x00004C8F, 0x00000A52, 0x000500C5,
0x0000000B, 0x00003FF9, 0x00005DC0, 0x00005450, 0x000200F9, 0x0000237B,
0x000200F8, 0x0000336B, 0x000100FF, 0x000200F8, 0x00004C4A, 0x000500C7,
0x0000000B, 0x00004A83, 0x00003C15, 0x000008A6, 0x000500C4, 0x0000000B,
0x000024D2, 0x00004A83, 0x00000A22, 0x000500C7, 0x0000000B, 0x000050AD,
0x00003C15, 0x000005FD, 0x000500C2, 0x0000000B, 0x0000448E, 0x000050AD,
0x00000A22, 0x000500C5, 0x0000000B, 0x00003FFA, 0x000024D2, 0x0000448E,
0x000200F9, 0x0000237B, 0x000200F8, 0x0000336C, 0x000100FF, 0x000200F8,
0x00002E5C, 0x000200F9, 0x0000237B, 0x000200F8, 0x00006296, 0x000100FF,
0x000200F8, 0x0000237B, 0x000B00F5, 0x0000000B, 0x0000600B, 0x00003C15,
0x00002E5C, 0x00003FFA, 0x00004C4A, 0x00003FF9, 0x00005567, 0x00003FF8,
0x00002957, 0x00050041, 0x00000288, 0x000061A6, 0x00001342, 0x00000A14,
0x0004003D, 0x0000000B, 0x00001FDF, 0x000061A6, 0x00050080, 0x0000000B,
0x00001DE4, 0x0000600B, 0x00001FDF, 0x000500C7, 0x0000000B, 0x0000499F,
0x00001DE4, 0x00000923, 0x00060041, 0x00000288, 0x000029CE, 0x00001342,
0x00000A17, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00005EAC, 0x000029CE,
0x00060041, 0x00000288, 0x00004AF7, 0x00001342, 0x00000A17, 0x00000A0D,
0x0004003D, 0x0000000B, 0x0000565C, 0x00004AF7, 0x0008000C, 0x0000000B,
0x00005CAB, 0x00000001, 0x0000002C, 0x0000499F, 0x00005EAC, 0x0000565C,
0x00040070, 0x0000000D, 0x00002568, 0x00005CAB, 0x0003003E, 0x00000CEB,
0x00002568, 0x000100FD, 0x00010038,
};

View File

@@ -0,0 +1,43 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for continuous quad tessellation with 1 control
// point (patch indexed).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only one invocation for 1cp).
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0).
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelOuter[3] = factor;
gl_TessLevelInner[0] = factor;
gl_TessLevelInner[1] = factor;
}

View File

@@ -0,0 +1,45 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for continuous quad tessellation with 4 control
// points (control point indexed).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 4) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only needs to be done by one invocation).
if (gl_InvocationID == 0) {
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0).
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelOuter[3] = factor;
gl_TessLevelInner[0] = factor;
gl_TessLevelInner[1] = factor;
}
}

View File

@@ -0,0 +1,41 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for continuous triangle tessellation with 1
// control point (patch indexed).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only one invocation for 1cp).
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0).
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelInner[0] = factor;
}

View File

@@ -0,0 +1,43 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for continuous triangle tessellation with 3
// control points (control point indexed).
// Uses fractional_even spacing for smooth tessellation.
layout(vertices = 3) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only needs to be done by one invocation).
if (gl_InvocationID == 0) {
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
// (fractional_even also requires a factor of at least 2.0).
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelInner[0] = factor;
}
}

View File

@@ -0,0 +1,41 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for discrete quad tessellation with 1 control
// point (patch indexed).
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only one invocation for 1cp).
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelOuter[3] = factor;
gl_TessLevelInner[0] = factor;
gl_TessLevelInner[1] = factor;
}

View File

@@ -0,0 +1,43 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for discrete quad tessellation with 4 control
// points (control point indexed).
layout(vertices = 4) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only needs to be done by one invocation).
if (gl_InvocationID == 0) {
// 1.0 already added to the factor on the CPU, according to the images in
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelOuter[3] = factor;
gl_TessLevelInner[0] = factor;
gl_TessLevelInner[1] = factor;
}
}

View File

@@ -0,0 +1,44 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for discrete triangle tessellation with 1 control
// point (patch indexed).
layout(vertices = 1) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only one invocation for 1cp).
// Xenos creates a uniform grid for triangles, but this can't be reproduced
// using the tessellator on the PC, so just use what has the closest level
// of detail.
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
//
// 1.0 already added to the factor on the CPU, according to the images in
// the slides above.
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelInner[0] = factor;
}

View File

@@ -0,0 +1,46 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Tessellation control shader for discrete triangle tessellation with 3 control
// points (control point indexed).
layout(vertices = 3) out;
#include "xenos_draw.glsli"
// Input from vertex shader - vertex index as float.
layout(location = 0) in float in_index[];
// Output to tessellation evaluation shader - vertex index as float.
layout(location = 0) out float out_index[];
void main() {
// Pass through the vertex index.
out_index[gl_InvocationID] = in_index[gl_InvocationID];
// Set tessellation levels (only needs to be done by one invocation).
if (gl_InvocationID == 0) {
// Xenos creates a uniform grid for triangles, but this can't be reproduced
// using the tessellator on the PC, so just use what has the closest level
// of detail.
// https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360
//
// 1.0 already added to the factor on the CPU, according to the images in
// the slides above.
float factor = xe_tessellation_factor_range.y;
gl_TessLevelOuter[0] = factor;
gl_TessLevelOuter[1] = factor;
gl_TessLevelOuter[2] = factor;
gl_TessLevelInner[0] = factor;
}
}

Binary file not shown.

View File

@@ -0,0 +1,55 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Vertex shader for adaptive tessellation.
// Reads edge tessellation factors from the index buffer (as float32) and passes
// them to the tessellation control shader.
#include "xenos_draw.glsli"
// Output to tessellation control shader - edge tessellation factor.
layout(location = 0) out float out_edge_factor;
// Endian swap for 32-bit value.
uint XeEndianSwap32(uint value, uint endian) {
if (endian == 0u) {
// No swap.
return value;
} else if (endian == 1u) {
// 8-in-16.
return ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u);
} else if (endian == 2u) {
// 8-in-32.
return ((value & 0x000000FFu) << 24u) | ((value & 0x0000FF00u) << 8u) |
((value & 0x00FF0000u) >> 8u) | ((value & 0xFF000000u) >> 24u);
} else {
// 16-in-32.
return ((value & 0x0000FFFFu) << 16u) | ((value & 0xFFFF0000u) >> 16u);
}
}
void main() {
// The Xbox 360's GPU accepts the float32 tessellation factors for edges
// through a special kind of an index buffer.
// While 4D5307F2 sets the factors to 0 for frustum-culled (quad) patches, in
// 4D5307E6 only allowing patches with factors above 0 makes distant
// (triangle) patches disappear - it appears that there are no special values
// for culled patches on the Xbox 360 (unlike zero, negative and NaN on
// Direct3D 11).
//
// The vertex index (gl_VertexIndex) contains the raw edge factor bits from
// the index buffer. We need to endian swap and interpret as float.
uint factor_bits = XeEndianSwap32(uint(gl_VertexIndex), xe_vertex_index_endian);
float factor = uintBitsToFloat(factor_bits) + 1.0;
out_edge_factor = clamp(factor, xe_tessellation_factor_range.x,
xe_tessellation_factor_range.y);
}

View File

@@ -0,0 +1,46 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
// Vertex shader for indexed tessellation (discrete/continuous modes).
// Passes the vertex index to the tessellation control shader.
#include "xenos_draw.glsli"
// Output to tessellation control shader - vertex index as float.
layout(location = 0) out float out_index;
// Endian swap for 32-bit value.
uint XeEndianSwap32(uint value, uint endian) {
if (endian == 0u) {
// No swap.
return value;
} else if (endian == 1u) {
// 8-in-16.
return ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u);
} else if (endian == 2u) {
// 8-in-32.
return ((value & 0x000000FFu) << 24u) | ((value & 0x0000FF00u) << 8u) |
((value & 0x00FF0000u) >> 8u) | ((value & 0xFF000000u) >> 24u);
} else {
// 16-in-32.
return ((value & 0x0000FFFFu) << 16u) | ((value & 0xFFFF0000u) >> 16u);
}
}
void main() {
// Only the lower 24 bits of the vertex index are used (tested on an Adreno
// 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as
// `(index + offset) & 0xFFFFFF`.
uint vertex_index = XeEndianSwap32(uint(gl_VertexIndex), xe_vertex_index_endian);
out_index = float(clamp((vertex_index + xe_vertex_index_offset) & 0xFFFFFFu,
xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));
}

Binary file not shown.

View File

@@ -0,0 +1,37 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_GPU_SHADERS_XENOS_DRAW_GLSLI_
#define XENIA_GPU_SHADERS_XENOS_DRAW_GLSLI_
// Tessellation constants for Vulkan tessellation shaders.
// This is a separate constant buffer dedicated to tessellation, not part of
// the main system constants, to avoid changing the existing SystemConstants
// layout.
//
// Binding: set 1 (kDescriptorSetConstants), binding 6 (after the existing
// constant buffers:
// 0 = System, 1 = FloatVertex, 2 = FloatPixel, 3 = BoolLoop, 4 = Fetch,
// 5 = ClipPlanes, 6 = Tessellation)
layout(std140, set = 1, binding = 6) uniform XeTessellationConstants {
// Tessellation factor range: .x = min, .y = max.
// 1.0 is added on the CPU according to Xbox 360 tessellation documentation.
// For fractional_even partitioning, minimum factor must be >= 2.0.
vec2 xe_tessellation_factor_range;
// Padding to align next member to 8 bytes (std140 rules).
vec2 xe_tessellation_padding0;
// Vertex/index processing parameters.
uint xe_vertex_index_endian;
uint xe_vertex_index_offset;
uvec2 xe_vertex_index_min_max;
};
#endif // XENIA_GPU_SHADERS_XENOS_DRAW_GLSLI_

View File

@@ -416,10 +416,17 @@ namespace spv {
ExecutionMode::SampleInterlockOrderedEXT
#define ExecutionModeInputPoints ExecutionMode::InputPoints
#define ExecutionModeTriangles ExecutionMode::Triangles
#define ExecutionModeQuads ExecutionMode::Quads
#define ExecutionModeIsolines ExecutionMode::Isolines
#define ExecutionModeInputLinesAdjacency ExecutionMode::InputLinesAdjacency
#define ExecutionModeOutputTriangleStrip ExecutionMode::OutputTriangleStrip
#define ExecutionModeInvocations ExecutionMode::Invocations
#define ExecutionModeOutputVertices ExecutionMode::OutputVertices
#define ExecutionModeSpacingEqual ExecutionMode::SpacingEqual
#define ExecutionModeSpacingFractionalEven ExecutionMode::SpacingFractionalEven
#define ExecutionModeSpacingFractionalOdd ExecutionMode::SpacingFractionalOdd
#define ExecutionModeVertexOrderCw ExecutionMode::VertexOrderCw
#define ExecutionModeVertexOrderCcw ExecutionMode::VertexOrderCcw
#define ExecutionModeDepthReplacing ExecutionMode::DepthReplacing
#define ExecutionModeStencilRefReplacingEXT \
ExecutionMode::StencilRefReplacingEXT

View File

@@ -15,6 +15,7 @@
#include "third_party/fmt/include/fmt/format.h"
#include "third_party/glslang/SPIRV/GLSL.std.450.h"
#include "xenia/base/assert.h"
#include "xenia/base/logging.h"
#include "xenia/base/math.h"
#include "xenia/base/string_buffer.h"
#include "xenia/gpu/spirv_compatibility.h"
@@ -111,6 +112,12 @@ void SpirvShaderTranslator::Reset() {
uniform_float_constants_ = spv::NoResult;
// Vertex shader inputs.
input_vertex_index_ = spv::NoResult;
// Tessellation evaluation shader inputs.
input_primitive_id_ = spv::NoResult;
input_tess_coord_ = spv::NoResult;
// Pixel shader inputs.
input_point_coordinates_ = spv::NoResult;
input_fragment_coordinates_ = spv::NoResult;
input_front_facing_ = spv::NoResult;
@@ -730,9 +737,45 @@ std::vector<uint8_t> SpirvShaderTranslator::CompleteTranslation() {
}
} else {
assert_true(is_vertex_shader());
execution_model = IsSpirvTessEvalShader()
? spv::ExecutionModelTessellationEvaluation
: spv::ExecutionModelVertex;
if (IsSpirvTessEvalShader()) {
execution_model = spv::ExecutionModelTessellationEvaluation;
// Set tessellation execution modes based on the domain shader type.
Modification shader_modification = GetSpirvShaderModification();
Shader::HostVertexShaderType host_type =
shader_modification.vertex.host_vertex_shader_type;
// Tessellation domain (triangles vs quads).
switch (host_type) {
case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:
case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:
builder_->addExecutionMode(function_main_,
spv::ExecutionModeTriangles);
break;
case Shader::HostVertexShaderType::kQuadDomainCPIndexed:
case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:
builder_->addExecutionMode(function_main_, spv::ExecutionModeQuads);
break;
case Shader::HostVertexShaderType::kLineDomainCPIndexed:
case Shader::HostVertexShaderType::kLineDomainPatchIndexed:
builder_->addExecutionMode(function_main_,
spv::ExecutionModeIsolines);
break;
default:
assert_unhandled_case(host_type);
break;
}
// Tessellation spacing - fractional_even for continuous mode, equal
// (integer) for discrete mode. The actual mode is determined by the TCS
// (hull shader), but we use fractional_even here as the default since it
// provides smooth results. The TCS sets the actual tessellation levels.
// For now, use fractional_even as it's more compatible.
builder_->addExecutionMode(function_main_,
spv::ExecutionModeSpacingFractionalEven);
// Vertex ordering - counter-clockwise (Vulkan default for front face).
builder_->addExecutionMode(function_main_,
spv::ExecutionModeVertexOrderCcw);
} else {
execution_model = spv::ExecutionModelVertex;
}
}
if (features_.denorm_flush_to_zero_float32) {
// Flush to zero, similar to the real hardware, also for things like Shader
@@ -1203,6 +1246,14 @@ void SpirvShaderTranslator::StartVertexOrTessEvalShaderBeforeMain() {
builder_->addDecoration(input_primitive_id_, spv::DecorationBuiltIn,
static_cast<int>(spv::BuiltIn::PrimitiveId));
main_interface_.push_back(input_primitive_id_);
// Tessellation coordinates (barycentric coordinates for the tessellated
// vertex within the patch).
input_tess_coord_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassInput, type_float3_, "gl_TessCoord");
builder_->addDecoration(input_tess_coord_, spv::DecorationBuiltIn,
static_cast<int>(spv::BuiltIn::TessCoord));
main_interface_.push_back(input_tess_coord_);
} else {
input_vertex_index_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassInput, type_int_, "gl_VertexIndex");
@@ -1421,8 +1472,166 @@ void SpirvShaderTranslator::StartVertexOrTessEvalShaderInMain() {
// Load the vertex index or the tessellation parameters.
if (register_count()) {
// TODO(Triang3l): Barycentric coordinates and patch index.
if (IsSpirvVertexShader()) {
if (IsSpirvTessEvalShader()) {
// Tessellation evaluation shader (domain shader).
// Copy barycentric coordinates (gl_TessCoord) to r0 with appropriate
// swizzle based on the domain type.
Shader::HostVertexShaderType host_type =
shader_modification.vertex.host_vertex_shader_type;
spv::Id tess_coord =
builder_->createLoad(input_tess_coord_, spv::NoPrecision);
switch (host_type) {
case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:
case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed: {
// Triangle domain requires at least 2 registers (r0 for barycentric,
// r1 for control point indices or patch index).
assert_true(register_count() >= 2);
// Triangle domain: gl_TessCoord.xyz -> r0.zyx
// ZYX swizzle according to 415607E1 and 4D5307F2.
uint_vector_temp_.clear();
uint_vector_temp_.push_back(2); // z -> r0.x
uint_vector_temp_.push_back(1); // y -> r0.y
uint_vector_temp_.push_back(0); // x -> r0.z
spv::Id tess_coord_zyx = builder_->createRvalueSwizzle(
spv::NoPrecision, type_float3_, tess_coord, uint_vector_temp_);
// Store to r0.xyz
id_vector_temp_.clear();
id_vector_temp_.push_back(const_int_0_);
spv::Id r0_ptr = builder_->createAccessChain(
spv::StorageClassFunction, var_main_registers_, id_vector_temp_);
// Build float4 from swizzled xyz and w=1.0
id_vector_temp_.clear();
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_zyx, type_float_, 0));
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_zyx, type_float_, 1));
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_zyx, type_float_, 2));
id_vector_temp_.push_back(const_float_1_);
builder_->createStore(
builder_->createCompositeConstruct(type_float4_, id_vector_temp_),
r0_ptr);
break;
}
case Shader::HostVertexShaderType::kQuadDomainCPIndexed: {
// Quad domain requires at least 2 registers (r0 for domain location,
// r1 for control point indices).
assert_true(register_count() >= 2);
// Quad domain CP-indexed: gl_TessCoord.xy -> r0.yz, r0.x = 0, r0.w =
// 1 XY swizzle according to the ground shader in 4D5307F2.
uint_vector_temp_.clear();
uint_vector_temp_.push_back(0); // x -> r0.y
uint_vector_temp_.push_back(1); // y -> r0.z
spv::Id tess_coord_xy = builder_->createRvalueSwizzle(
spv::NoPrecision, type_float2_, tess_coord, uint_vector_temp_);
// Store to r0
id_vector_temp_.clear();
id_vector_temp_.push_back(const_int_0_);
spv::Id r0_ptr = builder_->createAccessChain(
spv::StorageClassFunction, var_main_registers_, id_vector_temp_);
// Build float4 with x=0, yz from tess coord, w=1
id_vector_temp_.clear();
id_vector_temp_.push_back(const_float_0_);
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_xy, type_float_, 0));
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_xy, type_float_, 1));
id_vector_temp_.push_back(const_float_1_);
builder_->createStore(
builder_->createCompositeConstruct(type_float4_, id_vector_temp_),
r0_ptr);
break;
}
case Shader::HostVertexShaderType::kQuadDomainPatchIndexed: {
// Quad domain requires at least 2 registers (r0 for domain location
// and patch index, r1 for swizzle indicator).
assert_true(register_count() >= 2);
// Quad domain patch-indexed: gl_TessCoord.xy -> r0.yz,
// patch index -> r0.x, r0.w = 1
// XY swizzle according to the ground shader in 4D5307F2.
uint_vector_temp_.clear();
uint_vector_temp_.push_back(0); // x -> r0.y
uint_vector_temp_.push_back(1); // y -> r0.z
spv::Id tess_coord_xy = builder_->createRvalueSwizzle(
spv::NoPrecision, type_float2_, tess_coord, uint_vector_temp_);
// Load primitive ID (patch index) and convert to float.
spv::Id primitive_id =
builder_->createLoad(input_primitive_id_, spv::NoPrecision);
spv::Id patch_index_float = builder_->createUnaryOp(
spv::OpConvertSToF, type_float_, primitive_id);
// Store to r0: x = patch index, yz = tess coord, w = 1
id_vector_temp_.clear();
id_vector_temp_.push_back(const_int_0_);
spv::Id r0_ptr = builder_->createAccessChain(
spv::StorageClassFunction, var_main_registers_, id_vector_temp_);
id_vector_temp_.clear();
id_vector_temp_.push_back(patch_index_float);
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_xy, type_float_, 0));
id_vector_temp_.push_back(
builder_->createCompositeExtract(tess_coord_xy, type_float_, 1));
id_vector_temp_.push_back(const_float_1_);
builder_->createStore(
builder_->createCompositeConstruct(type_float4_, id_vector_temp_),
r0_ptr);
// Also set r1.x = 0.0f (swizzle indicator for identity swizzle).
if (register_count() >= 2) {
id_vector_temp_.clear();
id_vector_temp_.push_back(builder_->makeIntConstant(1));
id_vector_temp_.push_back(const_int_0_);
builder_->createStore(const_float_0_,
builder_->createAccessChain(
spv::StorageClassFunction,
var_main_registers_, id_vector_temp_));
}
break;
}
case Shader::HostVertexShaderType::kLineDomainCPIndexed:
case Shader::HostVertexShaderType::kLineDomainPatchIndexed:
// Line domain tessellation is not yet implemented.
XELOGE(
"SPIRV: Line domain tessellation not implemented for host type "
"{}",
static_cast<uint32_t>(host_type));
assert_unhandled_case(host_type);
break;
default:
break;
}
// For triangle patch-indexed mode, store patch index to r1.x and
// swizzle indicator (0.0f) to r1.y.
if (register_count() >= 2) {
if (host_type ==
Shader::HostVertexShaderType::kTriangleDomainPatchIndexed) {
// Load primitive ID (patch index) and convert to float.
spv::Id primitive_id =
builder_->createLoad(input_primitive_id_, spv::NoPrecision);
spv::Id patch_index_float = builder_->createUnaryOp(
spv::OpConvertSToF, type_float_, primitive_id);
// Store patch index to r1.x
id_vector_temp_.clear();
id_vector_temp_.push_back(builder_->makeIntConstant(1));
id_vector_temp_.push_back(const_int_0_);
builder_->createStore(patch_index_float,
builder_->createAccessChain(
spv::StorageClassFunction,
var_main_registers_, id_vector_temp_));
// Store swizzle indicator (0.0f = identity) to r1.y
// According to D3D12 implementation and comments in
// adaptive_triangle.hs.glsl, r1.y == 0 means identity swizzle.
id_vector_temp_.clear();
id_vector_temp_.push_back(builder_->makeIntConstant(1));
id_vector_temp_.push_back(builder_->makeIntConstant(1));
builder_->createStore(const_float_0_,
builder_->createAccessChain(
spv::StorageClassFunction,
var_main_registers_, id_vector_temp_));
}
}
} else if (IsSpirvVertexShader()) {
spv::Id vertex_index = builder_->createUnaryOp(
spv::OpBitcast, type_uint_,
builder_->createLoad(input_vertex_index_, spv::NoPrecision));

View File

@@ -271,6 +271,21 @@ class SpirvShaderTranslator : public ShaderTranslator {
float user_clip_planes[6][4];
};
// Separate constant buffer for tessellation parameters.
// Must match the layout in xenos_draw.glsli (std140).
struct TessellationConstants {
// Tessellation factor range: [0] = min, [1] = max.
// 1.0 is added on the CPU according to Xbox 360 tessellation documentation.
// For fractional_even partitioning, minimum factor must be >= 2.0.
float tessellation_factor_range[2];
// Padding to align next member to 8 bytes (std140 rules).
float padding0[2];
// Vertex/index processing parameters.
uint32_t vertex_index_endian;
uint32_t vertex_index_offset;
uint32_t vertex_index_min_max[2];
};
enum ConstantBuffer : uint32_t {
kConstantBufferSystem,
kConstantBufferFloatVertex,
@@ -278,6 +293,7 @@ class SpirvShaderTranslator : public ShaderTranslator {
kConstantBufferBoolLoop,
kConstantBufferFetch,
kConstantBufferClipPlanes,
kConstantBufferTessellation,
kConstantBufferCount,
};
@@ -895,6 +911,8 @@ class SpirvShaderTranslator : public ShaderTranslator {
spv::Id input_vertex_index_;
// VS as TES only - int.
spv::Id input_primitive_id_;
// VS as TES only - float3 (barycentric coordinates).
spv::Id input_tess_coord_;
// PS, only when needed - float2.
spv::Id input_point_coordinates_;
// PS, only when needed - float4.

View File

@@ -225,6 +225,21 @@ bool VulkanCommandProcessor::SetupContext() {
descriptor_set_layout_bindings_constants
[SpirvShaderTranslator::kConstantBufferFetch]
.stageFlags = guest_shader_stages;
// Clip plane constants - used by vertex shader (and TES for tessellation).
descriptor_set_layout_bindings_constants
[SpirvShaderTranslator::kConstantBufferClipPlanes]
.stageFlags = guest_shader_vertex_stages_;
// Tessellation constants - used by tessellation control shader, the
// tessellation vertex shader (for index/factor processing), and the
// tessellation evaluation shader (domain shader, which is the translated
// Xenos vertex shader).
descriptor_set_layout_bindings_constants
[SpirvShaderTranslator::kConstantBufferTessellation]
.stageFlags = device_properties.tessellationShader
? (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
VK_SHADER_STAGE_VERTEX_BIT)
: 0;
descriptor_set_layout_create_info.bindingCount =
uint32_t(xe::countof(descriptor_set_layout_bindings_constants));
descriptor_set_layout_create_info.pBindings =
@@ -2302,12 +2317,17 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,
// Nothing to draw.
return true;
}
// TODO(Triang3l): Tessellation, geometry-type-specific vertex shader,
// vertex shader as compute.
// TODO(Triang3l): Geometry-type-specific vertex shader, vertex shader as
// compute.
// Skip unsupported host vertex shader types (but allow tessellation types
// through - they will be handled in pipeline creation or rejected there if
// not fully supported yet).
if (primitive_processing_result.host_vertex_shader_type !=
Shader::HostVertexShaderType::kVertex &&
primitive_processing_result.host_vertex_shader_type !=
Shader::HostVertexShaderType::kPointListAsTriangleStrip) {
Shader::HostVertexShaderType::kPointListAsTriangleStrip &&
!Shader::IsHostVertexShaderTypeDomain(
primitive_processing_result.host_vertex_shader_type)) {
return false;
}
@@ -4514,6 +4534,49 @@ bool VulkanCommandProcessor::UpdateBindings(const VulkanShader* vertex_shader,
current_constant_buffers_up_to_date_ |=
UINT32_C(1) << SpirvShaderTranslator::kConstantBufferClipPlanes;
}
// Tessellation constants.
// Always initialize the buffer info, even if tessellation is not active,
// because the descriptor set write always includes all constant buffers.
if (!(current_constant_buffers_up_to_date_ &
(UINT32_C(1)
<< SpirvShaderTranslator::kConstantBufferTessellation))) {
VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_
[SpirvShaderTranslator::kConstantBufferTessellation];
uint8_t* mapping = uniform_buffer_pool_->Request(
frame_current_, sizeof(SpirvShaderTranslator::TessellationConstants),
uniform_buffer_alignment, buffer_info.buffer, buffer_info.offset);
if (!mapping) {
return false;
}
buffer_info.range = sizeof(SpirvShaderTranslator::TessellationConstants);
// Populate tessellation constants from registers.
SpirvShaderTranslator::TessellationConstants tessellation_constants;
// Tessellation factor range, plus 1.0 according to Xbox 360 docs.
// For fractional_even partitioning (continuous mode), minimum must be
// >= 2.0.
float tess_factor_min =
regs.Get<float>(XE_GPU_REG_VGT_HOS_MIN_TESS_LEVEL) + 1.0f;
float tess_factor_max =
regs.Get<float>(XE_GPU_REG_VGT_HOS_MAX_TESS_LEVEL) + 1.0f;
tessellation_constants.tessellation_factor_range[0] = tess_factor_min;
tessellation_constants.tessellation_factor_range[1] = tess_factor_max;
tessellation_constants.padding0[0] = 0.0f;
tessellation_constants.padding0[1] = 0.0f;
// Vertex index processing parameters for tessellation shaders.
auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();
tessellation_constants.vertex_index_endian =
static_cast<uint32_t>(vgt_dma_size.swap_mode);
tessellation_constants.vertex_index_offset =
regs[XE_GPU_REG_VGT_INDX_OFFSET];
tessellation_constants.vertex_index_min_max[0] =
regs[XE_GPU_REG_VGT_MIN_VTX_INDX];
tessellation_constants.vertex_index_min_max[1] =
regs[XE_GPU_REG_VGT_MAX_VTX_INDX];
std::memcpy(mapping, &tessellation_constants,
sizeof(SpirvShaderTranslator::TessellationConstants));
current_constant_buffers_up_to_date_ |=
UINT32_C(1) << SpirvShaderTranslator::kConstantBufferTessellation;
}
// Vertex shader float constants.
if (!(current_constant_buffers_up_to_date_ &
(UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatVertex))) {

View File

@@ -30,6 +30,21 @@
#include "xenia/gpu/xenos.h"
#include "xenia/ui/vulkan/vulkan_util.h"
// Tessellation shader bytecode.
namespace shaders {
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/adaptive_quad_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/adaptive_triangle_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/continuous_quad_1cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/continuous_quad_4cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/continuous_triangle_1cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/continuous_triangle_3cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/discrete_quad_1cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/discrete_quad_4cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/discrete_triangle_1cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/discrete_triangle_3cp_hs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/tessellation_adaptive_vs.h"
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/tessellation_indexed_vs.h"
} // namespace shaders
namespace xe {
namespace gpu {
namespace vulkan {
@@ -80,6 +95,68 @@ bool VulkanPipelineCache::Initialize() {
}
}
// Create tessellation shaders if tessellation is supported.
if (vulkan_device->properties().tessellationShader) {
// Vertex shaders for tessellation.
tessellation_indexed_vs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::tessellation_indexed_vs,
sizeof(shaders::tessellation_indexed_vs));
tessellation_adaptive_vs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::tessellation_adaptive_vs,
sizeof(shaders::tessellation_adaptive_vs));
// Discrete mode hull shaders.
discrete_triangle_1cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::discrete_triangle_1cp_hs,
sizeof(shaders::discrete_triangle_1cp_hs));
discrete_triangle_3cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::discrete_triangle_3cp_hs,
sizeof(shaders::discrete_triangle_3cp_hs));
discrete_quad_1cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::discrete_quad_1cp_hs,
sizeof(shaders::discrete_quad_1cp_hs));
discrete_quad_4cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::discrete_quad_4cp_hs,
sizeof(shaders::discrete_quad_4cp_hs));
// Continuous mode hull shaders.
continuous_triangle_1cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::continuous_triangle_1cp_hs,
sizeof(shaders::continuous_triangle_1cp_hs));
continuous_triangle_3cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::continuous_triangle_3cp_hs,
sizeof(shaders::continuous_triangle_3cp_hs));
continuous_quad_1cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::continuous_quad_1cp_hs,
sizeof(shaders::continuous_quad_1cp_hs));
continuous_quad_4cp_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::continuous_quad_4cp_hs,
sizeof(shaders::continuous_quad_4cp_hs));
// Adaptive mode hull shaders.
adaptive_triangle_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::adaptive_triangle_hs,
sizeof(shaders::adaptive_triangle_hs));
adaptive_quad_hs_ = ui::vulkan::util::CreateShaderModule(
vulkan_device, shaders::adaptive_quad_hs,
sizeof(shaders::adaptive_quad_hs));
// Verify all tessellation shaders were created successfully.
if (tessellation_indexed_vs_ == VK_NULL_HANDLE ||
tessellation_adaptive_vs_ == VK_NULL_HANDLE ||
discrete_triangle_1cp_hs_ == VK_NULL_HANDLE ||
discrete_triangle_3cp_hs_ == VK_NULL_HANDLE ||
discrete_quad_1cp_hs_ == VK_NULL_HANDLE ||
discrete_quad_4cp_hs_ == VK_NULL_HANDLE ||
continuous_triangle_1cp_hs_ == VK_NULL_HANDLE ||
continuous_triangle_3cp_hs_ == VK_NULL_HANDLE ||
continuous_quad_1cp_hs_ == VK_NULL_HANDLE ||
continuous_quad_4cp_hs_ == VK_NULL_HANDLE ||
adaptive_triangle_hs_ == VK_NULL_HANDLE ||
adaptive_quad_hs_ == VK_NULL_HANDLE) {
XELOGW(
"VulkanPipelineCache: Failed to create one or more tessellation "
"shaders - tessellation will not be available");
}
}
// Create Vulkan pipeline cache for faster pipeline creation.
VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
pipeline_cache_create_info.sType =
@@ -118,6 +195,31 @@ void VulkanPipelineCache::Shutdown() {
// Destroy all internal shaders.
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
depth_only_fragment_shader_);
// Destroy tessellation shaders.
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
tessellation_indexed_vs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
tessellation_adaptive_vs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
discrete_triangle_1cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
discrete_triangle_3cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
discrete_quad_1cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
discrete_quad_4cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
continuous_triangle_1cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
continuous_triangle_3cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
continuous_quad_1cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
continuous_quad_4cp_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
adaptive_triangle_hs_);
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
adaptive_quad_hs_);
for (const auto& geometry_shader_pair : geometry_shaders_) {
if (geometry_shader_pair.second != VK_NULL_HANDLE) {
dfn.vkDestroyShaderModule(device, geometry_shader_pair.second, nullptr);
@@ -368,10 +470,34 @@ bool VulkanPipelineCache::ConfigurePipeline(
PipelineCreationArguments creation_arguments;
auto& pipeline =
*pipelines_.emplace(description, Pipeline(pipeline_layout)).first;
// Get tessellation shaders if needed.
VkShaderModule tessellation_vertex_shader = VK_NULL_HANDLE;
VkShaderModule tessellation_control_shader = VK_NULL_HANDLE;
if (description.tessellation_mode != PipelineTessellationMode::kNone) {
tessellation_vertex_shader =
GetTessellationVertexShader(description.tessellation_mode);
bool use_control_point_count =
(description.tessellation_mode == PipelineTessellationMode::kAdaptive);
tessellation_control_shader = GetTessellationControlShader(
description.tessellation_mode, description.tessellation_patch,
use_control_point_count);
if (tessellation_vertex_shader == VK_NULL_HANDLE ||
tessellation_control_shader == VK_NULL_HANDLE) {
XELOGE(
"VulkanPipelineCache: Failed to get tessellation shaders for mode {} "
"patch {}",
static_cast<uint32_t>(description.tessellation_mode),
static_cast<uint32_t>(description.tessellation_patch));
return false;
}
}
creation_arguments.pipeline = &pipeline;
creation_arguments.vertex_shader = vertex_shader;
creation_arguments.pixel_shader = pixel_shader;
creation_arguments.geometry_shader = geometry_shader;
creation_arguments.tessellation_vertex_shader = tessellation_vertex_shader;
creation_arguments.tessellation_control_shader = tessellation_control_shader;
creation_arguments.render_pass = render_pass;
if (!EnsurePipelineCreated(creation_arguments)) {
return false;
@@ -556,6 +682,50 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
// without them.
PipelineGeometryShader geometry_shader = PipelineGeometryShader::kNone;
PipelinePrimitiveTopology primitive_topology;
// Handle tessellated and non-tessellated draws separately, like D3D12.
if (primitive_processing_result.IsTessellated()) {
// Tessellation is enabled - use patch list topology.
primitive_topology = PipelinePrimitiveTopology::kPatchList;
// Get tessellation mode from registers.
auto vgt_hos_cntl = regs.Get<reg::VGT_HOS_CNTL>();
switch (vgt_hos_cntl.tess_mode) {
case xenos::TessellationMode::kDiscrete:
description_out.tessellation_mode = PipelineTessellationMode::kDiscrete;
break;
case xenos::TessellationMode::kContinuous:
description_out.tessellation_mode =
PipelineTessellationMode::kContinuous;
break;
case xenos::TessellationMode::kAdaptive:
description_out.tessellation_mode = PipelineTessellationMode::kAdaptive;
break;
default:
// Unknown tessellation mode, fall back to discrete.
description_out.tessellation_mode = PipelineTessellationMode::kDiscrete;
break;
}
// Determine patch type based on primitive type.
switch (primitive_processing_result.host_primitive_type) {
case xenos::PrimitiveType::kTriangleList:
case xenos::PrimitiveType::kTrianglePatch:
description_out.tessellation_patch =
PipelineTessellationPatchType::kTriangle;
break;
case xenos::PrimitiveType::kQuadList:
case xenos::PrimitiveType::kQuadPatch:
description_out.tessellation_patch =
PipelineTessellationPatchType::kQuad;
break;
default:
XELOGE("VulkanPipelineCache: Unsupported tessellated primitive type {}",
uint32_t(primitive_processing_result.host_primitive_type));
return false;
}
} else {
// Non-tessellated draw.
switch (primitive_processing_result.host_primitive_type) {
case xenos::PrimitiveType::kPointList:
geometry_shader = PipelineGeometryShader::kPointList;
@@ -593,9 +763,10 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
primitive_topology = PipelinePrimitiveTopology::kLineListWithAdjacency;
break;
default:
// TODO(Triang3l): All primitive types and tessellation.
// TODO(Triang3l): Remaining primitive types.
return false;
}
}
description_out.geometry_shader = geometry_shader;
description_out.primitive_topology = primitive_topology;
description_out.primitive_restart =
@@ -1804,6 +1975,55 @@ VkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) {
return shader_module;
}
VkShaderModule VulkanPipelineCache::GetTessellationControlShader(
PipelineTessellationMode mode, PipelineTessellationPatchType patch_type,
bool use_control_point_count) const {
if (mode == PipelineTessellationMode::kNone ||
patch_type == PipelineTessellationPatchType::kNone) {
return VK_NULL_HANDLE;
}
switch (mode) {
case PipelineTessellationMode::kDiscrete:
if (patch_type == PipelineTessellationPatchType::kTriangle) {
return use_control_point_count ? discrete_triangle_3cp_hs_
: discrete_triangle_1cp_hs_;
} else {
return use_control_point_count ? discrete_quad_4cp_hs_
: discrete_quad_1cp_hs_;
}
case PipelineTessellationMode::kContinuous:
if (patch_type == PipelineTessellationPatchType::kTriangle) {
return use_control_point_count ? continuous_triangle_3cp_hs_
: continuous_triangle_1cp_hs_;
} else {
return use_control_point_count ? continuous_quad_4cp_hs_
: continuous_quad_1cp_hs_;
}
case PipelineTessellationMode::kAdaptive:
// Adaptive mode always uses per-corner control points.
if (patch_type == PipelineTessellationPatchType::kTriangle) {
return adaptive_triangle_hs_;
} else {
return adaptive_quad_hs_;
}
default:
return VK_NULL_HANDLE;
}
}
VkShaderModule VulkanPipelineCache::GetTessellationVertexShader(
PipelineTessellationMode mode) const {
if (mode == PipelineTessellationMode::kNone) {
return VK_NULL_HANDLE;
}
// Adaptive mode reads edge factors from index buffer; other modes pass
// vertex indices.
return (mode == PipelineTessellationMode::kAdaptive)
? tessellation_adaptive_vs_
: tessellation_indexed_vs_;
}
bool VulkanPipelineCache::EnsurePipelineCreated(
const PipelineCreationArguments& creation_arguments) {
if (creation_arguments.pipeline->second.pipeline != VK_NULL_HANDLE) {
@@ -1839,14 +2059,63 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
render_target_cache_.GetPath() ==
RenderTargetCache::Path::kPixelShaderInterlock;
std::array<VkPipelineShaderStageCreateInfo, 3> shader_stages;
bool is_tessellated =
description.tessellation_mode != PipelineTessellationMode::kNone;
// Up to 5 shader stages: VS, TCS, TES, GS, FS.
std::array<VkPipelineShaderStageCreateInfo, 5> shader_stages;
uint32_t shader_stage_count = 0;
// Vertex or tessellation evaluation shader.
// Vertex shader or tessellation evaluation shader.
assert_true(creation_arguments.vertex_shader->is_translated());
if (!creation_arguments.vertex_shader->is_valid()) {
return false;
}
if (is_tessellated) {
// For tessellation: use our pre-compiled VS for passing data to TCS,
// then TCS (hull shader), then the translated Xenos vertex shader as TES
// (domain shader).
// Tessellation vertex shader (passes indices to TCS).
VkPipelineShaderStageCreateInfo& shader_stage_tess_vs =
shader_stages[shader_stage_count++];
shader_stage_tess_vs.sType =
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
shader_stage_tess_vs.pNext = nullptr;
shader_stage_tess_vs.flags = 0;
shader_stage_tess_vs.stage = VK_SHADER_STAGE_VERTEX_BIT;
shader_stage_tess_vs.module = creation_arguments.tessellation_vertex_shader;
shader_stage_tess_vs.pName = "main";
shader_stage_tess_vs.pSpecializationInfo = nullptr;
// Tessellation control shader (hull shader).
VkPipelineShaderStageCreateInfo& shader_stage_tcs =
shader_stages[shader_stage_count++];
shader_stage_tcs.sType =
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
shader_stage_tcs.pNext = nullptr;
shader_stage_tcs.flags = 0;
shader_stage_tcs.stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
shader_stage_tcs.module = creation_arguments.tessellation_control_shader;
shader_stage_tcs.pName = "main";
shader_stage_tcs.pSpecializationInfo = nullptr;
// Tessellation evaluation shader (domain shader) - the translated Xenos
// vertex shader.
VkPipelineShaderStageCreateInfo& shader_stage_tes =
shader_stages[shader_stage_count++];
shader_stage_tes.sType =
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
shader_stage_tes.pNext = nullptr;
shader_stage_tes.flags = 0;
shader_stage_tes.stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
shader_stage_tes.module = creation_arguments.vertex_shader->shader_module();
assert_true(shader_stage_tes.module != VK_NULL_HANDLE);
shader_stage_tes.pName = "main";
shader_stage_tes.pSpecializationInfo = nullptr;
} else {
// Non-tessellated: standard vertex shader.
VkPipelineShaderStageCreateInfo& shader_stage_vertex =
shader_stages[shader_stage_count++];
shader_stage_vertex.sType =
@@ -1859,6 +2128,8 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
assert_true(shader_stage_vertex.module != VK_NULL_HANDLE);
shader_stage_vertex.pName = "main";
shader_stage_vertex.pSpecializationInfo = nullptr;
}
// Geometry shader.
if (creation_arguments.geometry_shader != VK_NULL_HANDLE) {
VkPipelineShaderStageCreateInfo& shader_stage_geometry =
@@ -2174,6 +2445,27 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
VK_DYNAMIC_STATE_STENCIL_REFERENCE;
}
// Tessellation state (only used when tessellation is active).
VkPipelineTessellationStateCreateInfo tessellation_state = {};
tessellation_state.sType =
VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
if (is_tessellated) {
// Determine patch control point count based on mode and patch type.
// For adaptive mode, we use the actual patch corner count (3 for triangles,
// 4 for quads) since each control point has its own edge factor.
// For discrete/continuous modes, we use 1 control point (the Xenos vertex
// shader receives the patch index and computes all corners internally).
if (description.tessellation_mode == PipelineTessellationMode::kAdaptive) {
tessellation_state.patchControlPoints =
(description.tessellation_patch ==
PipelineTessellationPatchType::kTriangle)
? 3
: 4;
} else {
tessellation_state.patchControlPoints = 1;
}
}
VkGraphicsPipelineCreateInfo pipeline_create_info;
pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipeline_create_info.pNext = nullptr;
@@ -2182,7 +2474,8 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
pipeline_create_info.pStages = shader_stages.data();
pipeline_create_info.pVertexInputState = &vertex_input_state;
pipeline_create_info.pInputAssemblyState = &input_assembly_state;
pipeline_create_info.pTessellationState = nullptr;
pipeline_create_info.pTessellationState =
is_tessellated ? &tessellation_state : nullptr;
pipeline_create_info.pViewportState = &viewport_state;
pipeline_create_info.pRasterizationState = &rasterization_state;
pipeline_create_info.pMultisampleState = &multisample_state;
@@ -2199,19 +2492,23 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();
const VkDevice device = vulkan_device->device();
VkPipeline pipeline;
if (dfn.vkCreateGraphicsPipelines(device, vk_pipeline_cache_, 1,
&pipeline_create_info, nullptr,
&pipeline) != VK_SUCCESS) {
// TODO(Triang3l): Move these error messages outside.
/* if (creation_arguments.pixel_shader) {
VkResult result = dfn.vkCreateGraphicsPipelines(
device, vk_pipeline_cache_, 1, &pipeline_create_info, nullptr, &pipeline);
if (result != VK_SUCCESS) {
if (creation_arguments.pixel_shader) {
XELOGE(
"Failed to create graphics pipeline with VS {:016X}, PS {:016X}",
"Failed to create graphics pipeline with VS {:016X}, PS {:016X} "
"(tessellated={}, result={})",
creation_arguments.vertex_shader->shader().ucode_data_hash(),
creation_arguments.pixel_shader->shader().ucode_data_hash());
creation_arguments.pixel_shader->shader().ucode_data_hash(),
is_tessellated, static_cast<int>(result));
} else {
XELOGE("Failed to create graphics pipeline with VS {:016X}",
creation_arguments.vertex_shader->shader().ucode_data_hash());
} */
XELOGE(
"Failed to create graphics pipeline with VS {:016X} "
"(tessellated={}, result={})",
creation_arguments.vertex_shader->shader().ucode_data_hash(),
is_tessellated, static_cast<int>(result));
}
return false;
}
creation_arguments.pipeline->second.pipeline = pipeline;

View File

@@ -114,6 +114,22 @@ class VulkanPipelineCache {
kPoint,
};
// Tessellation mode for pipeline creation.
// Must match the TCS (hull shader) selection logic.
enum class PipelineTessellationMode : uint32_t {
kNone,
kDiscrete, // Integer tessellation factors.
kContinuous, // Fractional (fractional_even) tessellation factors.
kAdaptive, // Per-edge factors from index buffer.
};
// Tessellation primitive type.
enum class PipelineTessellationPatchType : uint32_t {
kNone,
kTriangle,
kQuad,
};
enum class PipelineBlendFactor : uint32_t {
kZero,
kOne,
@@ -153,9 +169,11 @@ class VulkanPipelineCache {
// Shader stages.
PipelineGeometryShader geometry_shader : 2; // 2
PipelineTessellationMode tessellation_mode : 2; // 4
PipelineTessellationPatchType tessellation_patch : 2; // 6
// Input assembly.
PipelinePrimitiveTopology primitive_topology : 3; // 5
uint32_t primitive_restart : 1; // 6
PipelinePrimitiveTopology primitive_topology : 3; // 9
uint32_t primitive_restart : 1; // 10
// Rasterization.
uint32_t depth_clamp_enable : 1; // 7
PipelinePolygonMode polygon_mode : 2; // 9
@@ -216,6 +234,9 @@ class VulkanPipelineCache {
const VulkanShader::VulkanTranslation* vertex_shader;
const VulkanShader::VulkanTranslation* pixel_shader;
VkShaderModule geometry_shader;
// Tessellation shaders (only used when tessellation is active).
VkShaderModule tessellation_vertex_shader; // VS for passing data to TCS.
VkShaderModule tessellation_control_shader; // TCS (hull shader).
VkRenderPass render_pass;
};
@@ -271,6 +292,15 @@ class VulkanPipelineCache {
GeometryShaderKey& key_out);
VkShaderModule GetGeometryShader(GeometryShaderKey key);
// Get the appropriate tessellation control shader (hull shader) module.
VkShaderModule GetTessellationControlShader(
PipelineTessellationMode mode, PipelineTessellationPatchType patch_type,
bool use_control_point_count) const;
// Get the appropriate tessellation vertex shader module.
VkShaderModule GetTessellationVertexShader(
PipelineTessellationMode mode) const;
// Can be called from creation threads - all needed data must be fully set up
// at the point of the call: shaders must be translated, pipeline layout and
// render pass objects must be available.
@@ -317,6 +347,26 @@ class VulkanPipelineCache {
// shader interlock when no Xenos pixel shader provided.
VkShaderModule depth_only_fragment_shader_ = VK_NULL_HANDLE;
// Tessellation shaders.
// Vertex shaders for tessellation - pass indices/factors to TCS.
VkShaderModule tessellation_indexed_vs_ = VK_NULL_HANDLE;
VkShaderModule tessellation_adaptive_vs_ = VK_NULL_HANDLE;
// Tessellation control shaders (hull shaders) for different modes and
// primitive types.
// Discrete mode (integer tessellation factors).
VkShaderModule discrete_triangle_1cp_hs_ = VK_NULL_HANDLE;
VkShaderModule discrete_triangle_3cp_hs_ = VK_NULL_HANDLE;
VkShaderModule discrete_quad_1cp_hs_ = VK_NULL_HANDLE;
VkShaderModule discrete_quad_4cp_hs_ = VK_NULL_HANDLE;
// Continuous mode (fractional_even tessellation factors).
VkShaderModule continuous_triangle_1cp_hs_ = VK_NULL_HANDLE;
VkShaderModule continuous_triangle_3cp_hs_ = VK_NULL_HANDLE;
VkShaderModule continuous_quad_1cp_hs_ = VK_NULL_HANDLE;
VkShaderModule continuous_quad_4cp_hs_ = VK_NULL_HANDLE;
// Adaptive mode (per-edge factors from index buffer).
VkShaderModule adaptive_triangle_hs_ = VK_NULL_HANDLE;
VkShaderModule adaptive_quad_hs_ = VK_NULL_HANDLE;
// Vulkan pipeline cache for faster pipeline creation.
VkPipelineCache vk_pipeline_cache_ = VK_NULL_HANDLE;