Skip to content

Dubious optimization of UBO blocks #946

@Themaister

Description

@Themaister

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions