9ae6ea0711
The optimization logic for swizzling a constructor assumed that every argument to the constructor was a scalar or vector. When it was written, this assumption was true. However, we recently added support for casting mat2x2 to float4 which violates the assumption. We now check every argument and do not attempt to optimize if a non-scalar, non-vector arg is found. Change-Id: Ia2b297bd62dfdf4af56712164fbc80c29c9611eb Bug: oss-fuzz:36852 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/437017 Auto-Submit: John Stiles <johnstiles@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
75 lines
2.5 KiB
JavaScript
75 lines
2.5 KiB
JavaScript
OpCapability Shader
|
|
%1 = OpExtInstImport "GLSL.std.450"
|
|
OpMemoryModel Logical GLSL450
|
|
OpEntryPoint Fragment %_entrypoint_v "_entrypoint" %sk_FragColor %sk_Clockwise
|
|
OpExecutionMode %_entrypoint_v OriginUpperLeft
|
|
OpName %sk_FragColor "sk_FragColor"
|
|
OpName %sk_Clockwise "sk_Clockwise"
|
|
OpName %_entrypoint_v "_entrypoint_v"
|
|
OpName %main "main"
|
|
OpName %x "x"
|
|
OpName %y "y"
|
|
OpDecorate %sk_FragColor RelaxedPrecision
|
|
OpDecorate %sk_FragColor Location 0
|
|
OpDecorate %sk_FragColor Index 0
|
|
OpDecorate %sk_Clockwise BuiltIn FrontFacing
|
|
OpDecorate %x RelaxedPrecision
|
|
OpDecorate %29 RelaxedPrecision
|
|
OpDecorate %30 RelaxedPrecision
|
|
OpDecorate %31 RelaxedPrecision
|
|
OpDecorate %33 RelaxedPrecision
|
|
OpDecorate %34 RelaxedPrecision
|
|
OpDecorate %35 RelaxedPrecision
|
|
OpDecorate %36 RelaxedPrecision
|
|
OpDecorate %37 RelaxedPrecision
|
|
OpDecorate %38 RelaxedPrecision
|
|
OpDecorate %39 RelaxedPrecision
|
|
%float = OpTypeFloat 32
|
|
%v4float = OpTypeVector %float 4
|
|
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
|
%sk_FragColor = OpVariable %_ptr_Output_v4float Output
|
|
%bool = OpTypeBool
|
|
%_ptr_Input_bool = OpTypePointer Input %bool
|
|
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
|
|
%void = OpTypeVoid
|
|
%12 = OpTypeFunction %void
|
|
%v2float = OpTypeVector %float 2
|
|
%float_0 = OpConstant %float 0
|
|
%16 = OpConstantComposite %v2float %float_0 %float_0
|
|
%_ptr_Function_v2float = OpTypePointer Function %v2float
|
|
%20 = OpTypeFunction %v4float %_ptr_Function_v2float
|
|
%mat2v2float = OpTypeMatrix %v2float 2
|
|
%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
|
|
%float_1 = OpConstant %float 1
|
|
%float_2 = OpConstant %float 2
|
|
%float_3 = OpConstant %float 3
|
|
%_entrypoint_v = OpFunction %void None %12
|
|
%13 = OpLabel
|
|
%17 = OpVariable %_ptr_Function_v2float Function
|
|
OpStore %17 %16
|
|
%19 = OpFunctionCall %v4float %main %17
|
|
OpStore %sk_FragColor %19
|
|
OpReturn
|
|
OpFunctionEnd
|
|
%main = OpFunction %v4float None %20
|
|
%21 = OpFunctionParameter %_ptr_Function_v2float
|
|
%22 = OpLabel
|
|
%x = OpVariable %_ptr_Function_mat2v2float Function
|
|
%y = OpVariable %_ptr_Function_v2float Function
|
|
%29 = OpCompositeConstruct %v2float %float_0 %float_1
|
|
%30 = OpCompositeConstruct %v2float %float_2 %float_3
|
|
%31 = OpCompositeConstruct %mat2v2float %29 %30
|
|
OpStore %x %31
|
|
%33 = OpLoad %mat2v2float %x
|
|
%34 = OpCompositeExtract %float %33 0 0
|
|
%35 = OpCompositeExtract %float %33 0 1
|
|
%36 = OpCompositeExtract %float %33 1 0
|
|
%37 = OpCompositeExtract %float %33 1 1
|
|
%38 = OpCompositeConstruct %v4float %34 %35 %36 %37
|
|
%39 = OpVectorShuffle %v2float %38 %38 0 1
|
|
OpStore %y %39
|
|
%40 = OpLoad %v2float %y
|
|
%41 = OpVectorShuffle %v4float %40 %40 0 1 0 1
|
|
OpReturnValue %41
|
|
OpFunctionEnd
|