Closed Bug 926128 Opened 7 years ago Closed 6 years ago

reduce layer programs in use to 6, add colormatrix and blur support

Categories

(Core :: Graphics: Layers, defect)

x86
macOS
defect
Not set

Tracking

()

RESOLVED FIXED
mozilla30

People

(Reporter: gal, Assigned: mtseng)

References

Details

Attachments

(12 files, 20 obsolete files)

5.02 KB, patch
vlad
: review+
Details | Diff | Splinter Review
3.02 KB, patch
vlad
: review+
Details | Diff | Splinter Review
18.44 KB, patch
vlad
: review+
Details | Diff | Splinter Review
27.20 KB, patch
vlad
: review+
Details | Diff | Splinter Review
8.85 KB, patch
vlad
: review+
Details | Diff | Splinter Review
31.43 KB, patch
vlad
: review+
Details | Diff | Splinter Review
5.25 KB, patch
nical
: review+
Details | Diff | Splinter Review
60.14 KB, patch
vlad
: review+
Details | Diff | Splinter Review
2.59 KB, patch
vlad
: review+
Details | Diff | Splinter Review
3.81 KB, patch
vlad
: review+
Details | Diff | Splinter Review
5.69 KB, patch
gal
: review+
Details | Diff | Splinter Review
128.14 KB, patch
Details | Diff | Splinter Review
This patch reduces the layer programs we use to 6 by selecting some of the minor variants with uniforms. On older and new hardware this may add up to 2 cycles to the fragment shader in some cases. In practice this should be irrelevant.

All texture layer shaders are generated from the same source, and this patch also adds color matrix and blurring support, even though thats not actually used yet.
Summary: reduce layer programs in use to 6 → reduce layer programs in use to 6, add colormatrix and blur support
Attached patch patch (obsolete) — Splinter Review
Assignee: nobody → gal
A couple additional notes:
- Both blur and shadow will need two passes with the shader, each of which does 21 texture reads. On Mali this takes upwards of 900 cycles per pixel per pass. For smaller blur radii it might be worth having a dynamic kernel size?
- The color matrix multiplication seems pretty cheap. We might just always enable that instead of having an extra kind of program (right now I would need 6 additional programs for CM, and then another 6 for blur+CM).
- The remaining programs can be deleted once we finally kill the older layer manager.
Attachment #816284 - Flags: feedback?(roc)
Attachment #816284 - Attachment is obsolete: true
Attachment #816284 - Flags: feedback?(roc)
Attachment #816352 - Attachment description: patch → Unify into 6 programs and use them in the compositor.
Attachment #816353 - Attachment is patch: true
Attachment #816352 - Flags: review?(bgirard)
Attachment #816353 - Flags: review?(bgirard)
Attachment #816354 - Flags: review?(bgirard)
Attachment #816355 - Flags: review?(bgirard)
Sounds good to me, but my opinion isn't worth much here.
Here is a benchmark that may help determine whether switching to a 'unified shader' can have an impact on performance:

http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmark.html

It replaces 6 separate programs by one, with two degrees of freedom controlled by uniform:
 * one uniform, 'texSwitch', allows to switch between two textures or a solid color (3 possibilities);
 * one uniform, 'colorSwitch', allows to switch between color and monochrome rendering (2 possibilities).

Hopefully that's a fair enough benchmark for what we're trying to do here. Note that all the quads are semitransparent to actually exercise shader performance on deferred-HSR renderers such as the PowerVR (otherwise the PowerVR just optimises overdrawing away, see https://wiki.mozilla.org/Platform/GFX/MobileGPUs).
Uploaded some results there:

http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmarkresults.txt

These results confirm that switching to a unified shader indeed does not affect performance on desktop GPUs (including Intel integrated GPUs) of the past 5 years or so.

But it is affecting performance on some older desktop GPUs that we still need to care about (see the Geforce 7 result), and it is affecting performance on all mobile GPUs that I tested --- see in particular the Adreno 200 result and the PowerVR 540 result.

Of course there could always be something wrong in how this benchmark tries to imitate what a compositor has to do --- comments welcome!
The patch only switches swizzle and alpha/no-alpha as well as color or alphas for component rendering. That should be even on old GPUs and mobile where all the paths get executed essentially free.

As for the general benchmarks, we have to make sure we support Geoforce 7, but I wouldn't optimize for it.
Sorry for punting on this review so far. Hoping to resolve some b2g perf issues ahead of the paris work week. I do have some concern about the performance impact given the results bjacob has.
No worries. Lets bounce the reviews to bjacob. I am working with him on the perf question.
Here is an updated benchmark that aims to be closer to the shader changes in the present patches, as discussed on IRC (let me know if they should still be changed).

http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmark-variant.html

Results are similar to earlier. The speed difference for PowerVR is lower than before, but still large.

http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmarkresults-variant.txt

I was intrigued that our fillrate was so low on both the PowerVR and the Adreno with either shader (1 ms per quarter-screen quad on the Adreno) so I wondered if that was due to having draw-calls drawing only one quad each. So made a variant of the benchmark drawing 16 quads per draw-call, but that didn't make a big difference except that now the PowerVR couldn't even complete the benchmark with unified shader. For reference, it's at http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmark-variant2.html . Then I wondered if that low fill-rate was bound by the texture memory bandwidth to read from the textures, so I made another variant with tiny 16x12 texture so that it would fit in cache entirely and use practically no bandwidth to sample from... but I still got the same results. For reference, that variant is http://people.mozilla.org/~bjacob/webglbranchingbenchmark/webglbranchingbenchmark-variant3.html

At this point I am pretty much done with benchmarking unless you can think of a flaw in this benchmarking that we didn't already think of. If you think that there is a chance that this benchmarking could be irrelevant, one thing that you can do is to build with your patches and see how performance is actually affected. I would be especially interested in PowerVR devices.
Now that I think of it, the "low fill rate" absolute measurement above is probably very imprecise because this measurement is based on timing on the CPU side, using glFinish to sync the GPU. So let's disregard it. This approach is probably only suitable for getting rough relative measurements (A is X times slower than B), not absolute measurements. And even for relative measurements, this is only to be taken as a rough lower bound (i.e. when we say that A is X times slower than B, A could be even slower than that).
1ms vs 6ms is a sufficient scale to make decisions based on that I think. I will go and change the uniforms to compile-time settings (defines). Its not a big change in the approach, and should then bring performance back to what we had before, while still generating the shaders from one source.
Thanks. Changing these to be compile-time settings will definitely address the performance issue underlined by these benchmarks.
Are we still interested in having these patch reviewed?
Not the current form, I will work with bjacob on the next iteration (won't be a big change).
(In reply to Andreas Gal :gal from comment #18)
> Not the current form, I will work with bjacob on the next iteration (won't
> be a big change).

If you're extending/changing how the shaders are pre-processed then perhaps it's time to consider if we can represent what we're doing with the C preprocessor. The C preprocessor isn't great but it surely beats the random language thing we have now. and it's much more familiar. We could then compile our shaders by running a c compiler and only requesting the preprocessor phase.
Thats what I am doing. I am using #defines to configure the shaders.
Yeah, trusting the GLSL compiler's preprocessor is.. well, doable, but only really for simple things.  Would be nice if we had our own preprocessor here, especially if we want to do more things with GLSL in the future.

However, I would suggest doing that in the future.  (It would be nice if we could do this via JS, as there are some nice simple JS templating things out there.)
Attachment #816352 - Attachment is obsolete: true
Attachment #816352 - Flags: review?(bgirard)
Attachment #819785 - Flags: review?(bjacob)
Attachment #816353 - Attachment is obsolete: true
Attachment #816353 - Flags: review?(bgirard)
Attachment #819786 - Flags: review?(bjacob)
Attachment #816354 - Attachment is obsolete: true
Attachment #816354 - Flags: review?(bgirard)
Attachment #819788 - Flags: review?(bjacob)
Note: this adds a branch that depends on a uniform. This is known to be slow on mobile, where we don't use component alpha. Its fast on desktop, and avoiding the rebinding is actually a net win on my mac.
Attachment #816355 - Attachment is obsolete: true
Attachment #816355 - Flags: review?(bgirard)
Attachment #819789 - Flags: review?(bjacob)
I am pretty sure that uTexCoordMultiplier is actually not needed at all. I might do another patch for that, but I would like to land this long queue first.
Expect longer review times than usual due to the gfx work week.
Thanks. The code is pretty active and due to the depth of the queue stuff gets stale quickly and is really painful to rebase so I would appreciate any time you can make for this.
This version of the patch also reduces things to just EFFECT_RGB since its redundant and can get out of whack with the texture format itself.
Attachment #819793 - Attachment is obsolete: true
Attachment #819793 - Flags: review?(bjacob)
Attachment #820100 - Flags: review?(bjacob)
It is __EXTREMELY__ urgent that we delete the old layers code. Its excruciatingly painful to hack around it and keep it working while trying to fix the new code.
Attachment #820103 - Flags: review?(bjacob)
When do you think will you be able to review this?
Benoit, is there somebody else you can suggest to review this?  I know you have the bug 914823 which is a 1.2 CS release blocker, and it's something you should stay focused on, but if you can think of somebody else to hand the review to, it would work.  Vlad maybe?
Thanks for considering taking this off my plate; indeed between the work week, bug 914823 which is koi+, working on the solution for bug 923530 which we agreed on during the work week, and writing up the surfaces conversation that we had during the work week, now is a very busy time for me.

Really anyone who is a gfx peer is at least as qualified as I am to review this, given that I haven't previously written or reviewed code around here. Maybe use hg log / hg annotate to find out who's the best reviewer.
Thanks.  I think a good approach here may be to split this up a bit.  Nical, can you do a first pass, take a very quick look at the code, and pick a few of the patches that would be in your area of expertise.  Then let me know, and I'll ask nrc and mwoodrow to split the rest.  It should let us do these reviews faster in the end.
Flags: needinfo?(nical.bugzilla)
The patch is pretty straight forward code reshuffling. I am happy to walk nical through the patch queue.
Comment on attachment 819785 [details] [diff] [review]
Part 1: Create one unified shader thats configurable and use it in CompositorOGL.

Review of attachment 819785 [details] [diff] [review]:
-----------------------------------------------------------------

Almost a r+ with some comments/suggestions, but I need an answer on the last issue in the shaders, about RB swap -- it seems like it needs to be applied earlier.

::: gfx/layers/opengl/LayerManagerOGLProgram.cpp
@@ +111,5 @@
> +      if (aType == RGBLayerProgramType ||
> +	  aType == RGBRectLayerProgramType) {
> +	AddConfig(result, "#define ENABLE_TEXTURE_NO_ALPHA");
> +	result.mUniforms.AppendElement(Argument("uTextureNoAlpha"));
> +      }

Pull out this if block, no need for it to be nested.  Could even just handle RGBComponentAlphaLayerProgramType separately but meh.

@@ +372,5 @@
> +    vs << mProfile.mDefines[i] << endl;
> +    fs << mProfile.mDefines[i] << endl;
> +  }
> +  vs << mProfile.mVertexShaderString << endl;
> +  fs << mProfile.mFragmentShaderString << endl;

Wow, I just noticed that our programs don't have a #version directive.  That's ok, if it's omitted the oldest version is assumed, but ew.

::: gfx/layers/opengl/LayerManagerOGLProgram.h
@@ +394,5 @@
> +  }
> +
> +  void SetTexturePass2(bool aFlag) {
> +    SetUniform(mProfile.LookupUniformLocation("uTexturePass2"), aFlag ? 1 : 0);
> +  }

Please document what these three do in the header.

::: gfx/layers/opengl/LayerManagerOGLShaders.txt
@@ +345,5 @@
> +@shader sTextureLayer<mask:,Mask,Mask3D>FS
> +#ifdef ENABLE_TEXTURE_RECT
> +#extension GL_ARB_texture_rectangle : require
> +#define sampler2D sampler2DRect
> +#define texture2D texture2DRect

Blarg, this is both great and gross at the same time!

@@ +396,3 @@
>  {
>    vec4 color;
> +#ifdef ENABLE_TEXTURE_YCBCR

Would be nice if we had a full cpp preprocessor instead of just the half-assed one provided by GLSL (so you could #elif in this function).

btw, https://twitter.com/drawElements/status/391174860161822720 might be interesting.

@@ +470,5 @@
> +  if (uTextureNoAlpha)
> +    color = vec4(color.rgb, 1.0);
> +#endif
> +#ifdef ENABLE_TEXTURE_BGR
> +  if (uTextureBGR)

For sanity, you should really call this "SWAP_RB" or something.

However, this is the wrong place to apply it -- you need to swizzle right after sample().  Otherwise the color matrix will be applied to the wrong channels.

Unless TEXTURE_BGR means that the destination texture should be treated as bgr, in which case it /really/ needs some documentation (and probably called SWAP_RB_OUTPUT)
Comment on attachment 819789 [details] [diff] [review]
Part 4: Simplify component alpha path and avoid re-binding and duplicate program activation.

Review of attachment 819789 [details] [diff] [review]:
-----------------------------------------------------------------

::: gfx/layers/opengl/CompositorOGL.cpp
@@ -1229,5 @@
> -        program->SetLayerOpacity(aOpacity);
> -        program->SetLayerTransform(aTransform);
> -        program->SetTextureTransform(gfx3DMatrix());
> -        program->SetRenderOffset(aOffset.x, aOffset.y);
> -        program->SetLayerQuadRect(aRect);

(from old code) RenderOffset, LayerQuadRect aren't set in the new version of the code.  Should they be?
Comment on attachment 820100 [details] [diff] [review]
Part 6: Configure RGB/BGR and alpha/no alpha via defines, not uniforms, since that can be slow on some hardware.

Review of attachment 820100 [details] [diff] [review]:
-----------------------------------------------------------------

This is the wrong patch -- identical to part 7 patch.
Attachment #820100 - Flags: review?(bjacob) → review-
(In reply to Vladimir Vukicevic [:vlad] [:vladv] from comment #41)
> Comment on attachment 819789 [details] [diff] [review]
> Part 4: Simplify component alpha path and avoid re-binding and duplicate
> program activation.
> 
> Review of attachment 819789 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> ::: gfx/layers/opengl/CompositorOGL.cpp
> @@ -1229,5 @@
> > -        program->SetLayerOpacity(aOpacity);
> > -        program->SetLayerTransform(aTransform);
> > -        program->SetTextureTransform(gfx3DMatrix());
> > -        program->SetRenderOffset(aOffset.x, aOffset.y);
> > -        program->SetLayerQuadRect(aRect);
> 
> (from old code) RenderOffset, LayerQuadRect aren't set in the new version of
> the code.  Should they be?

  program->SetLayerQuadRect(aRect);
  program->SetLayerTransform(aTransform);
  program->SetRenderOffset(aOffset.x, aOffset.y);

is set further up in the control flow (above the switch)
Attachment #819789 - Attachment is obsolete: true
Attachment #819789 - Flags: review?(bjacob)
Attachment #825251 - Flags: review?(vladimir)
This addresses the RB_SWAP renaming.
Attachment #820100 - Attachment is obsolete: true
Attachment #825254 - Flags: review?(vladimir)
Note: Part 4 is unchanged.
Attachment #825251 - Flags: review?(vladimir) → review+
Sorry It took me a while to react. I felt comfortable reviewing part 4, not so much the other ones, but I could provide an uneducated review if Vlad is too busy. It would not be as good as if someone who knows that code did it though.
Flags: needinfo?(nical.bugzilla)
Feel free to feedback+/- I will wait for vlad's final r+.
Part 6 has rebase errors. I am uploading it again.
Comment on attachment 825254 [details] [diff] [review]
Part 6: Configure RGB/BGR and alpha/no alpha via defines, not uniforms, since that can be slow on some hardware.

Review of attachment 825254 [details] [diff] [review]:
-----------------------------------------------------------------

r- due to not updating the other Compositors; you should've really already try server'd this whole patch series :)

::: gfx/layers/CompositorTypes.h
@@ +120,5 @@
>  enum EffectTypes
>  {
>    EFFECT_MASK,
>    EFFECT_MAX_SECONDARY, // sentinel for the count of secondary effect types
> +  EFFECT_RGB,

To do this you have to fix all the other compositors; they all reference EFFECT_BGRX etc.

::: gfx/layers/opengl/CompositorOGL.h
@@ +73,5 @@
> +  bool operator< (const ShaderConfigOGL& other) const {
> +    return mFeatures < other.mFeatures;
> +  }
> +
> +  int mFeatures;

uint32_t ?

::: gfx/layers/opengl/LayerManagerOGLShaders.txt
@@ +386,5 @@
>  // if the below was |cb = texture2D(...).r - 0.5|, the "- 0.5" was
>  // just being ignored/skipped.  This, of course, lead to crappy
>  // rendering -- see bug 765150.  Doing them separately like below
>  // makes it all OK.  We don't know if this is special to constants,
>  // special to 0.5, special to addition/subtraction, etc.

This comment is no longer relevant here.  You can move it down to the sample function.
Attachment #825254 - Attachment is obsolete: false
Attachment #825385 - Flags: review? → review?(vladimir)
Comment on attachment 825385 [details] [diff] [review]
Part 6: Configure RGB/BGR and alpha/no alpha via defines, not uniforms, since that can be slow on some hardware.

See above comment, not sure what happened to bugzilla.
Attachment #825385 - Flags: review?(vladimir) → review-
Please finish reviewing this. I will upload separate D2D9 and D2D11 fixes and get Bas to review them.
Attachment #825385 - Attachment is obsolete: true
Attachment #825406 - Flags: review?(vladimir)
Comment on attachment 825406 [details] [diff] [review]
Part 6: Configure RGB/BGR and alpha/no alpha via defines, not uniforms, since that can be slow on some hardware.

Review of attachment 825406 [details] [diff] [review]:
-----------------------------------------------------------------

I did review!  Looks fine otherwise, though here's a few more comments from looking again.  I'd still r+ despite this though, but please consider fixing these.

::: gfx/layers/opengl/CompositorOGL.cpp
@@ +72,5 @@
> +ShaderConfigOGL::SetRenderColor(bool aEnabled)
> +{
> +  if (aEnabled)
> +    mFeatures |= ENABLE_RENDER_COLOR;
> +}

IMO these should all either not take a boolean, or should handle "false" appropriately (clearing out the feature).  I understand why they take booleans though, because the determination might be from a boolean expression... though writing
  config.SetRenderColor(isColor == true);
is eh roughly the same as
  if (isColor) SetRenderColor();

But it would seem odd to me to have
  config.SetRenderColor(true);
  config.SetRenderColor(false);

still leave me with ENABLE_RENDER_COLOR set.

@@ +415,5 @@
>    if (!ctx) {
>      ctx = mGLContext;
>    }
>  
> +  mShaders.clear();

Why did this get renamed to mShaders?  A Program is the actual final installable result; a Shader is just a component of it (e.g. you link two shaders together to make a Program).
Attachment #825406 - Flags: review?(vladimir) → review+
Attachment #825499 - Flags: review?(vladimir)
Attachment #825501 - Flags: review?(vladimir)
Attachment #825499 - Attachment description: Part 8: D3D9 patch → Part 9: D3D9 patch
There is a typo in the last patch. RGB and RGBA are switched around for D3D11. Fix that locally.
Comment on attachment 825499 [details] [diff] [review]
Part 9: D3D9 patch

Review of attachment 825499 [details] [diff] [review]:
-----------------------------------------------------------------

Looks straightforward enough.
Attachment #825499 - Flags: review?(vladimir) → review+
Comment on attachment 825501 [details] [diff] [review]
Part 10: D3D11 patch

Review of attachment 825501 [details] [diff] [review]:
-----------------------------------------------------------------

::: gfx/layers/d3d11/CompositorD3D11.cpp
@@ +461,5 @@
>      return;
> +  case EFFECT_RGB:
> +    mContext->PSSetShader((aFormat == FORMAT_B8G8R8A8 || aFormat == FORMAT_R8G8B8A8)
> +                          ? mAttachments->mRGBShader[aMaskType]
> +                          : mAttachments->mRGBAShader[aMaskType], nullptr, 0);

You already said you swapped these locally; but just calling them out here.
Attachment #825501 - Flags: review?(vladimir) → review+
Oh yeah. There shall be a lot of try-server-ing next :-/ Only tested on mac so far.
Attached patch rollup patch, v1, r=vlad/nical (obsolete) — Splinter Review
Missing precision statement for fragment shader on mobile and build problem for D3D11. Next try.

https://tbpl.mozilla.org/?tree=Try&rev=3a87e750e914
Try looks good. I will attach a new roll-up patch.
Attachment #825518 - Attachment is obsolete: true
Attachment #825728 - Flags: review+
Keywords: checkin-needed
https://hg.mozilla.org/integration/mozilla-inbound/rev/f24ee0606ea6

Andreas, I'm happy landing patches for you, but can you please make sure they have the needed commit information in them? Makes life easier on my end :)
https://developer.mozilla.org/en-US/docs/Mercurial_FAQ#How_can_I_generate_a_patch_for_somebody_else_to_check-in_for_me.3F
(In reply to Andreas Gal :gal from comment #67)
> Try looks good. I will attach a new roll-up patch.

Unfortunately there were reftest failures on the Try push, and as such also now on inbound:
https://tbpl.mozilla.org/php/getParsedLog.php?id=29975149&tree=Mozilla-Inbound
https://tbpl.mozilla.org/php/getParsedLog.php?id=29974611&tree=Mozilla-Inbound

B2G also crashes:
https://tbpl.mozilla.org/php/getParsedLog.php?id=29975645&tree=Mozilla-Inbound

So I've had to backout:
remote:   https://hg.mozilla.org/integration/mozilla-inbound/rev/5bb07c1ae9f5
New try run:

https://tbpl.mozilla.org/?tree=Try&rev=e9e3ec9c6a7d

Since shader programs are now stored in an array in the compositor which has a single context, I made the context pointer in the shaders weak to avoid a cycle. The context will be strongly held by the compositor until the programs are deleted.
Actually we were leaking shader programs, so I am deleting those instead comment 73 now. This might also fix the shutdown crash on B2G.

https://tbpl.mozilla.org/?tree=Try&rev=2037a8d02649
I am a bit speechless about the B2G crash. I might have to call in vendor help. I don't think I am causing that. I am probably just tickling something. The order of context destructions seems to have changed subtly. Lets see if nulling out the context helps.

https://tbpl.mozilla.org/?tree=Try&rev=86d240cfcb4a
I'll set up the emulator build, see if I get this locally.
Maybe we should destroy the surface first?

https://tbpl.mozilla.org/?tree=Try&rev=4456e1c96ac1
I think mSurface is invalid when we hand it to eglDestroySurface.
Alright, so I think whats wrong here is that a shader compilation fails for some odd reason and we never initialize mSurface right and we die trying to destroy it.

11:06:08     INFO -  11-06 19:03:56.067    45   144 D libEGL  : loaded /system/lib/egl/libEGL_emulation.so
11:06:08     INFO -  11-06 19:03:56.067    45   144 D         : HostConnection::get() New Host Connection established 0x45ae0350, tid 144
11:06:08     INFO -  11-06 19:03:56.077    45   144 D libEGL  : loaded /system/lib/egl/libGLESv1_CM_emulation.so
11:06:08     INFO -  11-06 19:03:56.107    45   144 D libEGL  : loaded /system/lib/egl/libGLESv2_emulation.so
11:06:08     INFO -  11-06 19:03:56.138    45   144 I HWComposer: Creating new instance
11:06:08     INFO -  11-06 19:03:56.138    45   144 E HWComposer: Failed to initialize hwc
11:06:08     INFO -  11-06 19:03:56.147    45   144 I Gecko   : OpenGL version detected: 200
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : === SHADER COMPILATION FAILED ===
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : === Source:
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #define ENABLE_RENDER_COLOR
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : /* sUnifiedLayerFS */
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef GL_ES
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : precision lowp float;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_RENDER_COLOR
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform vec4 uRenderColor;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #else
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef GL_ES // for tiling, texcoord can be greater than the lowfp range
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : varying mediump vec2 vTexCoord;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #else
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : varying vec2 vTexCoord;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_OPACITY
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform float uLayerOpacity;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_TEXTURE_RECT
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #extension GL_ARB_texture_rectangle : require
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #define sampler2D sampler2DRect
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #define texture2D texture2DRect
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_TEXTURE_EXTERNAL
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #extension GL_OES_EGL_image_external : require
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #define sampler2D samplerExternalOES
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_TEXTURE_YCBCR
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uYTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uCbTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uCrTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #else
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_TEXTURE_COMPONENT_ALPHA
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uBlackTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uWhiteTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform bool uTexturePass2;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #else
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform sampler2D uTexture;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #endif
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : #ifdef ENABLE_BLUR
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform bool uBlurAlpha;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform vec2 uBlurRadius;
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : uniform vec2
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : === Log:
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : xdY���
11:06:08     INFO -  11-06 19:03:56.187    45   144 I Gecko   : ============
Removed BLUR and COLOR_MATRIX to see whether that changes the behavior here.

https://tbpl.mozilla.org/?tree=Try&rev=63ed92ec9ef3
Forgot to rebuild the shader file include

https://tbpl.mozilla.org/?tree=Try&rev=250cf4debc42
Added a couple more printfs to figure out what the hell is going on. The shader program looks incomplete in the log.

https://tbpl.mozilla.org/?tree=Try&rev=8d68e05abbc5
Looks like gonk printf can't print large strings? Trying fputs.

https://tbpl.mozilla.org/?tree=Try&rev=67e733b2578c
This avoids using any defines and just generates the shader program on the fly:

https://tbpl.mozilla.org/?tree=Try&rev=9dfc61c54cc2

This is really ugly but its not worth trying to do this better until we can dispose of the old layers code.
There is a bug here:

<!DOCTYPE HTML>
<html>
<body style="background:rgb(0,0,0);">
  <div style="position:fixed;left:0;top:0;width:200px;height:200px;background:rgba(255,255,255,0.5);"></div>
</body>
</html>

This box gets rendered all white (opacity is disregarded). Looking into that.
This fixed the android emulator bug. Yay for shitty drivers.

Now still have to figure out comment 85.
For color shaders I didn't pre-multiply the color if layer opacity == 1.0. That fixed the test case above.
This should come back green: https://tbpl.mozilla.org/?tree=Try&rev=a426596dc9d0
Attached patch patch ready for check-in (obsolete) — Splinter Review
Attachment #825728 - Attachment is obsolete: true
Attached patch Patch for inbound. (obsolete) — Splinter Review
Attachment #829081 - Attachment is obsolete: true
Attachment #829088 - Flags: review+
(In reply to Andreas Gal :gal from comment #88)
> This should come back green:
> https://tbpl.mozilla.org/?tree=Try&rev=a426596dc9d0

I ran with the "inbound" patch locally on OS X 10.8 and while I had some failures, they didn't match the try failures.
Some of the failures we might have picked up from inbound.
Rebased again on top of inbound, and pushed to try twice:

without the patch: https://tbpl.mozilla.org/?tree=Try&rev=e50c19810724
with the patch: https://tbpl.mozilla.org/?tree=Try&rev=3db04f4e1e0b
There are definitely failures still that are not picked up from inbound. Looks like alpha or colors differ here:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAPoCAYAAAAmy5qxAAAVl0lEQVR4nO3OMQGAAAwEsZpHN7jghs+QPXfPvQAAAL/IAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjjwAAADsyAMAAMCOPAAAAOzIAwAAwI48AAAA7MgDAADAjA8Do2mQ1wVuQQAAAABJRU5ErkJggg==

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAPoCAYAAAAmy5qxAAAVmUlEQVR4nO3OMQGAAAwEsfpXgUgE4IIbPkP23D33AgAA/CIPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAA78gAAALAjDwAAADvyAAAAsCMPAAAAO/IAAACwIw8AAAAzPt0xxP2+iIWPAAAAAElFTkSuQmCC
Comment on attachment 829088 [details] [diff] [review]
Patch for inbound.

Review of attachment 829088 [details] [diff] [review]:
-----------------------------------------------------------------

::: gfx/layers/opengl/CompositorOGL.cpp
@@ +1231,5 @@
> +    }
> +  }
> +  fs << "void main() {" << endl;
> +  if (aConfig.mFeatures & ENABLE_RENDER_COLOR) {
> +    fs << "  vec4 color = vec4(uRenderColor.rgb, 0.8);" << endl;

I forgot this debug hunk in the patch and it adjusted the alpha by 0.8. That probably caused the failures.
Looks much better but there is something wrong with masking:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAPoCAYAAAAmy5qxAAASjklEQVR4nO3ZQQ3AMAwEweAxf34piEbbSJ1BcA9/Vl4bAAAgsr4eAAAA/IcAAQAAMgIEAADICBAAACAjQAAAgIwAAQAAMgIEAADICBAAACAjQAAAgIwAAQAAMgIEAADICBAAACAjQAAAgIwAAQAAMgIEAADICBAAACAjQAAAgMzrAJk9J3bAddw2AMB5PiAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAABkBAgAAZAQIAACQESAAAEBGgAAAAJnXATJ7TuyA67htAIDzfEAAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAICMAAEAADICBAAAyAgQAAAgI0AAAIDMAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC41QMc2VAEUSWWqwAAAABJRU5ErkJggg==

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAPoCAYAAAAmy5qxAAAaRElEQVR4nO3d38vfdf3HcXe5HK4O2iYuYVMc1MHQdTBUZBKISzTWQWuXB+laGFwUgQd6IIvlDiKICEVwQQ6JlURnQUGwOgmEQu0HxGjOIFCGGK6lEAxWXI8Ovgh+L6LP9dnn+jzen32u2+3xD+zg/YLn/eBz7ZoAAACUXDP0PwAAAFg/BAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKi5qgLkUi7lbM7mdE7n+TyfYzmWpSzlSI5kMYt5MA/mvtyXvdmb23N7dmVXbsyN2ZItucZmaluyJduzPbuyK7fn9uzN3tyX+/JgHsxiFnMkR7KUpRzLsZzMyZzO6byW13Ipl4b+DAEAmMDMBcjlXM4reSUnciKP5/EcyqHckTuyPdsHP5ptNrY923Nn7syhHMoTeSInciKv5tVczuWhP18AAEYYNECWs5wzOZPv5/s5nMPZnd3ZmI2DH7h2dW5jNmZ3dmcpSzmVUzmTM1nO8pCfOAAAK9QD5J28k5M5mcUsZkd2DH602nxvZ3bmoTyUF/JCLuRC+3MHAGCFSoCcy7kcz/Hszu7BD1Jbv1vIQvZmb47neF7P641PHwCAFaYWIOdzPk/n6ezLvixkYfDj0+yDW8hC7sk9eSbP5HzOT+sZAACwwpoHyJ/z5yxmUXTYVbOFLGQxizmbs2v9HAAAWGHNAuT3+X0O5IDwsKt2C1nIgRzIH/KHtXoWAACsMHGAnMu5PJJHcm2uHfyANFuLbczGHM5hvxMBAJiCiQLke/meP5trc7tN2ZQf58dr9dYAAMgEAfKz/GzwA9GssZ/n52v55gAA1rUrCpC/5+/Zki2DH4ZmjW3N1lzMxbV+ewAA69IVBcg3883Bj0Kz5r6Vb6312wMAWJfGDpB/5V/ZmZ2DH4Rmzd2cm/Pv/HsabxAAYF0ZO0B+mp8OfgyaDTG/BQEAmNzYAXJ/7h/8EDQbYp/JZ6bxBgEA1pWxAuRczmVDNgx+CJoNsYUs5K/567TeIgDAujBWgBzN0cGPQLMh91SemtZbBABYF8YKkN3ZPfgBaDbkPplPTustAgCsC6sOkDfz5uDHn9nQ25ANeStvTfNNAgDMtVUHyA/yg8GPP7NZ2I/yo2m+SQCAubbqAPlCvjD44Wc2C/tivjjNNwkAMNdWFSDLWc6NuXHww89sFvaxfCzLWZ722wQAmEurCpA/5o+DH31ms7Q/5U/TfpsAAHNpVQHybJ4d/OAzm6U9l+em/TYBAObSqgJkKUuDH3xms7Sv5qvTfpsAAHNpVQHyqXxq8IPPbJZ2b+6d9tsEAJhLqwoQP0A3+/+7KTdN+20CAMylkQFyMRcHP/bMZnHv5t3GGwUAmCsjA+Q3+c3gh57ZLO7lvNx4owAAc2VkgPgf0M3++36YHzbeKADAXBkZIEdzdPBDz2wWdyzHGm8UAGCujAyQIzky+KFnNot7NI823igAwFwZGSAHc3DwQ89sFreYxcYbBQCYKyMD5NP59OCHntks7oE80HijAABzZWSA3J27Bz/0zGZx+7Kv8UYBAObKyAC5LbcNfuiZzeL2ZE/jjQIAzJWRAXJLbhn80DObxd2aWxtvFABgrowMkK3ZOvihZzaLuyE3NN4oAMBcGRkg1+W6wQ89s1ncpmxqvFEAgLkyMkCGPvLMZnkAAIxHgJhNMAAAxiNAzCYYAADjESBmEwwAgPEIELMJBgDAeASI2QQDAGA8AsRsggEAMB4BYjbBAAAYjwAxm2AAAIxHgJhNMAAAxiNAzCYYAADjESBmEwwAgPEIELMJBgDAeASI2QQDAGA8AsRsggEAMB4BYjbBAAAYjwAxm2AAAIxHgJhNMAAAxiNAzCYYAADjESBmEwwAgPGMvKCuy3WDH3lms7hN2dR4owAAc2VkgGzN1sEPPbNZ3A25ofFGAQDmysgAuSW3DH7omc3ibs2tjTcKADBXRgbIbblt8EPPbBa3J3sabxQAYK6MDJC7c/fgh57ZLG5f9jXeKADAXBkZIPfn/sEPPbNZ3AN5oPFGAQDmysgA+Xw+P/ihZzaLW8xi440CAMyVkQHypXxp8EPPbBb3aB5tvFEAgLkyMkC+nq8PfuiZzeK+kW803igAwFwZGSCncmrwQ89sFvdiXmy8UQCAuTIyQF7Oy4MfemazuN/ld403CgAwV0YGyLt5d/BDz2zWtiEb8s/8s/FGAQDmysgASZKbctPgB5/ZLG1Hdkz7bQIAzKVVBci9uXfwg89slrY/+6f9NgEA5tKqAuQr+crgB5/ZLO1r+dq03yYAwFxaVYA8m2cHP/jMZmnP5blpv00AgLm0qgA5kzODH3xms7SzOTvttwkAMJdWFSBJsiM7Bj/6zGZhN+fmab5JAIC5tuoAOZIjgx9+ZrOwL+fL03yTAABzbdUB8mJeHPzwM5uF/SQ/meabBACYa6sOkLfzdjZkw+DHn9mQW8hCLuTCNN8kAMBcW3WAJMme7Bn8ADQbcnuzd1pvEQBgXRgrQI7m6OAHoNmQeypPTestAgCsC2MFyBt5I9fm2sGPQLMh9qF8KG/lrWm9RQCAdWGsAEmSz+azgx+CZkPsc/ncNN4gAMC6MnaA/CK/GPwQNBtiv8wvp/EGAQDWlbEDZDnL+Xg+PvgxaNbcJ/KJLGd5Gm8QAGBdGTtAkuQ7+c7gB6FZc9/Nd9f67QEArEtXFCAXczFbsmXwo9Cssa3Zmn/kH2v99gAA1qUrCpAkeSkvDX4YmjX22/x2Ld8cAMC6dsUBkvzfD9I/ko8MfiCaTWMfzUfz6/x6rd4aAACZMECS5PW8nkfyiP8fxOZmG7Mxh3M4f8lf1uKNAQDwARMHyPveyBt5LI/l+lw/+AFpdiW7PtfnsTyWN/PmWj0LAABWWLMAed/beTtP5slszubBD0qz1WxzNufJPJm/5W9r/RwAAFhhzQPkfedzPk/n6ezLvixkYfAj0+yDW8hC7sk9eSbP5HzOT+sZAACwwtQC5IMu5mJO5VQO5EA2ZdPgx6etz304H85iFnMqp3IxFxufPgAAK1QC5IPeyTs5mZNZzGJ2ZMfgR6nN93ZmZx7KQ3khL+RCLrQ/dwAAVqgHyErv5b38Kr/K8RzPgRzI1mwd/Gi1q3Pbsi0HciDfzrfzUl7Ke3lv6M8bAIAVBg+QlS7ncl7JKzmRE3k8j+dQDuWO3JHt2T74gWuzse3ZnjtzZw7lUJ7IEzmRE3k1r+ZyLg/9+QIAMMLMBcj/cimXcjZnczqn83yez7Ecy1KW8nAezsEczP7sz125K3uyJ7uyK9uyzZ8FnuFtzuZsy7bsyq7syZ7clbuyP/tzMAfzcB7OUpZyLMdyMidzOqfzWl7LpVwa+jMEAGACV1WAAAAAVzcBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoEaAAAAANQIEAACoESAAAECNAAEAAGoECAAAUCNAAACAGgECAADUCBAAAKBGgAAAADUCBAAAqBEgAABAjQABAABqBAgAAFAjQAAAgBoBAgAA1AgQAACgRoAAAAA1AgQAAKgRIAAAQI0AAQAAagQIAABQI0AAAIAaAQIAANQIEAAAoOYaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBZ9R+9/MoMAN+LbQAAAABJRU5ErkJggg==
Reduced test case:

<!DOCTYPE HTML>
<title>Test for clipping of border-radius</title>
<style>
#contain {
  width: 200px;
  height: 100px;
  position: relative;
}
#contain > div > canvas {
  border-radius: 20px / 40px;
}
</style>
<div id="contain">
<div><canvas id="canvas" height="100" width="200"></canvas></div>
<script>
var canvas = document.getElementById("canvas");
var cx = canvas.getContext("2d");
cx.fillStyle="lime";
cx.fillRect(0, 0, 200, 100);
</script>
</div>
CJ, this needs a bit more work, do you think Morris could figure out the remaining issues and see if we can land this?
Flags: needinfo?(cku)
Look through comments, reftest failures/ leak and B2G run time crash.
Let's me discuss with Morris tomorrow.
Keep needinfo to myself and needinfo to Morris as well.
Flags: needinfo?(mtseng)
Attached patch rollup.patch (obsolete) — Splinter Review
I found uMaskTexture and uMaskQuadTransform are not bind to profile. I also rebase patch to latest m-c. Right now the reftest is still fail. I'm trying to find out why it still fail.
Attachment #829088 - Attachment is obsolete: true
Flags: needinfo?(mtseng)
Attached patch rollup.patch (obsolete) — Splinter Review
In the color layer case. I found shader program output alpha with 0.8 cause many reftest failed. Modified it to 1.0.
Here is try push: https://tbpl.mozilla.org/?tree=Try&rev=feddf55b9be7
Some webgl reftest still failed. I'll investigate this later.

Andreas, I can handle this bug, Could you re-assign it to me? Thanks.
Attachment #8357036 - Attachment is obsolete: true
Flags: needinfo?(gal)
After reading patch and discuss with Morris, patches are are kind of shader code generator. I think Morris can handle it. Clear needinfo to myself
Flags: needinfo?(cku)
Assignee: gal → mtseng
Flags: needinfo?(gal)
You can always steal any bug from me at any time for any reason or no reason at all. Thanks Morris!
Attached patch rollup.patch (obsolete) — Splinter Review
webgl reftest failed because TexCoordMultiplier didn't handle correctly.
And also some reftest error on Android because some precision setting on the GLES is incorrect.

After those two fix. There are still 2 reftest failures on Android 4.0. 
Here is try push: https://tbpl.mozilla.org/?tree=Try&rev=5ac51123837a
Attachment #8357681 - Attachment is obsolete: true
TexCoordMultiplier is used by WebGL case. WebGL use extension "TextureRect". TextureRect use texture coordinate from 0 to texture size instead of 0 to 1. So we need send texture size to shader to adjust texture coordinate. In the origin patch we pre-multiply TexCoordMultiplier to TextureTransform but TextureTransform will reset by BindAndDrawQuadWithTextureRect function. So we still need a separate TexCoordMultiplier variable.

The precision setting mentioned above is this shader code "precision lowp float;" should be "precision mediump float;"
Attached patch rollup.patch (obsolete) — Splinter Review
This patch should pass all test on tryserver.
try push: https://tbpl.mozilla.org/?tree=Try&rev=77970e1d0ec6
Attachment #8362489 - Attachment is obsolete: true
Attachment #8374647 - Flags: review?(gal)
Comment on attachment 8374647 [details] [diff] [review]
rollup.patch

Review of attachment 8374647 [details] [diff] [review]:
-----------------------------------------------------------------

Thanks for fixing this! Please commit under your own name. You did the hard work here.

::: gfx/layers/opengl/OGLShaderProgram.h
@@ +406,5 @@
>      SetUniform(KnownUniform::TexCoordMultiplier, 2, f);
>    }
>  
> +  // Set whether we want the component alpha shader to return the color
> +  // vevtor (pass 1, false) or the alpha vector (pass2, true). With support

vector
Attachment #8374647 - Flags: review?(gal) → review+
https://hg.mozilla.org/mozilla-central/rev/c0e256be4775
Status: NEW → RESOLVED
Closed: 6 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla30
Depends on: 974189
Depends on: 975121
Depends on: 987497
You need to log in before you can comment on or make changes to this bug.