Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(735)

Unified Diff: gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc

Issue 2120983002: gpu, cmaa: don't blend the leftmost and bottom-most edges in the BLUR_EDGES path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: handle rightmost and topmost edges also Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
index 909a8323970d2eb17d8a5dc5fa531d30743c6159..65eca9ad36afcc8233508bcb22a70cae8970dcdb 100644
--- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
+++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
@@ -1438,10 +1438,29 @@ const char ApplyFramebufferAttachmentCMAAINTELResourceManager::cmaa_frag_s2_[] =
\n#ifdef BLUR_EDGES\n
layout(early_fragment_tests) in;
void BlurEdges() {
- int _i;
-
+ // Each |gl_FragCoord| updates 4 texels of the original texture, which are
+ // 2x|gl_FragCoord| + (-1 or 0, -1 or 0) in the unnormalized texture
+ // coordinate, which is the coordinate used by texelFetch().
+ // e.g. when gl_FragCoord == (3.5, 3.5), this fragment shader covers
+ // (6,6) (6,7) (7,6) (7,7) texels.
+ // Note: gl_FragCoord == (0.5, 0.5) (i.e. left-bottom-most fragment)
+ // covers (0,0) (0,1) (1,0) (1,1) texels
+ // gl_FragCoord == ((w/2)-0.5, (h/2)-0.5) (i.e. right-top-most fragment)
+ // covers (w-2,h-2) (w-2,h-1) (w-1,h-2) (w-1,h-1)
ivec3 screenPosIBase = ivec3(ivec2(gl_FragCoord.xy) * 2, 0);
vec3 screenPosBase = vec3(screenPosIBase);
+
+ // When gl_FragCoord == (0.5, 0.5) (i.e. left-bottom-most fragment),
+ // |sampA| textureGatherOffset() looks up (-1,-1), (-1,0), (0,-1), (0,0).
+ // (-1,-1), (-1,0), (0,-1) must be handled.
+ // Note: textureGatherOffset() on out of range gives an undefined value.
+ uvec2 notBottomLeft = uvec2(notEqual(screenPosIBase.xy, ivec2(0, 0)));
+ // When gl_FragCoord == ((w/2)-0.5, (h/2)-0.5) (i.e. right-top-most
+ // fragment), |sampD| looks up (w-1, h-1), (w-1, h), (w, h-1), (w, h).
+ // (w-1, h), (w, h-1), (w, h) must be handled.
+ uvec2 notTopRight = uvec2(
+ notEqual((screenPosIBase.xy + 2), textureSize(g_src0TextureFlt, 0)));
+
uint forFollowUpCount = 0u;
ivec4 forFollowUpCoords[4];
@@ -1464,24 +1483,27 @@ const char ApplyFramebufferAttachmentCMAAINTELResourceManager::cmaa_frag_s2_[] =
screenPosBase.xy * g_OneOverScreenSize,
ivec2(2, 2)) *255.5);
- packedEdgesArray[(0) * 4 + (0)] = sampA.w;
- packedEdgesArray[(1) * 4 + (0)] = sampA.z;
- packedEdgesArray[(0) * 4 + (1)] = sampA.x;
+ packedEdgesArray[(0) * 4 + (0)] =
+ sampA.w * notBottomLeft.x * notBottomLeft.y;
+ packedEdgesArray[(1) * 4 + (0)] = sampA.z * notBottomLeft.y;
+ packedEdgesArray[(0) * 4 + (1)] = sampA.x * notBottomLeft.x;
packedEdgesArray[(1) * 4 + (1)] = sampA.y;
- packedEdgesArray[(2) * 4 + (0)] = sampB.w;
- packedEdgesArray[(3) * 4 + (0)] = sampB.z;
+ packedEdgesArray[(2) * 4 + (0)] = sampB.w * notBottomLeft.y;
+ packedEdgesArray[(3) * 4 + (0)] =
+ sampB.z * notBottomLeft.y * notTopRight.x;
packedEdgesArray[(2) * 4 + (1)] = sampB.x;
- packedEdgesArray[(3) * 4 + (1)] = sampB.y;
- packedEdgesArray[(0) * 4 + (2)] = sampC.w;
+ packedEdgesArray[(3) * 4 + (1)] = sampB.y * notTopRight.x;
+ packedEdgesArray[(0) * 4 + (2)] = sampC.w * notBottomLeft.x;
packedEdgesArray[(1) * 4 + (2)] = sampC.z;
- packedEdgesArray[(0) * 4 + (3)] = sampC.x;
- packedEdgesArray[(1) * 4 + (3)] = sampC.y;
+ packedEdgesArray[(0) * 4 + (3)] =
+ sampC.x * notBottomLeft.x * notTopRight.y;
+ packedEdgesArray[(1) * 4 + (3)] = sampC.y * notTopRight.y;
packedEdgesArray[(2) * 4 + (2)] = sampD.w;
- packedEdgesArray[(3) * 4 + (2)] = sampD.z;
- packedEdgesArray[(2) * 4 + (3)] = sampD.x;
- packedEdgesArray[(3) * 4 + (3)] = sampD.y;
+ packedEdgesArray[(3) * 4 + (2)] = sampD.z * notTopRight.x;
+ packedEdgesArray[(2) * 4 + (3)] = sampD.x * notTopRight.y;
+ packedEdgesArray[(3) * 4 + (3)] = sampD.y * notTopRight.x * notTopRight.y;
- for (_i = 0; _i < 4; _i++) {
+ for (int _i = 0; _i < 4; _i++) {
int _x = _i % 2;
int _y = _i / 2;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698