diff options
author | Romain Guy <romainguy@google.com> | 2010-09-09 14:42:43 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2010-09-09 14:42:43 -0700 |
commit | a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5 (patch) | |
tree | 4194d14711b2cba0e8192e5f1c0764f530bc7309 /libs/hwui/ProgramCache.cpp | |
parent | d90f23e24a4d1768d5a7ed0e7072e67af6330a45 (diff) |
Add support for advanced blend modes with the framebuffer.
This adds the ability to blend with the framebuffer using Darken,
Lighten, Add, Multiply, Overlay and Screen.
Change-Id: Iae01a53797d4ad39c373cba6ff2a42293129da1a
Diffstat (limited to 'libs/hwui/ProgramCache.cpp')
-rw-r--r-- | libs/hwui/ProgramCache.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index 39fe85a740e1..ff65c1b73375 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -66,6 +66,8 @@ const char* gVS_Footer = // Fragment shaders snippets /////////////////////////////////////////////////////////////////////////////// +const char* gFS_Header_Extension_FramebufferFetch = + "#extension GL_NV_shader_framebuffer_fetch : enable\n\n"; const char* gFS_Header = "precision mediump float;\n\n"; const char* gFS_Uniforms_Color = @@ -115,6 +117,8 @@ const char* gFS_Main_BitmapShader_Modulate = " fragColor = bitmapColor * fragColor.a;\n"; const char* gFS_Main_FragColor = " gl_FragColor = fragColor;\n"; +const char* gFS_Main_FragColor_Blend = + " gl_FragColor = blendFramebuffer(fragColor, gl_LastFragColor);\n"; const char* gFS_Main_ApplyColorOp[4] = { // None "", @@ -281,7 +285,14 @@ String8 ProgramCache::generateVertexShader(const ProgramDescription& description String8 ProgramCache::generateFragmentShader(const ProgramDescription& description) { // Set the default precision - String8 shader(gFS_Header); + String8 shader; + + bool blendFramebuffer = description.framebufferMode >= SkXfermode::kPlus_Mode; + if (blendFramebuffer) { + shader.append(gFS_Header_Extension_FramebufferFetch); + } + + shader.append(gFS_Header); // Varyings if (description.hasTexture) { @@ -315,6 +326,9 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti if (description.colorOp == ProgramDescription::kColorBlend) { generateBlend(shader, "blendColors", description.colorMode); } + if (blendFramebuffer) { + generateBlend(shader, "blendFramebuffer", description.framebufferMode); + } if (description.isBitmapNpot) { generateTextureWrap(shader, description.bitmapWrapS, description.bitmapWrapT); } @@ -359,7 +373,11 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti // Apply the color op if needed shader.append(gFS_Main_ApplyColorOp[description.colorOp]); // Output the fragment - shader.append(gFS_Main_FragColor); + if (!blendFramebuffer) { + shader.append(gFS_Main_FragColor); + } else { + shader.append(gFS_Main_FragColor_Blend); + } } // End the shader shader.append(gFS_Footer); |