diff --git a/resources/sksl/runtime/ConstPreservation.rts b/resources/sksl/runtime/ConstPreservation.rts index b9b405ceee..dd4277b937 100644 --- a/resources/sksl/runtime/ConstPreservation.rts +++ b/resources/sksl/runtime/ConstPreservation.rts @@ -9,5 +9,5 @@ half2 compute_ba(const half2 rg) { half4 main(float2 xy) { const half g = r + 1; - return half4(r, g, compute_ba(half2(r, g))); + return half4(sqrt(r), g, compute_ba(half2(r, sqrt(g)))); } diff --git a/src/sksl/ir/SkSLConstructorCompound.cpp b/src/sksl/ir/SkSLConstructorCompound.cpp index a983382f53..834c9d3760 100644 --- a/src/sksl/ir/SkSLConstructorCompound.cpp +++ b/src/sksl/ir/SkSLConstructorCompound.cpp @@ -5,6 +5,7 @@ * found in the LICENSE file. */ +#include "src/sksl/SkSLConstantFolder.h" #include "src/sksl/ir/SkSLConstructorCompound.h" #include @@ -71,6 +72,15 @@ std::unique_ptr ConstructorCompound::Make(const Context& context, } args = std::move(flattened); } + + // Replace constant variables with their corresponding values, so `float2(one, two)` can + // compile down to `float2(1.0, 2.0)` (the latter is a compile-time constant). + for (std::unique_ptr& arg : args) { + const Expression* value = ConstantFolder::GetConstantValueForVariable(*arg); + if (value != arg.get()) { + arg = value->clone(); + } + } } return std::make_unique(offset, type, std::move(args)); diff --git a/tests/sksl/runtime/ConstPreservation.stage b/tests/sksl/runtime/ConstPreservation.stage index e47dd5c663..b9665ae359 100644 --- a/tests/sksl/runtime/ConstPreservation.stage +++ b/tests/sksl/runtime/ConstPreservation.stage @@ -6,5 +6,5 @@ half2 compute_ba_0(const half2 rg) half4 main(float2 xy) { const half g = 1.0; - return half4(half4(r_0, g, compute_ba_0(half2(r_0, g)))); + return half4(half4(sqrt(r_0), 1.0, compute_ba_0(half2(0.0, sqrt(g))))); } diff --git a/tests/sksl/shared/NegatedVectorLiteral.asm.frag b/tests/sksl/shared/NegatedVectorLiteral.asm.frag index 5fada99fc0..293f6fb46d 100644 --- a/tests/sksl/shared/NegatedVectorLiteral.asm.frag +++ b/tests/sksl/shared/NegatedVectorLiteral.asm.frag @@ -28,19 +28,19 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision OpDecorate %_UniformBuffer Block OpDecorate %11 Binding 0 OpDecorate %11 DescriptorSet 0 -OpDecorate %92 RelaxedPrecision -OpDecorate %94 RelaxedPrecision -OpDecorate %99 RelaxedPrecision +OpDecorate %91 RelaxedPrecision +OpDecorate %93 RelaxedPrecision +OpDecorate %98 RelaxedPrecision +OpDecorate %100 RelaxedPrecision OpDecorate %101 RelaxedPrecision OpDecorate %102 RelaxedPrecision OpDecorate %103 RelaxedPrecision -OpDecorate %104 RelaxedPrecision +OpDecorate %110 RelaxedPrecision OpDecorate %111 RelaxedPrecision -OpDecorate %112 RelaxedPrecision -OpDecorate %117 RelaxedPrecision -OpDecorate %146 RelaxedPrecision +OpDecorate %116 RelaxedPrecision +OpDecorate %145 RelaxedPrecision +OpDecorate %147 RelaxedPrecision OpDecorate %148 RelaxedPrecision -OpDecorate %149 RelaxedPrecision %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %_ptr_Output_v4float = OpTypePointer Output %v4float @@ -71,14 +71,14 @@ OpDecorate %149 RelaxedPrecision %v2int = OpTypeVector %int 2 %v2bool = OpTypeVector %bool 2 %int_3 = OpConstant %int 3 -%80 = OpTypeFunction %v4float %_ptr_Function_v2float +%79 = OpTypeFunction %v4float %_ptr_Function_v2float %_ptr_Function_float = OpTypePointer Function %float %float_1 = OpConstant %float 1 %float_2 = OpConstant %float 2 %_ptr_Function_v4float = OpTypePointer Function %v4float %v3float = OpTypeVector %float 3 %float_n2 = OpConstant %float -2 -%111 = OpConstantComposite %v2float %float_1 %float_n2 +%110 = OpConstantComposite %v2float %float_1 %float_n2 %false = OpConstantFalse %bool %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %_entrypoint_v = OpFunction %void None %16 @@ -118,103 +118,102 @@ OpStore %47 %46 %57 = OpLoad %int %one %58 = OpLoad %int %two %59 = OpISub %int %57 %58 -%60 = OpLoad %int %two -%61 = OpCompositeConstruct %v2int %59 %60 -%56 = OpSNegate %v2int %61 -%62 = OpIEqual %v2bool %48 %56 -%64 = OpAll %bool %62 -%65 = OpSelect %int %64 %int_1 %int_0 -%66 = OpAccessChain %_ptr_Function_int %result %int_3 -OpStore %66 %65 -%68 = OpLoad %v4int %result -%69 = OpCompositeExtract %int %68 0 -%70 = OpLoad %v4int %result -%71 = OpCompositeExtract %int %70 1 -%72 = OpIMul %int %69 %71 -%73 = OpLoad %v4int %result -%74 = OpCompositeExtract %int %73 2 -%75 = OpIMul %int %72 %74 -%76 = OpLoad %v4int %result -%77 = OpCompositeExtract %int %76 3 -%78 = OpIMul %int %75 %77 -%79 = OpINotEqual %bool %78 %int_0 -OpReturnValue %79 +%60 = OpCompositeConstruct %v2int %59 %int_2 +%56 = OpSNegate %v2int %60 +%61 = OpIEqual %v2bool %48 %56 +%63 = OpAll %bool %61 +%64 = OpSelect %int %63 %int_1 %int_0 +%65 = OpAccessChain %_ptr_Function_int %result %int_3 +OpStore %65 %64 +%67 = OpLoad %v4int %result +%68 = OpCompositeExtract %int %67 0 +%69 = OpLoad %v4int %result +%70 = OpCompositeExtract %int %69 1 +%71 = OpIMul %int %68 %70 +%72 = OpLoad %v4int %result +%73 = OpCompositeExtract %int %72 2 +%74 = OpIMul %int %71 %73 +%75 = OpLoad %v4int %result +%76 = OpCompositeExtract %int %75 3 +%77 = OpIMul %int %74 %76 +%78 = OpINotEqual %bool %77 %int_0 +OpReturnValue %78 OpFunctionEnd -%main = OpFunction %v4float None %80 -%81 = OpFunctionParameter %_ptr_Function_v2float -%82 = OpLabel +%main = OpFunction %v4float None %79 +%80 = OpFunctionParameter %_ptr_Function_v2float +%81 = OpLabel %_0_one = OpVariable %_ptr_Function_float Function %_1_two = OpVariable %_ptr_Function_float Function %_2_result = OpVariable %_ptr_Function_v4float Function -%140 = OpVariable %_ptr_Function_v4float Function +%139 = OpVariable %_ptr_Function_v4float Function OpStore %_0_one %float_1 OpStore %_1_two %float_2 -%90 = OpAccessChain %_ptr_Function_float %_2_result %int_0 +%89 = OpAccessChain %_ptr_Function_float %_2_result %int_0 +OpStore %89 %float_1 +%90 = OpAccessChain %_ptr_Function_float %_2_result %int_1 OpStore %90 %float_1 -%91 = OpAccessChain %_ptr_Function_float %_2_result %int_1 -OpStore %91 %float_1 -%93 = OpLoad %float %_1_two -%94 = OpCompositeConstruct %v4float %93 %93 %93 %93 -%92 = OpFNegate %v4float %94 -%96 = OpLoad %float %_1_two -%95 = OpFNegate %float %96 -%98 = OpLoad %float %_1_two -%97 = OpFNegate %float %98 -%99 = OpCompositeConstruct %v3float %97 %97 %97 -%101 = OpCompositeExtract %float %99 0 -%102 = OpCompositeExtract %float %99 1 -%103 = OpCompositeExtract %float %99 2 -%104 = OpCompositeConstruct %v4float %95 %101 %102 %103 -%105 = OpFOrdEqual %v4bool %92 %104 -%106 = OpAll %bool %105 -%107 = OpSelect %int %106 %int_1 %int_0 -%108 = OpConvertSToF %float %107 -%109 = OpAccessChain %_ptr_Function_float %_2_result %int_2 -OpStore %109 %108 -%113 = OpLoad %float %_0_one -%114 = OpLoad %float %_1_two -%115 = OpFSub %float %113 %114 -%116 = OpLoad %float %_1_two -%117 = OpCompositeConstruct %v2float %115 %116 -%112 = OpFNegate %v2float %117 -%118 = OpFOrdEqual %v2bool %111 %112 -%119 = OpAll %bool %118 -%120 = OpSelect %int %119 %int_1 %int_0 -%121 = OpConvertSToF %float %120 -%122 = OpAccessChain %_ptr_Function_float %_2_result %int_3 -OpStore %122 %121 -%124 = OpLoad %v4float %_2_result -%125 = OpCompositeExtract %float %124 0 -%126 = OpLoad %v4float %_2_result -%127 = OpCompositeExtract %float %126 1 -%128 = OpFMul %float %125 %127 -%129 = OpLoad %v4float %_2_result -%130 = OpCompositeExtract %float %129 2 -%131 = OpFMul %float %128 %130 -%132 = OpLoad %v4float %_2_result -%133 = OpCompositeExtract %float %132 3 -%134 = OpFMul %float %131 %133 -%135 = OpFUnordNotEqual %bool %134 %float_0 -OpSelectionMerge %137 None -OpBranchConditional %135 %136 %137 +%92 = OpLoad %float %_1_two +%93 = OpCompositeConstruct %v4float %92 %92 %92 %92 +%91 = OpFNegate %v4float %93 +%95 = OpLoad %float %_1_two +%94 = OpFNegate %float %95 +%97 = OpLoad %float %_1_two +%96 = OpFNegate %float %97 +%98 = OpCompositeConstruct %v3float %96 %96 %96 +%100 = OpCompositeExtract %float %98 0 +%101 = OpCompositeExtract %float %98 1 +%102 = OpCompositeExtract %float %98 2 +%103 = OpCompositeConstruct %v4float %94 %100 %101 %102 +%104 = OpFOrdEqual %v4bool %91 %103 +%105 = OpAll %bool %104 +%106 = OpSelect %int %105 %int_1 %int_0 +%107 = OpConvertSToF %float %106 +%108 = OpAccessChain %_ptr_Function_float %_2_result %int_2 +OpStore %108 %107 +%112 = OpLoad %float %_0_one +%113 = OpLoad %float %_1_two +%114 = OpFSub %float %112 %113 +%115 = OpLoad %float %_1_two +%116 = OpCompositeConstruct %v2float %114 %115 +%111 = OpFNegate %v2float %116 +%117 = OpFOrdEqual %v2bool %110 %111 +%118 = OpAll %bool %117 +%119 = OpSelect %int %118 %int_1 %int_0 +%120 = OpConvertSToF %float %119 +%121 = OpAccessChain %_ptr_Function_float %_2_result %int_3 +OpStore %121 %120 +%123 = OpLoad %v4float %_2_result +%124 = OpCompositeExtract %float %123 0 +%125 = OpLoad %v4float %_2_result +%126 = OpCompositeExtract %float %125 1 +%127 = OpFMul %float %124 %126 +%128 = OpLoad %v4float %_2_result +%129 = OpCompositeExtract %float %128 2 +%130 = OpFMul %float %127 %129 +%131 = OpLoad %v4float %_2_result +%132 = OpCompositeExtract %float %131 3 +%133 = OpFMul %float %130 %132 +%134 = OpFUnordNotEqual %bool %133 %float_0 +OpSelectionMerge %136 None +OpBranchConditional %134 %135 %136 +%135 = OpLabel +%137 = OpFunctionCall %bool %test_int_b +OpBranch %136 %136 = OpLabel -%138 = OpFunctionCall %bool %test_int_b -OpBranch %137 -%137 = OpLabel -%139 = OpPhi %bool %false %82 %138 %136 -OpSelectionMerge %143 None -OpBranchConditional %139 %141 %142 +%138 = OpPhi %bool %false %81 %137 %135 +OpSelectionMerge %142 None +OpBranchConditional %138 %140 %141 +%140 = OpLabel +%143 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 +%145 = OpLoad %v4float %143 +OpStore %139 %145 +OpBranch %142 %141 = OpLabel -%144 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 -%146 = OpLoad %v4float %144 -OpStore %140 %146 -OpBranch %143 +%146 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 +%147 = OpLoad %v4float %146 +OpStore %139 %147 +OpBranch %142 %142 = OpLabel -%147 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 -%148 = OpLoad %v4float %147 -OpStore %140 %148 -OpBranch %143 -%143 = OpLabel -%149 = OpLoad %v4float %140 -OpReturnValue %149 +%148 = OpLoad %v4float %139 +OpReturnValue %148 OpFunctionEnd diff --git a/tests/sksl/shared/NegatedVectorLiteral.glsl b/tests/sksl/shared/NegatedVectorLiteral.glsl index 7b0c5546d8..a2082f85ee 100644 --- a/tests/sksl/shared/NegatedVectorLiteral.glsl +++ b/tests/sksl/shared/NegatedVectorLiteral.glsl @@ -9,7 +9,7 @@ bool test_int_b() { result.x = 1; result.y = 1; result.z = int(-ivec4(two) == ivec4(-2, ivec3(-2)) ? 1 : 0); - result.w = int(-ivec2(-one, one + one) == -ivec2(one - two, two) ? 1 : 0); + result.w = int(-ivec2(-one, one + one) == -ivec2(one - two, 2) ? 1 : 0); return bool(((result.x * result.y) * result.z) * result.w); } vec4 main() { diff --git a/tests/sksl/shared/NegatedVectorLiteral.metal b/tests/sksl/shared/NegatedVectorLiteral.metal index 977468a09d..622764e816 100644 --- a/tests/sksl/shared/NegatedVectorLiteral.metal +++ b/tests/sksl/shared/NegatedVectorLiteral.metal @@ -18,7 +18,7 @@ bool test_int_b() { result.x = 1; result.y = 1; result.z = int(all(-int4(two) == int4(-2, int3(-2))) ? 1 : 0); - result.w = int(all(-int2(-one, one + one) == -int2(one - two, two)) ? 1 : 0); + result.w = int(all(-int2(-one, one + one) == -int2(one - two, 2)) ? 1 : 0); return bool(((result.x * result.y) * result.z) * result.w); } fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {