RetroArch/deps/SPIRV-Cross/shaders-no-opt/asm/frag/relaxed-precision-inheritance-rules.asm.frag

147 lines
5.7 KiB
JavaScript

; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 15
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %FragColor0 %FragColor1 %FragColor2 %FragColor3 %V4
OpExecutionMode %main OriginUpperLeft
OpSource ESSL 320
OpName %main "main"
OpName %FragColor0 "FragColor0"
OpName %FragColor1 "FragColor1"
OpName %FragColor2 "FragColor2"
OpName %FragColor3 "FragColor3"
OpName %V4 "V4"
OpName %V4_value0 "V4_value0"
OpName %V1_value0 "V1_value0"
OpName %V1_value1 "V1_value1"
OpName %V1_value2 "V1_value2"
OpName %float_0_weird "float_0_weird"
OpName %ubo "ubo"
OpName %ubo_mp0 "ubo_mp0"
OpName %ubo_hp0 "ubo_hp0"
OpName %block "UBO"
OpName %phi_mp "phi_mp"
OpName %phi_hp "phi_hp"
OpMemberName %block 0 "mediump_float"
OpMemberName %block 1 "highp_float"
OpDecorate %FragColor0 RelaxedPrecision
OpDecorate %FragColor0 Location 0
OpDecorate %FragColor1 RelaxedPrecision
OpDecorate %FragColor1 Location 1
OpDecorate %FragColor2 RelaxedPrecision
OpDecorate %FragColor2 Location 2
OpDecorate %FragColor3 RelaxedPrecision
OpDecorate %FragColor3 Location 3
OpDecorate %V4 RelaxedPrecision
OpDecorate %V4 Location 0
OpDecorate %V4_add RelaxedPrecision
OpDecorate %V4_mul RelaxedPrecision
OpDecorate %V1_add RelaxedPrecision
OpDecorate %V1_mul RelaxedPrecision
OpDecorate %phi_mp RelaxedPrecision
OpDecorate %mp_to_mp RelaxedPrecision
OpDecorate %hp_to_mp RelaxedPrecision
OpDecorate %V1_add_composite RelaxedPrecision
OpDecorate %V1_mul_composite RelaxedPrecision
OpDecorate %V4_sin1 RelaxedPrecision
OpDecorate %float_0_weird RelaxedPrecision
OpDecorate %ubo Binding 0
OpDecorate %ubo DescriptorSet 0
OpDecorate %block Block
OpMemberDecorate %block 0 Offset 0
OpMemberDecorate %block 1 Offset 4
OpMemberDecorate %block 0 RelaxedPrecision
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%block = OpTypeStruct %float %float
%block_ptr = OpTypePointer Uniform %block
%ubo_float_ptr = OpTypePointer Uniform %float
%ubo = OpVariable %block_ptr Uniform
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%float_3 = OpConstant %float 3.0
%v4float = OpTypeVector %float 4
%float_3_splat = OpConstantComposite %v4float %float_3 %float_3 %float_3 %float_3
%_ptr_Output_v4float = OpTypePointer Output %v4float
%FragColor0 = OpVariable %_ptr_Output_v4float Output
%FragColor1 = OpVariable %_ptr_Output_v4float Output
%FragColor2 = OpVariable %_ptr_Output_v4float Output
%FragColor3 = OpVariable %_ptr_Output_v4float Output
%_ptr_Input_v4float = OpTypePointer Input %v4float
%_ptr_Input_float = OpTypePointer Input %float
%V4 = OpVariable %_ptr_Input_v4float Input
%main = OpFunction %void None %3
%5 = OpLabel
; Inherits precision in GLSL
%V4_value0 = OpLoad %v4float %V4
; Inherits precision in GLSL
%ptr_V4x = OpAccessChain %_ptr_Input_float %V4 %uint_0
; Inherits precision in GLSL
%V1_value0 = OpLoad %float %ptr_V4x
%V1_value1 = OpCompositeExtract %float %V4_value0 2
%V1_value2 = OpCopyObject %float %V1_value1
%mp_ptr = OpAccessChain %ubo_float_ptr %ubo %uint_0
%hp_ptr = OpAccessChain %ubo_float_ptr %ubo %uint_1
%ubo_mp0 = OpLoad %float %mp_ptr
%ubo_hp0 = OpLoad %float %hp_ptr
; Stays mediump
%V4_add = OpFAdd %v4float %V4_value0 %float_3_splat
; Must promote to highp
%V4_sub = OpFSub %v4float %V4_value0 %float_3_splat
; Relaxed, truncate inputs.
%V4_mul = OpFMul %v4float %V4_sub %float_3_splat
OpStore %FragColor0 %V4_add
OpStore %FragColor1 %V4_sub
OpStore %FragColor2 %V4_mul
; Same as V4 tests.
%V1_add = OpFAdd %float %V1_value0 %float_3
%float_0_weird = OpFSub %float %float_3 %ubo_hp0
%V1_sub = OpFSub %float %V1_value0 %float_0_weird
%V1_mul = OpFMul %float %V1_sub %ubo_hp0
%V1_result = OpCompositeConstruct %v4float %V1_add %V1_sub %V1_mul %float_3
OpStore %FragColor3 %V1_result
; Same as V4 tests, but composite forwarding.
%V1_add_composite = OpFAdd %float %V1_value1 %ubo_mp0
%V1_sub_composite = OpFSub %float %V1_value2 %ubo_mp0
%V1_mul_composite = OpFMul %float %V1_sub_composite %ubo_hp0
%V1_result_composite = OpCompositeConstruct %v4float %V1_add_composite %V1_sub_composite %V1_mul_composite %float_3
OpStore %FragColor3 %V1_result_composite
; Must promote input to highp.
%V4_sin0 = OpExtInst %v4float %1 Sin %V4_value0
OpStore %FragColor0 %V4_sin0
; Can keep mediump input.
%V4_sin1 = OpExtInst %v4float %1 Sin %V4_value0
OpStore %FragColor1 %V4_sin1
OpBranch %next
%next = OpLabel
%phi_mp = OpPhi %float %V1_add %5
%phi_hp = OpPhi %float %V1_sub %5
; Consume PHIs in different precision contexts
%mp_to_mp = OpFAdd %float %phi_mp %phi_mp
%mp_to_hp = OpFAdd %float %phi_mp %phi_mp
%hp_to_mp = OpFAdd %float %phi_hp %phi_hp
%hp_to_hp = OpFAdd %float %phi_hp %phi_hp
%complete = OpCompositeConstruct %v4float %mp_to_mp %mp_to_hp %hp_to_mp %hp_to_hp
OpStore %FragColor2 %complete
OpReturn
OpFunctionEnd