History log of /frameworks/base/libs/hwui/ProgramCache.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
669b15a93548b82135c73196665bcb7f03d87795 31-Mar-2017 Derek Sollenberger <djsollen@google.com> Fix HWUI/Skia Gradients to premultiply the colors prior to interpolation

This is fixed in Skia by passing the appropriate flag when the shader is
generated. The fix in HWUI is to reverse the premultiplication and
interpolation steps.

Test: bit CtsUiRenderingTestCases:.testclasses.ShaderTests
Bug: 34323783
Change-Id: I3417141949f62fcc696b6d8213a4b446d7d0cbf8
/frameworks/base/libs/hwui/ProgramCache.cpp
caaaa66e57293e4a6f312649bf472eab84d5c7fe 27-Mar-2017 Romain Guy <romainguy@google.com> Convert bitmaps to sRGB/scRGB when they have a color profile

This change also fixes an issue with RGBA16F bitmaps when modulated
with a color (for instance by setting an alpha on the Paint object).

The color space conversion is currently done entirely in the shader,
by doing these operations in order:

1. Sample the texture
2. Un-premultiply alpha
3. Apply the EOTF
4. Multiply by the 3x3 color space matrix
5. Apply the OETF
6. Premultiply alpha

Optimizations:
- Steps 2 & 6 are skipped for opaque (common) bitmaps
- Step 3 is skipped when the color space's EOTF is close
to sRGB (Display P3 for instance). Instead, we use
a hardware sRGB fetch (when the GPU supports it)
- When step 3 is necessary, we use one of four standard
EOTF implementations, to save cycles when possible:
+ Linear (doesn't do anything)
+ Full parametric (ICC parametric curve type 4 as defined
in ICC.1:2004-10, section 10.15)
+ Limited parametric (ICC parametric curve type 3)
+ Gamma (ICC parametric curve type 0)

Color space conversion could be done using texture samplers
instead, for instance 3D LUTs, with or without transfer
functions baked in, or 1D LUTs for transfer functions. This
would result in dependent texture fetches which may or may
not be an advantage over an ALU based implementation. The
current solution favor the use of ALUs to save precious
bandwidth.

Test: CtsUiRenderingTests, CtsGraphicsTests
Bug: 32984164
Change-Id: I10bc3db515e13973b45220f129c66b23f0f7f8fe
/frameworks/base/libs/hwui/ProgramCache.cpp
6183c97e5f317ad52ad16fe50e40129e2c7b2150 16-Mar-2017 Romain Guy <romainguy@google.com> Bowing my head in shame, going back to gamma interpolated gradients

Frankengradients (linearly interpolated RGB, gamma interpolated alpha) look
fantastic but unfortunately create sligh compatibility issues. For instance,
a gradient from 0xffea1030 to 0x00ea1030 (opaque to alpha, with a single
color) blended on top of 0xff101010 would not look the same as a single
opaque gradient from 0xffea1030 to 0xff101010. The difference is hardly
noticeable on simple gradients but it could cause confusion amongst app
developers. Their life is hard enough as it is, let's be good to them.

My crusade against the gamma world is not over and one day I shall
be the victor. I am patience.

Bug: 35485208
Test: UiRendering.ShaderTests, UiRendering.GradientTests, manual testing
Change-Id: I8204e60cdf0a6b12dfe22638d30ca9622687000e
/frameworks/base/libs/hwui/ProgramCache.cpp
0d86d7ebc2b83f0bdd28bb99e57289215947f2e0 16-Mar-2017 Romain Guy <romainguy@google.com> Improve dithering of alpha gradients

Bug: 32984164
Test: CtsUiRenderingTestCases
Change-Id: Ic728725845befd3c52cc7b043d5c6f8e33fcfcd2
/frameworks/base/libs/hwui/ProgramCache.cpp
efb4b06493fe7b1604c762a448b13c7af2845a8d 27-Feb-2017 Romain Guy <romainguy@google.com> Add ColorSpace information on Bitmap

This is the first step toward interpreting color spaces at render time.

Bug: 32984164
Test: BitmapColorSpaceTest in CtsGraphicsTestCases

Change-Id: I0164a18f1ed74a745874fe5229168042afe27a04
/frameworks/base/libs/hwui/ProgramCache.cpp
91a8ec0145ae0ce85782b40c964d16ba2465aec7 08-Feb-2017 Romain Guy <romainguy@google.com> Don't print shader source

Bug: 32984164
Test: compile & run
Change-Id: If632e49b773ca44d4e09e3acb5979f4df15a8d77
/frameworks/base/libs/hwui/ProgramCache.cpp
636afc1877882dc9cf73b49f8a68c73cc418d8cd 07-Feb-2017 Romain Guy <romainguy@google.com> Apply transfer function when rendering with linear textures

RGBA16F bitmaps are always encoded in linear space, which means we must
apply the opto-electronic transfer function before we can render them
in the framebuffer.

Since our linear bitmaps are assumed to be scRGB, values can be negative.
The OETF is a slightly modified sRGB OETF:

sign(x) * OETF_sRGB(abs(x))

This effectively mirrors the OETF over the negative domain.

This CL also removes the "optimized" shader generation path. With
current compilers, the optimized path doesn't do anything of value
and makes ProgramCache difficult to maintain. Shader compilers inline
everything and are really good at folding expressions and removing
unused code.

Bug: 32984164
Test: CtsUiRenderingTestCases
Change-Id: Ieb458ad53574e3a8959aa6bccbbd2d1fe203cbc5
/frameworks/base/libs/hwui/ProgramCache.cpp
9fe7e16399aa9739b63ce9add1d04fd8ef00678f 04-Feb-2017 Romain Guy <romainguy@google.com> Gradients are now an absurd Chimera

As of O, gradients are interpolated in linear space. This unfortunately
affects applications that were expecting a certain behavior for the
alpha ramp. This change attempts to get the best of both world: better
color interpolation (in linear space) and the old alpha interpolation
(in gamma space). This is achieved by applying the electro-optical
transfer function to the alpha channel; an idea so wrong it would
make any graphics programmer worth his salt weep in disgust.

As abhorrent this idea might be to me, it also acts as a faint
beacon of hope admist the unfathomable darkness that is Android's
color management.

And if you allow me another misguided metaphor, this change
represents the flotsam I can cling onto in the hope to one day
reach the bountiful shores of linear blending and accurate color
management. Would this change not fix the distress caused by its
predecessors, I will have no choice but bow my head in shame until
the day I can finally devise an infallible plan.

Bug: 33010587
Test: CtsUiRenderingTestCases
Change-Id: I5397fefd7944413f2c820e613a5cba50579d4dd5
/frameworks/base/libs/hwui/ProgramCache.cpp
68a9dd8c88869fa47aa7d3c2e9ecce5077452f57 14-Dec-2016 Sergei Vasilinetc <sergeyv@google.com> Merge "HWUI: set correct sampler for external texture in shaders"
9c97e48fbe389180b4b64845f093c53c92c374f3 13-Dec-2016 sergeyv <sergeyv@google.com> HWUI: set correct sampler for external texture in shaders

Test: hwuimacro hwbitmapcompositeshader
bug:30999911
Change-Id: Ic63f7109a4a7069b62c0b21efae2d4ba7e6d64be
/frameworks/base/libs/hwui/ProgramCache.cpp
a0ed6f03f6f06eb41cbcc15c0a99b4a78fd91bef 13-Dec-2016 Romain Guy <romainguy@google.com> Pre-multiply gradient colors the right way

Alpha pre-multiplication must be done after applying the
opto-electronic transfer function when linear blending is
disabled. The correct way would be to pre-multiply before
gamma encoding but this leads to improper blending which
cannot be corrected without using sRGB frame buffers and
texture sampling.

Bug: 33010587
Test: cts-tradefed run singleCommand cts-dev --module CtsUiRenderingTestCases --test android.uirendering.cts.testclasses.GradientTests
Change-Id: I5f04bda4cb9f63674537aef5931621c14d601884
/frameworks/base/libs/hwui/ProgramCache.cpp
554ffeb8b7c836da43a637c59eedfc617895b19d 16-Nov-2016 sergeyv <sergeyv@google.com> Support hardware bitmaps in bitmap shaders

Test: hwuimacro bitmapShaderEglImage --onscreen.
bug:30999911
Change-Id: I9d16a1c217a4474841794cf27ce49e3f7823678e
/frameworks/base/libs/hwui/ProgramCache.cpp
c2f31df8b3b9a237e9abffc59c61804ad8495073 28-Oct-2016 Mike Reed <reed@google.com> use SkBlendMode

skbug.com/5814

Test: compile only
Change-Id: Ibbaff43df1117b2ca77fd8f917f03d88cc476330
(cherry picked from commit 26edbcba8a2ed4cb300e7f87e679e3b73cec2772)
/frameworks/base/libs/hwui/ProgramCache.cpp
8762e332e3797fb41929a1c6069207f4906ca329 12-Oct-2016 Romain Guy <romainguy@google.com> Various fixes for linear blending and gradients

With linear blending turned off some textures were still
created as sRGB textures instead of linear textures.
Multi-stop gradients were not behaving properly on devices
with no support for float textures.
Gradients are now always interpolated in linear space
even if linear blending is off.
New functions to always force sRGB->linear->sRGB conversions.

Test: Manual testing
Bug: 29940137
Change-Id: Ie2f84ee2a65fd85570e88af813e841e0e625df6c
/frameworks/base/libs/hwui/ProgramCache.cpp
253f2c213f6ecda63b6872aee77bd30d5ec07c82 29-Sep-2016 Romain Guy <romainguy@google.com> Linear blending, step 1

NOTE: Linear blending is currently disabled in this CL as the
feature is still a work in progress

Android currently performs all blending (any kind of linear math
on colors really) on gamma-encoded colors. Since Android assumes
that the default color space is sRGB, all bitmaps and colors
are encoded with the sRGB Opto-Electronic Conversion Function
(OECF, which can be approximated with a power function). Since
the power curve is not linear, our linear math is incorrect.
The result is that we generate colors that tend to be too dark;
this affects blending but also anti-aliasing, gradients, blurs,
etc.

The solution is to convert gamma-encoded colors back to linear
space before doing any math on them, using the sRGB Electo-Optical
Conversion Function (EOCF). This is achieved in different
ways in different parts of the pipeline:

- Using hardware conversions when sampling from OpenGL textures
or writing into OpenGL frame buffers
- Using software conversion functions, to translate app-supplied
colors to and from sRGB
- Using Skia's color spaces

Any type of processing on colors must roughly ollow these steps:

[sRGB input]->EOCF->[linear data]->[processing]->OECF->[sRGB output]

For the sRGB color space, the conversion functions are defined as
follows:

OECF(linear) :=
linear <= 0.0031308 ? linear * 12.92 : (pow(linear, 1/2.4) * 1.055) - 0.055

EOCF(srgb) :=
srgb <= 0.04045 ? srgb / 12.92 : pow((srgb + 0.055) / 1.055, 2.4)

The EOCF is simply the reciprocal of the OECF.
While it is highly recommended to use the exact sRGB conversion
functions everywhere possible, it is sometimes useful or beneficial
to rely on approximations:

- pow(x,2.2) and pow(x,1/2.2)
- x^2 and sqrt(x)

The latter is particularly useful in fragment shaders (for instance
to apply dithering in sRGB space), especially if the sqrt() can be
replaced with an inversesqrt().

Here is a fairly exhaustive list of modifications implemented
in this CL:

- Set TARGET_ENABLE_LINEAR_BLENDING := false in BoardConfig.mk
to disable linear blending. This is only for GLES 2.0 GPUs
with no hardware sRGB support. This flag is currently assumed
to be false (see note above)
- sRGB writes are disabled when entering a functor (WebView).
This will need to be fixed at some point
- Skia bitmaps are created with the sRGB color space
- Bitmaps using a 565 config are expanded to 888
- Linear blending is disabled when entering a functor
- External textures are not properly sampled (see below)
- Gradients are interpolated in linear space
- Texture-based dithering was replaced with analytical dithering
- Dithering is done in the quantization color space, which is
why we must do EOCF(OECF(color)+dither)
- Text is now gamma corrected differently depending on the luminance
of the source pixel. The asumption is that a bright pixel will be
blended on a dark background and the other way around. The source
alpha is gamma corrected to thicken dark on bright and thin
bright on dark to match the intended design of fonts. This also
matches the behavior of popular design/drawing applications
- Removed the asset atlas. It did not contain anything useful and
could not be sampled in sRGB without a yet-to-be-defined GL
extension
- The last column of color matrices is converted to linear space
because its value are added to linear colors

Missing features:
- Resource qualifier?
- Regeneration of goldeng images for automated tests
- Handle alpha8/grey8 properly
- Disable sRGB write for layers with external textures

Test: Manual testing while work in progress
Bug: 29940137

Change-Id: I6a07b15ab49b554377cd33a36b6d9971a15e9a0b
/frameworks/base/libs/hwui/ProgramCache.cpp
138c21fbec12bead3c7ca1f181c3fd35542ccb00 29-Apr-2016 Chris Craik <ccraik@google.com> Use LUT for computing final shadow alpha

bug:27415250

Significantly reduces shadow fragment shader computation.

Change-Id: Ie9b3c712700754b3734d0ae9cda8751c298fc59e
/frameworks/base/libs/hwui/ProgramCache.cpp
11718bc17bcfc56dfb9f4362eebf640b025c4415 22-Sep-2015 Chris Craik <ccraik@google.com> Remove shader based gamma approach

Also fixes some INIT_LOGD logs

Change-Id: I212a71a1e7b366aea41f7c3c8cc169d509d6e4a2
/frameworks/base/libs/hwui/ProgramCache.cpp
71c10ee8be20be968b19a88f771077933f7cc155 22-Aug-2015 Chris Craik <ccraik@google.com> Merge "Switch several enums to enum classes"
b9ce116dac378b4cf4490f265dcbd5704a1dd43c 21-Aug-2015 Chris Craik <ccraik@google.com> Switch several enums to enum classes

Change-Id: I00ecd0b61657196b51704f70ca31a9d1c1ac254e
/frameworks/base/libs/hwui/ProgramCache.cpp
8bd68c6b7d4d6d3137edf1cbdc0e0de266c5b9ee 20-Aug-2015 Chris Craik <ccraik@google.com> Define GLSL version

bug:21923805

Change-Id: Ie44fb9cf38ef5f19df957e4a639d9c7d47da391e
/frameworks/base/libs/hwui/ProgramCache.cpp
5a4690bf26932c0d6940e4af8516d920e09ae81a 14-Jul-2015 Chris Craik <ccraik@google.com> Clean up unncessary defines

LOG_TAG and TRACE_TAG are already defined in the makefile

Change-Id: I9e53e3dacbe018441edd74cb7c8c90846defee74
/frameworks/base/libs/hwui/ProgramCache.cpp
ecf091e171012831cddea59f1f64a46e87ee8c4f 17-Feb-2015 ztenghui <ztenghui@google.com> Update the shadow fall off function from cosine to gaussian.

Also tune the parameters to match a better look designed by UX team.
For ambient part, the acos transformed alpha is not needed any more.

b/19370798

Change-Id: I20d2615d1be502eb900942ed756aecd1660dee48
/frameworks/base/libs/hwui/ProgramCache.cpp
c0bf700441e1b53f1693d7445dc6f9876f5c9b4f 06-Mar-2015 Derek Sollenberger <djsollen@google.com> SkPorterDuff Multiply mode maps to SkXfermode modulate.

bug:19627342
Change-Id: I97f26ca1bc8abe2768f4a12cc70fb0fa5d905098
/frameworks/base/libs/hwui/ProgramCache.cpp
1c1c3fe9ebde8f911da65d49bdb91af583453dc6 06-Mar-2015 Chris Craik <ccraik@google.com> Avoid invalid shader creation for certain blend modes

bug:19627342

Change-Id: I41e3c1ce8e6fa52f046ec492d19de7cab92b9ec5
/frameworks/base/libs/hwui/ProgramCache.cpp
117bdbcfa3e8306dad21e7e01fa71b00cdfa7265 05-Feb-2015 Chris Craik <ccraik@google.com> Glop ColorFilter & VertexBuffer support, initial enable

Enables Glop rendering for supported Rects and VertexBuffers
Also removes unused Query object

Change-Id: Ibe227bc362685a153159f75077664f0947764e06
/frameworks/base/libs/hwui/ProgramCache.cpp
d41c4d8c732095ae99c955b6b82f7306633004b1 06-Jan-2015 Chris Craik <ccraik@google.com> Add overrides and switch to nullptr keyword for all files

Adds remaining missing overrides and nullptr usages, missed due to
an extreme failure in tool usage.

Change-Id: I56abd72975a3999ad13330003c348db40f59aebf
/frameworks/base/libs/hwui/ProgramCache.cpp
51d6a3db97bdd5315f1a17a4b447d10a92217b98 23-Dec-2014 Chris Craik <ccraik@google.com> Cleanup various clang warnings, use unique_ptrs in several places

Change-Id: I347904b25e51fcc7de14b1e72f1acd0f6ba26f3f
/frameworks/base/libs/hwui/ProgramCache.cpp
64bb413a664001c95c8439cf097dc3033f4ed733 22-Nov-2014 Andreas Gampe <agampe@google.com> Revert "resolved conflicts for merge of 220c3f4f to master"

Reverted as hwui doesn't agree.

This reverts commit 8a902d9f24e83c87b054adb5836b4a5b8a257be9.

Change-Id: I109e7b02bee2921e2155ded6df36f52e6f574b5a
/frameworks/base/libs/hwui/ProgramCache.cpp
2ab8298dc37851aab4623ba3f98d71055d653a73 21-Nov-2014 Andreas Gampe <agampe@google.com> resolved conflicts for merge of 99377df1 to lmp-mr1-dev-plus-aosp

Change-Id: I3a98f55832ac447b1ed0dd129c7a93d088025943
42ddc18d108f789705ad4eb697ce9599ad322507 21-Nov-2014 Andreas Gampe <agampe@google.com> Frameworks/base: Unused parameters in hwui

Remove Clang cutout for unused parameters. Fix warnings.

Remove Clang cutout for deprecated Skia function usage. Has been
fixed in the L push.

Change-Id: I7ea073ff67127cc1e14e798b655e2c50615fe8e7
/frameworks/base/libs/hwui/ProgramCache.cpp
23d307c8d88f4a3849163b9e5b7cd11d0d4f372c 27-Oct-2014 John Reck <jreck@google.com> Cleanup debug options

Bug: 18138852
Bug: 18065434
Change-Id: Ibb07b73b147c2a8b287fe8aee3f6624582f21b00
/frameworks/base/libs/hwui/ProgramCache.cpp
73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7 17-Sep-2014 Chris Craik <ccraik@google.com> Handle premultiplication correctly for ColorMatrixColorFilters

bug:17405627

Previously, the input content to the color matrix computation was left
premultiplied. Since the color matrix could reduce the alpha channel,
the alpha was re-multiplied, but this was incomplete, and incorrect.

Instead, apply the color matrix in unpremultiplied space.

Change-Id: I87b8e03d2e228e6ded81f7bbfea952605d7a095c
/frameworks/base/libs/hwui/ProgramCache.cpp
e23b8dd58fba275802d48fccb43170845aac0382 04-Sep-2014 Derek Sollenberger <djsollen@google.com> Merge "Remove invalid premul step from HWUI's matrix color filter." into lmp-dev
68a73e8700c3bb30395e4ebf1b6e5a9b81699a5a 30-Aug-2014 Chris Craik <ccraik@google.com> Fix precision issues for roundrect clipping

bug:16984008
Change-Id: I941232d569293717f6bcd249d9e01f72a7409d2e
/frameworks/base/libs/hwui/ProgramCache.cpp
79c9f9168919b0fbb26f8ecd5704875dbc6a539b 18-Aug-2014 Derek Sollenberger <djsollen@google.com> Remove invalid premul step from HWUI's matrix color filter.

bug: 16186699
Change-Id: Ia0b828e76ce4831ee9e3b4f54c697e6017f1604d
/frameworks/base/libs/hwui/ProgramCache.cpp
91a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0 12-Aug-2014 Chris Craik <ccraik@google.com> Switch to cos interpolation of shadow alpha

bug:16852257

Updates default shadow opacities to compensate.

Also, update variable/constant naming related to vertex alpha.

Change-Id: I9055b4ac3c9ac305ca9d515f21b52d6aa6dc9c5c
/frameworks/base/libs/hwui/ProgramCache.cpp
bf75945e7a1ae7c1000682716643c942c1e19ba6 12-Aug-2014 Chris Craik <ccraik@google.com> Rework shadow interpolation

bug:16852257

Use pow(alpha, 1.5) to avoid harsh edges on shadow alpha ramps.

Also adjusts shadow constants to compensate.

Change-Id: I5869956d7d292db2a8e496bc320084b6d64c3fb7
/frameworks/base/libs/hwui/ProgramCache.cpp
f99f320dc79e290a89d668243b6d77c3442b36ab 06-Aug-2014 Chris Craik <ccraik@google.com> Fix large radius RR clipping issue on certain devices

bug:16804363

Since dist can be in the 1000s of pixels, and length() may square it
in its current precision, scale the value down significantly first,
since final precision isn't very important.

Change-Id: Id20f7a49d6171355c8e242442c2b5083f746dca3
/frameworks/base/libs/hwui/ProgramCache.cpp
deeda3d337aed1eee218b89a7aba5992ced371f0 06-May-2014 Chris Craik <ccraik@google.com> Round rect outline clipping

Change-Id: Iee9cf4f719f6f1917507b69189ad114fa365917b
/frameworks/base/libs/hwui/ProgramCache.cpp
76d3a1b8d035d27bc80b0f2fc480a903bd001514 10-Dec-2013 Derek Sollenberger <djsollen@google.com> Removing SkiaColorFilter and inspecting the native object directly.

bug: 10650594
Change-Id: I4fcf66d008765afa0e35d011f58bc792183cb74f
/frameworks/base/libs/hwui/ProgramCache.cpp
6d29c8d5218cac0fb35f3b7c253f2bdebd44f15a 09-May-2013 Chris Craik <ccraik@google.com> Add tessellation path for points

bug:4351353
bug:8185479

Point tessellation is similar to line special case, except that we
only tessellate one point (as a circle or rect) and duplicate it
across other instances.

Additionally:

Fixes square caps for AA=false lines

Cleanup in CanvasCompare, disabling interpolation on zoomed-in
comparison view

Change-Id: I0756fcc4b20f77878fed0d8057297c80e82ed9dc
/frameworks/base/libs/hwui/ProgramCache.cpp
78dd96d5af20f489f0e8b288617d57774ec284f7 03-May-2013 Romain Guy <romainguy@google.com> Add an on-screen overdraw counter

The counter can be enabled by setting the system property called
debug.hwui.overdraw to the string "count". If the string is set
to "show", overdraw will be highlighted on screen instead of
printing out a simple counter.

Change-Id: I9a9c970d54bffab43138bbb7682f6c04bc2c40bd
/frameworks/base/libs/hwui/ProgramCache.cpp
032d47af737d803e841ab79f38ac9068a46c9aeb 09-Apr-2013 Romain Guy <romainguy@google.com> Change the dither texture's swizzling

This is a more elegant way to sample from a float alpha texture.
Instead of sampling from the red channel in the fragment shader
we can set the alpha channel swizzle to redirect it to the
red channel. This lets us sample from the alpha channel in the
fragment shader and get the correct value.

Change-Id: I95bbf7a82964e1bf42c0fee1b782b6bdbbcef618
/frameworks/base/libs/hwui/ProgramCache.cpp
b48800428906ae455c2b63acacd44e390e1fee49 05-Apr-2013 Romain Guy <romainguy@google.com> Use float textures to render gradients when possible

Float textures offer better precision for dithering.

In addition this change removes two uniforms from gradient shaders.
These uniforms were used to dither gradients but their value is
a build time constant. Instead we hardcode the value directly in
the shader source at compile time.

Change-Id: I05e9fd3eef93771843bbd91b453274452dfaefee
/frameworks/base/libs/hwui/ProgramCache.cpp
096b8d96d539429de5e67b2821ef3f9ee0300842 01-Mar-2013 Chris Craik <ccraik@google.com> Add shader program selection shortcut

Add a key manipulation that makes black text/paths use the standard
simple bitmap/patch shader, since they are the same. Previously we'd
create a separate shader for each because the keys differed, even
though the shaders were functionally equivalent.

Also fixes some issues around setting DEBUG_PROGRAM

Change-Id: I0c77c684d58da03501ee9ab8239c7d4a70fd6b5c
/frameworks/base/libs/hwui/ProgramCache.cpp
3ff0bfdd144bba3b023eda8c49b25fb0d0de8653 25-Feb-2013 Romain Guy <romainguy@google.com> Add new property to debug non-rectangular clip operations

This change adds a new property called "debug.hwui.show_stencil_clip"
that accepts the following values:

- "highlight", colorizes in green any drawing command that's tested
against a non-rectangular clip region
- "region", shows the non-rectangular clip region in blue every time
it is used
- "hide", default value, nothing is shown

Change-Id: I83c8602310edc4aaeb8b905371cdd185b17d32b5
/frameworks/base/libs/hwui/ProgramCache.cpp
ff316ec7a76e52572a2e89b691e6b3bba0cafba3 14-Feb-2013 Romain Guy <romainguy@google.com> Implement support for drawBitmapMesh's colors array

Change-Id: I3d901f6267c2918771ac30ff55c8d80c3ab5b725
/frameworks/base/libs/hwui/ProgramCache.cpp
65cd612face362d054a85d0f7e5881c59cd523be 11-Dec-2012 Chris Craik <ccraik@google.com> Add cap tessellation support

bug:7117155
bug:8114304

Currently used for lines (with and without AA) and arcs with useCenter=false

Also removes 0.375, 0.375 offset for AA lines

Change-Id: Ic8ace418739344db1e2814edf65253fe7448b0b0
/frameworks/base/libs/hwui/ProgramCache.cpp
39284b763a09688468ed3799ebd2ebb76ea5dfd5 27-Sep-2012 Romain Guy <romainguy@google.com> Make gradients beautiful again
Bug #7239634

This change passes two matrices to the vertex shader instead of one.
We used to compute the final MVP matrix on the CPU to minimize the
number of operations in the vertex shaders. Shader compilers are
however smart enough to perform this optimization for us. Since we
need the MV matrix to properly compute gradients dithering, this
change splits the MVP matrix into two. This has the advantage of
removing one matrix multiplication per drawing operation on the
CPU.
The SGX 540 shader compiler produces the same number of instructions
in both cases. There is no penalty hit with having two matrices
instead of one. We also send so few vertices per frame that it
does not matter very much.

Change-Id: I17d47ac4772615418e0e1885b97493d31435a936
/frameworks/base/libs/hwui/ProgramCache.cpp
e83221c547cf2038752e5378e72e49a62cfd9954 25-Sep-2012 Romain Guy <romainguy@google.com> Fix alpha channel computation with ColorMatrixColorFilter
Bug #7222476

There were two issues:
- Blending was ignored with color filters
- The addition vector of a color filter was treated as integer values
instead of float values

Change-Id: Id94065704a30ee8aaaa5724a9f3a3cff7c50ced7
/frameworks/base/libs/hwui/ProgramCache.cpp
dbb261455b1b8d2fdf4f0f8ad84ddb09dda1ed9b 22-Sep-2012 Chet Haase <chet@google.com> Merge "Optimize shaders for dithered gradients" into jb-mr1-dev
a1d12dd619c86c9ac121a3095ff5e5633c11e876 21-Sep-2012 Chet Haase <chet@google.com> Optimize shaders for dithered gradients

It's faster to compute a dither calculation in the vertex shader and use
a varying (letting the GPU interpolate the fragment values) than to perform
that calculation in the fragment shader as part of a texture lookup.

Issue #7207600 Prime mr1 shader performance issues
Issue #7158326 Bad framerates on MR1 (Mako, Manta, Prime)

Change-Id: I15789582a6e9e2d8b9dd22aa5b0f72f0ba1cce7f
/frameworks/base/libs/hwui/ProgramCache.cpp
710f46d9d6a5bf9ea1c1833384caf61e1934124f 18-Sep-2012 Chris Craik <ccraik@google.com> Polygonal rendering of simple fill shapes

bug:4419017

Change-Id: If0428e1732139786cba15f54b285d880e4a56b89
/frameworks/base/libs/hwui/ProgramCache.cpp
0990ffbc4d407e174423a4a04b5902ed83f71db5 18-Sep-2012 Chet Haase <chet@google.com> Fix GL shader bugs

Fixing errors in emitted shader code that caused GL errors
at runtime

Change-Id: I267a84398a81329a6688b292505f8779bd750ad1
/frameworks/base/libs/hwui/ProgramCache.cpp
1c5c206953d673f8424908c77c974c06d5b99a9c 18-Sep-2012 Chet Haase <chet@google.com> Fix bad shader code

Shader code missing "=" in a couple of cases.

Change-Id: Iff8a99a0ccb2903c30e2bdb2f698ef9b2e03d5d1
/frameworks/base/libs/hwui/ProgramCache.cpp
a938f569ce206c1ed68d736181016b5b708c0084 14-Sep-2012 Romain Guy <romainguy@google.com> Fix modulation and gamma correction issues

Modulation is normally enabled in a shader when drawing with an alpha
mask (A8 texture.) Modulation is used to do one of two things:

- Colorize the primitive (to draw text in red for instance)
- Apply extra translucency (50% translucent circle filled with a bitmap)

The current implementation has four issues:

1. Unnecessary work is performed by assigning the modulation color
to vec4 fragColor early in the shader
2. The modulation color's alpha is applied twice when the primitive
is drawn with an SkShader
3. The decision to modulate is wrong and triggers when any of the
RGB channels is < 1.0. Only the alpha channel needs to be taken
into account to make the decision
4. Gamma correction is not applied properly

This change addresses all four issues above.

Change-Id: I73fcc74efc4b094bf2d1b835f10ffaa2ea4b9eb9
/frameworks/base/libs/hwui/ProgramCache.cpp
9f44a13a125980fee92cdc76376063129f0eebc9 14-Sep-2012 Chris Craik <ccraik@google.com> Multiply alpha for AA as late as possible

Should be done after all color computation

Change-Id: Iaadd565f7d2263f111f6841a00e7c341025833d3
/frameworks/base/libs/hwui/ProgramCache.cpp
6ebdc114e0d72137394f02bc8ffe9d7a782a65c4 01-Sep-2012 Chris Craik <ccraik@google.com> Varying-based AA rect drawing

Instead of calculating opacity from relative position in the shader, use a
shader varying to do this computation for us.

bug:5045101

Also adds a test to HwAccelerationTest to show incorrect antialiasing in
scaled drawAARect / boundarySize calculation.

Change-Id: Icdc41acb01dc10ce354834f8389a5aed2f439162
/frameworks/base/libs/hwui/ProgramCache.cpp
a798b95a9ef328720febec72d01462cd97e3d4c7 28-Aug-2012 Chris Craik <ccraik@google.com> Use smoothstep to eliminate branches in AA shader

Change-Id: If4ecb1a9446f29b2f8444f5cee551f863c1993e8
/frameworks/base/libs/hwui/ProgramCache.cpp
320d46bf844b84351cb80c5d4a4768d86447ac81 09-Aug-2012 Romain Guy <romainguy@google.com> Reduce gradients textures size whenever possible

Change-Id: Ifd58625ee62edac3b5d20b77553cb98b6fa2b46e
/frameworks/base/libs/hwui/ProgramCache.cpp
211efea7376371ee755edd2ad03e83ef6eea464e 01-Aug-2012 Romain Guy <romainguy@google.com> Add dithering to gradients

Change-Id: Ic1208855bde3a254eca2fd7cef43e0f1318ce419
/frameworks/base/libs/hwui/ProgramCache.cpp
42e1e0d482d774cf18a55773e434f02edb9e4462 30-Jul-2012 Romain Guy <romainguy@google.com> Improve gradients

Avoid using textures for common gradients (two stops from 0.0 to 1.0)

Change-Id: Iff55d21b126c8cfc4cfb701669f2339c8f6b131a
/frameworks/base/libs/hwui/ProgramCache.cpp
63553478130f78d44c8fbeaebc610e19925544a5 19-Jul-2012 Romain Guy <romainguy@google.com> Remove vendor specific precision qualifier

Change-Id: I0a56ca7a5a399ec94993d3cea0c4aff6c0f86e39
/frameworks/base/libs/hwui/ProgramCache.cpp
8e025de5fb3ab1c099541e3a387123170bf9d1a9 19-Jul-2012 Romain Guy <romainguy@google.com> Note to self

Change-Id: Ic5699bdbf880ad68748c827bb5b4976b12d4d413
/frameworks/base/libs/hwui/ProgramCache.cpp
4121063313ac0d6f69f6253cac821d0c1c122086 17-Jul-2012 Romain Guy <romainguy@google.com> Add shader-based text gamma correction

To enable it, the system property ro.hwui.text_gamma_shader must be
set to true. For testing, DEBUG_FONT_RENDERER_FORCE_SHADER_GAMMA
can be set to 1 in libhwui/Debug.h.

Change-Id: If345c6b71b67ecf1ef2e8847b71f30f3ef251a27
/frameworks/base/libs/hwui/ProgramCache.cpp
f3a910b423db7ad79cf61518bdd9278c048ad0d8 13-Dec-2011 Romain Guy <romainguy@google.com> Optimize state changes

Change-Id: Iae59bc8dfd6427d0967472462cc1994987092827
/frameworks/base/libs/hwui/ProgramCache.cpp
a60c3889718f4513a6c9d8b80f655db5d6346905 02-Aug-2011 Romain Guy <romainguy@google.com> Use high precision iterators on specific GPUs
Bug #5098359

Change-Id: I52ee8c7b4c9e8d4c7bedb684eaf7bef6c44c74b9
/frameworks/base/libs/hwui/ProgramCache.cpp
df0a7fbdcff3c683641b7980da50a7d0eebe0876 03-May-2011 Romain Guy <romainguy@google.com> Merge "Allows to render with an OpenGL context inside a TextureView."
8f0095cd33558e9cc8a440047908e53b68906f5f 03-May-2011 Romain Guy <romainguy@google.com> Allows to render with an OpenGL context inside a TextureView.

Change-Id: I59453f7fc3997f0502a1c5d325d37fed376fabc7
/frameworks/base/libs/hwui/ProgramCache.cpp
99585adeb4167ca357a72eb866f34c1af944f4b9 03-May-2011 Chet Haase <chet@google.com> Line endcaps for AA lines are now antialiased.

Also fixed other minor issues with AA and line rendering.

Change-Id: Icd4638d27c70e2ee0f28b5d9a2b97d8b29e8ac4d
/frameworks/base/libs/hwui/ProgramCache.cpp
aa6c24c21c727a196451332448d4e3b11a80be69 29-Apr-2011 Romain Guy <romainguy@google.com> New widget: TextureView
Bug #4343984

TextureView can be used to render media content (video, OpenGL,
RenderScript) inside a View.

The key difference with SurfaceView is that TextureView does
not create a new Surface. This gives the ability to seamlessly
transform, animate, fade, etc. a TextureView, which was hard
if not impossible to do with a SurfaceView.
A TextureView also interacts perfectly with ScrollView,
ListView, etc. It allows application to embed media content
in a much more flexible way than before.

For instance, to render the camera preview at 50% opacity,
all you need to do is the following:

mTextureView.setAlpha(0.5f);
Camera c = Camera.open();
c.setPreviewTexture(mTextureView.getSurfaceTexture());
c.startPreview();

TextureView uses a SurfaceTexture to get the job done. More
APIs are required to make it easy to create OpenGL contexts
for a TextureView. It can currently be done with a bit of
JNI code.

Change-Id: Iaa7953097ab5beb8437bcbbfa03b2df5b7f80cd7
/frameworks/base/libs/hwui/ProgramCache.cpp
740bf2bb2e900d3db2292b5909b4b4c6e90320e6 27-Apr-2011 Romain Guy <romainguy@google.com> Apply shaders/filters to text drop shadows.
Bug #4318323

This change also fixes the fact that shaders were not modulated
by the paint's color when drawing paths.

Change-Id: Id88804143aea06c895d4cbcdbe106d660230aa5a
/frameworks/base/libs/hwui/ProgramCache.cpp
5b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82 14-Apr-2011 Chet Haase <chet@google.com> Enable anti-aliasing for hw-accelerated lines

Draw anti-aliased lines with OpenGL by constructing a quad with
a border that fades out (to mimic fragment coverage).

Change-Id: Ib81a3e62d663acdf1b46b401ac4aa7ee9855cc7e
/frameworks/base/libs/hwui/ProgramCache.cpp
80bbfb19eefe3cb9be8833b136381cece069e24d 24-Mar-2011 Romain Guy <romainguy@google.com> Fix shaders generation on IMG GPUs.

Change-Id: Id15df2663e41e31f04c8d86b958312341da8101d
/frameworks/base/libs/hwui/ProgramCache.cpp
ed6fcb034b44d9a6ac2fc72fee6030417811f234 21-Mar-2011 Romain Guy <romainguy@google.com> Add support for drawPoint() and drawPoints().

Change-Id: I01bef50c08ec3160f8d40dc060b2cf6c2e4d7639
/frameworks/base/libs/hwui/ProgramCache.cpp
67f27952c1bcb2230beef9b5ca0bf42edad436a9 08-Dec-2010 Romain Guy <romainguy@google.com> Correctly release the OpenGL Canvas on EGL error.

Change-Id: Ib31fd8445f7ce5f7aa7e0205de0e7db80d024fc2
/frameworks/base/libs/hwui/ProgramCache.cpp
c15008e72ec00ca20a271c3006dac649fd07533b 10-Nov-2010 Romain Guy <romainguy@google.com> Move all debug flags in a single place.

This change also adds a new memory usage flag. When turned on, the
following is printed after every frame:

D/OpenGLRenderer( 3723): Current memory usage / total memory usage (bytes):
D/OpenGLRenderer( 3723): TextureCache 3766680 / 20971520
D/OpenGLRenderer( 3723): LayerCache 3538944 / 8388608
D/OpenGLRenderer( 3723): GradientCache 135168 / 524288
D/OpenGLRenderer( 3723): PathCache 41180 / 4194304
D/OpenGLRenderer( 3723): TextDropShadowCache 0 / 2097152
D/OpenGLRenderer( 3723): FontRenderer 0 262144 / 262144
D/OpenGLRenderer( 3723): FontRenderer 1 262144 / 262144
D/OpenGLRenderer( 3723): FontRenderer 2 262144 / 262144
D/OpenGLRenderer( 3723): Other:
D/OpenGLRenderer( 3723): FboCache 2 / 12
D/OpenGLRenderer( 3723): PatchCache 31 / 512
D/OpenGLRenderer( 3723): Total memory usage:
D/OpenGLRenderer( 3723): 8268404 bytes, 7.89 MB

This should help tracking possibe memory issues.

Change-Id: I83f483ca1d2dbef904829bce368e33fe5503e8d6
/frameworks/base/libs/hwui/ProgramCache.cpp
4afdf666fdb034834c48445570ed9d6f4133fc71 14-Oct-2010 Romain Guy <romainguy@android.com> Color filters were ignored by the program cache fast path.

Change-Id: I08f2f02d356234a674be778d088e0558fd49c849
/frameworks/base/libs/hwui/ProgramCache.cpp
9db91243c5ace4421091557b76a0b1cbd2312fec 12-Oct-2010 Romain Guy <romainguy@google.com> Simplify black texture fragment shader.

Change-Id: If2d43f92f4c98ec128692761a670b0f31207a3c0
/frameworks/base/libs/hwui/ProgramCache.cpp
707b2f78ccaa09965d7e030fda3a883ce9b75ea8 12-Oct-2010 Romain Guy <romainguy@google.com> Optimize GLSL shaders.

Change-Id: I9a5e01bced63d8da0c61330a543a2b805388a59d
/frameworks/base/libs/hwui/ProgramCache.cpp
7537f856f9076a84db04d8de447f6527b67166fd 11-Oct-2010 Romain Guy <romainguy@google.com> Improve performance of linear gradients.

Change-Id: If1caee31fc045dea13a4c5c10f25f2ffd325c4f8
/frameworks/base/libs/hwui/ProgramCache.cpp
14830948d02f768c41b97b7a8d15e1b3cab78267 08-Oct-2010 Romain Guy <romainguy@google.com> Add 3D transforms support to all gradients.

Change-Id: I61409edd00dab3a11684a3f5e4f7df0afc734758
/frameworks/base/libs/hwui/ProgramCache.cpp
e3095e0c1e2a4a4f34f741aa386eae56536ca5aa 07-Oct-2010 Romain Guy <romainguy@google.com> Apply 3D transformations to gradient shaders.

This fixes only linear gradients. Sweep and radial gradients, as well as
bitmap shaders, will be fixed in a future commit.

Change-Id: I4eee4ff62e9bbf3b9339fc111a780167449ecfef
/frameworks/base/libs/hwui/ProgramCache.cpp
ddb80bebb0776e6d852aab6e8bba5d5591847a55 21-Sep-2010 Romain Guy <romainguy@google.com> Add support for circular gradients to the GL renderer.

This change also adds full support for local transformation matrices on
sweep and radial gradients.

Change-Id: Id8773bc0766575190e3f3d51984fc5e57b266c3f
/frameworks/base/libs/hwui/ProgramCache.cpp
ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6f 21-Sep-2010 Romain Guy <romainguy@google.com> Add support for SweepGradient in the GL renderer.

Change-Id: I7aa397ed4e34655ead9ba1f5b4ce087665e0f022
/frameworks/base/libs/hwui/ProgramCache.cpp
f607bdc167f66b3e7003acaa4736ae46d78c1492 11-Sep-2010 Romain Guy <romainguy@google.com> Correct implementation of saveLayer().

Change-Id: I5375126636913e0a84f2d6bbd0ebe40d2e4f2763
/frameworks/base/libs/hwui/ProgramCache.cpp
a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5 09-Sep-2010 Romain Guy <romainguy@google.com> 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
/frameworks/base/libs/hwui/ProgramCache.cpp
48daa54d31fc59ec969dcff65eb3cbb0ce879a8d 11-Aug-2010 Romain Guy <romainguy@google.com> Add extra blending modes.

This change adds the following blending modes for shaders and color filters:
Add
Multiply
Screen
Overlay
Darken
Lighten

Change-Id: Iff22f5ce6041b43c71b1857d73013f5010ab3413
/frameworks/base/libs/hwui/ProgramCache.cpp
61c8c9c5b2006d18e9310b6521c65b36ffe75ce4 10-Aug-2010 Romain Guy <romainguy@google.com> Fix tons of bugs and add new text rendering support.

Change-Id: I326c66b10784006f6df2f12d38e120cef94cd0d7
/frameworks/base/libs/hwui/ProgramCache.cpp
7fbcc0492fca03857e3c45064f4aa040af817d55 05-Aug-2010 Romain Guy <romainguy@google.com> Add support for paths.

Rendering is implementing by rasterizing the paths into A8 textures.
This cna be extremely inefficient if the path changes often.

Change-Id: I609343f304ae38e0d319359403ee73b9b5b3c93a
/frameworks/base/libs/hwui/ProgramCache.cpp
db1938e0e6ef816e228c815adccebd5cb05f2aa8 03-Aug-2010 Romain Guy <romainguy@google.com> Add support for ColorFilters.

Color filters are fully supported and can be used with shaders.

Change-Id: Id90ccf1c81cb462f2431f366f3f8f710d7971e04
/frameworks/base/libs/hwui/ProgramCache.cpp
06f96e2652e4855b6520ad9dd70583677605b79a 31-Jul-2010 Romain Guy <romainguy@google.com> Refactor Skia shaders handling.

With this change, Skia shaders can easily be applied to any mesh. This change also
supports ComposeShader. For instance, this can be used to blend a gradient and a
bitmap togehter and paint a string of text with the result.

Change-Id: I701c2f9cf7f89b2ff58005e8a1d0d80ccf4a4aea
/frameworks/base/libs/hwui/ProgramCache.cpp
889f8d1403761d5668115ced6cbb3f767cfe966d 29-Jul-2010 Romain Guy <romainguy@google.com> Moved all the rendering code to the new shader generator.

The generator supports features that are not yet implement in the
renderer: color matrix, lighting, porterduff color blending and
composite shaders.

This change also adds support for repeated/mirrored non-power of 2
bitmap shaders.

Change-Id: I903a11a070c0eb9cc8850a60ef305751e5b47234
/frameworks/base/libs/hwui/ProgramCache.cpp
ac670c0433d19397d4e36ced2110475b6f54fe26 28-Jul-2010 Romain Guy <romainguy@google.com> Generate shaders to cover all possible cases.

With this change, all the vertex and fragment shaders used by the GL
renderer are now generated based on a program description supplied
by the caller. This allows the renderer to generate a large number
of shaders without having to write all the possible combinations by
hand. The generated shaders are stored in a program cache.

Change-Id: If54d286e77ae021c724d42090da476df12a18ebb
/frameworks/base/libs/hwui/ProgramCache.cpp