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 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
341 // Inputs | 341 // Inputs |
342 // g_screenTexture source_texture tex0 | 342 // g_screenTexture source_texture tex0 |
343 // Outputs | 343 // Outputs |
344 // gl_FragDepth mini4_edge_depth_texture_ fbo.depth | 344 // gl_FragDepth mini4_edge_depth_texture_ fbo.depth |
345 // out uvec4 outEdges mini4_edge_texture_ fbo.col | 345 // out uvec4 outEdges mini4_edge_texture_ fbo.col |
346 // image2D g_resultTextureFlt4Slot1 working_color_texture_ image1 | 346 // image2D g_resultTextureFlt4Slot1 working_color_texture_ image1 |
347 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; | 347 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; |
348 | 348 |
349 { | 349 { |
350 glUseProgram(edges0_shader_); | 350 glUseProgram(edges0_shader_); |
351 glUniform1f(0, 1.0f); | 351 glUniform2f(0, 1.0f / width_, 1.0f / height_); |
352 glUniform2f(1, 1.0f / width_, 1.0f / height_); | |
353 glDepthMask(GL_TRUE); | 352 glDepthMask(GL_TRUE); |
354 glDepthFunc(GL_ALWAYS); | 353 glDepthFunc(GL_ALWAYS); |
355 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 354 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
356 | 355 |
357 if (!is_gles31_compatible_) { | 356 if (!is_gles31_compatible_) { |
358 glUniform1i(edges1_shader_result_texture_float4_slot1_, 1); | 357 glUniform1i(edges1_shader_result_texture_float4_slot1_, 1); |
359 } | 358 } |
360 glBindImageTextureEXT(1, working_color_texture_, 0, GL_FALSE, 0, | 359 glBindImageTextureEXT(1, working_color_texture_, 0, GL_FALSE, 0, |
361 GL_WRITE_ONLY, GL_RGBA8); | 360 GL_WRITE_ONLY, GL_RGBA8); |
362 | 361 |
363 glActiveTexture(GL_TEXTURE0); | 362 glActiveTexture(GL_TEXTURE0); |
364 glBindTexture(GL_TEXTURE_2D, source_texture); | 363 glBindTexture(GL_TEXTURE_2D, source_texture); |
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 364 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
366 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
367 | 366 |
368 glDrawArrays(GL_TRIANGLES, 0, 3); | 367 glDrawArrays(GL_TRIANGLES, 0, 3); |
369 } | 368 } |
370 | 369 |
371 // Detect edges Pass 1 (finish the previous pass edge processing). | 370 // Detect edges Pass 1 (finish the previous pass edge processing). |
372 // Do the culling of non-dominant local edges (leave mainly locally dominant | 371 // Do the culling of non-dominant local edges (leave mainly locally dominant |
373 // edges) and merge Right and Bottom edges into TopRightBottomLeft | 372 // edges) and merge Right and Bottom edges into TopRightBottomLeft |
374 | 373 |
375 // Inputs | 374 // Inputs |
376 // g_src0Texture4Uint mini4_edge_texture_ tex1 | 375 // g_src0Texture4Uint mini4_edge_texture_ tex1 |
377 // Outputs | 376 // Outputs |
378 // image2D g_resultTexture edge_texture_b image0 | 377 // image2D g_resultTexture edge_texture_b image0 |
379 { | 378 { |
380 glUseProgram(edges1_shader_); | 379 glUseProgram(edges1_shader_); |
381 glUniform1f(0, 0.0f); | 380 glUniform2f(0, 1.0f / width_, 1.0f / height_); |
382 glUniform2f(1, 1.0f / width_, 1.0f / height_); | |
383 glDepthMask(GL_FALSE); | 381 glDepthMask(GL_FALSE); |
384 glDepthFunc(GL_LESS); | 382 glDepthFunc(GL_LESS); |
385 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); | 383 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); |
386 | 384 |
387 if (!is_gles31_compatible_) { | 385 if (!is_gles31_compatible_) { |
388 glUniform1i(edges1_shader_result_texture_, 0); | 386 glUniform1i(edges1_shader_result_texture_, 0); |
389 } | 387 } |
390 glBindImageTextureEXT(0, edge_texture_b, 0, GL_FALSE, 0, GL_WRITE_ONLY, | 388 glBindImageTextureEXT(0, edge_texture_b, 0, GL_FALSE, 0, GL_WRITE_ONLY, |
391 edge_format); | 389 edge_format); |
392 | 390 |
393 glActiveTexture(GL_TEXTURE1); | 391 glActiveTexture(GL_TEXTURE1); |
394 glBindTexture(GL_TEXTURE_2D, mini4_edge_texture_); | 392 glBindTexture(GL_TEXTURE_2D, mini4_edge_texture_); |
395 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 393 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
396 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 394 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
397 | 395 |
398 glDrawArrays(GL_TRIANGLES, 0, 3); | 396 glDrawArrays(GL_TRIANGLES, 0, 3); |
399 } | 397 } |
400 | 398 |
401 // - Combine RightBottom (.xy) edges from previous pass into | 399 // - Combine RightBottom (.xy) edges from previous pass into |
402 // RightBottomLeftTop (.xyzw) edges and output it into the mask (have to | 400 // RightBottomLeftTop (.xyzw) edges and output it into the mask. |
403 // fill in the whole buffer including empty ones for the line length | |
404 // detection to work correctly). | |
405 // - On all pixels with any edge, input buffer into a temporary color buffer | 401 // - On all pixels with any edge, input buffer into a temporary color buffer |
406 // needed for correct blending in the next pass (other pixels not needed | 402 // needed for correct blending in the next pass (other pixels not needed |
407 // so not copied to avoid bandwidth use). | 403 // so not copied to avoid bandwidth use). |
408 // - On all pixels with 2 or more edges output positive depth mask for the | 404 // - On all pixels with 2 or more edges output positive depth mask for the |
409 // next pass. | 405 // next pass. |
410 | 406 |
411 // Inputs | 407 // Inputs |
412 // g_src0TextureFlt edge_texture_b tex1 //ps | 408 // g_src0TextureFlt edge_texture_b tex1 //ps |
413 // Outputs | 409 // Outputs |
414 // image2D g_resultTextureSlot2 edge_texture_a image2 | 410 // image2D g_resultTextureSlot2 edge_texture_a image2 |
415 // gl_FragDepth mini4_edge_texture_ fbo.depth | 411 // gl_FragDepth mini4_edge_texture_ fbo.depth |
416 { | 412 { |
417 // Combine edges: each pixel will now contain info on all (top, right, | 413 // Combine edges: each pixel will now contain info on all (top, right, |
418 // bottom, left) edges; also create depth mask as above depth and mark | 414 // bottom, left) edges; also mark depth 1 value on all pixels with any edge |
419 // potential Z sAND also copy source color data but only on edge pixels | 415 // and also copy source color data but only on edge pixels |
420 glUseProgram(edges_combine_shader_); | 416 glUseProgram(edges_combine_shader_); |
421 glUniform1f(0, 1.0f); | 417 glUniform2f(0, 1.0f / width_, 1.0f / height_); |
422 glUniform2f(1, 1.0f / width_, 1.0f / height_); | |
423 glDepthMask(GL_TRUE); | 418 glDepthMask(GL_TRUE); |
424 glDepthFunc(GL_ALWAYS); | 419 glDepthFunc(GL_LESS); |
425 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); | 420 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); |
426 | 421 |
427 if (!is_gles31_compatible_) { | 422 if (!is_gles31_compatible_) { |
428 glUniform1i(edges_combine_shader_result_texture_slot2_, 2); | 423 glUniform1i(edges_combine_shader_result_texture_slot2_, 2); |
429 } | 424 } |
430 glBindImageTextureEXT(2, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY, | 425 glBindImageTextureEXT(2, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY, |
431 edge_format); | 426 edge_format); |
432 | 427 |
433 glActiveTexture(GL_TEXTURE1); | 428 glActiveTexture(GL_TEXTURE1); |
434 glBindTexture(GL_TEXTURE_2D, edge_texture_b); | 429 glBindTexture(GL_TEXTURE_2D, edge_texture_b); |
(...skipping 13 matching lines...) Expand all Loading... | |
448 | 443 |
449 // Inputs | 444 // Inputs |
450 // g_screenTexture working_color_texture_ tex0 | 445 // g_screenTexture working_color_texture_ tex0 |
451 // g_src0TextureFlt edge_texture_a tex1 //ps | 446 // g_src0TextureFlt edge_texture_a tex1 //ps |
452 // sampled | 447 // sampled |
453 // Outputs | 448 // Outputs |
454 // g_resultTextureFlt4Slot1 dest_texture image1 | 449 // g_resultTextureFlt4Slot1 dest_texture image1 |
455 // gl_FragDepth mini4_edge_texture_ fbo.depth | 450 // gl_FragDepth mini4_edge_texture_ fbo.depth |
456 { | 451 { |
457 glUseProgram(process_and_apply_shader_); | 452 glUseProgram(process_and_apply_shader_); |
458 glUniform1f(0, 0.0f); | 453 glUniform2f(0, 1.0f / width_, 1.0f / height_); |
459 glUniform2f(1, 1.0f / width_, 1.0f / height_); | |
460 glDepthMask(GL_FALSE); | 454 glDepthMask(GL_FALSE); |
461 glDepthFunc(GL_LESS); | 455 glDepthFunc(GL_LESS); |
462 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); | 456 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); |
463 | 457 |
464 if (!is_gles31_compatible_) { | 458 if (!is_gles31_compatible_) { |
465 glUniform1i(process_and_apply_shader_result_texture_float4_slot1_, 1); | 459 glUniform1i(process_and_apply_shader_result_texture_float4_slot1_, 1); |
466 } | 460 } |
467 glBindImageTextureEXT(1, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, | 461 glBindImageTextureEXT(1, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, |
468 GL_RGBA8); | 462 GL_RGBA8); |
469 | 463 |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
683 } | 677 } |
684 | 678 |
685 return shader; | 679 return shader; |
686 } | 680 } |
687 | 681 |
688 /* clang-format off */ | 682 /* clang-format off */ |
689 // Shaders used in the CMAA algorithm. | 683 // Shaders used in the CMAA algorithm. |
690 const char ApplyFramebufferAttachmentCMAAINTELResourceManager::vert_str_[] = | 684 const char ApplyFramebufferAttachmentCMAAINTELResourceManager::vert_str_[] = |
691 SHADER( | 685 SHADER( |
692 precision highp float; | 686 precision highp float; |
693 layout(location = 0) uniform float g_Depth; | |
694 // No input data. | 687 // No input data. |
695 // Verts are autogenerated. | 688 // Verts are autogenerated. |
696 // | 689 // |
697 // vertexID 0,1,2 should generate | 690 // vertexID 0,1,2 should generate |
698 // POS: (-1,-1), (+3,-1), (-1,+3) | 691 // POS: (-1,-1), (+3,-1), (-1,+3) |
699 // | 692 // |
700 // This generates a triangle that completely covers the -1->1 viewport | 693 // This generates a triangle that completely covers the -1->1 viewport |
701 // | 694 // |
702 void main() | 695 void main() |
703 { | 696 { |
704 float x = -1.0 + float((gl_VertexID & 1) << 2); | 697 float x = -1.0 + float((gl_VertexID & 1) << 2); |
705 float y = -1.0 + float((gl_VertexID & 2) << 1); | 698 float y = -1.0 + float((gl_VertexID & 2) << 1); |
706 gl_Position = vec4(x, y, g_Depth, 1.0); | 699 gl_Position = vec4(x, y, 0.0, 1.0); |
707 } | 700 } |
708 ); | 701 ); |
709 | 702 |
710 const char ApplyFramebufferAttachmentCMAAINTELResourceManager::cmaa_frag_s1_[] = | 703 const char ApplyFramebufferAttachmentCMAAINTELResourceManager::cmaa_frag_s1_[] = |
711 SHADER( | 704 SHADER( |
712 precision highp float; | 705 precision highp float; |
713 precision highp int; | 706 precision highp int; |
714 | 707 |
715 \n#define SETTINGS_ALLOW_SHORT_Zs 1\n | 708 \n#define SETTINGS_ALLOW_SHORT_Zs 1\n |
716 \n#define EDGE_DETECT_THRESHOLD 13.0f\n | 709 \n#define EDGE_DETECT_THRESHOLD 13.0f\n |
717 \n#define saturate(x) clamp((x), 0.0, 1.0)\n | 710 \n#define saturate(x) clamp((x), 0.0, 1.0)\n |
718 | 711 |
719 // bind to location 0 | |
720 layout(location = 0) uniform float g_Depth; | |
721 // bind to a uniform buffer bind point 0 | 712 // bind to a uniform buffer bind point 0 |
722 layout(location = 1) uniform vec2 g_OneOverScreenSize; | 713 layout(location = 0) uniform vec2 g_OneOverScreenSize; |
723 \n#ifndef EDGE_DETECT_THRESHOLD\n | 714 \n#ifndef EDGE_DETECT_THRESHOLD\n |
724 layout(location = 2) uniform float g_ColorThreshold; | 715 layout(location = 1) uniform float g_ColorThreshold; |
725 \n#endif\n | 716 \n#endif\n |
726 | 717 |
727 \n#ifdef SUPPORTS_USAMPLER2D\n | 718 \n#ifdef SUPPORTS_USAMPLER2D\n |
728 \n#define USAMPLER usampler2D\n | 719 \n#define USAMPLER usampler2D\n |
729 \n#define UVEC4 uvec4\n | 720 \n#define UVEC4 uvec4\n |
730 \n#define LOAD_UINT(arg) arg\n | 721 \n#define LOAD_UINT(arg) arg\n |
731 \n#define STORE_UVEC4(arg) arg\n | 722 \n#define STORE_UVEC4(arg) arg\n |
732 \n#else\n | 723 \n#else\n |
733 \n#define USAMPLER sampler2D\n | 724 \n#define USAMPLER sampler2D\n |
734 \n#define UVEC4 vec4\n | 725 \n#define UVEC4 vec4\n |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1156 et = saturate(et - threshold); | 1147 et = saturate(et - threshold); |
1157 ivec2 eti = ivec2(et * 15.0 + 0.99); | 1148 ivec2 eti = ivec2(et * 15.0 + 0.99); |
1158 outputEdges.w = uint(eti.x | (eti.y << 4)); | 1149 outputEdges.w = uint(eti.x | (eti.y << 4)); |
1159 | 1150 |
1160 storeFlagPixel11 += et.x; | 1151 storeFlagPixel11 += et.x; |
1161 storeFlagPixel11 += et.y; | 1152 storeFlagPixel11 += et.y; |
1162 storeFlagPixel21 += et.x; | 1153 storeFlagPixel21 += et.x; |
1163 storeFlagPixel12 += et.y; | 1154 storeFlagPixel12 += et.y; |
1164 } | 1155 } |
1165 | 1156 |
1166 gl_FragDepth = any(bvec4(outputEdges)) ? 1.0 : 0.0; | 1157 gl_FragDepth = any(bvec4(outputEdges)) ? 1.0 : 0.0; |
dshwang
2016/07/06 10:41:20
gl_Depth is redudant.
| |
1167 | 1158 |
1168 if (gl_FragDepth != 0.0) { | 1159 if (gl_FragDepth != 0.0) { |
1169 if (storeFlagPixel00 != 0.0) | 1160 if (storeFlagPixel00 != 0.0) |
1170 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 0), | 1161 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 0), |
1171 pixel00); | 1162 pixel00); |
1172 if (storeFlagPixel10 != 0.0) | 1163 if (storeFlagPixel10 != 0.0) |
1173 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 0), | 1164 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 0), |
1174 pixel10); | 1165 pixel10); |
1175 if (storeFlagPixel20 != 0.0) | 1166 if (storeFlagPixel20 != 0.0) |
1176 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 0), | 1167 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 0), |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1424 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 1), | 1415 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 1), |
1425 outEdge4Flt.zzzz); | 1416 outEdge4Flt.zzzz); |
1426 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 1), | 1417 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 1), |
1427 outEdge4Flt.wwww); | 1418 outEdge4Flt.wwww); |
1428 | 1419 |
1429 // uvec4 numberOfEdges4 = uvec4(bitCount(outEdge4)); | 1420 // uvec4 numberOfEdges4 = uvec4(bitCount(outEdge4)); |
1430 // gl_FragDepth = | 1421 // gl_FragDepth = |
1431 // any(greaterThan(numberOfEdges4, uvec4(1))) ? 1.0 : 0.0; | 1422 // any(greaterThan(numberOfEdges4, uvec4(1))) ? 1.0 : 0.0; |
1432 | 1423 |
1433 gl_FragDepth = | 1424 gl_FragDepth = |
1434 any(greaterThan(outEdge4, uvec4(1))) ? 1.0 : 0.0; | 1425 any(greaterThan(outEdge4, uvec4(1))) ? 1.0 : 0.0; |
dshwang
2016/07/06 10:41:20
gl_Depth is redudant.
| |
1435 } | 1426 } |
1436 \n#endif\n // COMBINE_EDGES | 1427 \n#endif\n // COMBINE_EDGES |
1437 | 1428 |
1438 \n#ifdef BLUR_EDGES\n | 1429 \n#ifdef BLUR_EDGES\n |
1439 layout(early_fragment_tests) in; | 1430 layout(early_fragment_tests) in; |
1440 void BlurEdges() { | 1431 void BlurEdges() { |
1441 // Each |gl_FragCoord| updates 4 texels of the original texture, which are | 1432 // Each |gl_FragCoord| updates 4 texels of the original texture, which are |
1442 // 2x|gl_FragCoord| + (-1 or 0, -1 or 0) in the unnormalized texture | 1433 // 2x|gl_FragCoord| + (-1 or 0, -1 or 0) in the unnormalized texture |
1443 // coordinate, which is the coordinate used by texelFetch(). | 1434 // coordinate, which is the coordinate used by texelFetch(). |
1444 // e.g. when gl_FragCoord == (3.5, 3.5), this fragment shader covers | 1435 // e.g. when gl_FragCoord == (3.5, 3.5), this fragment shader covers |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1883 \n#ifdef OUT_FBO\n | 1874 \n#ifdef OUT_FBO\n |
1884 outColor = pixel; | 1875 outColor = pixel; |
1885 \n#else\n | 1876 \n#else\n |
1886 imageStore(outTexture, screenPosI, pixel); | 1877 imageStore(outTexture, screenPosI, pixel); |
1887 \n#endif\n | 1878 \n#endif\n |
1888 } | 1879 } |
1889 ); | 1880 ); |
1890 /* clang-format on */ | 1881 /* clang-format on */ |
1891 | 1882 |
1892 } // namespace gpu | 1883 } // namespace gpu |
OLD | NEW |