Custom shader renders only one quarter of the screen on Android

I use my custom toon shader for everything on the scene. But on an actual phone (quite old) it renders only one quarter of the screen. The chip is Adreno 506.
Picture 1 is the screenshot from the editor, picture 2 is the screenshot from my phone.

The masking here is not straight, because it cut off triangles, not pixels.
What’s going on? I’m totally clueless.

Shader code:

Shader "Unlit/ColoredTexture"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _Color("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "LightMode" = "ForwardBase" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            #pragma multi_compile_instancing
            #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"
            #include "AutoLight.cginc"
            #pragma target 3.0

            struct appdata
            {
                half4 vertex : POSITION;
                half2 uv : TEXCOORD0;
                half3 normal : NORMAL;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                half2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                SHADOW_COORDS(2)
                half3 worldNormal: TEXCOORD3;
                half4 vertex : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            sampler2D _MainTex;
            half4 _MainTex_ST;
            UNITY_INSTANCING_BUFFER_START(Props)
            UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
            UNITY_INSTANCING_BUFFER_END(Props)

            v2f vert (appdata v)
            {
                v2f o;

                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                o.worldNormal = UnityObjectToWorldNormal(v.normal);

                TRANSFER_SHADOW(o)
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                half NdotL = clamp(dot(i.worldNormal, _WorldSpaceLightPos0.xyz) * 25 * SHADOW_ATTENUATION(i), 0.5, 1);
                fixed4 col = tex2D(_MainTex, i.uv) * UNITY_ACCESS_INSTANCED_PROP(Props, _Color) * NdotL;
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
            Fallback "VertexLit"
}

EDIT: actually, I’m using two custom shaders - the second one doesn’t have a self-shadow part in frag, because it looks weird on cubes (but looks cool on spheres). It only receives shadows. One line difference. However, when playing on a high-end Samsung, the shader I showed you (with self-shadows) doesn’t render at all, as if it was completely transparent. But its simplified version with no self-shadows appears fine.
Maybe it is somehow related to shader instruction count?..

Anyone?

i have the same problem but with text