[Vulkan] Rectangle list geometry shader

This commit is contained in:
Triang3l 2022-03-21 22:53:19 +03:00
parent c47b874a4d
commit acc4fd6846
5 changed files with 609 additions and 20 deletions

View File

@ -0,0 +1,391 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 24886
; Schema: 0
OpCapability Geometry
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Geometry %5663 "main" %5305 %3631 %3144 %4930
OpExecutionMode %5663 Triangles
OpExecutionMode %5663 Invocations 1
OpExecutionMode %5663 OutputTriangleStrip
OpExecutionMode %5663 OutputVertices 6
OpMemberDecorate %_struct_1017 0 BuiltIn Position
OpDecorate %_struct_1017 Block
OpDecorate %3631 Location 0
OpDecorate %3144 Location 0
OpMemberDecorate %_struct_1018 0 BuiltIn Position
OpDecorate %_struct_1018 Block
OpDecorate %7509 NoContraction
OpDecorate %15269 NoContraction
OpDecorate %24885 NoContraction
OpDecorate %14166 NoContraction
OpDecorate %7062 NoContraction
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%bool = OpTypeBool
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_struct_1017 = OpTypeStruct %v4float
%uint = OpTypeInt 32 0
%uint_3 = OpConstant %uint 3
%_arr__struct_1017_uint_3 = OpTypeArray %_struct_1017 %uint_3
%_ptr_Input__arr__struct_1017_uint_3 = OpTypePointer Input %_arr__struct_1017_uint_3
%5305 = OpVariable %_ptr_Input__arr__struct_1017_uint_3 Input
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Input_v4float = OpTypePointer Input %v4float
%v4bool = OpTypeVector %bool 4
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%uint_0 = OpConstant %uint 0
%uint_16 = OpConstant %uint 16
%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
%_ptr_Output__arr_v4float_uint_16 = OpTypePointer Output %_arr_v4float_uint_16
%3631 = OpVariable %_ptr_Output__arr_v4float_uint_16 Output
%_arr__arr_v4float_uint_16_uint_3 = OpTypeArray %_arr_v4float_uint_16 %uint_3
%_ptr_Input__arr__arr_v4float_uint_16_uint_3 = OpTypePointer Input %_arr__arr_v4float_uint_16_uint_3
%3144 = OpVariable %_ptr_Input__arr__arr_v4float_uint_16_uint_3 Input
%_ptr_Input__arr_v4float_uint_16 = OpTypePointer Input %_arr_v4float_uint_16
%_struct_1018 = OpTypeStruct %v4float
%_ptr_Output__struct_1018 = OpTypePointer Output %_struct_1018
%4930 = OpVariable %_ptr_Output__struct_1018 Output
%_ptr_Output_v4float = OpTypePointer Output %v4float
%v3float = OpTypeVector %float 3
%float_n1 = OpConstant %float -1
%float_1 = OpConstant %float 1
%266 = OpConstantComposite %v3float %float_n1 %float_1 %float_1
%2582 = OpConstantComposite %v3float %float_1 %float_n1 %float_1
%267 = OpConstantComposite %v3float %float_1 %float_1 %float_n1
%v3bool = OpTypeVector %bool 3
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %23648 None
OpSwitch %uint_0 %11880
%11880 = OpLabel
%23974 = OpAccessChain %_ptr_Input_v4float %5305 %int_0 %int_0
%20722 = OpLoad %v4float %23974
%16842 = OpIsNan %v4bool %20722
%9783 = OpAny %bool %16842
%11671 = OpLogicalNot %bool %9783
OpSelectionMerge %7750 None
OpBranchConditional %11671 %12129 %7750
%12129 = OpLabel
%19939 = OpAccessChain %_ptr_Input_v4float %5305 %int_1 %int_0
%20723 = OpLoad %v4float %19939
%18381 = OpIsNan %v4bool %20723
%14860 = OpAny %bool %18381
OpBranch %7750
%7750 = OpLabel
%24534 = OpPhi %bool %9783 %11880 %14860 %12129
%22068 = OpLogicalNot %bool %24534
OpSelectionMerge %9251 None
OpBranchConditional %22068 %12130 %9251
%12130 = OpLabel
%19940 = OpAccessChain %_ptr_Input_v4float %5305 %int_2 %int_0
%20724 = OpLoad %v4float %19940
%18382 = OpIsNan %v4bool %20724
%14861 = OpAny %bool %18382
OpBranch %9251
%9251 = OpLabel
%10924 = OpPhi %bool %24534 %7750 %14861 %12130
OpSelectionMerge %7205 None
OpBranchConditional %10924 %21992 %7205
%21992 = OpLabel
OpBranch %23648
%7205 = OpLabel
OpBranch %6529
%6529 = OpLabel
%23131 = OpPhi %uint %uint_0 %7205 %11651 %14551
%13910 = OpULessThan %bool %23131 %uint_3
OpLoopMerge %8693 %14551 None
OpBranchConditional %13910 %14551 %8693
%14551 = OpLabel
%18153 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %23131
%16222 = OpLoad %_arr_v4float_uint_16 %18153
OpStore %3631 %16222
%16679 = OpAccessChain %_ptr_Input_v4float %5305 %23131 %int_0
%7391 = OpLoad %v4float %16679
%22888 = OpAccessChain %_ptr_Output_v4float %4930 %int_0
OpStore %22888 %7391
OpEmitVertex
%11651 = OpIAdd %uint %23131 %int_1
OpBranch %6529
%8693 = OpLabel
OpEndPrimitive
%12070 = OpAccessChain %_ptr_Input_v4float %5305 %int_1 %int_0
%6301 = OpLoad %v4float %12070
%18018 = OpVectorShuffle %v3float %6301 %6301 0 1 2
%12374 = OpVectorShuffle %v3float %20722 %20722 0 1 2
%18845 = OpFSub %v3float %18018 %12374
%18938 = OpAccessChain %_ptr_Input_v4float %5305 %int_2 %int_0
%13501 = OpLoad %v4float %18938
%9022 = OpVectorShuffle %v3float %13501 %13501 0 1 2
%7477 = OpFSub %v3float %9022 %12374
%11062 = OpFSub %v3float %9022 %18018
%14931 = OpDot %float %18845 %18845
%23734 = OpDot %float %7477 %7477
%22344 = OpDot %float %11062 %11062
%24721 = OpFOrdGreaterThan %bool %22344 %14931
OpSelectionMerge %15688 None
OpBranchConditional %24721 %13839 %15688
%13839 = OpLabel
%21187 = OpFOrdGreaterThan %bool %22344 %23734
OpBranch %15688
%15688 = OpLabel
%10925 = OpPhi %bool %24721 %8693 %21187 %13839
OpSelectionMerge %11701 None
OpBranchConditional %10925 %12131 %13261
%12131 = OpLabel
%18154 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_2
%16223 = OpLoad %_arr_v4float_uint_16 %18154
OpStore %3631 %16223
%19413 = OpAccessChain %_ptr_Output_v4float %4930 %int_0
OpStore %19413 %13501
OpEmitVertex
%22812 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_1
%11341 = OpLoad %_arr_v4float_uint_16 %22812
OpStore %3631 %11341
OpStore %19413 %6301
OpEmitVertex
OpBranch %11701
%13261 = OpLabel
%23993 = OpFOrdGreaterThan %bool %23734 %14931
OpSelectionMerge %15689 None
OpBranchConditional %23993 %13840 %15689
%13840 = OpLabel
%21188 = OpFOrdGreaterThan %bool %23734 %22344
OpBranch %15689
%15689 = OpLabel
%10926 = OpPhi %bool %23993 %13261 %21188 %13840
OpSelectionMerge %11046 None
OpBranchConditional %10926 %12132 %11589
%12132 = OpLabel
%18155 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_0
%16224 = OpLoad %_arr_v4float_uint_16 %18155
OpStore %3631 %16224
%19414 = OpAccessChain %_ptr_Output_v4float %4930 %int_0
OpStore %19414 %20722
OpEmitVertex
%22813 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_2
%11342 = OpLoad %_arr_v4float_uint_16 %22813
OpStore %3631 %11342
OpStore %19414 %13501
OpEmitVertex
OpBranch %11046
%11589 = OpLabel
%20575 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_1
%16225 = OpLoad %_arr_v4float_uint_16 %20575
OpStore %3631 %16225
%19415 = OpAccessChain %_ptr_Output_v4float %4930 %int_0
OpStore %19415 %6301
OpEmitVertex
%22814 = OpAccessChain %_ptr_Input__arr_v4float_uint_16 %3144 %int_0
%11343 = OpLoad %_arr_v4float_uint_16 %22814
OpStore %3631 %11343
OpStore %19415 %20722
OpEmitVertex
OpBranch %11046
%11046 = OpLabel
%16046 = OpCompositeConstruct %v3bool %10926 %10926 %10926
%20034 = OpSelect %v3float %16046 %2582 %267
OpBranch %11701
%11701 = OpLabel
%10540 = OpPhi %v3float %266 %12131 %20034 %11046
OpBranch %19952
%19952 = OpLabel
%23132 = OpPhi %uint %uint_0 %11701 %21301 %11859
%13911 = OpULessThan %bool %23132 %uint_16
OpLoopMerge %14959 %11859 None
OpBranchConditional %13911 %11859 %14959
%11859 = OpLabel
%19851 = OpCompositeExtract %float %10540 0
%12487 = OpAccessChain %_ptr_Input_v4float %3144 %int_0 %23132
%12683 = OpLoad %v4float %12487
%8719 = OpVectorTimesScalar %v4float %12683 %19851
%15671 = OpCompositeExtract %float %10540 1
%17096 = OpAccessChain %_ptr_Input_v4float %3144 %int_1 %23132
%13595 = OpLoad %v4float %17096
%19790 = OpVectorTimesScalar %v4float %13595 %15671
%20206 = OpFAdd %v4float %8719 %19790
%10579 = OpCompositeExtract %float %10540 2
%16297 = OpAccessChain %_ptr_Input_v4float %3144 %int_2 %23132
%13596 = OpLoad %v4float %16297
%19486 = OpVectorTimesScalar %v4float %13596 %10579
%22917 = OpFAdd %v4float %20206 %19486
%16419 = OpAccessChain %_ptr_Output_v4float %3631 %23132
OpStore %16419 %22917
%21301 = OpIAdd %uint %23132 %int_1
OpBranch %19952
%14959 = OpLabel
%9332 = OpCompositeExtract %float %10540 0
%7509 = OpVectorTimesScalar %v4float %20722 %9332
%6858 = OpCompositeExtract %float %10540 1
%15269 = OpVectorTimesScalar %v4float %6301 %6858
%24885 = OpFAdd %v4float %7509 %15269
%17621 = OpCompositeExtract %float %10540 2
%14166 = OpVectorTimesScalar %v4float %13501 %17621
%7062 = OpFAdd %v4float %24885 %14166
%18129 = OpAccessChain %_ptr_Output_v4float %4930 %int_0
OpStore %18129 %7062
OpEmitVertex
OpEndPrimitive
OpBranch %23648
%23648 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t primitive_rectangle_list_gs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x00006136, 0x00000000, 0x00020011,
0x00000002, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0009000F, 0x00000003,
0x0000161F, 0x6E69616D, 0x00000000, 0x000014B9, 0x00000E2F, 0x00000C48,
0x00001342, 0x00030010, 0x0000161F, 0x00000016, 0x00040010, 0x0000161F,
0x00000000, 0x00000001, 0x00030010, 0x0000161F, 0x0000001D, 0x00040010,
0x0000161F, 0x0000001A, 0x00000006, 0x00050048, 0x000003F9, 0x00000000,
0x0000000B, 0x00000000, 0x00030047, 0x000003F9, 0x00000002, 0x00040047,
0x00000E2F, 0x0000001E, 0x00000000, 0x00040047, 0x00000C48, 0x0000001E,
0x00000000, 0x00050048, 0x000003FA, 0x00000000, 0x0000000B, 0x00000000,
0x00030047, 0x000003FA, 0x00000002, 0x00030047, 0x00001D55, 0x0000002A,
0x00030047, 0x00003BA5, 0x0000002A, 0x00030047, 0x00006135, 0x0000002A,
0x00030047, 0x00003756, 0x0000002A, 0x00030047, 0x00001B96, 0x0000002A,
0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00020014,
0x00000009, 0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D,
0x0000000D, 0x00000004, 0x0003001E, 0x000003F9, 0x0000001D, 0x00040015,
0x0000000B, 0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13,
0x00000003, 0x0004001C, 0x00000A0F, 0x000003F9, 0x00000A13, 0x00040020,
0x000000C9, 0x00000001, 0x00000A0F, 0x0004003B, 0x000000C9, 0x000014B9,
0x00000001, 0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000029A, 0x00000001,
0x0000001D, 0x00040017, 0x00000011, 0x00000009, 0x00000004, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B,
0x0000000B, 0x00000A3A, 0x00000010, 0x0004001C, 0x0000066B, 0x0000001D,
0x00000A3A, 0x00040020, 0x000008E8, 0x00000003, 0x0000066B, 0x0004003B,
0x000008E8, 0x00000E2F, 0x00000003, 0x0004001C, 0x000001AC, 0x0000066B,
0x00000A13, 0x00040020, 0x00000429, 0x00000001, 0x000001AC, 0x0004003B,
0x00000429, 0x00000C48, 0x00000001, 0x00040020, 0x000008E9, 0x00000001,
0x0000066B, 0x0003001E, 0x000003FA, 0x0000001D, 0x00040020, 0x00000676,
0x00000003, 0x000003FA, 0x0004003B, 0x00000676, 0x00001342, 0x00000003,
0x00040020, 0x0000029B, 0x00000003, 0x0000001D, 0x00040017, 0x00000018,
0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000,
0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0006002C, 0x00000018,
0x0000010A, 0x00000341, 0x0000008A, 0x0000008A, 0x0006002C, 0x00000018,
0x00000A16, 0x0000008A, 0x00000341, 0x0000008A, 0x0006002C, 0x00000018,
0x0000010B, 0x0000008A, 0x0000008A, 0x00000341, 0x00040017, 0x00000010,
0x00000009, 0x00000003, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,
0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00005C60, 0x00000000,
0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00060041,
0x0000029A, 0x00005DA6, 0x000014B9, 0x00000A0B, 0x00000A0B, 0x0004003D,
0x0000001D, 0x000050F2, 0x00005DA6, 0x0004009C, 0x00000011, 0x000041CA,
0x000050F2, 0x0004009A, 0x00000009, 0x00002637, 0x000041CA, 0x000400A8,
0x00000009, 0x00002D97, 0x00002637, 0x000300F7, 0x00001E46, 0x00000000,
0x000400FA, 0x00002D97, 0x00002F61, 0x00001E46, 0x000200F8, 0x00002F61,
0x00060041, 0x0000029A, 0x00004DE3, 0x000014B9, 0x00000A0E, 0x00000A0B,
0x0004003D, 0x0000001D, 0x000050F3, 0x00004DE3, 0x0004009C, 0x00000011,
0x000047CD, 0x000050F3, 0x0004009A, 0x00000009, 0x00003A0C, 0x000047CD,
0x000200F9, 0x00001E46, 0x000200F8, 0x00001E46, 0x000700F5, 0x00000009,
0x00005FD6, 0x00002637, 0x00002E68, 0x00003A0C, 0x00002F61, 0x000400A8,
0x00000009, 0x00005634, 0x00005FD6, 0x000300F7, 0x00002423, 0x00000000,
0x000400FA, 0x00005634, 0x00002F62, 0x00002423, 0x000200F8, 0x00002F62,
0x00060041, 0x0000029A, 0x00004DE4, 0x000014B9, 0x00000A11, 0x00000A0B,
0x0004003D, 0x0000001D, 0x000050F4, 0x00004DE4, 0x0004009C, 0x00000011,
0x000047CE, 0x000050F4, 0x0004009A, 0x00000009, 0x00003A0D, 0x000047CE,
0x000200F9, 0x00002423, 0x000200F8, 0x00002423, 0x000700F5, 0x00000009,
0x00002AAC, 0x00005FD6, 0x00001E46, 0x00003A0D, 0x00002F62, 0x000300F7,
0x00001C25, 0x00000000, 0x000400FA, 0x00002AAC, 0x000055E8, 0x00001C25,
0x000200F8, 0x000055E8, 0x000200F9, 0x00005C60, 0x000200F8, 0x00001C25,
0x000200F9, 0x00001981, 0x000200F8, 0x00001981, 0x000700F5, 0x0000000B,
0x00005A5B, 0x00000A0A, 0x00001C25, 0x00002D83, 0x000038D7, 0x000500B0,
0x00000009, 0x00003656, 0x00005A5B, 0x00000A13, 0x000400F6, 0x000021F5,
0x000038D7, 0x00000000, 0x000400FA, 0x00003656, 0x000038D7, 0x000021F5,
0x000200F8, 0x000038D7, 0x00050041, 0x000008E9, 0x000046E9, 0x00000C48,
0x00005A5B, 0x0004003D, 0x0000066B, 0x00003F5E, 0x000046E9, 0x0003003E,
0x00000E2F, 0x00003F5E, 0x00060041, 0x0000029A, 0x00004127, 0x000014B9,
0x00005A5B, 0x00000A0B, 0x0004003D, 0x0000001D, 0x00001CDF, 0x00004127,
0x00050041, 0x0000029B, 0x00005968, 0x00001342, 0x00000A0B, 0x0003003E,
0x00005968, 0x00001CDF, 0x000100DA, 0x00050080, 0x0000000B, 0x00002D83,
0x00005A5B, 0x00000A0E, 0x000200F9, 0x00001981, 0x000200F8, 0x000021F5,
0x000100DB, 0x00060041, 0x0000029A, 0x00002F26, 0x000014B9, 0x00000A0E,
0x00000A0B, 0x0004003D, 0x0000001D, 0x0000189D, 0x00002F26, 0x0008004F,
0x00000018, 0x00004662, 0x0000189D, 0x0000189D, 0x00000000, 0x00000001,
0x00000002, 0x0008004F, 0x00000018, 0x00003056, 0x000050F2, 0x000050F2,
0x00000000, 0x00000001, 0x00000002, 0x00050083, 0x00000018, 0x0000499D,
0x00004662, 0x00003056, 0x00060041, 0x0000029A, 0x000049FA, 0x000014B9,
0x00000A11, 0x00000A0B, 0x0004003D, 0x0000001D, 0x000034BD, 0x000049FA,
0x0008004F, 0x00000018, 0x0000233E, 0x000034BD, 0x000034BD, 0x00000000,
0x00000001, 0x00000002, 0x00050083, 0x00000018, 0x00001D35, 0x0000233E,
0x00003056, 0x00050083, 0x00000018, 0x00002B36, 0x0000233E, 0x00004662,
0x00050094, 0x0000000D, 0x00003A53, 0x0000499D, 0x0000499D, 0x00050094,
0x0000000D, 0x00005CB6, 0x00001D35, 0x00001D35, 0x00050094, 0x0000000D,
0x00005748, 0x00002B36, 0x00002B36, 0x000500BA, 0x00000009, 0x00006091,
0x00005748, 0x00003A53, 0x000300F7, 0x00003D48, 0x00000000, 0x000400FA,
0x00006091, 0x0000360F, 0x00003D48, 0x000200F8, 0x0000360F, 0x000500BA,
0x00000009, 0x000052C3, 0x00005748, 0x00005CB6, 0x000200F9, 0x00003D48,
0x000200F8, 0x00003D48, 0x000700F5, 0x00000009, 0x00002AAD, 0x00006091,
0x000021F5, 0x000052C3, 0x0000360F, 0x000300F7, 0x00002DB5, 0x00000000,
0x000400FA, 0x00002AAD, 0x00002F63, 0x000033CD, 0x000200F8, 0x00002F63,
0x00050041, 0x000008E9, 0x000046EA, 0x00000C48, 0x00000A11, 0x0004003D,
0x0000066B, 0x00003F5F, 0x000046EA, 0x0003003E, 0x00000E2F, 0x00003F5F,
0x00050041, 0x0000029B, 0x00004BD5, 0x00001342, 0x00000A0B, 0x0003003E,
0x00004BD5, 0x000034BD, 0x000100DA, 0x00050041, 0x000008E9, 0x0000591C,
0x00000C48, 0x00000A0E, 0x0004003D, 0x0000066B, 0x00002C4D, 0x0000591C,
0x0003003E, 0x00000E2F, 0x00002C4D, 0x0003003E, 0x00004BD5, 0x0000189D,
0x000100DA, 0x000200F9, 0x00002DB5, 0x000200F8, 0x000033CD, 0x000500BA,
0x00000009, 0x00005DB9, 0x00005CB6, 0x00003A53, 0x000300F7, 0x00003D49,
0x00000000, 0x000400FA, 0x00005DB9, 0x00003610, 0x00003D49, 0x000200F8,
0x00003610, 0x000500BA, 0x00000009, 0x000052C4, 0x00005CB6, 0x00005748,
0x000200F9, 0x00003D49, 0x000200F8, 0x00003D49, 0x000700F5, 0x00000009,
0x00002AAE, 0x00005DB9, 0x000033CD, 0x000052C4, 0x00003610, 0x000300F7,
0x00002B26, 0x00000000, 0x000400FA, 0x00002AAE, 0x00002F64, 0x00002D45,
0x000200F8, 0x00002F64, 0x00050041, 0x000008E9, 0x000046EB, 0x00000C48,
0x00000A0B, 0x0004003D, 0x0000066B, 0x00003F60, 0x000046EB, 0x0003003E,
0x00000E2F, 0x00003F60, 0x00050041, 0x0000029B, 0x00004BD6, 0x00001342,
0x00000A0B, 0x0003003E, 0x00004BD6, 0x000050F2, 0x000100DA, 0x00050041,
0x000008E9, 0x0000591D, 0x00000C48, 0x00000A11, 0x0004003D, 0x0000066B,
0x00002C4E, 0x0000591D, 0x0003003E, 0x00000E2F, 0x00002C4E, 0x0003003E,
0x00004BD6, 0x000034BD, 0x000100DA, 0x000200F9, 0x00002B26, 0x000200F8,
0x00002D45, 0x00050041, 0x000008E9, 0x0000505F, 0x00000C48, 0x00000A0E,
0x0004003D, 0x0000066B, 0x00003F61, 0x0000505F, 0x0003003E, 0x00000E2F,
0x00003F61, 0x00050041, 0x0000029B, 0x00004BD7, 0x00001342, 0x00000A0B,
0x0003003E, 0x00004BD7, 0x0000189D, 0x000100DA, 0x00050041, 0x000008E9,
0x0000591E, 0x00000C48, 0x00000A0B, 0x0004003D, 0x0000066B, 0x00002C4F,
0x0000591E, 0x0003003E, 0x00000E2F, 0x00002C4F, 0x0003003E, 0x00004BD7,
0x000050F2, 0x000100DA, 0x000200F9, 0x00002B26, 0x000200F8, 0x00002B26,
0x00060050, 0x00000010, 0x00003EAE, 0x00002AAE, 0x00002AAE, 0x00002AAE,
0x000600A9, 0x00000018, 0x00004E42, 0x00003EAE, 0x00000A16, 0x0000010B,
0x000200F9, 0x00002DB5, 0x000200F8, 0x00002DB5, 0x000700F5, 0x00000018,
0x0000292C, 0x0000010A, 0x00002F63, 0x00004E42, 0x00002B26, 0x000200F9,
0x00004DF0, 0x000200F8, 0x00004DF0, 0x000700F5, 0x0000000B, 0x00005A5C,
0x00000A0A, 0x00002DB5, 0x00005335, 0x00002E53, 0x000500B0, 0x00000009,
0x00003657, 0x00005A5C, 0x00000A3A, 0x000400F6, 0x00003A6F, 0x00002E53,
0x00000000, 0x000400FA, 0x00003657, 0x00002E53, 0x00003A6F, 0x000200F8,
0x00002E53, 0x00050051, 0x0000000D, 0x00004D8B, 0x0000292C, 0x00000000,
0x00060041, 0x0000029A, 0x000030C7, 0x00000C48, 0x00000A0B, 0x00005A5C,
0x0004003D, 0x0000001D, 0x0000318B, 0x000030C7, 0x0005008E, 0x0000001D,
0x0000220F, 0x0000318B, 0x00004D8B, 0x00050051, 0x0000000D, 0x00003D37,
0x0000292C, 0x00000001, 0x00060041, 0x0000029A, 0x000042C8, 0x00000C48,
0x00000A0E, 0x00005A5C, 0x0004003D, 0x0000001D, 0x0000351B, 0x000042C8,
0x0005008E, 0x0000001D, 0x00004D4E, 0x0000351B, 0x00003D37, 0x00050081,
0x0000001D, 0x00004EEE, 0x0000220F, 0x00004D4E, 0x00050051, 0x0000000D,
0x00002953, 0x0000292C, 0x00000002, 0x00060041, 0x0000029A, 0x00003FA9,
0x00000C48, 0x00000A11, 0x00005A5C, 0x0004003D, 0x0000001D, 0x0000351C,
0x00003FA9, 0x0005008E, 0x0000001D, 0x00004C1E, 0x0000351C, 0x00002953,
0x00050081, 0x0000001D, 0x00005985, 0x00004EEE, 0x00004C1E, 0x00050041,
0x0000029B, 0x00004023, 0x00000E2F, 0x00005A5C, 0x0003003E, 0x00004023,
0x00005985, 0x00050080, 0x0000000B, 0x00005335, 0x00005A5C, 0x00000A0E,
0x000200F9, 0x00004DF0, 0x000200F8, 0x00003A6F, 0x00050051, 0x0000000D,
0x00002474, 0x0000292C, 0x00000000, 0x0005008E, 0x0000001D, 0x00001D55,
0x000050F2, 0x00002474, 0x00050051, 0x0000000D, 0x00001ACA, 0x0000292C,
0x00000001, 0x0005008E, 0x0000001D, 0x00003BA5, 0x0000189D, 0x00001ACA,
0x00050081, 0x0000001D, 0x00006135, 0x00001D55, 0x00003BA5, 0x00050051,
0x0000000D, 0x000044D5, 0x0000292C, 0x00000002, 0x0005008E, 0x0000001D,
0x00003756, 0x000034BD, 0x000044D5, 0x00050081, 0x0000001D, 0x00001B96,
0x00006135, 0x00003756, 0x00050041, 0x0000029B, 0x000046D1, 0x00001342,
0x00000A0B, 0x0003003E, 0x000046D1, 0x00001B96, 0x000100DA, 0x000100DB,
0x000200F9, 0x00005C60, 0x000200F8, 0x00005C60, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,103 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#version 460
#extension GL_GOOGLE_include_directive : require
#include "xenos_gs.glsli"
layout(triangles) in;
layout(triangle_strip, max_vertices=6) out;
void main() {
if (any(isnan(gl_in[0].gl_Position)) || any(isnan(gl_in[1].gl_Position)) ||
any(isnan(gl_in[2].gl_Position))) {
return;
}
uint i;
for (i = 0; i < 3u; ++i) {
xe_out_interpolators = xe_in_interpolators[i];
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
// Find the diagonal (the edge that is longer than both the other two) and
// mirror the other vertex across it.
vec3 edge_01 = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 edge_02 = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 edge_12 = gl_in[2].gl_Position.xyz - gl_in[1].gl_Position.xyz;
vec3 edge_squares = vec3(
dot(edge_01, edge_01), dot(edge_02, edge_02), dot(edge_12, edge_12));
vec3 v3_signs;
if (edge_squares.z > edge_squares.x && edge_squares.z > edge_squares.y) {
// 12 is the diagonal. Most games use this form.
//
// 0 ------ 1 0: -1,-1
// | - | 1: 1,-1
// | // | 2: -1, 1
// | - | 3: [ 1, 1 ]
// 2 ----- [3]
//
// 0 ------ 2 0: -1,-1
// | - | 1: -1, 1
// | // | 2: 1,-1
// | - | 3: [ 1, 1 ]
// 1 ------[3]
xe_out_interpolators = xe_in_interpolators[2];
gl_Position = gl_in[2].gl_Position;
EmitVertex();
xe_out_interpolators = xe_in_interpolators[1];
gl_Position = gl_in[1].gl_Position;
EmitVertex();
v3_signs = vec3(-1.0, 1.0, 1.0);
} else if (edge_squares.y > edge_squares.x &&
edge_squares.y > edge_squares.z) {
// 02 is the diagonal.
//
// 0 ------ 1 0: -1,-1
// | - | 1: 1,-1
// | \\ | 2: 1, 1
// | - | 3: [-1, 1 ]
// [3] ----- 2
xe_out_interpolators = xe_in_interpolators[0];
gl_Position = gl_in[0].gl_Position;
EmitVertex();
xe_out_interpolators = xe_in_interpolators[2];
gl_Position = gl_in[2].gl_Position;
EmitVertex();
v3_signs = vec3(1.0, -1.0, 1.0);
} else {
// 01 is the diagonal. Not seen in any game so far.
//
// 0 ------ 2 0: -1,-1
// | - | 1: 1, 1
// | \\ | 2: 1,-1
// | - | 3: [-1, 1 ]
// [3] ----- 1
xe_out_interpolators = xe_in_interpolators[1];
gl_Position = gl_in[1].gl_Position;
EmitVertex();
xe_out_interpolators = xe_in_interpolators[0];
gl_Position = gl_in[0].gl_Position;
EmitVertex();
v3_signs = vec3(1.0, 1.0, -1.0);
}
for (i = 0; i < 16u; ++i) {
xe_out_interpolators[i] = v3_signs.x * xe_in_interpolators[0][i] +
v3_signs.y * xe_in_interpolators[1][i] +
v3_signs.z * xe_in_interpolators[2][i];
}
gl_Position = v3_signs.x * gl_in[0].gl_Position +
v3_signs.y * gl_in[1].gl_Position +
v3_signs.z * gl_in[2].gl_Position;
EmitVertex();
EndPrimitive();
}

View File

@ -0,0 +1,25 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_GPU_D3D12_SHADERS_XENOS_GS_GLSLI_
#define XENIA_GPU_D3D12_SHADERS_XENOS_GS_GLSLI_
layout(location=0) in vec4 xe_in_interpolators[][16];
in gl_PerVertex {
vec4 gl_Position;
} gl_in[];
layout(location=0) out vec4 xe_out_interpolators[16];
out gl_PerVertex {
precise vec4 gl_Position;
};
#endif // XENIA_GPU_D3D12_SHADERS_XENOS_GS_GLSLI_

View File

@ -27,11 +27,17 @@
#include "xenia/gpu/vulkan/vulkan_command_processor.h"
#include "xenia/gpu/vulkan/vulkan_shader.h"
#include "xenia/gpu/xenos.h"
#include "xenia/ui/vulkan/vulkan_util.h"
namespace xe {
namespace gpu {
namespace vulkan {
// Generated with `xb buildshaders`.
namespace shaders {
#include "xenia/gpu/shaders/bytecode/vulkan_spirv/primitive_rectangle_list_gs.h"
} // namespace shaders
VulkanPipelineCache::VulkanPipelineCache(
VulkanCommandProcessor& command_processor,
const RegisterFile& register_file,
@ -45,6 +51,20 @@ VulkanPipelineCache::~VulkanPipelineCache() { Shutdown(); }
bool VulkanPipelineCache::Initialize() {
const ui::vulkan::VulkanProvider& provider =
command_processor_.GetVulkanProvider();
const VkPhysicalDeviceFeatures& device_features = provider.device_features();
if (device_features.geometryShader) {
gs_rectangle_list_ = ui::vulkan::util::CreateShaderModule(
provider, shaders::primitive_rectangle_list_gs,
sizeof(shaders::primitive_rectangle_list_gs));
if (gs_rectangle_list_ == VK_NULL_HANDLE) {
XELOGE(
"VulkanPipelineCache: Failed to create the rectangle list geometry "
"shader");
Shutdown();
return false;
}
}
shader_translator_ = std::make_unique<SpirvShaderTranslator>(
SpirvShaderTranslator::Features(provider));
@ -53,9 +73,17 @@ bool VulkanPipelineCache::Initialize() {
}
void VulkanPipelineCache::Shutdown() {
const ui::vulkan::VulkanProvider& provider =
command_processor_.GetVulkanProvider();
const ui::vulkan::VulkanProvider::DeviceFunctions& dfn = provider.dfn();
VkDevice device = provider.device();
ClearCache();
shader_translator_.reset();
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,
gs_rectangle_list_);
}
void VulkanPipelineCache::ClearCache() {
@ -357,6 +385,9 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
}
description_out.render_pass_key = render_pass_key;
// TODO(Triang3l): Implement primitive types currently using geometry shaders
// without them.
PipelineGeometryShader geometry_shader = PipelineGeometryShader::kNone;
PipelinePrimitiveTopology primitive_topology;
switch (primitive_processing_result.host_primitive_type) {
case xenos::PrimitiveType::kPointList:
@ -369,7 +400,6 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
primitive_topology = PipelinePrimitiveTopology::kLineStrip;
break;
case xenos::PrimitiveType::kTriangleList:
case xenos::PrimitiveType::kRectangleList:
primitive_topology = PipelinePrimitiveTopology::kTriangleList;
break;
case xenos::PrimitiveType::kTriangleFan:
@ -381,6 +411,10 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
case xenos::PrimitiveType::kTriangleStrip:
primitive_topology = PipelinePrimitiveTopology::kTriangleStrip;
break;
case xenos::PrimitiveType::kRectangleList:
geometry_shader = PipelineGeometryShader::kRectangleList;
primitive_topology = PipelinePrimitiveTopology::kTriangleList;
break;
case xenos::PrimitiveType::kQuadList:
primitive_topology = PipelinePrimitiveTopology::kLineListWithAdjacency;
break;
@ -388,6 +422,7 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
// TODO(Triang3l): All primitive types and tessellation.
return false;
}
description_out.geometry_shader = geometry_shader;
description_out.primitive_topology = primitive_topology;
description_out.primitive_restart =
primitive_processing_result.host_primitive_reset_enabled;
@ -605,6 +640,11 @@ bool VulkanPipelineCache::ArePipelineRequirementsMet(
}
}
if (!device_features.geometryShader &&
description.geometry_shader != PipelineGeometryShader::kNone) {
return false;
}
if (!device_features.independentBlend) {
uint32_t color_rts_remaining =
description.render_pass_key.depth_and_color_used >> 1;
@ -670,14 +710,14 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
command_processor_.GetVulkanProvider();
const VkPhysicalDeviceFeatures& device_features = provider.device_features();
VkPipelineShaderStageCreateInfo shader_stages[2];
std::array<VkPipelineShaderStageCreateInfo, 3> shader_stages;
uint32_t shader_stage_count = 0;
// Vertex or tessellation evaluation shader.
assert_true(creation_arguments.vertex_shader->is_translated());
if (!creation_arguments.vertex_shader->is_valid()) {
return false;
}
assert_true(shader_stage_count < xe::countof(shader_stages));
VkPipelineShaderStageCreateInfo& shader_stage_vertex =
shader_stages[shader_stage_count++];
shader_stage_vertex.sType =
@ -690,12 +730,33 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
assert_true(shader_stage_vertex.module != VK_NULL_HANDLE);
shader_stage_vertex.pName = "main";
shader_stage_vertex.pSpecializationInfo = nullptr;
// Geometry shader.
VkShaderModule geometry_shader = VK_NULL_HANDLE;
switch (description.geometry_shader) {
case PipelineGeometryShader::kRectangleList:
geometry_shader = gs_rectangle_list_;
break;
default:
break;
}
if (geometry_shader != VK_NULL_HANDLE) {
VkPipelineShaderStageCreateInfo& shader_stage_geometry =
shader_stages[shader_stage_count++];
shader_stage_geometry.sType =
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
shader_stage_geometry.pNext = nullptr;
shader_stage_geometry.flags = 0;
shader_stage_geometry.stage = VK_SHADER_STAGE_GEOMETRY_BIT;
shader_stage_geometry.module = geometry_shader;
shader_stage_geometry.pName = "main";
shader_stage_geometry.pSpecializationInfo = nullptr;
}
// Pixel shader.
if (creation_arguments.pixel_shader) {
assert_true(creation_arguments.pixel_shader->is_translated());
if (!creation_arguments.pixel_shader->is_valid()) {
return false;
}
assert_true(shader_stage_count < xe::countof(shader_stages));
VkPipelineShaderStageCreateInfo& shader_stage_fragment =
shader_stages[shader_stage_count++];
shader_stage_fragment.sType =
@ -985,7 +1046,7 @@ bool VulkanPipelineCache::EnsurePipelineCreated(
pipeline_create_info.pNext = nullptr;
pipeline_create_info.flags = 0;
pipeline_create_info.stageCount = shader_stage_count;
pipeline_create_info.pStages = shader_stages;
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;

View File

@ -82,6 +82,11 @@ class VulkanPipelineCache {
const PipelineLayoutProvider*& pipeline_layout_out);
private:
enum class PipelineGeometryShader : uint32_t {
kNone,
kRectangleList,
};
enum class PipelinePrimitiveTopology : uint32_t {
kPointList,
kLineList,
@ -136,24 +141,26 @@ class VulkanPipelineCache {
uint64_t pixel_shader_modification;
VulkanRenderTargetCache::RenderPassKey render_pass_key;
// Shader stages.
PipelineGeometryShader geometry_shader : 2; // 2
// Input assembly.
PipelinePrimitiveTopology primitive_topology : 3; // 3
uint32_t primitive_restart : 1; // 4
PipelinePrimitiveTopology primitive_topology : 3; // 5
uint32_t primitive_restart : 1; // 6
// Rasterization.
uint32_t depth_clamp_enable : 1; // 5
PipelinePolygonMode polygon_mode : 2; // 7
uint32_t cull_front : 1; // 8
uint32_t cull_back : 1; // 9
uint32_t front_face_clockwise : 1; // 10
uint32_t depth_clamp_enable : 1; // 7
PipelinePolygonMode polygon_mode : 2; // 9
uint32_t cull_front : 1; // 10
uint32_t cull_back : 1; // 11
uint32_t front_face_clockwise : 1; // 12
// Depth / stencil.
uint32_t depth_write_enable : 1; // 11
xenos::CompareFunction depth_compare_op : 3; // 14
uint32_t stencil_test_enable : 1; // 15
xenos::StencilOp stencil_front_fail_op : 3; // 18
xenos::StencilOp stencil_front_pass_op : 3; // 21
xenos::StencilOp stencil_front_depth_fail_op : 3; // 24
xenos::CompareFunction stencil_front_compare_op : 3; // 27
xenos::StencilOp stencil_back_fail_op : 3; // 30
uint32_t depth_write_enable : 1; // 13
xenos::CompareFunction depth_compare_op : 3; // 15
uint32_t stencil_test_enable : 1; // 17
xenos::StencilOp stencil_front_fail_op : 3; // 20
xenos::StencilOp stencil_front_pass_op : 3; // 23
xenos::StencilOp stencil_front_depth_fail_op : 3; // 26
xenos::CompareFunction stencil_front_compare_op : 3; // 29
xenos::StencilOp stencil_back_fail_op : 3; // 32
xenos::StencilOp stencil_back_pass_op : 3; // 3
xenos::StencilOp stencil_back_depth_fail_op : 3; // 6
@ -228,6 +235,8 @@ class VulkanPipelineCache {
const RegisterFile& register_file_;
VulkanRenderTargetCache& render_target_cache_;
VkShaderModule gs_rectangle_list_ = VK_NULL_HANDLE;
// Temporary storage for AnalyzeUcode calls on the processor thread.
StringBuffer ucode_disasm_buffer_;
// Reusable shader translator on the command processor thread.