OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa
_intel.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa
_intel.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "gpu/command_buffer/service/framebuffer_manager.h" | 8 #include "gpu/command_buffer/service/framebuffer_manager.h" |
9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
10 #include "ui/gl/gl_context.h" | 10 #include "ui/gl/gl_context.h" |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 outVal.x = D3DX_FLOAT_to_SRGB(val.x); | 798 outVal.x = D3DX_FLOAT_to_SRGB(val.x); |
799 outVal.y = D3DX_FLOAT_to_SRGB(val.y); | 799 outVal.y = D3DX_FLOAT_to_SRGB(val.y); |
800 outVal.z = D3DX_FLOAT_to_SRGB(val.z); | 800 outVal.z = D3DX_FLOAT_to_SRGB(val.z); |
801 return outVal; | 801 return outVal; |
802 } | 802 } |
803 /////////////////////////////////////////////////////////////////////// | 803 /////////////////////////////////////////////////////////////////////// |
804 \n#endif\n // IN_GAMMA_CORRECT_MODE | 804 \n#endif\n // IN_GAMMA_CORRECT_MODE |
805 | 805 |
806 // how .rgba channels from the edge texture maps to pixel edges: | 806 // how .rgba channels from the edge texture maps to pixel edges: |
807 // | 807 // |
808 // A - 0x08 | 808 // A - 0x02 |
809 // |¯¯¯¯¯¯¯¯¯| | 809 // |¯¯¯¯¯¯¯¯¯| |
810 // | | | 810 // | | |
811 // 0x04 - B | pixel | R - 0x01 | 811 // 0x04 - B | pixel | R - 0x01 |
812 // | | | 812 // | | |
813 // |_________| | 813 // |_________| |
814 // G - 0x02 | 814 // G - 0x08 |
815 // | 815 // |
816 // (A - there's an edge between us and a pixel above us) | 816 // (A - there's an edge between us and a pixel at the bottom) |
817 // (R - there's an edge between us and a pixel to the right) | 817 // (R - there's an edge between us and a pixel to the right) |
818 // (G - there's an edge between us and a pixel at the bottom) | 818 // (G - there's an edge between us and a pixel above us) |
819 // (B - there's an edge between us and a pixel to the left) | 819 // (B - there's an edge between us and a pixel to the left) |
820 | 820 |
821 // Expecting values of 1 and 0 only! | 821 // Expecting values of 1 and 0 only! |
822 uint PackEdge(uvec4 edges) { | 822 uint PackEdge(uvec4 edges) { |
823 return (edges.x << 0u) | (edges.y << 1u) | (edges.z << 2u) | | 823 return (edges.x << 0u) | (edges.y << 1u) | (edges.z << 2u) | |
824 (edges.w << 3u); | 824 (edges.w << 3u); |
825 } | 825 } |
826 | 826 |
827 uvec4 UnpackEdge(uint value) { | 827 uvec4 UnpackEdge(uint value) { |
828 uvec4 ret; | 828 uvec4 ret; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 const bool horizontal, | 909 const bool horizontal, |
910 const bool invertedZShape, | 910 const bool invertedZShape, |
911 const ivec2 stepRight) { | 911 const ivec2 stepRight) { |
912 // TODO: there must be a cleaner and faster way to get to these - | 912 // TODO: there must be a cleaner and faster way to get to these - |
913 // a precalculated array indexing maybe? | 913 // a precalculated array indexing maybe? |
914 uint maskLeft = uint(0); | 914 uint maskLeft = uint(0); |
915 uint bitsContinueLeft = uint(0); | 915 uint bitsContinueLeft = uint(0); |
916 uint maskRight = uint(0); | 916 uint maskRight = uint(0); |
917 uint bitsContinueRight = uint(0); | 917 uint bitsContinueRight = uint(0); |
918 { | 918 { |
919 // Horizontal (vertical is the same, just rotated 90º | 919 // Horizontal (vertical is the same, just rotated 90º counter-clockwise) |
920 // counter-clockwise) | |
921 // Inverted Z case: // Normal Z case: | 920 // Inverted Z case: // Normal Z case: |
922 // __ // __ | 921 // __ // __ |
923 // X| // X| | 922 // X| // X| |
924 // -- // -- | 923 // -- // -- |
925 // | 924 // |
| 925 // Vertical |
| 926 // Inverted Z case: // Normal Z case: |
| 927 // | // | |
| 928 // -- // -- |
| 929 // X| // |X |
926 uint maskTraceLeft = uint(0); | 930 uint maskTraceLeft = uint(0); |
927 uint maskTraceRight = uint(0); | 931 uint maskTraceRight = uint(0); |
928 uint maskStopLeft = uint(0); | 932 uint maskStopLeft = uint(0); |
929 uint maskStopRight = uint(0); | 933 uint maskStopRight = uint(0); |
930 if (horizontal) { | 934 if (horizontal) { |
931 if (invertedZShape) { | 935 if (invertedZShape) { |
932 maskTraceLeft = 0x02u; // tracing bottom edge | 936 maskTraceLeft = 0x08u; // tracing bottom edge |
933 maskTraceRight = 0x08u; // tracing top edge | 937 maskTraceRight = 0x02u; // tracing top edge |
934 } else { | 938 } else { |
935 maskTraceLeft = 0x08u; // tracing top edge | 939 maskTraceLeft = 0x02u; // tracing top edge |
936 maskTraceRight = 0x02u; // tracing bottom edge | 940 maskTraceRight = 0x08u; // tracing bottom edge |
937 } | 941 } |
938 maskStopLeft = 0x01u; // stop on right edge | 942 maskStopLeft = 0x01u; // stop on right edge |
939 maskStopRight = 0x04u; // stop on left edge | 943 maskStopRight = 0x04u; // stop on left edge |
940 } else { | 944 } else { |
941 if (invertedZShape) { | 945 if (invertedZShape) { |
942 maskTraceLeft = 0x01u; // tracing right edge | 946 maskTraceLeft = 0x01u; // tracing right edge |
943 maskTraceRight = 0x04u; // tracing left edge | 947 maskTraceRight = 0x04u; // tracing left edge |
944 } else { | 948 } else { |
945 maskTraceLeft = 0x04u; // tracing left edge | 949 maskTraceLeft = 0x04u; // tracing left edge |
946 maskTraceRight = 0x01u; // tracing right edge | 950 maskTraceRight = 0x01u; // tracing right edge |
947 } | 951 } |
948 maskStopLeft = 0x08u; // stop on top edge | 952 maskStopLeft = 0x02u; // stop on top edge |
949 maskStopRight = 0x02u; // stop on bottom edge | 953 maskStopRight = 0x08u; // stop on bottom edge |
950 } | 954 } |
951 | 955 |
952 maskLeft = maskTraceLeft | maskStopLeft; | 956 maskLeft = maskTraceLeft | maskStopLeft; |
953 bitsContinueLeft = maskTraceLeft; | 957 bitsContinueLeft = maskTraceLeft; |
954 maskRight = maskTraceRight | maskStopRight; | 958 maskRight = maskTraceRight | maskStopRight; |
955 bitsContinueRight = maskTraceRight; | 959 bitsContinueRight = maskTraceRight; |
956 } | 960 } |
957 /////////////////////////////////////////////////////////////////////// | 961 /////////////////////////////////////////////////////////////////////// |
958 | 962 |
959 \n#ifdef SETTINGS_ALLOW_SHORT_Zs\n | 963 \n#ifdef SETTINGS_ALLOW_SHORT_Zs\n |
(...skipping 23 matching lines...) Expand all Loading... |
983 } | 987 } |
984 lineLengthLeft = lineLengthRight = i; | 988 lineLengthLeft = lineLengthRight = i; |
985 return; | 989 return; |
986 } | 990 } |
987 | 991 |
988 void ProcessDetectedZ(ivec2 screenPos, bool horizontal, | 992 void ProcessDetectedZ(ivec2 screenPos, bool horizontal, |
989 bool invertedZShape) { | 993 bool invertedZShape) { |
990 int lineLengthLeft = 0; | 994 int lineLengthLeft = 0; |
991 int lineLengthRight = 0; | 995 int lineLengthRight = 0; |
992 | 996 |
993 ivec2 stepRight = (horizontal) ? (ivec2(1, 0)) : (ivec2(0, -1)); | 997 ivec2 stepRight = (horizontal) ? (ivec2(1, 0)) : (ivec2(0, 1)); |
994 vec2 blendDir = (horizontal) ? (vec2(0, -1)) : (vec2(-1, 0)); | 998 vec2 blendDir = (horizontal) ? (vec2(0, -1)) : (vec2(1, 0)); |
995 | 999 |
996 FindLineLength(lineLengthLeft, lineLengthRight, screenPos, | 1000 FindLineLength(lineLengthLeft, lineLengthRight, screenPos, |
997 horizontal, invertedZShape, stepRight); | 1001 horizontal, invertedZShape, stepRight); |
998 | 1002 |
999 vec2 pixelSize = g_OneOverScreenSize; | 1003 vec2 pixelSize = g_OneOverScreenSize; |
1000 | 1004 |
1001 float leftOdd = 0.15 * float(lineLengthLeft % 2); | 1005 float leftOdd = 0.15 * float(lineLengthLeft % 2); |
1002 float rightOdd = 0.15 * float(lineLengthRight % 2); | 1006 float rightOdd = 0.15 * float(lineLengthRight % 2); |
1003 | 1007 |
1004 int loopFrom = -int((lineLengthLeft + 1) / 2) + 1; | 1008 int loopFrom = -int((lineLengthLeft + 1) / 2) + 1; |
1005 int loopTo = int((lineLengthRight + 1) / 2); | 1009 int loopTo = int((lineLengthRight + 1) / 2); |
1006 | 1010 |
1007 float totalLength = float(loopTo - loopFrom) + 1.0 - leftOdd - | 1011 float totalLength = float(loopTo - loopFrom) + 1.0 - leftOdd - |
1008 rightOdd; | 1012 rightOdd; |
1009 | 1013 |
1010 for (int i = loopFrom; i <= loopTo; i++) { | 1014 for (int i = loopFrom; i <= loopTo; i++) { |
1011 highp ivec2 pixelPos = screenPos + stepRight * i; | 1015 highp ivec2 pixelPos = screenPos + stepRight * i; |
1012 vec2 pixelPosFlt = vec2(float(pixelPos.x) + 0.5, | 1016 vec2 pixelPosFlt = vec2(float(pixelPos.x) + 0.5, |
1013 float(pixelPos.y) + 0.5); | 1017 float(pixelPos.y) + 0.5); |
1014 | 1018 |
1015 \n#ifdef DEBUG_OUTPUT_AAINFO\n | 1019 \n#ifdef DEBUG_OUTPUT_AAINFO\n |
1016 imageStore(g_resultTextureSlot2, pixelPos, | 1020 imageStore(g_resultTextureSlot2, pixelPos, |
1017 PackBlurAAInfo(pixelPos, 1u)); | 1021 PackBlurAAInfo(pixelPos, 1u)); |
1018 \n#endif\n | 1022 \n#endif\n |
1019 | 1023 |
1020 float m = (float(i) + 0.5 - leftOdd - float(loopFrom)) / | 1024 float m = (float(i) + 0.5 - leftOdd - float(loopFrom)) / |
1021 totalLength; | 1025 totalLength; |
1022 m = saturate(m); | 1026 m = saturate(m); |
1023 float k = m - ((i > 0) ? 1.0 : 0.0); | 1027 float k = m - ((i > 0) ? 1.0 : 0.0); |
1024 k = (invertedZShape) ? (-k) : (k); | 1028 k = (invertedZShape) ? (k) : (-k); |
1025 | 1029 |
1026 vec4 color = textureLod(g_screenTexture, | 1030 vec4 color = textureLod(g_screenTexture, |
1027 (pixelPosFlt + blendDir * k) * pixelSize, | 1031 (pixelPosFlt + blendDir * k) * pixelSize, |
1028 0.0); | 1032 0.0); |
1029 | 1033 |
1030 \n#ifdef IN_GAMMA_CORRECT_MODE\n | 1034 \n#ifdef IN_GAMMA_CORRECT_MODE\n |
1031 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); | 1035 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); |
1032 \n#endif\n | 1036 \n#endif\n |
1033 imageStore(g_resultTextureFlt4Slot1, pixelPos, color); | 1037 imageStore(g_resultTextureFlt4Slot1, pixelPos, color); |
1034 } | 1038 } |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1475 uint packedEdgesC = packedEdgesArray[(1 + _x) * 4 + (1 + _y)]; | 1479 uint packedEdgesC = packedEdgesArray[(1 + _x) * 4 + (1 + _y)]; |
1476 | 1480 |
1477 uvec4 edges = UnpackEdge(packedEdgesC); | 1481 uvec4 edges = UnpackEdge(packedEdgesC); |
1478 vec4 edgesFlt = vec4(edges); | 1482 vec4 edgesFlt = vec4(edges); |
1479 | 1483 |
1480 float numberOfEdges = dot(edgesFlt, vec4(1, 1, 1, 1)); | 1484 float numberOfEdges = dot(edgesFlt, vec4(1, 1, 1, 1)); |
1481 if (numberOfEdges < 2.0) | 1485 if (numberOfEdges < 2.0) |
1482 continue; | 1486 continue; |
1483 | 1487 |
1484 float fromRight = edgesFlt.r; | 1488 float fromRight = edgesFlt.r; |
1485 float fromBelow = edgesFlt.g; | 1489 float fromAbove = edgesFlt.g; |
1486 float fromLeft = edgesFlt.b; | 1490 float fromLeft = edgesFlt.b; |
1487 float fromAbove = edgesFlt.a; | 1491 float fromBelow = edgesFlt.a; |
1488 | 1492 |
1489 vec4 xFroms = vec4(fromBelow, fromAbove, fromRight, fromLeft); | 1493 vec4 xFroms = vec4(fromBelow, fromAbove, fromRight, fromLeft); |
1490 | 1494 |
1491 float blurCoeff = 0.0; | 1495 float blurCoeff = 0.0; |
1492 | 1496 |
1493 // These are additional blurs that complement the main line-based | 1497 // These are additional blurs that complement the main line-based |
1494 // blurring; Unlike line-based, these do not necessarily preserve | 1498 // blurring; Unlike line-based, these do not necessarily preserve |
1495 // the total amount of screen colour as they will take | 1499 // the total amount of screen colour as they will take |
1496 // neighbouring pixel colours and apply them to the one currently | 1500 // neighbouring pixel colours and apply them to the one currently |
1497 // processed. | 1501 // processed. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1560 float allWeightSum = centerWeight + fourWeightSum; | 1564 float allWeightSum = centerWeight + fourWeightSum; |
1561 | 1565 |
1562 vec4 color = vec4(0, 0, 0, 0); | 1566 vec4 color = vec4(0, 0, 0, 0); |
1563 if (fromLeftWeight > 0.0) { | 1567 if (fromLeftWeight > 0.0) { |
1564 vec3 pixelL = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, | 1568 vec3 pixelL = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, |
1565 ivec2(-1, 0)).rgb; | 1569 ivec2(-1, 0)).rgb; |
1566 color.rgb += fromLeftWeight * pixelL; | 1570 color.rgb += fromLeftWeight * pixelL; |
1567 } | 1571 } |
1568 if (fromAboveWeight > 0.0) { | 1572 if (fromAboveWeight > 0.0) { |
1569 vec3 pixelT = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, | 1573 vec3 pixelT = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, |
1570 ivec2(0, -1)).rgb; | 1574 ivec2(0, 1)).rgb; |
1571 color.rgb += fromAboveWeight * pixelT; | 1575 color.rgb += fromAboveWeight * pixelT; |
1572 } | 1576 } |
1573 if (fromRightWeight > 0.0) { | 1577 if (fromRightWeight > 0.0) { |
1574 vec3 pixelR = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, | 1578 vec3 pixelR = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, |
1575 ivec2(1, 0)).rgb; | 1579 ivec2(1, 0)).rgb; |
1576 color.rgb += fromRightWeight * pixelR; | 1580 color.rgb += fromRightWeight * pixelR; |
1577 } | 1581 } |
1578 if (fromBelowWeight > 0.0) { | 1582 if (fromBelowWeight > 0.0) { |
1579 vec3 pixelB = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, | 1583 vec3 pixelB = texelFetchOffset(g_screenTexture, screenPosI.xy, 0, |
1580 ivec2(0, 1)).rgb; | 1584 ivec2(0, -1)).rgb; |
1581 color.rgb += fromBelowWeight * pixelB; | 1585 color.rgb += fromBelowWeight * pixelB; |
1582 } | 1586 } |
1583 | 1587 |
1584 color /= fourWeightSum + 0.0001; | 1588 color /= fourWeightSum + 0.0001; |
1585 color.a = 1.0 - centerWeight / allWeightSum; | 1589 color.a = 1.0 - centerWeight / allWeightSum; |
1586 | 1590 |
1587 color.rgb = mix(pixelC.rgb, color.rgb, color.a).rgb; | 1591 color.rgb = mix(pixelC.rgb, color.rgb, color.a).rgb; |
1588 \n#ifdef IN_GAMMA_CORRECT_MODE\n | 1592 \n#ifdef IN_GAMMA_CORRECT_MODE\n |
1589 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); | 1593 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); |
1590 \n#endif\n | 1594 \n#endif\n |
1591 | 1595 |
1592 \n#ifdef DEBUG_OUTPUT_AAINFO\n | 1596 \n#ifdef DEBUG_OUTPUT_AAINFO\n |
1593 imageStore(g_resultTextureSlot2, screenPosI.xy, | 1597 imageStore(g_resultTextureSlot2, screenPosI.xy, |
1594 PackBlurAAInfo(screenPosI.xy, uint(numberOfEdges))); | 1598 PackBlurAAInfo(screenPosI.xy, uint(numberOfEdges))); |
1595 \n#endif\n | 1599 \n#endif\n |
1596 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy, | 1600 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy, |
1597 vec4(color.rgb, pixelC.a)); | 1601 vec4(color.rgb, pixelC.a)); |
1598 | 1602 |
1599 if (numberOfEdges == 2.0) { | 1603 if (numberOfEdges == 2.0) { |
1600 uint packedEdgesL = packedEdgesArray[(0 + _x) * 4 + (1 + _y)]; | 1604 uint packedEdgesL = packedEdgesArray[(0 + _x) * 4 + (1 + _y)]; |
1601 uint packedEdgesT = packedEdgesArray[(1 + _x) * 4 + (0 + _y)]; | 1605 uint packedEdgesB = packedEdgesArray[(1 + _x) * 4 + (0 + _y)]; |
1602 uint packedEdgesR = packedEdgesArray[(2 + _x) * 4 + (1 + _y)]; | 1606 uint packedEdgesR = packedEdgesArray[(2 + _x) * 4 + (1 + _y)]; |
1603 uint packedEdgesB = packedEdgesArray[(1 + _x) * 4 + (2 + _y)]; | 1607 uint packedEdgesT = packedEdgesArray[(1 + _x) * 4 + (2 + _y)]; |
1604 | 1608 |
1605 bool isHorizontalA = ((packedEdgesC) == (0x01u | 0x02u)) && | 1609 bool isHorizontalA = ((packedEdgesC) == (0x01u | 0x02u)) && |
1606 ((packedEdgesR & (0x01u | 0x08u)) == (0x08u)); | 1610 ((packedEdgesR & 0x08u) == 0x08u); |
1607 bool isHorizontalB = ((packedEdgesC) == (0x01u | 0x08u)) && | 1611 bool isHorizontalB = ((packedEdgesC) == (0x01u | 0x08u)) && |
1608 ((packedEdgesR & (0x01u | 0x02u)) == (0x02u)); | 1612 ((packedEdgesR & 0x02u) == 0x02u); |
1609 | 1613 |
1610 bool isHCandidate = isHorizontalA || isHorizontalB; | 1614 bool isHCandidate = isHorizontalA || isHorizontalB; |
1611 | 1615 |
1612 bool isVerticalA = ((packedEdgesC) == (0x08u | 0x01u)) && | 1616 bool isVerticalA = ((packedEdgesC) == (0x02u | 0x04u)) && |
1613 ((packedEdgesT & (0x08u | 0x04u)) == (0x04u)); | 1617 ((packedEdgesT & 0x01u) == 0x01u); |
1614 bool isVerticalB = ((packedEdgesC) == (0x08u | 0x04u)) && | 1618 bool isVerticalB = ((packedEdgesC) == (0x01u | 0x02u)) && |
1615 ((packedEdgesT & (0x08u | 0x01u)) == (0x01u)); | 1619 ((packedEdgesT & 0x04u) == 0x04u); |
1616 bool isVCandidate = isVerticalA || isVerticalB; | 1620 bool isVCandidate = isVerticalA || isVerticalB; |
1617 | 1621 |
1618 bool isCandidate = isHCandidate || isVCandidate; | 1622 bool isCandidate = isHCandidate || isVCandidate; |
1619 | 1623 |
1620 if (!isCandidate) | 1624 if (!isCandidate) |
1621 continue; | 1625 continue; |
1622 | 1626 |
1623 bool horizontal = isHCandidate; | 1627 bool horizontal = isHCandidate; |
1624 | 1628 |
1625 // what if both are candidates? do additional pruning (still not | 1629 // what if both are candidates? do additional pruning (still not |
1626 // 100% but gets rid of worst case errors) | 1630 // 100% but gets rid of worst case errors) |
1627 if (isHCandidate && isVCandidate) | 1631 if (isHCandidate && isVCandidate) |
1628 horizontal = | 1632 horizontal = |
1629 (isHorizontalA && ((packedEdgesL & 0x02u) == 0x02u)) || | 1633 (isHorizontalA && ((packedEdgesL & 0x02u) == 0x02u)) || |
1630 (isHorizontalB && ((packedEdgesL & 0x08u) == 0x08u)); | 1634 (isHorizontalB && ((packedEdgesL & 0x08u) == 0x08u)); |
1631 | 1635 |
1632 ivec2 offsetC; | 1636 ivec2 offsetC; |
1633 uint packedEdgesM1P0; | 1637 uint packedEdgesM1P0; |
1634 uint packedEdgesP1P0; | 1638 uint packedEdgesP1P0; |
1635 if (horizontal) { | 1639 if (horizontal) { |
1636 packedEdgesM1P0 = packedEdgesL; | 1640 packedEdgesM1P0 = packedEdgesL; |
1637 packedEdgesP1P0 = packedEdgesR; | 1641 packedEdgesP1P0 = packedEdgesR; |
1638 offsetC = ivec2(2, 0); | 1642 offsetC = ivec2(2, 0); |
1639 } else { | 1643 } else { |
1640 packedEdgesM1P0 = packedEdgesB; | 1644 packedEdgesM1P0 = packedEdgesB; |
1641 packedEdgesP1P0 = packedEdgesT; | 1645 packedEdgesP1P0 = packedEdgesT; |
1642 offsetC = ivec2(0, -2); | 1646 offsetC = ivec2(0, 2); |
1643 } | 1647 } |
1644 | 1648 |
1645 uvec4 edgesM1P0 = UnpackEdge(packedEdgesM1P0); | 1649 uvec4 edgesM1P0 = UnpackEdge(packedEdgesM1P0); |
1646 uvec4 edgesP1P0 = UnpackEdge(packedEdgesP1P0); | 1650 uvec4 edgesP1P0 = UnpackEdge(packedEdgesP1P0); |
1647 uvec4 edgesP2P0 = UnpackEdge(uint(texelFetch( | 1651 uvec4 edgesP2P0 = UnpackEdge(uint(texelFetch( |
1648 g_src0TextureFlt, screenPosI.xy + offsetC, 0).r * 255.5)); | 1652 g_src0TextureFlt, screenPosI.xy + offsetC, 0).r * 255.5)); |
1649 | 1653 |
1650 uvec4 arg0; | 1654 uvec4 arg0; |
1651 uvec4 arg1; | 1655 uvec4 arg1; |
1652 uvec4 arg2; | 1656 uvec4 arg2; |
1653 uvec4 arg3; | 1657 uvec4 arg3; |
1654 bool arg4; | 1658 bool arg4; |
1655 | 1659 |
1656 if (horizontal) { | 1660 if (horizontal) { |
1657 arg0 = uvec4(edges); | 1661 arg0 = uvec4(edges); |
1658 arg1 = edgesM1P0; | 1662 arg1 = edgesM1P0; |
1659 arg2 = edgesP1P0; | 1663 arg2 = edgesP1P0; |
1660 arg3 = edgesP2P0; | 1664 arg3 = edgesP2P0; |
1661 arg4 = true; | 1665 arg4 = true; |
1662 } else { | 1666 } else { |
1663 // Reuse the same code for vertical (used for horizontal above) | 1667 // Reuse the same code for vertical (used for horizontal above) |
1664 // but rotate input data 90º counter-clockwise, so that: | 1668 // but rotate input data 90º counter-clockwise. See FindLineLength() |
1665 // left becomes bottom | 1669 // e.g. arg0.r (new top) must be mapped to edges.g (old top) |
1666 // top becomes left | 1670 arg0 = uvec4(edges.gbar); |
1667 // right becomes top | 1671 arg1 = edgesM1P0.gbar; |
1668 // bottom becomes right | 1672 arg2 = edgesP1P0.gbar; |
1669 | 1673 arg3 = edgesP2P0.gbar; |
1670 // we also have to rotate edges, thus .argb | |
1671 arg0 = uvec4(edges.argb); | |
1672 arg1 = edgesM1P0.argb; | |
1673 arg2 = edgesP1P0.argb; | |
1674 arg3 = edgesP2P0.argb; | |
1675 arg4 = false; | 1674 arg4 = false; |
1676 } | 1675 } |
1677 | 1676 |
1678 { | 1677 { |
1679 ivec2 screenPos = screenPosI.xy; | 1678 ivec2 screenPos = screenPosI.xy; |
1680 uvec4 _edges = arg0; | 1679 uvec4 _edges = arg0; |
1681 uvec4 _edgesM1P0 = arg1; | 1680 uvec4 _edgesM1P0 = arg1; |
1682 uvec4 _edgesP1P0 = arg2; | 1681 uvec4 _edgesP1P0 = arg2; |
1683 uvec4 _edgesP2P0 = arg3; | 1682 uvec4 _edgesP2P0 = arg3; |
1684 bool horizontal = arg4; | 1683 bool horizontal = arg4; |
1685 // Inverted Z case: | 1684 |
1686 // __ | 1685 // Normal Z case: |
| 1686 // __ |
1687 // X| | 1687 // X| |
1688 // ¯¯ | 1688 // ¯¯ |
1689 bool isInvertedZ = false; | 1689 bool isInvertedZ = false; |
1690 bool isNormalZ = false; | 1690 bool isNormalZ = false; |
1691 { | 1691 { |
1692 \n#ifndef SETTINGS_ALLOW_SHORT_Zs\n | 1692 \n#ifndef SETTINGS_ALLOW_SHORT_Zs\n |
1693 // (1u-_edges.a) constraint can be removed; it was added for | 1693 // (1u-_edges.a) constraint can be removed; it was added for |
1694 // some rare cases | 1694 // some rare cases |
1695 uint isZShape = _edges.r * _edges.g * _edgesM1P0.g * | 1695 uint isZShape = _edges.r * _edges.g * _edgesM1P0.g * |
1696 _edgesP1P0.a *_edgesP2P0.a * (1u - _edges.b) * | 1696 _edgesP1P0.a *_edgesP2P0.a * (1u - _edges.b) * |
1697 (1u - _edgesP1P0.r) * (1u - _edges.a) * | 1697 (1u - _edgesP1P0.r) * (1u - _edges.a) * |
1698 (1u - _edgesP1P0.g); | 1698 (1u - _edgesP1P0.g); |
1699 \n#else\n | 1699 \n#else\n |
1700 uint isZShape = _edges.r * _edges.g * _edgesP1P0.a * | 1700 uint isZShape = _edges.r * _edges.g * _edgesP1P0.a * |
1701 (1u - _edges.b) * (1u - _edgesP1P0.r) * (1u - _edges.a) * | 1701 (1u - _edges.b) * (1u - _edgesP1P0.r) * (1u - _edges.a) * |
1702 (1u - _edgesP1P0.g); | 1702 (1u - _edgesP1P0.g); |
1703 isZShape *= (_edgesM1P0.g + _edgesP2P0.a); | 1703 isZShape *= (_edgesM1P0.g + _edgesP2P0.a); |
1704 // and at least one of these need to be there | 1704 // and at least one of these need to be there |
1705 \n#endif\n | 1705 \n#endif\n |
1706 if (isZShape > 0u) { | 1706 if (isZShape > 0u) { |
1707 isInvertedZ = true; | 1707 isNormalZ = true; |
1708 } | 1708 } |
1709 } | 1709 } |
1710 | 1710 |
1711 // Normal Z case: | 1711 // Inverted Z case: |
1712 // __ | 1712 // __ |
1713 // X| | 1713 // X| |
1714 // ¯¯ | 1714 // ¯¯ |
1715 { | 1715 { |
1716 \n#ifndef SETTINGS_ALLOW_SHORT_Zs\n | 1716 \n#ifndef SETTINGS_ALLOW_SHORT_Zs\n |
1717 uint isZShape = _edges.r * _edges.a * _edgesM1P0.a * | 1717 uint isZShape = _edges.r * _edges.a * _edgesM1P0.a * |
1718 _edgesP1P0.g * _edgesP2P0.g * (1u - _edges.b) * | 1718 _edgesP1P0.g * _edgesP2P0.g * (1u - _edges.b) * |
1719 (1u - _edgesP1P0.r) * (1u - _edges.g) * | 1719 (1u - _edgesP1P0.r) * (1u - _edges.g) * |
1720 (1u - _edgesP1P0.a); | 1720 (1u - _edgesP1P0.a); |
1721 \n#else\n | 1721 \n#else\n |
1722 uint isZShape = _edges.r * _edges.a * _edgesP1P0.g * | 1722 uint isZShape = _edges.r * _edges.a * _edgesP1P0.g * |
1723 (1u - _edges.b) * (1u - _edgesP1P0.r) * (1u - _edges.g) * | 1723 (1u - _edges.b) * (1u - _edgesP1P0.r) * (1u - _edges.g) * |
1724 (1u - _edgesP1P0.a); | 1724 (1u - _edgesP1P0.a); |
1725 isZShape *= | 1725 isZShape *= |
1726 (_edgesM1P0.a + _edgesP2P0.g); | 1726 (_edgesM1P0.a + _edgesP2P0.g); |
1727 // and at least one of these need to be there | 1727 // and at least one of these need to be there |
1728 \n#endif\n | 1728 \n#endif\n |
1729 | 1729 |
1730 if (isZShape > 0u) { | 1730 if (isZShape > 0u) { |
1731 isNormalZ = true; | 1731 isInvertedZ = true; |
1732 } | 1732 } |
1733 } | 1733 } |
1734 | 1734 |
1735 bool isZ = isInvertedZ || isNormalZ; | 1735 bool isZ = isInvertedZ || isNormalZ; |
1736 if (isZ) { | 1736 if (isZ) { |
1737 forFollowUpCoords[forFollowUpCount++] = | 1737 forFollowUpCoords[forFollowUpCount++] = |
1738 ivec4(screenPosI.xy, horizontal, isInvertedZ); | 1738 ivec4(screenPosI.xy, horizontal, isInvertedZ); |
1739 } | 1739 } |
1740 } | 1740 } |
1741 } | 1741 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 \n#ifdef OUT_FBO\n | 1828 \n#ifdef OUT_FBO\n |
1829 outColor = pixel; | 1829 outColor = pixel; |
1830 \n#else\n | 1830 \n#else\n |
1831 imageStore(outTexture, screenPosI, pixel); | 1831 imageStore(outTexture, screenPosI, pixel); |
1832 \n#endif\n | 1832 \n#endif\n |
1833 } | 1833 } |
1834 ); | 1834 ); |
1835 /* clang-format on */ | 1835 /* clang-format on */ |
1836 | 1836 |
1837 } // namespace gpu | 1837 } // namespace gpu |
OLD | NEW |