diff --git a/src/rewriter.fs b/src/rewriter.fs index 860368ed..310df774 100644 --- a/src/rewriter.fs +++ b/src/rewriter.fs @@ -413,6 +413,27 @@ let private simplifyBlock stmts = Some (ForE (Some e, cond, inc, body)) | (Expr e, While (cond, body)) -> // a=0;while(i<5); -> for(a=0;i<5;); Some (ForE(Some e, Some cond, None, body)) + | (Expr (FunCall(Op "=", [Var d1; e1])), + Expr (FunCall(Op "=", [Var d2; FunCall(Var func, [Var d3; e2])]))) + when d1 = d2 && d1 = d3 -> // d=e1;d=f(d,e2); -> d=f(e1,e2); + // Particularly useful for: d=min(d,f1());d=min(d,f2()); -> d=min(min(d,f1()),f2()); + // conditions to perform the replacement: + // [A] d is a local. if it's not, a function call in e2 (or even f) could modify it + // [B] d3 must be the only use of d in the FunCall to f + // [C] f doesn't take d3 as "out" or "inout". + if not (List.contains func.Name ["min"; "max"]) then // takes care of [C] + None + else + let e2UsesD = false//failwith "TODO: visiter e2 savoir s'il utilise d" // [B] + if e2UsesD then + None + else + let dIsALocal = true//failwith "TODO: savoir si d est une locale, mais pour ça il faut avoir accumulé la liste des decls locales de la fonction en cours" // [A] + if not dIsALocal then + None + else + failwith "les gains sont pas fous en compressé, en fait..." + Some (Expr (FunCall(Op "=", [Var d1; FunCall(Var func, [e1; e2])]))) | _ -> None) // Inline inner decl-less blocks. (Presence of decl could lead to redefinitions.) a();{b();}c(); -> a();b();c(); diff --git a/tests/compression_results.log b/tests/compression_results.log index ed38174a..5d5bb70d 100644 --- a/tests/compression_results.log +++ b/tests/compression_results.log @@ -2,22 +2,22 @@ clod.frag... 8960 => 1545.563 audio-flight-v2.frag 4650 => 902.661 buoy.frag 4242 => 632.431 controllable-machinery.frag 7771 => 1227.917 -ed-209.frag 7932 => 1361.638 +ed-209.frag 7916 => 1363.067 elevated.hlsl 3416 => 603.918 endeavour.frag 2661 => 541.942 from-the-seas-to-the-stars.frag 14367 => 2342.623 frozen-wasteland.frag 4609 => 812.410 -kinder_painter.frag 2905 => 450.888 +kinder_painter.frag 2901 => 450.835 leizex.frag 2327 => 515.566 lunaquatic.frag 5231 => 1055.816 mandelbulb.frag 2419 => 546.857 ohanami.frag 3292 => 736.461 orchard.frag 5647 => 1033.964 oscars_chair.frag 4651 => 986.364 -robin.frag 6343 => 1057.981 +robin.frag 6327 => 1057.611 slisesix.frag 4587 => 937.138 terrarium.frag 3634 => 747.342 -the_real_party_is_in_your_pocket.frag 12243 => 1814.824 +the_real_party_is_in_your_pocket.frag 12187 => 1823.704 valley_ball.glsl 4386 => 888.496 yx_long_way_from_home.frag 3030 => 615.535 -Total: 119303 => 21358.334 +Total: 119211 => 21368.221 diff --git a/tests/real/ed-209.frag.expected b/tests/real/ed-209.frag.expected index dabff1d1..6c67b627 100644 --- a/tests/real/ed-209.frag.expected +++ b/tests/real/ed-209.frag.expected @@ -143,9 +143,7 @@ MarchData gunPod(vec3 p) float bump=sign(sin(pp.z*33.3))*.003,d=sdBox(pp,vec3(.1-bump,.38-bump,.34))-.02; pp=p-vec3(0,0,-.6); pp.x=abs(pp.x)-.1; - d=min(d,sdCappedCylinder(pp,.06,.15)); - d=min(d,sdCappedCylinder(pp+vec3(0,.12,-.05),.06,.05)); - d=min(d,sdBox(p+vec3(0,0,.54),vec3(.1,.06,.04))); + d=min(min(min(d,sdCappedCylinder(pp,.06,.15)),sdCappedCylinder(pp+vec3(0,.12,-.05),.06,.05)),sdBox(p+vec3(0,0,.54),vec3(.1,.06,.04))); if(d.01)" - "z+=mix(.02,pow(max(0.,v(l.xy-vec2(0,.25+pow(abs(l.x),3.)),vec2(.32,.94))-.05)*1e2,1.3)/1500.,1.-x(-.001,i));" - "if(l.z<0.)" - "s=v(s,m(l-vec3(0,0,-.1),vec3(.5,.5,.055))-.04,64.);" + "float a=m(m(f.x-.55,length(f-vec2(0,.8))-1.76,49.),f.y-.95,83.2),z=y.z-.14,s=-y.z-.09-(1.-x(.9,y.y+.3+.1)-x(.55,-(y.y+.3+.17)))*.17,i=m(m(f.x-.48,length(f-vec2(0,2.5))-2.5,117.),f.y-.87,80.);" + "if(y.z>.01)" + "z+=mix(.02,pow(max(0.,v(y.xy-vec2(0,.25+pow(abs(y.x),3.)),vec2(.32,.94))-.05)*1e2,1.3)/1500.,1.-x(-.001,i));" + "if(y.z<0.)" + "s=v(s,m(y-vec3(0,0,-.1),vec3(.5,.5,.055))-.04,64.);" "f.x-=.09;" "f.y+=.635;" "a=m(a,z,192.);" "float r=a,c=.001+v(length(f)-.01,v(length(f-vec2(.036,0))-.01,length(f-vec2(-.036,0))-.01,40.),40.);" - "a=m(a,-l.z-.09,64.);" - "if(l.z<0.)" + "a=m(a,-y.z-.09,64.);" + "if(y.z<0.)" "a=v(a,m(r+.03,s,64.),256.);" "r=1.;" - "a=m(m(a,min(l.z,-c+.003),256.),min(l.z,-abs(i)-.001),448.);" - "a=m(a,min(l.z-.13,-v(l.xy-vec2(0,-.118))),512.);" - "a=m(a,min(l.z-.13,-abs(length(vec2(max(abs(l.x)-.12,0.),l.y+.117))-.035)+.003),512.);" - "a=m(m(a,min(1.,-min(1.,max(m(abs(l.x)-.31,abs(l.y-.49)-.29,5e2),abs(l.z-.185)-.1))+.004),576.),-abs(l.z-.01)-1e-4,384.);" - "if(l.y<0.)" + "a=m(m(a,min(y.z,-c+.003),256.),min(y.z,-abs(i)-.001),448.);" + "a=m(a,min(y.z-.13,-v(y.xy-vec2(0,-.118))),512.);" + "a=m(a,min(y.z-.13,-abs(length(vec2(max(abs(y.x)-.12,0.),y.y+.117))-.035)+.003),512.);" + "a=m(m(a,min(1.,-min(1.,max(m(abs(y.x)-.31,abs(y.y-.49)-.29,5e2),abs(y.z-.185)-.1))+.004),576.),-abs(y.z-.01)-1e-4,384.);" + "if(y.y<0.)" "{" - "if(l.y<-.5)" - "a+=(1.-smoothstep(-.001,.002,m(l+vec3(0,.03,-.2),.13,.007,.001,true)))*.005,a=m(a,-m(l+vec3(0,0,-.2),.13,.007,.001,false),1024.);" + "if(y.y<-.5)" + "a+=(1.-smoothstep(-.001,.002,m(y+vec3(0,.03,-.2),.13,.007,.001,true)))*.005,a=m(a,-m(y+vec3(0,0,-.2),.13,.007,.001,false),1024.);" "vec2 d=vec2(-.32,-.314),p=vec2(.124,.033);" - "float b=length(l.xy-vec2(.405,-.28))-.07,o=length(l.xy-vec2(.202,-.345))-.07,e=v(v(l.xy-d,p)-.005,v(l.xy-d,p.yx)-.005,512.);" - "a=m(a,min(l.z,-b+.004),320.);" - "a=m(a,min(l.z,-o+.004),320.);" - "a=m(a,min(l.z,-min(1.,e)+.006),192.);" - "l.xy-=vec2(.405,-.28);" - "float g=(1.-x(.002,min(min(n(l.xy,vec2(0,-.035),vec2(-.014,.024)),n(l.xy,vec2(-.03,-.035),vec2(-.014,.024))),n(l.xy,vec2(-.02),vec2(-.01,-.02)))-.0025))*.002;" - "l.xy+=vec2(.405,-.28);" - "l.xy-=vec2(.202,-.345);" - "float w=min(min(min(n(l.xy,vec2(-.03,-.035),vec2(-.03,.024)),n(l.xy,vec2(-.03,-.035),vec2(-.018,-.035))),n(l.xy,vec2(-.03,.024),vec2(-.018,.024))),n(l.xy,vec2(-.03,-.0055),vec2(-.018,-.0055)));" - "if(l.x>-.018)" - "w=min(min(w,abs(length(l.xy-vec2(-.018,-.02025))-.01475)),abs(length(l.xy-vec2(-.018,.00925))-.01475));" + "float b=length(y.xy-vec2(.405,-.28))-.07,o=length(y.xy-vec2(.202,-.345))-.07,e=v(v(y.xy-d,p)-.005,v(y.xy-d,p.yx)-.005,512.);" + "a=m(a,min(y.z,-b+.004),320.);" + "a=m(a,min(y.z,-o+.004),320.);" + "a=m(a,min(y.z,-min(1.,e)+.006),192.);" + "y.xy-=vec2(.405,-.28);" + "float g=(1.-x(.002,min(min(n(y.xy,vec2(0,-.035),vec2(-.014,.024)),n(y.xy,vec2(-.03,-.035),vec2(-.014,.024))),n(y.xy,vec2(-.02),vec2(-.01,-.02)))-.0025))*.002;" + "y.xy+=vec2(.405,-.28);" + "y.xy-=vec2(.202,-.345);" + "float w=min(min(min(n(y.xy,vec2(-.03,-.035),vec2(-.03,.024)),n(y.xy,vec2(-.03,-.035),vec2(-.018,-.035))),n(y.xy,vec2(-.03,.024),vec2(-.018,.024))),n(y.xy,vec2(-.03,-.0055),vec2(-.018,-.0055)));" + "if(y.x>-.018)" + "w=min(min(w,abs(length(y.xy-vec2(-.018,-.02025))-.01475)),abs(length(y.xy-vec2(-.018,.00925))-.01475));" "w=(1.-x(.002,w-.0025))*.002;" - "l.xy+=vec2(.202,-.345);" - "float k=max(-l.z,m(abs(l.z)-.17,max(-.015,c),96.)),t=min(max(-l.z,m(abs(l.z)-.17+w,o,128.)),max(-l.z,m(abs(l.z)-.17+g,b,128.)));" - "vec3 h=l;" - "h.z-=pow(length(l.xy-d),2.)/2.-.01;" - "t=m(min(t,max(-l.z,m(abs(h.z)-.18,e,768.))),-(length(h-vec3(d,.19))-.026),512.);" + "y.xy+=vec2(.202,-.345);" + "float k=max(-y.z,m(abs(y.z)-.17,max(-.015,c),96.)),t=min(max(-y.z,m(abs(y.z)-.17+w,o,128.)),max(-y.z,m(abs(y.z)-.17+g,b,128.)));" + "vec3 h=y;" + "h.z-=pow(length(y.xy-d),2.)/2.-.01;" + "t=m(min(t,max(-y.z,m(abs(h.z)-.18,e,768.))),-(length(h-vec3(d,.19))-.026),512.);" "h.xy-=d;" "h.xy=abs(h.xy);" "if(h.x0.)" - "return y=f,i;" + "return a=f,i;" "m=-1.;" "vec2 h=vec2(-1,-3);" - "float r=(h.x-l.y)/v.y,d=(h.y-l.z)/v.z;" - "vec2 c=s((l-vec3(0,h+2.))*vec3(0,.5,.5),v*vec3(0,.5,.5)),p=l.yz+v.yz*c.y-h-2.;" + "float r=(h.x-y.y)/v.y,d=(h.y-y.z)/v.z;" + "vec2 c=s((y-vec3(0,h+2.))*vec3(0,.5,.5),v*vec3(0,.5,.5)),p=y.yz+v.yz*c.y-h-2.;" "if(c.x0.&&p.x<0.&&p.y<0.)" - "y=vec3(-p*.5,0).zxy,m=c.y;" + "a=vec3(-p*.5,0).zxy,m=c.y;" "else" " if(r>0.&&(r0.&&(d5.||abs(w.y)>2.5||abs(w.z)>3.3?" "vec4(-1):" "vec4(m,0,0,0);" @@ -247,49 +238,49 @@ const char *the_real_party_is_in_your_pocket_frag = "{" "return fract(sin(y++)*43758.5453123);" "}" - "vec3 h(vec3 l,vec3 v)" + "vec3 h(vec3 v,vec3 y)" "{" - "vec3 y=vec3(0),f=vec3(1);" - "bool a=false;" + "vec3 a=vec3(0),f=vec3(1);" + "bool l=false;" "for(int i=0;i<4;++i)" "{" - "v=normalize(v);" + "y=normalize(y);" "vec3 z,p,e;" - "vec4 r=s(l,v,z);" + "vec4 r=s(v,y,z);" "float d=r.x;" "if(d<0.)" "{" - "y+=max(f*vec3(.9)*(.5+.5*dot(v,normalize(vec3(-2,4,1))))*.4*1.3*vec3(1,.9,.65)+f*vec3(.9)*step(.9,dot(v,normalize(vec3(6,2,1))))*10.4*2.3+f*vec3(.9)*step(.95,dot(v,normalize(vec3(-2,1,3))))*10.4*1.5,0.)*pow(max(.5+.5*-v.z,0.),.2);" + "a+=max(f*vec3(.9)*(.5+.5*dot(y,normalize(vec3(-2,4,1))))*.4*1.3*vec3(1,.9,.65)+f*vec3(.9)*step(.9,dot(y,normalize(vec3(6,2,1))))*10.4*2.3+f*vec3(.9)*step(.95,dot(y,normalize(vec3(-2,1,3))))*10.4*1.5,0.)*pow(max(.5+.5*-y.z,0.),.2);" "break;" "}" "float c=floor(r.y/8.);" "r.y=mod(r.y,8.);" - "vec3 h=l+v*d;" + "vec3 h=v+y*d;" "vec2 w=vec2(6.28319*m(),m()*2.-1.);" "vec3 k=z+vec3(sqrt(1.-w.y*w.y)*vec2(cos(w.x),sin(w.x)),w.y);" "float t=r.y>1.5?" "mix(h.x>0.?" ".1:" - ".05,.5,pow(1.-clamp(dot(-v,z),0.,1.),2.)):" - "mix(.2,.8,pow(1.-clamp(dot(-v,z),0.,1.),1.5));" + ".05,.5,pow(1.-clamp(dot(-y,z),0.,1.),2.)):" + "mix(.2,.8,pow(1.-clamp(dot(-y,z),0.,1.),1.5));" "if(r.y>5.5&&r.y<6.5)" "{" - "if(a)" + "if(l)" "break;" - "l=h+z*2e-4;" - "f*=mix(.1,.8,pow(1.-clamp(dot(-v,z),0.,1.),3.))*mix(vec3(1),vec3(1,.9,.5),.5);" - "v=reflect(v,z)+(vec3(m(),m(),m())-.5)*.3;" + "v=h+z*2e-4;" + "f*=mix(.1,.8,pow(1.-clamp(dot(-y,z),0.,1.),3.))*mix(vec3(1),vec3(1,.9,.5),.5);" + "y=reflect(y,z)+(vec3(m(),m(),m())-.5)*.3;" "}" "else" " if(r.y>4.5&&r.y<5.5)" "{" - "if(a)" + "if(l)" "break;" "t=.02;" "if(m()>t)" - "l=h-z*2e-4*-sign(v.z),v+=(vec3(m(),m(),m())-.5)*.1;" + "v=h-z*2e-4*-sign(y.z),y+=(vec3(m(),m(),m())-.5)*.1;" "else" - " l=h+z*2e-4,v=reflect(v,z)+(vec3(m(),m(),m())-.5)*.3;" + " v=h+z*2e-4,y=reflect(y,z)+(vec3(m(),m(),m())-.5)*.3;" "}" "else" " if(r.y<.5||r.y>2.5)" @@ -300,34 +291,29 @@ const char *the_real_party_is_in_your_pocket_frag = "if(r.y>3.5)" "{" "b=vec3(.008);" - "if(!a)" + "if(!l)" "{" "if(h.y>.5)" "{" "vec2 o=r.zw-vec2(-.38,.6);" "float g=min(min(min(min(min(min(max(length(o-vec2(.005))-.0125,-(length(o-vec2(-.012,.005))-.025)),max(length(o-vec2(-.02,.005))-.0125,-(length(o-vec2(-.045,.005))-.03))),max(length(o-vec2(.005))-.0125,-(length(o-vec2(-.012,.005))-.025))),max(length(o-vec2(.03,.005))-.0125,-(length(o-vec2(.02,.005))-.02))),abs(length(o-vec2(-.037,-.0398))-.0104)),n(o,vec2(-.064,-.05),vec2(-.064,-.03))),max(-o.x-.063,abs(length(vec2(max(0.,o.x+.06),o.y+.035))-.006)));" "o.x-=.091;" - "g=min(g,n(o,vec2(-.064,-.05),vec2(-.064,-.03)));" - "g=min(g,max(-o.x-.063,abs(length(vec2(max(0.,o.x+.06),o.y+.035))-.006)));" - "g=min(g,n(o,vec2(-.054,-.05),vec2(-.059,-.041)));" + "g=min(min(min(g,n(o,vec2(-.064,-.05),vec2(-.064,-.03))),max(-o.x-.063,abs(length(vec2(max(0.,o.x+.06),o.y+.035))-.006))),n(o,vec2(-.054,-.05),vec2(-.059,-.041)));" "o.x+=.091;" - "g=min(g,n(o,vec2(.009,-.05),vec2(.009,-.03)));" - "g=min(g,n(o,vec2(.009,-.05),vec2(.018,-.05)));" - "g=min(g,n(o,vec2(.009,-.03),vec2(.018,-.03)));" - "g=min(g,n(o,vec2(.009,-.039),vec2(.018,-.039)));" + "g=min(min(min(min(g,n(o,vec2(.009,-.05),vec2(.009,-.03))),n(o,vec2(.009,-.05),vec2(.018,-.05))),n(o,vec2(.009,-.03),vec2(.018,-.03))),n(o,vec2(.009,-.039),vec2(.018,-.039)));" "o.x=abs(o.x+.01);" "o.x=abs(o.x-.006);" "g=min(g,n(o,vec2(0,-.05),vec2(.006,-.03)));" "b=mix(b,vec3(.3),step(g-.0018,0.));" "}" "if(length(r.zw-vec2(-.43,.605))<.014)" - "y+=f*3.*vec3(1,.01,.01)*(.8+8.*(1.-x(.01,length(r.zw-vec2(-.43,.605)))));" + "a+=f*3.*vec3(1,.01,.01)*(.8+8.*(1.-x(.01,length(r.zw-vec2(-.43,.605)))));" "if(r.w>0.&&h.y<.2)" "{" "b=mix(b,vec3(.3),step(n(r.zw-vec2(0,.103)),0.));" "{" - "vec2 g=vec2(-.07,.02),o=vec2(-.09,.03),C=vec2(-.1,0),D=C+normalize(C-o)*.03,B=vec2(-.065,-.026);" - "b=mix(b,vec3(.520661,.00153787,.064975),step(min(m(r.zw-vec2(.16,.103),C,D,B),m(r.zw-vec2(.16,.103),g,o,C))-.007,0.));" + "vec2 o=vec2(-.07,.02),g=vec2(-.09,.03),C=vec2(-.1,0),D=C+normalize(C-g)*.03,B=vec2(-.065,-.026);" + "b=mix(b,vec3(.520661,.00153787,.064975),step(min(m(r.zw-vec2(.16,.103),C,D,B),m(r.zw-vec2(.16,.103),o,g,C))-.007,0.));" "}" "{" "vec2 o=r.zw-vec2(.16,.103);" @@ -364,7 +350,7 @@ const char *the_real_party_is_in_your_pocket_frag = "D=mix(D,vec3(1),step(A,0.));" "D*=vec3(1,1,.8);" "D*=smoothstep(.1,.2,C.x)*smoothstep(.1,.2,C.y);" - "y+=f*3.*D;" + "a+=f*3.*D;" "b=vec3(.1);" "}" "}" @@ -373,9 +359,9 @@ const char *the_real_party_is_in_your_pocket_frag = "if(r.y>3.&&r.y<3.2)" "b=vec3(.4);" "f*=b;" - "l=h+z*2e-4;" - "v=k;" - "a=true;" + "v=h+z*2e-4;" + "y=k;" + "l=true;" "}" "else" "{" @@ -389,40 +375,40 @@ const char *the_real_party_is_in_your_pocket_frag = "if(r.y>1.5)" "o=vec3(.02);" "f*=o;" - "l=h+z*2e-4;" - "v=k;" - "a=true;" + "v=h+z*2e-4;" + "y=k;" + "l=true;" "}" "else" "{" - "if(a)" + "if(l)" "break;" "f*=r.y>1.5?" "vec3(.5):" ".9*mix(o,vec3(1),.25);" - "l=h+z*2e-4;" - "v=reflect(v,z)+(vec3(m(),m(),m())-.5)*.4;" + "v=h+z*2e-4;" + "y=reflect(y,z)+(vec3(m(),m(),m())-.5)*.4;" "}" "}" "if(max(f.x,max(f.y,f.z))<.001)" "break;" "}" - "return y;" + "return a;" "}" "void main()" "{" - "vec3 l=vec3(0);" - "for(int v=0;v<16;++v)" + "vec3 v=vec3(0);" + "for(int x=0;x<16;++x)" "{" - "y=float(v)+gl_TexCoord[0].x*16.;" - "float a=m()*6.28319;" - "vec2 o=vec2(cos(a),sin(a))*sqrt(1.-sqrt(1.-m()))*1.2;" + "y=float(x)+gl_TexCoord[0].x*16.;" + "float l=m()*6.28319;" + "vec2 a=vec2(cos(l),sin(l))*sqrt(1.-sqrt(1.-m()))*1.2;" "if(int(y)%4==0)" - "o*=15.*length(o);" - "l+=h(vec3(0,0,4.8),vec3((gl_FragCoord.xy-vec2(960,540)+o)/540.,-3.5))/48.;" + "a*=15.*length(a);" + "v+=h(vec3(0,0,4.8),vec3((gl_FragCoord.xy-vec2(960,540)+a)/540.,-3.5))/48.;" "}" - "l/=(l+1.)/2.;" - "gl_FragColor.xyz=pow(l+.01*vec3(1,1,.5),vec3(1./2.2))+m()/1e2;" + "v/=(v+1.)/2.;" + "gl_FragColor.xyz=pow(v+.01*vec3(1,1,.5),vec3(1./2.2))+m()/1e2;" "}"; #endif // THE_REAL_PARTY_IS_IN_YOUR_POCKET_FRAG_EXPECTED_