1033 Commits

Author SHA1 Message Date
Romain Guy
c46d07a29e Merge all shapes/paths caches to PathCache
This change will greatly simplify the multi-threading of all
shape types.

This change also uses PathTessellator to render convex paths.

Change-Id: I4e65bc95c9d24ecae2183b72204de5c2dfb6ada4
2013-03-18 18:32:17 -07:00
Chris Craik
cada41aeb1 Work around saveLayer clipping/transform deferring issues
bug:8409891

Disables deferring

Change-Id: I93498a4a45a5bfe01143faa154926c6a138db8f9
2013-03-18 17:00:18 -07:00
Chris Craik
d0afeac6df Reset draw modifiers after flushing
bug:8401910

This avoids leaving the renderer in a state with stale pointers (to,
e.g., shaders or color filters)

Change-Id: Idf8b63657041352e70e34e91ea416fe4385d4bc2
2013-03-15 18:48:41 -07:00
Chris Craik
a08f95cfec Use snapshot alpha for layers
Removes mMultipliedAlpha, using the snapshot alpha for all
non-overlapping display list alpha control.

Additionally, fixes opacity issues where children of
hasOverlappingRendering=false displaylists (both hw layer sublists and
other sublists with hasOverlappingRendering=false)

Change-Id: I6adc16da855835f9f518f8967628e5d0135c789b
2013-03-15 17:29:27 -07:00
Chris Craik
f40b8a939f Merge "Fully deferred displaylist replay" into jb-mr2-dev 2013-03-15 22:54:16 +00:00
Chris Craik
ff78583d8a Fully deferred displaylist replay
bug:8037003

A recursive drawDisplayList call is now entirely deferred before
playing back to the screen and issuing GL commands. This way, the
entire stream can be inspected, optimized, and batch work (such as
uploading textures) before issuing commands.

Additionally, this fixes an issue where operations draw could move
across restores corresponding to saveLayer(alpha). Those and other
similar cases (such as complex clipping, requiring the stencil) are
now treated as batching barriers, with the operations that change
renderer state in a way that's difficult to defer are just re-issued
at flush time.

Change-Id: Ie7348166662a5ad89fb9b1e87558334fb826b01e
2013-03-15 14:48:18 -07:00
Romain Guy
bd3055f95e Less aggressive glyphs precaching
The renderer used to pre-cache glyphs at record time. This then changed
to pre-caching at the beginning of every frame. This unfortunately entails
a lot of duplicate work on every frame, which amounts to 0.5 to 1ms in
some stock applications.

This change is somewhere in the middle: pre-caching happens the first
time a DrawTextOp is deferred or every time the screen-space transform
is different from the last pre-caching operation.

Change-Id: Id6d9e2599d90a5b75010b0f0a28746befbf3c205
2013-03-13 16:14:47 -07:00
Romain Guy
0f809f3b79 Prevent infinite loop when trimming the path cache
Change-Id: I04b5fa498336068f997c68d8613b35a99f67adbe
2013-03-13 14:32:45 -07:00
Romain Guy
5dc7fa7096 Add TaskManager API
This API can be used to run arbitrary tasks on a pool of worker
threads. The number of threads is calculated based on the number
of CPU cores available.

The API is made of 3 classes:

TaskManager
      Creates and manages the worker threads.

Task
      Describes the work to be done and the type of the output.
      A task contains a future used to wait for the worker thread
      to be done computing the result of the task.

TaskProcessor
      The processor dispatches tasks to the TaskManager and is
      responsible for performing the computation required by
      each task. A processor will only be asked to process tasks
      sent to the manager through the processor.

A typical use case:

class MyTask: Task<MyType>

class MyProcessor: TaskProcessor<MyType>

TaskManager m = new TaskManager();
MyProcessor p = new MyProcessor(m);
MyTask t = new MyTask();
p.add(t);

// Waits until the result is available
MyType result = t->getResult();

Change-Id: I1fe845ba4c49bb0e1b0627ab147f9a861c8e0749
2013-03-12 15:06:42 -07:00
Romain Guy
ca89e2a687 Precache paths from a worker thread
Change-Id: I3e7b53d67e0e03e403beaf55c39350ead7f1e309
2013-03-11 17:05:28 -07:00
Romain Guy
6e20040893 Move blur code from FontRenderer to utils/Blur.cpp
Change-Id: I2cebbfbcb722ed4b37e54ffbf8b53bb92ad0c964
2013-03-08 11:28:22 -08:00
Romain Guy
b09f147126 Don't apply scale to glyphs when a perspective is set.
Bug #8337925

Magazines uses very large scale factors that blow up font cache & CPU.

Change-Id: I1c0ed430ed91b86cc6c6f59f7e8bdcc89a464e46
2013-03-07 17:03:25 -08:00
Romain Guy
8afce816df Round scale factors to rasterize text
Harder, better, faster, stronger.

Change-Id: Iee4125de98c4e61603f56bb7f06002cc86458214
2013-03-06 19:09:59 -08:00
Romain Guy
624234f69b Take only the scale params into account to rasterize text
This change extracts the scale parameters of the current transform
to pass then to the font renderer. Rotation and perspective are
applied to the generated mesh inside the vertex shader. This limits
the number of glyphs we have to create in the font cache and thus
reduces memory churn.

Change-Id: Ic5b3bae2b2b0e0250a8ee723b071a1709725c749
2013-03-05 18:12:35 -08:00
Romain Guy
0b58a3deab Make glyph copies a little more cache friendly
Change-Id: Ie21b7079cc5d3ea67a03597c57842636e4afe143
2013-03-05 12:16:27 -08:00
Romain Guy
3b753829ae Fix colored rects clipping and code cleanup
The drawColorRects() method was clipping individual rectangles
using the wrong parameters left, top, right and bottom instead
of l, r, t and b. It also checked for count == 0 after the loop
when it should have checked for vertexCount == 0. The quickReject
is now not part of the loop since it's a bit overkill to perform
so many matrix multiplications. What we really care about is the
final quickReject performed on the max bounds of the entire set
of rectangles.

This change also replaces all instances of mSnapshot->transform
by currentTransform() to make the code slightly more readable.

Change-Id: I6485280414499716852f7dbfba186774eb6763d4
2013-03-05 10:27:35 -08:00
Romain Guy
19d4dd8599 Take text scale/skew into account only when rendering into a layer
3D rotations can undo scale/skew transforms; since FreeType only accepts
2x2 matrices we can end up generating very large glyphs that are drawn
at a 1:1 scale on screen. For instance, if the current transform has a
scale of 2000 set on both X and Y axis and a perspective Z factor set to
Z, the actual scale factor on screen ends up being 1. We would however
generate glyphs with a scale factor of 2000 causing the font renderer
to blow up.

Change-Id: Ia5c3618d36644e817825cb9c89e2f53aece2074e
2013-03-04 13:48:43 -08:00
Romain Guy
151b71cb52 Merge "Fix math issue when transforming text in perspective" into jb-mr2-dev 2013-03-02 02:08:18 +00:00
Romain Guy
874f5c6e4a Fix math issue when transforming text in perspective
Change-Id: Iad6b4e477c11bd1ef5f0ceab2fabcd440030154d
2013-03-01 18:07:35 -08:00
Romain Guy
28459117a7 Merge "Precache glyphs at final raster size" into jb-mr2-dev 2013-03-02 00:13:17 +00:00
Romain Guy
0f6675332c Precache glyphs at final raster size
The deferred display lists model now allows us to precache glyphs
at their exact size on screen.

This change also removes debug markers when the renderer defers
and reorders display lists. It also adds a flush event marker.

Change-Id: I66ec5216dc12b93ecfdad52a7146b1cfb31fbeb4
2013-03-01 16:04:53 -08:00
Chris Craik
1da8a6a36d Merge "Add shader program selection shortcut" into jb-mr2-dev 2013-03-01 19:42:38 +00:00
Chris Craik
096b8d96d5 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
2013-03-01 11:11:31 -08:00
Romain Guy
1361dff5eb Merge "Support 3D rotations when drawing text" into jb-mr2-dev 2013-03-01 00:05:51 +00:00
Romain Guy
a4adcf0239 Support 3D rotations when drawing text
If a perspective transform is set on the Canvas, drawText() should
not attempt to rasterize glyphs in screen space. This change uses
the old behavior instead (i.e. rasterize the glyphs at the native
font size and apply the transform on the resulting mesh.)

This change also adds an optimization: empty glyphs (spaces) do
not generate vertices anymore. This saves a lot of vertices in text
heavy applications such as Gmail.

Change-Id: Ib531384163f5165b5785501612a7b1474f3ff599
2013-02-28 16:04:48 -08:00
Chris Craik
d6960a49b4 Account for text alignment in Op bounds calculation
bug:8243821

Previously this wasn't done for deferred clipping + reordering, so
non-left-aligned text would be clipped at defer time, when it wouldn't
have been at draw time (in OpenGLRenderer::quickReject())

Change-Id: Ic96949c2dca4378f284606b37d9411ed42f8d203
2013-02-28 11:25:39 -08:00
Romain Guy
19886f8b51 Merge "Properly scale text" into jb-mr2-dev 2013-02-28 01:05:34 +00:00
Romain Guy
c74f45a334 Properly scale text
This change does not apply to drawPosText() and drawTextOnPath() yet.

Prior to this change, glyphs were always rasterized based on the
font size specified in the paint. All transforms were then applied
on the resulting texture. This creates rather ugly results when
text is scaled and/or rotated.

With this change, the font renderer will apply the current transform
matrix to the glyph before they are rasterized. This generates much
better looking results.

Change-Id: I0141b6ff18db35e1213e7a3ab9db1ecaf03d7a9c
2013-02-27 15:49:57 -08:00
Chris Craik
d041e476f3 Merge "Correct sub-hairline tessellation threshold" into jb-mr2-dev 2013-02-27 23:49:37 +00:00
Chris Craik
d80806b305 Merge "Fix T-junctions in layers' generated meshes" into jb-mr2-dev 2013-02-27 23:47:55 +00:00
Chris Craik
19a390bff3 Correct sub-hairline tessellation threshold
Change-Id: Id868d41a36db5b4daa762d84b6329f9c31916bce
2013-02-27 15:43:26 -08:00
Romain Guy
a6456d0d7e Merge "Draw text drop shadows even when the text color is transparent" into jb-mr2-dev 2013-02-27 22:16:22 +00:00
Chris Craik
6c5b9be745 Fix T-junctions in layers' generated meshes
bug:4128442

Currently we fix T-junctions for hardware layers, and for
Canvas.saveLayer if the transform isn't rectAsRect. Ideally, hardware
layers should lazily re-generate T-junction free geometry if the
transform becomes non-rectAsRect

Depends on frameworks/native change:
https://googleplex-android-review.googlesource.com/#/c/277668/
which adds Region::createTJunctionFreeRegion()

Change-Id: Ice75b4a1a4459ff835059ea81d70f7d1563fd96d
2013-02-27 14:03:19 -08:00
Romain Guy
768bffc9b8 Draw text drop shadows even when the text color is transparent
This matches Skia's behavior.

Change-Id: Ibf0a52611f5801cfa68169f66ab0ec06f256600f
2013-02-27 13:52:26 -08:00
Romain Guy
758724fd09 Don't increment the paint's generation ID when drawing bitmaps
When the renderer draws a bitmap as part of a display list with an
alpha < 1.0f, the paint is temporarily modified to alter the opacity
of the bitmap. This has the side effect of increasing the paint's
generation ID counter which can break paint caching.

Change-Id: I5055d059ad1639829fa50af3d946e296c4dab877
2013-02-27 11:53:12 -08:00
Romain Guy
08bca88b27 Rename debug property and expose it in HardwareRenderer
Change-Id: If46a9bc14a50f6c9a202d901881b36bbac32cba3
2013-02-25 16:21:30 -08:00
Romain Guy
3ff0bfdd14 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
2013-02-25 15:01:58 -08:00
Chris Craik
fb68065709 Merge "Add deferredList null check" 2013-02-23 00:42:53 +00:00
Chris Craik
ba868c3e22 Add deferredList null check
Needed for non-deferred mode (debug.hwui.disable_draw_defer = true)

Change-Id: I278cbe200aa6ce06fa92dc45c63ceda6e85a0cbe
2013-02-22 16:28:27 -08:00
Chris Craik
dd8697c095 Avoid double blur
bug:8204062

Avoids incorrectly blurring with RenderScript after a C++ blur

Additionally, avoids draw/blurring if the input text has empty bounds

Change-Id: Ibbaf74800fff7a6e4cda3aa24286b90e7aef589d
2013-02-22 16:16:16 -08:00
Romain Guy
505d1d64ed Merge "Prettify display lists logging" 2013-02-22 21:45:57 +00:00
Romain Guy
7031ff68bb Prettify display lists logging
This change makes it a lot easier to see the tree structure.

Change-Id: I4969abd1eb010f1d529671f8d86dc4c930be24f6
2013-02-22 11:51:15 -08:00
Chris Craik
94b97b38b7 am eab51de4: Merge "Fix clipping and stencil layer issues"
* commit 'eab51de4de88219256260fe26e2018a6234ef83b':
  Fix clipping and stencil layer issues
2013-02-21 19:31:17 -08:00
Chris Craik
b98a016c67 Fix clipping and stencil layer issues
bug:8235699

Ensure rectangle clipping operations disable deferring when necessary
(i.e., when the op might create a non-rect region), including in
DisplayList::setViewProperties

Additionally, makes clipping with a kUnion always use a region, for
consistency with software rendering

Change-Id: I6730f1a80250bcf3f91cd4afde646d470a12dbc2
2013-02-21 16:12:00 -08:00
Ben Cheng
08d160a366 am 7a60c43d: Merge "Use free for memory chunks allocated through memalign."
* commit '7a60c43d874bd047ea4b93b94c9b8771ea5739cc':
  Use free for memory chunks allocated through memalign.
2013-02-20 14:39:35 -08:00
Ben Cheng
7a60c43d87 Merge "Use free for memory chunks allocated through memalign." 2013-02-20 22:34:58 +00:00
Ben Cheng
15641a6181 Use free for memory chunks allocated through memalign.
BUG: 8234423
Change-Id: Ic4100a780908c94540722cc4af5f73f4940431b4
2013-02-20 13:20:03 -08:00
Chris Craik
c4ca87f0f4 am 8a47d8ea: Merge "Clean up clipping and deferral logic"
* commit '8a47d8eaec26d0937aee94a057f561f246748339':
  Clean up clipping and deferral logic
2013-02-20 10:42:40 -08:00
Chris Craik
8a47d8eaec Merge "Clean up clipping and deferral logic" 2013-02-20 18:40:03 +00:00
Chris Craik
5d11676414 Clean up clipping and deferral logic
bug:8037003

-Merges replay methods
-Bounds checking for DrawBitmapMesh, DrawRects and DrawDisplayList
-Use clip as bounds for otherwise unbounded draw operations

Clip-as-bounds is correct for drawColor and functor, but other draw
operations (pos text, text on path, and layers) still need true bounds
calculation

Change-Id: I5d5149d2c624f01e3fe46628bf156e835e69b9d5
2013-02-19 18:56:10 -08:00