Commit 161a76e1 by Nicolas Capens Committed by Nicolas Capens

Compute implicit derivatives relative to first quad pixel.

Previously the derivatives in y were computed using the difference between the second and fourth pixel in the quad. For consistency with the x derivative, use the first and third pixel instead. Also, some shuffling can be eliminated by having the x derivative in the y component, and the y derivative in the z component. Change-Id: I985dcd3c5e2c47c10caf020cf5cb79587b3b3aab Reviewed-on: https://swiftshader-review.googlesource.com/14168Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 6372aceb
...@@ -1421,7 +1421,7 @@ namespace sw ...@@ -1421,7 +1421,7 @@ namespace sw
{ {
Float4 duvdxy; Float4 duvdxy;
if(function != Grad) if(function != Grad) // Implicit
{ {
duvdxy = Float4(uuuu.yz, vvvv.yz) - Float4(uuuu.xx, vvvv.xx); duvdxy = Float4(uuuu.yz, vvvv.yz) - Float4(uuuu.xx, vvvv.xx);
} }
...@@ -1492,15 +1492,15 @@ namespace sw ...@@ -1492,15 +1492,15 @@ namespace sw
{ {
Float4 dudxy, dvdxy, dsdxy; Float4 dudxy, dvdxy, dsdxy;
if(function != Grad) if(function != Grad) // Implicit
{ {
Float4 U = u * M; Float4 U = u * M;
Float4 V = v * M; Float4 V = v * M;
Float4 W = w * M; Float4 W = w * M;
dudxy = U.ywyw - U; dudxy = U - U.xxxx;
dvdxy = V.ywyw - V; dvdxy = V - V.xxxx;
dsdxy = W.ywyw - W; dsdxy = W - W.xxxx;
} }
else else
{ {
...@@ -1508,10 +1508,6 @@ namespace sw ...@@ -1508,10 +1508,6 @@ namespace sw
dvdxy = Float4(dsx.y.xx, dsy.y.xx); dvdxy = Float4(dsx.y.xx, dsy.y.xx);
dsdxy = Float4(dsx.z.xx, dsy.z.xx); dsdxy = Float4(dsx.z.xx, dsy.z.xx);
dudxy = Float4(dudxy.xz, dudxy.xz);
dvdxy = Float4(dvdxy.xz, dvdxy.xz);
dsdxy = Float4(dsdxy.xz, dsdxy.xz);
dudxy *= Float4(M.x); dudxy *= Float4(M.x);
dvdxy *= Float4(M.x); dvdxy *= Float4(M.x);
dsdxy *= Float4(M.x); dsdxy *= Float4(M.x);
...@@ -1529,7 +1525,7 @@ namespace sw ...@@ -1529,7 +1525,7 @@ namespace sw
dudxy += dvdxy; dudxy += dvdxy;
dudxy += dsdxy; dudxy += dsdxy;
lod = Max(Float(dudxy.x), Float(dudxy.y)); // FIXME: Max(dudxy.x, dudxy.y); lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z);
lod = log2sqrt(lod); // log2(sqrt(lod)) lod = log2sqrt(lod); // log2(sqrt(lod))
...@@ -1568,21 +1564,17 @@ namespace sw ...@@ -1568,21 +1564,17 @@ namespace sw
{ {
Float4 dudxy, dvdxy, dsdxy; Float4 dudxy, dvdxy, dsdxy;
if(function != Grad) if(function != Grad) // Implicit
{ {
dudxy = uuuu.ywyw - uuuu; dudxy = uuuu - uuuu.xxxx;
dvdxy = vvvv.ywyw - vvvv; dvdxy = vvvv - vvvv.xxxx;
dsdxy = wwww.ywyw - wwww; dsdxy = wwww - wwww.xxxx;
} }
else else
{ {
dudxy = Float4(dsx.x.xx, dsy.x.xx); dudxy = Float4(dsx.x.xx, dsy.x.xx);
dvdxy = Float4(dsx.y.xx, dsy.y.xx); dvdxy = Float4(dsx.y.xx, dsy.y.xx);
dsdxy = Float4(dsx.z.xx, dsy.z.xx); dsdxy = Float4(dsx.z.xx, dsy.z.xx);
dudxy = Float4(dudxy.xz, dudxy.xz);
dvdxy = Float4(dvdxy.xz, dvdxy.xz);
dsdxy = Float4(dsdxy.xz, dsdxy.xz);
} }
// Scale by texture dimensions and LOD // Scale by texture dimensions and LOD
...@@ -1597,7 +1589,7 @@ namespace sw ...@@ -1597,7 +1589,7 @@ namespace sw
dudxy += dvdxy; dudxy += dvdxy;
dudxy += dsdxy; dudxy += dsdxy;
lod = Max(Float(dudxy.x), Float(dudxy.y)); // FIXME: Max(dudxy.x, dudxy.y); lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z);
lod = log2sqrt(lod); // log2(sqrt(lod)) lod = log2sqrt(lod); // log2(sqrt(lod))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment