-
Notifications
You must be signed in to change notification settings - Fork 664
Dubious optimization of UBO blocks #946
Copy link
Copy link
Closed
Description
Using spirv-opt -O -o opt.spv test.spv
Input SPIR-V
; SPIR-V
; Version: 1.0
; Generator: Google Shaderc over Glslang; 2
; Bound: 80
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %gl_InstanceIndex %Position %__0
OpSource GLSL 450
OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
OpSourceExtension "GL_GOOGLE_include_directive"
OpName %main "main"
OpName %World "World"
OpName %StaticMeshInfo "StaticMeshInfo"
OpMemberName %StaticMeshInfo 0 "Model"
OpMemberName %StaticMeshInfo 1 "Normal"
OpName %PerVertexData "PerVertexData"
OpMemberName %PerVertexData 0 "infos"
OpName %_ ""
OpName %gl_InstanceIndex "gl_InstanceIndex"
OpName %Position "Position"
OpName %gl_PerVertex "gl_PerVertex"
OpMemberName %gl_PerVertex 0 "gl_Position"
OpMemberName %gl_PerVertex 1 "gl_PointSize"
OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
OpMemberName %gl_PerVertex 3 "gl_CullDistance"
OpName %__0 ""
OpName %RenderParameters "RenderParameters"
OpMemberName %RenderParameters 0 "projection"
OpMemberName %RenderParameters 1 "view"
OpMemberName %RenderParameters 2 "view_projection"
OpMemberName %RenderParameters 3 "inv_projection"
OpMemberName %RenderParameters 4 "inv_view"
OpMemberName %RenderParameters 5 "inv_view_projection"
OpMemberName %RenderParameters 6 "inv_local_view_projection"
OpMemberName %RenderParameters 7 "camera_position"
OpMemberName %RenderParameters 8 "camera_front"
OpMemberName %RenderParameters 9 "camera_right"
OpMemberName %RenderParameters 10 "camera_up"
OpMemberName %RenderParameters 11 "z_near"
OpMemberName %RenderParameters 12 "z_far"
OpName %global "global"
OpMemberDecorate %StaticMeshInfo 0 ColMajor
OpMemberDecorate %StaticMeshInfo 0 Offset 0
OpMemberDecorate %StaticMeshInfo 0 MatrixStride 16
OpMemberDecorate %StaticMeshInfo 1 ColMajor
OpMemberDecorate %StaticMeshInfo 1 Offset 64
OpMemberDecorate %StaticMeshInfo 1 MatrixStride 16
OpDecorate %_arr_StaticMeshInfo_uint_256 ArrayStride 128
OpMemberDecorate %PerVertexData 0 Offset 0
OpDecorate %PerVertexData Block
OpDecorate %_ DescriptorSet 3
OpDecorate %_ Binding 0
OpDecorate %gl_InstanceIndex BuiltIn InstanceIndex
OpDecorate %Position Location 0
OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
OpDecorate %gl_PerVertex Block
OpMemberDecorate %RenderParameters 0 ColMajor
OpMemberDecorate %RenderParameters 0 Offset 0
OpMemberDecorate %RenderParameters 0 MatrixStride 16
OpMemberDecorate %RenderParameters 1 ColMajor
OpMemberDecorate %RenderParameters 1 Offset 64
OpMemberDecorate %RenderParameters 1 MatrixStride 16
OpMemberDecorate %RenderParameters 2 ColMajor
OpMemberDecorate %RenderParameters 2 Offset 128
OpMemberDecorate %RenderParameters 2 MatrixStride 16
OpMemberDecorate %RenderParameters 3 ColMajor
OpMemberDecorate %RenderParameters 3 Offset 192
OpMemberDecorate %RenderParameters 3 MatrixStride 16
OpMemberDecorate %RenderParameters 4 ColMajor
OpMemberDecorate %RenderParameters 4 Offset 256
OpMemberDecorate %RenderParameters 4 MatrixStride 16
OpMemberDecorate %RenderParameters 5 ColMajor
OpMemberDecorate %RenderParameters 5 Offset 320
OpMemberDecorate %RenderParameters 5 MatrixStride 16
OpMemberDecorate %RenderParameters 6 ColMajor
OpMemberDecorate %RenderParameters 6 Offset 384
OpMemberDecorate %RenderParameters 6 MatrixStride 16
OpMemberDecorate %RenderParameters 7 Offset 448
OpMemberDecorate %RenderParameters 8 Offset 464
OpMemberDecorate %RenderParameters 9 Offset 480
OpMemberDecorate %RenderParameters 10 Offset 496
OpMemberDecorate %RenderParameters 11 Offset 508
OpMemberDecorate %RenderParameters 12 Offset 512
OpDecorate %RenderParameters Block
OpDecorate %global DescriptorSet 0
OpDecorate %global Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v3float = OpTypeVector %float 3
%_ptr_Function_v3float = OpTypePointer Function %v3float
%v4float = OpTypeVector %float 4
%mat4v4float = OpTypeMatrix %v4float 4
%StaticMeshInfo = OpTypeStruct %mat4v4float %mat4v4float
%uint = OpTypeInt 32 0
%uint_256 = OpConstant %uint 256
%_arr_StaticMeshInfo_uint_256 = OpTypeArray %StaticMeshInfo %uint_256
%PerVertexData = OpTypeStruct %_arr_StaticMeshInfo_uint_256
%_ptr_Uniform_PerVertexData = OpTypePointer Uniform %PerVertexData
%_ = OpVariable %_ptr_Uniform_PerVertexData Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Input_int = OpTypePointer Input %int
%gl_InstanceIndex = OpVariable %_ptr_Input_int Input
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%_ptr_Input_v3float = OpTypePointer Input %v3float
%Position = OpVariable %_ptr_Input_v3float Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%int_1 = OpConstant %int 1
%uint_1 = OpConstant %uint 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%int_3 = OpConstant %int 3
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
%__0 = OpVariable %_ptr_Output_gl_PerVertex Output
%RenderParameters = OpTypeStruct %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %v3float %v3float %v3float %v3float %float %float
%_ptr_Uniform_RenderParameters = OpTypePointer Uniform %RenderParameters
%global = OpVariable %_ptr_Uniform_RenderParameters Uniform
%_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
%float_1 = OpConstant %float 1
%_ptr_Output_v4float = OpTypePointer Output %v4float
%main = OpFunction %void None %3
%5 = OpLabel
%World = OpVariable %_ptr_Function_v3float Function
%23 = OpLoad %int %gl_InstanceIndex
%25 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %23 %int_0 %int_0
%26 = OpLoad %v4float %25
%27 = OpVectorShuffle %v3float %26 %26 0 1 2
%32 = OpAccessChain %_ptr_Input_float %Position %uint_0
%33 = OpLoad %float %32
%34 = OpVectorTimesScalar %v3float %27 %33
%35 = OpLoad %int %gl_InstanceIndex
%37 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %35 %int_0 %int_1
%38 = OpLoad %v4float %37
%39 = OpVectorShuffle %v3float %38 %38 0 1 2
%41 = OpAccessChain %_ptr_Input_float %Position %uint_1
%42 = OpLoad %float %41
%43 = OpVectorTimesScalar %v3float %39 %42
%44 = OpFAdd %v3float %34 %43
%45 = OpLoad %int %gl_InstanceIndex
%47 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %45 %int_0 %int_2
%48 = OpLoad %v4float %47
%49 = OpVectorShuffle %v3float %48 %48 0 1 2
%51 = OpAccessChain %_ptr_Input_float %Position %uint_2
%52 = OpLoad %float %51
%53 = OpVectorTimesScalar %v3float %49 %52
%54 = OpFAdd %v3float %44 %53
%55 = OpLoad %int %gl_InstanceIndex
%57 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %55 %int_0 %int_3
%58 = OpLoad %v4float %57
%59 = OpVectorShuffle %v3float %58 %58 0 1 2
%60 = OpFAdd %v3float %54 %59
OpStore %World %60
%69 = OpAccessChain %_ptr_Uniform_mat4v4float %global %int_2
%70 = OpLoad %mat4v4float %69
%71 = OpLoad %v3float %World
%73 = OpCompositeExtract %float %71 0
%74 = OpCompositeExtract %float %71 1
%75 = OpCompositeExtract %float %71 2
%76 = OpCompositeConstruct %v4float %73 %74 %75 %float_1
%77 = OpMatrixTimesVector %v4float %70 %76
%79 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
OpStore %79 %77
OpReturn
OpFunctionEnd
Output:
; SPIR-V
; Version: 1.0
; Generator: Google Shaderc over Glslang; 2
; Bound: 82
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %gl_InstanceIndex %Position %__0
OpSource GLSL 450
OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"
OpSourceExtension "GL_GOOGLE_include_directive"
OpName %main "main"
OpName %StaticMeshInfo "StaticMeshInfo"
OpMemberName %StaticMeshInfo 0 "Model"
OpMemberName %StaticMeshInfo 1 "Normal"
OpName %PerVertexData "PerVertexData"
OpMemberName %PerVertexData 0 "infos"
OpName %_ ""
OpName %gl_InstanceIndex "gl_InstanceIndex"
OpName %Position "Position"
OpName %gl_PerVertex "gl_PerVertex"
OpMemberName %gl_PerVertex 0 "gl_Position"
OpMemberName %gl_PerVertex 1 "gl_PointSize"
OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
OpMemberName %gl_PerVertex 3 "gl_CullDistance"
OpName %__0 ""
OpName %RenderParameters "RenderParameters"
OpMemberName %RenderParameters 0 "projection"
OpMemberName %RenderParameters 1 "view"
OpMemberName %RenderParameters 2 "view_projection"
OpMemberName %RenderParameters 3 "inv_projection"
OpMemberName %RenderParameters 4 "inv_view"
OpMemberName %RenderParameters 5 "inv_view_projection"
OpMemberName %RenderParameters 6 "inv_local_view_projection"
OpMemberName %RenderParameters 7 "camera_position"
OpMemberName %RenderParameters 8 "camera_front"
OpMemberName %RenderParameters 9 "camera_right"
OpMemberName %RenderParameters 10 "camera_up"
OpMemberName %RenderParameters 11 "z_near"
OpMemberName %RenderParameters 12 "z_far"
OpName %global "global"
OpMemberDecorate %StaticMeshInfo 0 ColMajor
OpMemberDecorate %StaticMeshInfo 0 Offset 0
OpMemberDecorate %StaticMeshInfo 0 MatrixStride 16
OpMemberDecorate %StaticMeshInfo 1 ColMajor
OpMemberDecorate %StaticMeshInfo 1 Offset 64
OpMemberDecorate %StaticMeshInfo 1 MatrixStride 16
OpDecorate %_arr_StaticMeshInfo_uint_256 ArrayStride 128
OpMemberDecorate %PerVertexData 0 Offset 0
OpDecorate %PerVertexData Block
OpDecorate %_ DescriptorSet 3
OpDecorate %_ Binding 0
OpDecorate %gl_InstanceIndex BuiltIn InstanceIndex
OpDecorate %Position Location 0
OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
OpDecorate %gl_PerVertex Block
OpMemberDecorate %RenderParameters 0 ColMajor
OpMemberDecorate %RenderParameters 0 Offset 0
OpMemberDecorate %RenderParameters 0 MatrixStride 16
OpMemberDecorate %RenderParameters 1 ColMajor
OpMemberDecorate %RenderParameters 1 Offset 64
OpMemberDecorate %RenderParameters 1 MatrixStride 16
OpMemberDecorate %RenderParameters 2 ColMajor
OpMemberDecorate %RenderParameters 2 Offset 128
OpMemberDecorate %RenderParameters 2 MatrixStride 16
OpMemberDecorate %RenderParameters 3 ColMajor
OpMemberDecorate %RenderParameters 3 Offset 192
OpMemberDecorate %RenderParameters 3 MatrixStride 16
OpMemberDecorate %RenderParameters 4 ColMajor
OpMemberDecorate %RenderParameters 4 Offset 256
OpMemberDecorate %RenderParameters 4 MatrixStride 16
OpMemberDecorate %RenderParameters 5 ColMajor
OpMemberDecorate %RenderParameters 5 Offset 320
OpMemberDecorate %RenderParameters 5 MatrixStride 16
OpMemberDecorate %RenderParameters 6 ColMajor
OpMemberDecorate %RenderParameters 6 Offset 384
OpMemberDecorate %RenderParameters 6 MatrixStride 16
OpMemberDecorate %RenderParameters 7 Offset 448
OpMemberDecorate %RenderParameters 8 Offset 464
OpMemberDecorate %RenderParameters 9 Offset 480
OpMemberDecorate %RenderParameters 10 Offset 496
OpMemberDecorate %RenderParameters 11 Offset 508
OpMemberDecorate %RenderParameters 12 Offset 512
OpDecorate %RenderParameters Block
OpDecorate %global DescriptorSet 0
OpDecorate %global Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v3float = OpTypeVector %float 3
%_ptr_Function_v3float = OpTypePointer Function %v3float
%v4float = OpTypeVector %float 4
%mat4v4float = OpTypeMatrix %v4float 4
%StaticMeshInfo = OpTypeStruct %mat4v4float %mat4v4float
%uint = OpTypeInt 32 0
%uint_256 = OpConstant %uint 256
%_arr_StaticMeshInfo_uint_256 = OpTypeArray %StaticMeshInfo %uint_256
%PerVertexData = OpTypeStruct %_arr_StaticMeshInfo_uint_256
%_ptr_Uniform_PerVertexData = OpTypePointer Uniform %PerVertexData
%_ = OpVariable %_ptr_Uniform_PerVertexData Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Input_int = OpTypePointer Input %int
%gl_InstanceIndex = OpVariable %_ptr_Input_int Input
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%_ptr_Input_v3float = OpTypePointer Input %v3float
%Position = OpVariable %_ptr_Input_v3float Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%int_1 = OpConstant %int 1
%uint_1 = OpConstant %uint 1
%int_2 = OpConstant %int 2
%uint_2 = OpConstant %uint 2
%int_3 = OpConstant %int 3
%_arr_float_uint_1 = OpTypeArray %float %uint_1
%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
%__0 = OpVariable %_ptr_Output_gl_PerVertex Output
%RenderParameters = OpTypeStruct %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %mat4v4float %v3float %v3float %v3float %v3float %float %float
%_ptr_Uniform_RenderParameters = OpTypePointer Uniform %RenderParameters
%global = OpVariable %_ptr_Uniform_RenderParameters Uniform
%_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
%float_1 = OpConstant %float 1
%_ptr_Output_v4float = OpTypePointer Output %v4float
%main = OpFunction %void None %3
%5 = OpLabel
%23 = OpLoad %int %gl_InstanceIndex
%25 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %23 %int_0 %int_0
%26 = OpLoad %v4float %25
%27 = OpVectorShuffle %v3float %26 %26 0 1 2
%32 = OpAccessChain %_ptr_Input_float %Position %uint_0
%33 = OpLoad %float %32
%34 = OpVectorTimesScalar %v3float %27 %33
%35 = OpLoad %int %gl_InstanceIndex
%37 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %35 %int_0 %int_1
%38 = OpLoad %v4float %37
%39 = OpVectorShuffle %v3float %38 %38 0 1 2
%41 = OpAccessChain %_ptr_Input_float %Position %uint_1
%42 = OpLoad %float %41
%43 = OpVectorTimesScalar %v3float %39 %42
%44 = OpFAdd %v3float %34 %43
%45 = OpLoad %int %gl_InstanceIndex
%47 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %45 %int_0 %int_2
%48 = OpLoad %v4float %47
%49 = OpVectorShuffle %v3float %48 %48 0 1 2
%51 = OpAccessChain %_ptr_Input_float %Position %uint_2
%52 = OpLoad %float %51
%53 = OpVectorTimesScalar %v3float %49 %52
%54 = OpFAdd %v3float %44 %53
%55 = OpLoad %int %gl_InstanceIndex
%57 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %55 %int_0 %int_3
%58 = OpLoad %v4float %57
%59 = OpVectorShuffle %v3float %58 %58 0 1 2
%60 = OpFAdd %v3float %54 %59
%80 = OpLoad %RenderParameters %global
%81 = OpCompositeExtract %mat4v4float %80 2
%73 = OpCompositeExtract %float %60 0
%74 = OpCompositeExtract %float %60 1
%75 = OpCompositeExtract %float %60 2
%76 = OpCompositeConstruct %v4float %73 %74 %75 %float_1
%77 = OpMatrixTimesVector %v4float %81 %76
%79 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
OpStore %79 %77
OpReturn
OpFunctionEnd
One awkward result is that the entire UBO is read as a value, only to then poke out a single matrix from that using OpCompositeExtract. I don't see how this can be "better" code.
%80 = OpLoad %RenderParameters %global
%81 = OpCompositeExtract %mat4v4float %80 2
Reactions are currently unavailable