Commit 3611c4b4 authored by joth@chromium.org's avatar joth@chromium.org

Force spontaneous draws into the SW path

Any unrequested draws will cause UI corruption if they hit the GL path.
The strategy is to disallow any such draws, but to enable diagnosis
force them into the SW path where they cause less UI damange but we can
log or assert as appropriate.

BUG=

Review URL: https://chromiumcodereview.appspot.com/17553012

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208014 0039d316-1c4b-4281-b951-d872f2087c98
parent 200729f8
......@@ -4,24 +4,18 @@
#include "content/browser/android/in_process/synchronous_compositor_output_surface.h"
#include "base/command_line.h"
#include "base/auto_reset.h"
#include "base/logging.h"
#include "base/time.h"
#include "cc/output/begin_frame_args.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_ack.h"
#include "cc/output/context_provider.h"
#include "cc/output/output_surface_client.h"
#include "cc/output/software_output_device.h"
#include "content/browser/android/in_process/synchronous_compositor_impl.h"
#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
#include "content/public/browser/android/synchronous_compositor_client.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkDevice.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "ui/gfx/rect_conversions.h"
#include "ui/gfx/skia_util.h"
#include "ui/gfx/transform.h"
......@@ -88,6 +82,7 @@ SynchronousCompositorOutputSurface::SynchronousCompositorOutputSurface(
scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareDevice(this))),
routing_id_(routing_id),
needs_begin_frame_(false),
invoking_composite_(false),
did_swap_buffer_(false),
current_sw_canvas_(NULL) {
capabilities_.deferred_gl_initialization = true;
......@@ -104,7 +99,11 @@ SynchronousCompositorOutputSurface::~SynchronousCompositorOutputSurface() {
}
bool SynchronousCompositorOutputSurface::ForcedDrawToSoftwareDevice() const {
return current_sw_canvas_ != NULL;
// |current_sw_canvas_| indicates we're in a DemandDrawSw call. In addition
// |invoking_composite_| == false indicates an attempt to draw outside of
// the synchronous compositor's control: force it into SW path and hence to
// the null canvas (and will log a warning there).
return current_sw_canvas_ != NULL || !invoking_composite_;
}
bool SynchronousCompositorOutputSurface::BindToClient(
......@@ -196,7 +195,7 @@ bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
DCHECK(CalledOnValidThread());
DCHECK(canvas);
DCHECK(!current_sw_canvas_);
current_sw_canvas_ = canvas;
base::AutoReset<SkCanvas*> canvas_resetter(&current_sw_canvas_, canvas);
SkIRect canvas_clip;
canvas->getClipDeviceBounds(&canvas_clip);
......@@ -212,12 +211,13 @@ bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
InvokeComposite(clip.size());
current_sw_canvas_ = NULL;
return did_swap_buffer_;
}
void SynchronousCompositorOutputSurface::InvokeComposite(
gfx::Size damage_size) {
DCHECK(!invoking_composite_);
base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true);
did_swap_buffer_ = false;
SetNeedsRedrawRect(gfx::Rect(damage_size));
if (needs_begin_frame_)
......
......@@ -79,6 +79,7 @@ class SynchronousCompositorOutputSurface
int routing_id_;
bool needs_begin_frame_;
bool invoking_composite_;
bool did_swap_buffer_;
// Only valid (non-NULL) during a DemandDrawSw() call.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment