diff options
author | Haixia Shi <hshi@chromium.org> | 2015-10-09 15:48:47 -0700 |
---|---|---|
committer | Haixia Shi <hshi@chromium.org> | 2015-10-09 15:48:47 -0700 |
commit | 3a8773c4747b9e9077bfaea4ab18225077ef90c6 (patch) | |
tree | e34b83475c074991c6221e71f0a37a85d9721ac9 /glworker.cpp | |
parent | e823f649199c70560357a79c5709b8dd4009b459 (diff) |
drm_hwcomposer: support the PREMULT blending mode in glworker
BUG=24791071
TEST=verify notification icon shade is consistent with or without glworker
Change-Id: Ib7db1ece2e1dd327fdc1ffdbd44c360bd63f76b9
Diffstat (limited to 'glworker.cpp')
-rw-r--r-- | glworker.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/glworker.cpp b/glworker.cpp index 4cbe142..ffb4182 100644 --- a/glworker.cpp +++ b/glworker.cpp @@ -206,6 +206,7 @@ static int GenerateShaders(std::vector<AutoGLProgram> *blend_programs) { "precision mediump float; \n" "uniform samplerExternalOES uLayerTextures[LAYER_COUNT]; \n" "uniform float uLayerAlpha[LAYER_COUNT]; \n" +"uniform float uLayerPremult[LAYER_COUNT]; \n" "in vec2 fTexCoords[LAYER_COUNT]; \n" "out vec4 oFragColor; \n" "void main() { \n" @@ -214,7 +215,7 @@ static int GenerateShaders(std::vector<AutoGLProgram> *blend_programs) { " for (int i = 0; i < LAYER_COUNT; i++) { \n" " vec4 texSample = texture2D(uLayerTextures[i], fTexCoords[i]); \n" " float a = texSample.a * uLayerAlpha[i]; \n" -" color += a * alphaCover * texSample.rgb; \n" +" color += max(a, uLayerPremult[i]) * alphaCover * texSample.rgb; \n" " alphaCover *= 1.0 - a; \n" " if (alphaCover <= 0.5/255.0) \n" " break; \n" @@ -295,6 +296,7 @@ struct RenderingCommand { unsigned texture_index; float crop_bounds[4]; float alpha; + float premult; float texture_matrix[4]; }; @@ -410,13 +412,14 @@ static void ConstructCommands(DrmCompositionLayer *layers, size_t num_layers, } if (layer.blending == DrmHwcBlending::kNone) { - src.alpha = 1.0f; + src.alpha = src.premult = 1.0f; // This layer is opaque. There is no point in using layers below this // one. break; } src.alpha = layer.alpha / 255.0f; + src.premult = (layer.blending == DrmHwcBlending::kPreMult) ? 1.0f : 0.0f; } } } @@ -652,6 +655,7 @@ int GLWorkerCompositor::Composite(DrmCompositionLayer *layers, GLint gl_tex_loc = glGetUniformLocation(program, "uLayerTextures"); GLint gl_crop_loc = glGetUniformLocation(program, "uLayerCrop"); GLint gl_alpha_loc = glGetUniformLocation(program, "uLayerAlpha"); + GLint gl_premult_loc = glGetUniformLocation(program, "uLayerPremult"); GLint gl_tex_matrix_loc = glGetUniformLocation(program, "uTexMatrix"); glUniform4f(gl_viewport_loc, cmd.bounds[0] / (float)frame_width, cmd.bounds[1] / (float)frame_height, @@ -661,6 +665,7 @@ int GLWorkerCompositor::Composite(DrmCompositionLayer *layers, for (unsigned src_index = 0; src_index < cmd.texture_count; src_index++) { const RenderingCommand::TextureSource &src = cmd.textures[src_index]; glUniform1f(gl_alpha_loc + src_index, src.alpha); + glUniform1f(gl_premult_loc + src_index, src.premult); glUniform4f(gl_crop_loc + src_index, src.crop_bounds[0], src.crop_bounds[1], src.crop_bounds[2] - src.crop_bounds[0], src.crop_bounds[3] - src.crop_bounds[1]); |