[RFC weston] compositor: optimize/simplify shaders
ppaalanen at gmail.com
Mon Aug 27 07:03:10 PDT 2012
On Wed, 22 Aug 2012 19:09:28 -0500
Rob Clark <rob.clark at linaro.org> wrote:
> From: Rob Clark <rob at ti.com>
> Re-work how the shaders and emitted vertices work. Rather than always
> rendering clip-rect sized quads and doing transformation in tex coords
> (and requiring the corresponding clipping in frag shader), instead
> emit transformed vertices, clipped wrt. dirty region, and use simpler
> frag shaders. Also, split the rendering, so blended surfaces with an
> opaque region have the opaque region drawn with blend disabled. The
> result is considerably fewer pixels drawn with blend enabled, and much
> fewer cycles in the frag shader.
> This requires having some more complex logic to figure out the vertices
> of the shape which forms the intersection of the clip rect and the
> transformed surface. Which has perhaps got a few bugs or missing cases,
> still (visual glitches in some cases) but at this point more or less is
> starting to work. I think it is at least far enough along to get some
> initial review.
> The result, on small SoC GPU (omap4/pandaboard) on 1920x1080 display,
> for simple stuff like moving windows around, I get 60fps (before 30fps
> or less), and pushing YUV buffers for hw decoded 1080p video goes from
> ~6fps to 30fps, with no drop in framerate for transformed/rotated video
> TODO: compositor-wayland also needs to be updated..
> src/compositor.c | 560 +++++++++++++++++++++++++++++++++++++++++++-----------
> src/compositor.h | 5 +-
> 2 files changed, 456 insertions(+), 109 deletions(-)
I've started reviewing your patch and fixing the remaining bugs. So far
I think I got most of the blend/opaque region stuff sorted out. I
haven't still gotten to the geometry, where I can trigger visual bugs
with and without getting your TODO printouts.
I'm guessing the xwayland surfaces will come and haunt us, because I
think they contain both an opaque region with undefined alpha values,
and opaque and non-opaque regions with valid alpha values.I haven't
even tested them yet, but I guess a quick fix would be to paint opaque
regions always with a shader that forces texture alpha to 1.0. Would it
better as a different shader program or a uniform flag for a shader, I
I'm not sure we should have nested functions in Weston code base. Also
like you noted, compositor_wayland.c does not build anymore.
Here's my WIP tree that may be rebased!
The following changes since commit 5418a904ca007a109f6af8c0c75ca97a134986d9:
toytoolkit: don't ignore resizes with negative width or height (2012-08-16 10:33:56 -0400)
are available in the git repository at:
Pekka Paalanen (4):
compositor: fix build against WL_bind_wayland_display extension
compositor: re-enable full-surface alpha
compositor: specialised fragment shader for RGBX
compositor: fix blending for full-surface alpha
Rob Clark (2):
compositor: add support for OES_EGL_image_external
compositor: optimize/simplify shaders
src/compositor.c | 621 ++++++++++++++++++++++++++++++++++++++++----------
src/compositor.h | 9 +-
src/weston-egl-ext.h | 4 +
3 files changed, 510 insertions(+), 124 deletions(-)
I should get to reviewing the geometry tomorrow.
More information about the wayland-devel