summaryrefslogtreecommitdiffstats
path: root/cc/output
diff options
context:
space:
mode:
Diffstat (limited to 'cc/output')
-rw-r--r--cc/output/delegating_renderer.cc29
-rw-r--r--cc/output/delegating_renderer.h6
-rw-r--r--cc/output/direct_renderer.cc25
-rw-r--r--cc/output/direct_renderer.h9
-rw-r--r--cc/output/gl_renderer.cc40
-rw-r--r--cc/output/gl_renderer.h2
-rw-r--r--cc/output/gl_renderer_unittest.cc211
-rw-r--r--cc/output/output_surface.cc23
-rw-r--r--cc/output/output_surface.h4
-rw-r--r--cc/output/output_surface_client.h1
-rw-r--r--cc/output/renderer.h23
-rw-r--r--cc/output/software_renderer.cc25
-rw-r--r--cc/output/software_renderer.h9
-rw-r--r--cc/output/software_renderer_unittest.cc52
14 files changed, 239 insertions, 220 deletions
diff --git a/cc/output/delegating_renderer.cc b/cc/output/delegating_renderer.cc
index 88c1f6c..d43b0e9 100644
--- a/cc/output/delegating_renderer.cc
+++ b/cc/output/delegating_renderer.cc
@@ -31,20 +31,21 @@ namespace cc {
scoped_ptr<DelegatingRenderer> DelegatingRenderer::Create(
RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider) {
- scoped_ptr<DelegatingRenderer> renderer(
- new DelegatingRenderer(client, output_surface, resource_provider));
+ scoped_ptr<DelegatingRenderer> renderer(new DelegatingRenderer(
+ client, settings, output_surface, resource_provider));
if (!renderer->Initialize())
return scoped_ptr<DelegatingRenderer>();
return renderer.Pass();
}
-DelegatingRenderer::DelegatingRenderer(
- RendererClient* client,
- OutputSurface* output_surface,
- ResourceProvider* resource_provider)
- : Renderer(client),
+DelegatingRenderer::DelegatingRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
+ OutputSurface* output_surface,
+ ResourceProvider* resource_provider)
+ : Renderer(client, settings),
output_surface_(output_surface),
resource_provider_(resource_provider),
visible_(true) {
@@ -70,9 +71,7 @@ bool DelegatingRenderer::Initialize() {
return false;
std::string unique_context_name = base::StringPrintf(
- "%s-%p",
- Settings().compositor_name.c_str(),
- context3d);
+ "%s-%p", settings_->compositor_name.c_str(), context3d);
context3d->pushGroupMarkerEXT(unique_context_name.c_str());
const ContextProvider::Capabilities& caps =
@@ -82,8 +81,7 @@ bool DelegatingRenderer::Initialize() {
capabilities_.using_set_visibility = caps.set_visibility;
capabilities_.using_egl_image = caps.egl_image_external;
- capabilities_.using_map_image =
- Settings().use_map_image && caps.map_image;
+ capabilities_.using_map_image = settings_->use_map_image && caps.map_image;
return true;
}
@@ -103,9 +101,10 @@ static ResourceProvider::ResourceId AppendToArray(
return id;
}
-void DelegatingRenderer::DrawFrame(
- RenderPassList* render_passes_in_draw_order,
- ContextProvider* offscreen_context_provider) {
+void DelegatingRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
+ ContextProvider* offscreen_context_provider,
+ float device_scale_factor,
+ bool allow_partial_swap) {
TRACE_EVENT0("cc", "DelegatingRenderer::DrawFrame");
DCHECK(!frame_for_swap_buffers_.delegated_frame_data);
diff --git a/cc/output/delegating_renderer.h b/cc/output/delegating_renderer.h
index 3e900ac..57a2418 100644
--- a/cc/output/delegating_renderer.h
+++ b/cc/output/delegating_renderer.h
@@ -19,6 +19,7 @@ class CC_EXPORT DelegatingRenderer : public Renderer {
public:
static scoped_ptr<DelegatingRenderer> Create(
RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider);
virtual ~DelegatingRenderer();
@@ -28,7 +29,9 @@ class CC_EXPORT DelegatingRenderer : public Renderer {
virtual bool CanReadPixels() const OVERRIDE;
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
- ContextProvider* offscreen_context_provider) OVERRIDE;
+ ContextProvider* offscreen_context_provider,
+ float device_scale_factor,
+ bool allow_partial_swap) OVERRIDE;
virtual void Finish() OVERRIDE {}
@@ -49,6 +52,7 @@ class CC_EXPORT DelegatingRenderer : public Renderer {
private:
DelegatingRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider);
bool Initialize();
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
index 15f8501..c3a4d39 100644
--- a/cc/output/direct_renderer.cc
+++ b/cc/output/direct_renderer.cc
@@ -127,9 +127,10 @@ gfx::Rect DirectRenderer::MoveFromDrawToWindowSpace(
}
DirectRenderer::DirectRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider)
- : Renderer(client),
+ : Renderer(client, settings),
output_surface_(output_surface),
resource_provider_(resource_provider) {}
@@ -194,7 +195,9 @@ void DirectRenderer::DecideRenderPassAllocationsForFrame(
}
void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
- ContextProvider* offscreen_context_provider) {
+ ContextProvider* offscreen_context_provider,
+ float device_scale_factor,
+ bool allow_partial_swap) {
TRACE_EVENT0("cc", "DirectRenderer::DrawFrame");
UMA_HISTOGRAM_COUNTS("Renderer4.renderPassCount",
render_passes_in_draw_order->size());
@@ -205,8 +208,9 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
DrawingFrame frame;
frame.root_render_pass = root_render_pass;
frame.root_damage_rect =
- Capabilities().using_partial_swap && client_->AllowPartialSwap() ?
- root_render_pass->damage_rect : root_render_pass->output_rect;
+ Capabilities().using_partial_swap && allow_partial_swap
+ ? root_render_pass->damage_rect
+ : root_render_pass->output_rect;
frame.root_damage_rect.Intersect(gfx::Rect(client_->DeviceViewport().size()));
frame.offscreen_context_provider = offscreen_context_provider;
@@ -216,12 +220,12 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
// can leave the window at the wrong size if we never draw and the proper
// viewport size is never set.
output_surface_->Reshape(client_->DeviceViewport().size(),
- client_->DeviceScaleFactor());
+ device_scale_factor);
BeginDrawingFrame(&frame);
for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
RenderPass* pass = render_passes_in_draw_order->at(i);
- DrawRenderPass(&frame, pass);
+ DrawRenderPass(&frame, pass, allow_partial_swap);
for (ScopedPtrVector<CopyOutputRequest>::iterator it =
pass->copy_requests.begin();
@@ -319,13 +323,14 @@ void DirectRenderer::SetScissorTestRectInDrawSpace(const DrawingFrame* frame,
void DirectRenderer::FinishDrawingQuadList() {}
void DirectRenderer::DrawRenderPass(DrawingFrame* frame,
- const RenderPass* render_pass) {
+ const RenderPass* render_pass,
+ bool allow_partial_swap) {
TRACE_EVENT0("cc", "DirectRenderer::DrawRenderPass");
if (!UseRenderPass(frame, render_pass))
return;
bool using_scissor_as_optimization =
- Capabilities().using_partial_swap && client_->AllowPartialSwap();
+ Capabilities().using_partial_swap && allow_partial_swap;
gfx::RectF render_pass_scissor;
if (using_scissor_as_optimization) {
@@ -334,7 +339,7 @@ void DirectRenderer::DrawRenderPass(DrawingFrame* frame,
}
if (frame->current_render_pass != frame->root_render_pass ||
- client_->ShouldClearRootRenderPass()) {
+ settings_->should_clear_root_render_pass) {
if (NeedDeviceClip(frame))
SetScissorTestRect(DeviceClipRect(frame));
else if (!using_scissor_as_optimization)
@@ -402,7 +407,7 @@ bool DirectRenderer::UseRenderPass(DrawingFrame* frame,
bool DirectRenderer::HaveCachedResourcesForRenderPassId(RenderPass::Id id)
const {
- if (!Settings().cache_render_pass_contents)
+ if (!settings_->cache_render_pass_contents)
return false;
CachedResource* texture = render_pass_textures_.get(id);
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h
index 3937619..94ec9cc 100644
--- a/cc/output/direct_renderer.h
+++ b/cc/output/direct_renderer.h
@@ -32,7 +32,9 @@ class CC_EXPORT DirectRenderer : public Renderer {
virtual bool HaveCachedResourcesForRenderPassId(RenderPass::Id id) const
OVERRIDE;
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
- ContextProvider* offscreen_context_provider) OVERRIDE;
+ ContextProvider* offscreen_context_provider,
+ float device_scale_factor,
+ bool allow_partial_swap) OVERRIDE;
struct CC_EXPORT DrawingFrame {
DrawingFrame();
@@ -54,6 +56,7 @@ class CC_EXPORT DirectRenderer : public Renderer {
protected:
DirectRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider);
@@ -104,7 +107,9 @@ class CC_EXPORT DirectRenderer : public Renderer {
static gfx::Size RenderPassTextureSize(const RenderPass* render_pass);
static GLenum RenderPassTextureFormat(const RenderPass* render_pass);
- void DrawRenderPass(DrawingFrame* frame, const RenderPass* render_pass);
+ void DrawRenderPass(DrawingFrame* frame,
+ const RenderPass* render_pass,
+ bool allow_partial_swap);
bool UseRenderPass(DrawingFrame* frame, const RenderPass* render_pass);
virtual void BindFramebufferToOutputSurface(DrawingFrame* frame) = 0;
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index f19f441..e430ebf 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -127,12 +127,16 @@ struct GLRenderer::PendingAsyncReadPixels {
};
scoped_ptr<GLRenderer> GLRenderer::Create(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider,
int highp_threshold_min,
bool use_skia_gpu_backend) {
- scoped_ptr<GLRenderer> renderer(new GLRenderer(
- client, output_surface, resource_provider, highp_threshold_min));
+ scoped_ptr<GLRenderer> renderer(new GLRenderer(client,
+ settings,
+ output_surface,
+ resource_provider,
+ highp_threshold_min));
if (!renderer->Initialize())
return scoped_ptr<GLRenderer>();
if (use_skia_gpu_backend) {
@@ -145,10 +149,11 @@ scoped_ptr<GLRenderer> GLRenderer::Create(RendererClient* client,
}
GLRenderer::GLRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider,
int highp_threshold_min)
- : DirectRenderer(client, output_surface, resource_provider),
+ : DirectRenderer(client, settings, output_surface, resource_provider),
offscreen_framebuffer_id_(0),
shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)),
context_(output_surface->context_provider()->Context3d()),
@@ -170,18 +175,15 @@ bool GLRenderer::Initialize() {
if (!context_->makeContextCurrent())
return false;
- std::string unique_context_name = base::StringPrintf(
- "%s-%p",
- Settings().compositor_name.c_str(),
- context_);
+ std::string unique_context_name =
+ base::StringPrintf("%s-%p", settings_->compositor_name.c_str(), context_);
context_->pushGroupMarkerEXT(unique_context_name.c_str());
ContextProvider::Capabilities context_caps =
output_surface_->context_provider()->ContextCapabilities();
capabilities_.using_partial_swap =
- Settings().partial_swap_enabled &&
- context_caps.post_sub_buffer;
+ settings_->partial_swap_enabled && context_caps.post_sub_buffer;
capabilities_.using_set_visibility = context_caps.set_visibility;
@@ -202,7 +204,7 @@ bool GLRenderer::Initialize() {
capabilities_.using_offscreen_context3d = true;
capabilities_.using_map_image =
- Settings().use_map_image && context_caps.map_image;
+ settings_->use_map_image && context_caps.map_image;
capabilities_.using_discard_framebuffer =
context_caps.discard_framebuffer;
@@ -290,7 +292,7 @@ void GLRenderer::ViewportChanged() {
void GLRenderer::ClearFramebuffer(DrawingFrame* frame) {
// It's unsafe to clear when we have a stencil test because glClear ignores
// stencil.
- if (client_->ExternalStencilTestEnabled() &&
+ if (output_surface_->HasExternalStencilTest() &&
frame->current_render_pass == frame->root_render_pass) {
DCHECK(!frame->current_render_pass->has_transparent_background);
return;
@@ -1249,7 +1251,7 @@ void GLRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect));
float edge[24];
bool use_aa =
- Settings().allow_antialiasing && !quad->force_anti_aliasing_off &&
+ settings_->allow_antialiasing && !quad->force_anti_aliasing_off &&
SetupQuadForAntialiasing(device_transform, quad, &local_quad, edge);
SolidColorProgramUniforms uniforms;
@@ -1388,7 +1390,7 @@ void GLRenderer::DrawContentQuad(const DrawingFrame* frame,
gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect));
float edge[24];
- bool use_aa = Settings().allow_antialiasing && SetupQuadForAntialiasing(
+ bool use_aa = settings_->allow_antialiasing && SetupQuadForAntialiasing(
device_transform, quad, &local_quad, edge);
TileProgramUniforms uniforms;
@@ -2098,7 +2100,7 @@ void GLRenderer::SwapBuffers() {
compositor_frame.metadata = client_->MakeCompositorFrameMetadata();
compositor_frame.gl_frame_data = make_scoped_ptr(new GLFrameData);
compositor_frame.gl_frame_data->size = output_surface_->SurfaceSize();
- if (capabilities_.using_partial_swap && client_->AllowPartialSwap()) {
+ if (capabilities_.using_partial_swap) {
// If supported, we can save significant bandwidth by only swapping the
// damaged/scissored region (clamped to the viewport)
swap_buffer_rect_.Intersect(client_->DeviceViewport());
@@ -2511,7 +2513,7 @@ void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) {
current_framebuffer_lock_.reset();
output_surface_->BindFramebuffer();
- if (client_->ExternalStencilTestEnabled()) {
+ if (output_surface_->HasExternalStencilTest()) {
SetStencilEnabled(true);
GLC(context_, context_->stencilFunc(GL_EQUAL, 1, 1));
} else {
@@ -3159,11 +3161,9 @@ void GLRenderer::LazyLabelOffscreenContext(
return;
offscreen_context_labelled_ = true;
std::string unique_context_name = base::StringPrintf(
- "%s-Offscreen-%p",
- Settings().compositor_name.c_str(),
- context_);
- offscreen_context_provider->Context3d()->pushGroupMarkerEXT(
- unique_context_name.c_str());
+ "%s-Offscreen-%p", settings_->compositor_name.c_str(), context_);
+ offscreen_context_provider->Context3d()
+ ->pushGroupMarkerEXT(unique_context_name.c_str());
}
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index 030c863..e4bd650 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -40,6 +40,7 @@ class ScopedEnsureFramebufferAllocation;
class CC_EXPORT GLRenderer : public DirectRenderer {
public:
static scoped_ptr<GLRenderer> Create(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider,
int highp_threshold_min,
@@ -81,6 +82,7 @@ class CC_EXPORT GLRenderer : public DirectRenderer {
protected:
GLRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider,
int highp_threshold_min);
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index 75b8277..dff29c8 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -141,9 +141,7 @@ class FakeRendererClient : public RendererClient {
: host_impl_(&proxy_),
set_full_root_layer_damage_count_(0),
root_layer_(LayerImpl::Create(host_impl_.active_tree(), 1)),
- viewport_size_(gfx::Size(1, 1)),
- scale_factor_(1.f),
- external_stencil_test_enabled_(false) {
+ viewport_size_(gfx::Size(1, 1)) {
root_layer_->CreateRenderSurface();
RenderPass::Id render_pass_id =
root_layer_->render_surface()->RenderPassId();
@@ -158,44 +156,19 @@ class FakeRendererClient : public RendererClient {
static gfx::Size fake_size(1, 1);
return gfx::Rect(fake_size);
}
- virtual gfx::Rect DeviceClip() const OVERRIDE {
- return DeviceViewport();
- }
- virtual float DeviceScaleFactor() const OVERRIDE {
- return scale_factor_;
- }
- virtual const LayerTreeSettings& Settings() const OVERRIDE {
- static LayerTreeSettings fake_settings;
- return fake_settings;
- }
+ virtual gfx::Rect DeviceClip() const OVERRIDE { return DeviceViewport(); }
virtual void SetFullRootLayerDamage() OVERRIDE {
set_full_root_layer_damage_count_++;
}
- virtual bool HasImplThread() const OVERRIDE { return false; }
- virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; }
virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE {
return CompositorFrameMetadata();
}
- virtual bool AllowPartialSwap() const OVERRIDE {
- return true;
- }
- virtual bool ExternalStencilTestEnabled() const OVERRIDE {
- return external_stencil_test_enabled_;
- }
-
- void EnableExternalStencilTest() {
- external_stencil_test_enabled_ = true;
- }
// Methods added for test.
int set_full_root_layer_damage_count() const {
return set_full_root_layer_damage_count_;
}
- void set_viewport_and_scale(
- gfx::Size viewport_size, float scale_factor) {
- viewport_size_ = viewport_size;
- scale_factor_ = scale_factor;
- }
+ void set_viewport(gfx::Size viewport_size) { viewport_size_ = viewport_size; }
RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); }
RenderPassList* render_passes_in_draw_order() {
@@ -209,16 +182,15 @@ class FakeRendererClient : public RendererClient {
scoped_ptr<LayerImpl> root_layer_;
RenderPassList render_passes_in_draw_order_;
gfx::Size viewport_size_;
- float scale_factor_;
- bool external_stencil_test_enabled_;
};
class FakeRendererGL : public GLRenderer {
public:
FakeRendererGL(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider)
- : GLRenderer(client, output_surface, resource_provider, 0) {}
+ : GLRenderer(client, settings, output_surface, resource_provider, 0) {}
// GLRenderer methods.
@@ -243,16 +215,17 @@ class GLRendererTest : public testing::Test {
resource_provider_ =
ResourceProvider::Create(output_surface_.get(), 0).Pass();
- renderer_ = make_scoped_ptr(new FakeRendererGL(
- &renderer_client_,
- output_surface_.get(),
- resource_provider_.get()));
+ renderer_ = make_scoped_ptr(new FakeRendererGL(&renderer_client_,
+ &settings_,
+ output_surface_.get(),
+ resource_provider_.get()));
}
virtual void SetUp() { renderer_->Initialize(); }
void SwapBuffers() { renderer_->SwapBuffers(); }
+ LayerTreeSettings settings_;
FrameCountingContext* context3d_;
FakeOutputSurfaceClient output_surface_client_;
scoped_ptr<FakeOutputSurface> output_surface_;
@@ -335,6 +308,7 @@ class GLRendererShaderTest : public testing::Test {
resource_provider_ = ResourceProvider::Create(output_surface_.get(),
0).Pass();
renderer_.reset(new FakeRendererGL(&renderer_client_,
+ &settings_,
output_surface_.get(),
resource_provider_.get()));
renderer_->Initialize();
@@ -394,6 +368,7 @@ class GLRendererShaderTest : public testing::Test {
renderer_->program_shadow_);
}
+ LayerTreeSettings settings_;
FakeOutputSurfaceClient output_surface_client_;
scoped_ptr<FakeOutputSurface> output_surface_;
FakeRendererClient renderer_client_;
@@ -462,7 +437,8 @@ TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) {
EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
renderer_->SetVisible(true);
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
SwapBuffers();
@@ -476,7 +452,8 @@ TEST_F(GLRendererTest, FramebufferDiscardedAfterReadbackWhenNotVisible) {
EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
char pixels[4];
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
renderer_->GetFramebufferPixels(pixels, gfx::Rect(0, 0, 1, 1));
@@ -487,10 +464,11 @@ TEST_F(GLRendererTest, FramebufferDiscardedAfterReadbackWhenNotVisible) {
TEST_F(GLRendererTest, ExternalStencil) {
EXPECT_FALSE(renderer_->stencil_enabled());
- renderer_client_.EnableExternalStencilTest();
+ output_surface_->set_has_external_stencil_test(true);
renderer_client_.root_render_pass()->has_transparent_background = false;
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
EXPECT_TRUE(renderer_->stencil_enabled());
}
@@ -651,9 +629,12 @@ TEST(GLRendererTest2, InitializationDoesNotMakeSynchronousCalls) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
EXPECT_TRUE(renderer.Initialize());
}
@@ -693,9 +674,12 @@ TEST(GLRendererTest2, InitializationWithQuicklyLostContextDoesNotAssert) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
renderer.Initialize();
}
@@ -725,16 +709,19 @@ TEST(GLRendererTest2, OpaqueBackground) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
renderer_client.root_render_pass()->has_transparent_background = false;
EXPECT_TRUE(renderer.Initialize());
-// On DEBUG builds, render passes with opaque background clear to blue to
-// easily see regions that were not drawn on the screen.
+ // On DEBUG builds, render passes with opaque background clear to blue to
+ // easily see regions that were not drawn on the screen.
EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, 1, _))
.Times(1);
#ifdef NDEBUG
@@ -742,7 +729,8 @@ TEST(GLRendererTest2, OpaqueBackground) {
#else
EXPECT_CALL(*context, clear(_)).Times(1);
#endif
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
Mock::VerifyAndClearExpectations(context);
}
@@ -758,9 +746,12 @@ TEST(GLRendererTest2, TransparentBackground) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
renderer_client.root_render_pass()->has_transparent_background = true;
@@ -769,7 +760,8 @@ TEST(GLRendererTest2, TransparentBackground) {
EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, 1, _))
.Times(1);
EXPECT_CALL(*context, clear(_)).Times(1);
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
Mock::VerifyAndClearExpectations(context);
}
@@ -832,9 +824,12 @@ TEST(GLRendererTest2, VisibilityChangeIsLastCall) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
EXPECT_TRUE(renderer.Initialize());
@@ -844,7 +839,8 @@ TEST(GLRendererTest2, VisibilityChangeIsLastCall) {
// RenderClient and the Context by giving them both a pointer to a variable on
// the stack.
renderer.SetVisible(true);
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
renderer.SetVisible(false);
EXPECT_TRUE(context->last_call_was_set_visibility());
}
@@ -888,9 +884,12 @@ TEST(GLRendererTest2, ActiveTextureState) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
// During initialization we are allowed to set any texture parameters.
EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber());
@@ -949,11 +948,6 @@ TEST(GLRendererTest2, ActiveTextureState) {
Mock::VerifyAndClearExpectations(context);
}
-class NoClearRootRenderPassFakeClient : public FakeRendererClient {
- public:
- virtual bool ShouldClearRootRenderPass() const OVERRIDE { return false; }
-};
-
class NoClearRootRenderPassMockContext : public TestWebGraphicsContext3D {
public:
MOCK_METHOD1(clear, void(WGC3Dbitfield mask));
@@ -977,9 +971,14 @@ TEST(GLRendererTest2, ShouldClearRootRenderPass) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
- NoClearRootRenderPassFakeClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ LayerTreeSettings settings;
+ settings.should_clear_root_render_pass = false;
+
+ FakeRendererClient renderer_client;
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
EXPECT_TRUE(renderer.Initialize());
gfx::Rect viewport_rect(renderer_client.DeviceViewport());
@@ -1020,7 +1019,8 @@ TEST(GLRendererTest2, ShouldClearRootRenderPass) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
// In multiple render passes all but the root pass should clear the
// framebuffer.
@@ -1059,9 +1059,12 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
FakeRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
EXPECT_TRUE(renderer.Initialize());
EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
@@ -1092,7 +1095,8 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
}
class NonReshapableOutputSurface : public FakeOutputSurface {
@@ -1158,9 +1162,12 @@ TEST(GLRendererTest2, ScissorAndViewportWithinNonreshapableSurface) {
scoped_ptr<ResourceProvider> resource_provider(
ResourceProvider::Create(output_surface.get(), 0));
+ LayerTreeSettings settings;
OffsetViewportRendererClient renderer_client;
- FakeRendererGL renderer(
- &renderer_client, output_surface.get(), resource_provider.get());
+ FakeRendererGL renderer(&renderer_client,
+ &settings,
+ output_surface.get(),
+ resource_provider.get());
EXPECT_TRUE(renderer.Initialize());
EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
@@ -1177,7 +1184,8 @@ TEST(GLRendererTest2, ScissorAndViewportWithinNonreshapableSurface) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
- renderer.DrawFrame(renderer_client.render_passes_in_draw_order(), NULL);
+ renderer.DrawFrame(
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
}
TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
@@ -1240,7 +1248,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassProgram();
// RenderPassColorMatrixProgram
@@ -1256,7 +1265,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassColorMatrixProgram();
// RenderPassMaskProgram
@@ -1276,7 +1286,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassMaskProgram();
// RenderPassMaskColorMatrixProgram
@@ -1292,7 +1303,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassMaskColorMatrixProgram();
// RenderPassProgramAA
@@ -1312,7 +1324,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassProgramAA();
// RenderPassColorMatrixProgramAA
@@ -1328,7 +1341,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassColorMatrixProgramAA();
// RenderPassMaskProgramAA
@@ -1345,7 +1359,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassMaskProgramAA();
// RenderPassMaskColorMatrixProgramAA
@@ -1361,7 +1376,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestRenderPassMaskColorMatrixProgramAA();
}
@@ -1409,7 +1425,8 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
// If use_aa incorrectly ignores clipping, it will use the
// RenderPassProgramAA shader instead of the RenderPassProgram.
@@ -1439,7 +1456,8 @@ TEST_F(GLRendererShaderTest, DrawSolidColorShader) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
- renderer_->DrawFrame(renderer_client_.render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
TestSolidColorProgramAA();
}
@@ -1493,15 +1511,14 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
resource_provider_ = ResourceProvider::Create(&output_surface_, 0).Pass();
- renderer_.reset(new FakeRendererGL(this,
- &output_surface_,
- resource_provider_.get()));
+ renderer_.reset(new FakeRendererGL(
+ this, &settings_, &output_surface_, resource_provider_.get()));
EXPECT_TRUE(renderer_->Initialize());
}
void SwapBuffers() { renderer_->SwapBuffers(); }
- void DrawFrame() {
+ void DrawFrame(float device_scale_factor) {
gfx::Rect viewport_rect(DeviceViewport());
ScopedPtrVector<RenderPass>* render_passes = render_passes_in_draw_order();
render_passes->clear();
@@ -1514,7 +1531,7 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return());
EXPECT_CALL(output_surface_,
- Reshape(DeviceViewport().size(), DeviceScaleFactor())).Times(1);
+ Reshape(DeviceViewport().size(), device_scale_factor)).Times(1);
EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1);
@@ -1522,7 +1539,8 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
renderer_->DecideRenderPassAllocationsForFrame(
*render_passes_in_draw_order());
- renderer_->DrawFrame(render_passes_in_draw_order(), NULL);
+ renderer_->DrawFrame(
+ render_passes_in_draw_order(), NULL, device_scale_factor, true);
}
OutputSurfaceMockContext* Context() {
@@ -1530,6 +1548,7 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
output_surface_.context_provider()->Context3d());
}
+ LayerTreeSettings settings_;
FakeOutputSurfaceClient output_surface_client_;
StrictMock<MockOutputSurface> output_surface_;
scoped_ptr<ResourceProvider> resource_provider_;
@@ -1537,32 +1556,32 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
};
TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) {
- DrawFrame();
+ DrawFrame(1.f);
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
renderer_->SwapBuffers();
}
TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) {
- DrawFrame();
+ DrawFrame(1.f);
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
renderer_->SwapBuffers();
- set_viewport_and_scale(gfx::Size(2, 2), 2.f);
+ set_viewport(gfx::Size(2, 2));
renderer_->ViewportChanged();
- DrawFrame();
+ DrawFrame(2.f);
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
renderer_->SwapBuffers();
- DrawFrame();
+ DrawFrame(2.f);
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
renderer_->SwapBuffers();
- set_viewport_and_scale(gfx::Size(1, 1), 1.f);
+ set_viewport(gfx::Size(1, 1));
renderer_->ViewportChanged();
- DrawFrame();
+ DrawFrame(1.f);
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
renderer_->SwapBuffers();
}
diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc
index bd2e8c1..2ffcf95 100644
--- a/cc/output/output_surface.cc
+++ b/cc/output/output_surface.cc
@@ -30,8 +30,7 @@ using std::vector;
namespace cc {
-OutputSurface::OutputSurface(
- scoped_refptr<ContextProvider> context_provider)
+OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
: context_provider_(context_provider),
has_gl_discard_backbuffer_(false),
has_swap_buffers_complete_callback_(false),
@@ -42,8 +41,8 @@ OutputSurface::OutputSurface(
needs_begin_frame_(false),
begin_frame_pending_(false),
client_(NULL),
- check_for_retroactive_begin_frame_pending_(false) {
-}
+ check_for_retroactive_begin_frame_pending_(false),
+ external_stencil_test_enabled_(false) {}
OutputSurface::OutputSurface(
scoped_ptr<cc::SoftwareOutputDevice> software_device)
@@ -57,8 +56,8 @@ OutputSurface::OutputSurface(
needs_begin_frame_(false),
begin_frame_pending_(false),
client_(NULL),
- check_for_retroactive_begin_frame_pending_(false) {
-}
+ check_for_retroactive_begin_frame_pending_(false),
+ external_stencil_test_enabled_(false) {}
OutputSurface::OutputSurface(
scoped_refptr<ContextProvider> context_provider,
@@ -74,8 +73,8 @@ OutputSurface::OutputSurface(
needs_begin_frame_(false),
begin_frame_pending_(false),
client_(NULL),
- check_for_retroactive_begin_frame_pending_(false) {
-}
+ check_for_retroactive_begin_frame_pending_(false),
+ external_stencil_test_enabled_(false) {}
void OutputSurface::InitializeBeginFrameEmulation(
base::SingleThreadTaskRunner* task_runner,
@@ -220,7 +219,7 @@ void OutputSurface::DidLoseOutputSurface() {
}
void OutputSurface::SetExternalStencilTest(bool enabled) {
- client_->SetExternalStencilTest(enabled);
+ external_stencil_test_enabled_ = enabled;
}
void OutputSurface::SetExternalDrawConstraints(const gfx::Transform& transform,
@@ -237,10 +236,12 @@ OutputSurface::~OutputSurface() {
ResetContext3d();
}
-bool OutputSurface::ForcedDrawToSoftwareDevice() const {
- return false;
+bool OutputSurface::HasExternalStencilTest() const {
+ return external_stencil_test_enabled_;
}
+bool OutputSurface::ForcedDrawToSoftwareDevice() const { return false; }
+
bool OutputSurface::BindToClient(cc::OutputSurfaceClient* client) {
DCHECK(client);
client_ = client;
diff --git a/cc/output/output_surface.h b/cc/output/output_surface.h
index 84d128a..c01c768 100644
--- a/cc/output/output_surface.h
+++ b/cc/output/output_surface.h
@@ -73,6 +73,8 @@ class CC_EXPORT OutputSurface : public FrameRateControllerClient {
return capabilities_;
}
+ virtual bool HasExternalStencilTest() const;
+
// Obtain the 3d context or the software device associated with this output
// surface. Either of these may return a null pointer, but not both.
// In the event of a lost context, the entire output surface should be
@@ -194,6 +196,8 @@ class CC_EXPORT OutputSurface : public FrameRateControllerClient {
// redundant checks for a retroactive BeginFrame.
bool check_for_retroactive_begin_frame_pending_;
+ bool external_stencil_test_enabled_;
+
DISALLOW_COPY_AND_ASSIGN(OutputSurface);
};
diff --git a/cc/output/output_surface_client.h b/cc/output/output_surface_client.h
index 7b59513..06e148d 100644
--- a/cc/output/output_surface_client.h
+++ b/cc/output/output_surface_client.h
@@ -34,7 +34,6 @@ class CC_EXPORT OutputSurfaceClient {
virtual void BeginFrame(const BeginFrameArgs& args) = 0;
virtual void OnSwapBuffersComplete(const CompositorFrameAck* ack) = 0;
virtual void DidLoseOutputSurface() = 0;
- virtual void SetExternalStencilTest(bool enabled) = 0;
virtual void SetExternalDrawConstraints(const gfx::Transform& transform,
gfx::Rect viewport,
gfx::Rect clip,
diff --git a/cc/output/renderer.h b/cc/output/renderer.h
index 7624a5b..32a109f 100644
--- a/cc/output/renderer.h
+++ b/cc/output/renderer.h
@@ -23,15 +23,8 @@ class CC_EXPORT RendererClient {
// contained within the output surface size.
virtual gfx::Rect DeviceViewport() const = 0;
virtual gfx::Rect DeviceClip() const = 0;
-
- virtual float DeviceScaleFactor() const = 0;
- virtual const LayerTreeSettings& Settings() const = 0;
virtual void SetFullRootLayerDamage() = 0;
- virtual bool HasImplThread() const = 0;
- virtual bool ShouldClearRootRenderPass() const = 0;
virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const = 0;
- virtual bool AllowPartialSwap() const = 0;
- virtual bool ExternalStencilTestEnabled() const = 0;
protected:
virtual ~RendererClient() {}
@@ -43,8 +36,6 @@ class CC_EXPORT Renderer {
virtual const RendererCapabilities& Capabilities() const = 0;
- const LayerTreeSettings& Settings() const { return client_->Settings(); }
-
virtual void ViewportChanged() {}
virtual bool CanReadPixels() const = 0;
@@ -54,11 +45,12 @@ class CC_EXPORT Renderer {
virtual bool HaveCachedResourcesForRenderPassId(RenderPass::Id id) const;
// This passes ownership of the render passes to the renderer. It should
- // consume them, and empty the list.
- // The |offscreen_context_provider| may change from frame to frame and should
- // not be cached.
+ // consume them, and empty the list. The parameters here may change from frame
+ // to frame and should not be cached.
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
- ContextProvider* offscreen_context_provider) = 0;
+ ContextProvider* offscreen_context_provider,
+ float device_scale_factor,
+ bool allow_partial_swap) = 0;
// Waits for rendering to finish.
virtual void Finish() = 0;
@@ -82,10 +74,11 @@ class CC_EXPORT Renderer {
virtual void SetDiscardBackBufferWhenNotVisible(bool discard) = 0;
protected:
- explicit Renderer(RendererClient* client)
- : client_(client) {}
+ explicit Renderer(RendererClient* client, const LayerTreeSettings* settings)
+ : client_(client), settings_(settings) {}
RendererClient* client_;
+ const LayerTreeSettings* settings_;
private:
DISALLOW_COPY_AND_ASSIGN(Renderer);
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 04f8a8b..7e8f4f8 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -51,21 +51,23 @@ bool IsScaleAndIntegerTranslate(const SkMatrix& matrix) {
scoped_ptr<SoftwareRenderer> SoftwareRenderer::Create(
RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider) {
- return make_scoped_ptr(
- new SoftwareRenderer(client, output_surface, resource_provider));
+ return make_scoped_ptr(new SoftwareRenderer(
+ client, settings, output_surface, resource_provider));
}
SoftwareRenderer::SoftwareRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider)
- : DirectRenderer(client, output_surface, resource_provider),
- visible_(true),
- is_scissor_enabled_(false),
- is_backbuffer_discarded_(false),
- output_device_(output_surface->software_device()),
- current_canvas_(NULL) {
+ : DirectRenderer(client, settings, output_surface, resource_provider),
+ visible_(true),
+ is_scissor_enabled_(false),
+ is_backbuffer_discarded_(false),
+ output_device_(output_surface->software_device()),
+ current_canvas_(NULL) {
if (resource_provider_) {
capabilities_.max_texture_size = resource_provider_->max_texture_size();
capabilities_.best_texture_format =
@@ -76,7 +78,7 @@ SoftwareRenderer::SoftwareRenderer(RendererClient* client,
capabilities_.allow_partial_texture_updates = true;
capabilities_.using_partial_swap = true;
- capabilities_.using_map_image = Settings().use_map_image;
+ capabilities_.using_map_image = settings_->use_map_image;
capabilities_.using_shared_memory_resources = true;
}
@@ -135,7 +137,7 @@ void SoftwareRenderer::EnsureScissorTestDisabled() {
void SoftwareRenderer::Finish() {}
void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) {
- DCHECK(!client_->ExternalStencilTestEnabled());
+ DCHECK(!output_surface_->HasExternalStencilTest());
current_framebuffer_lock_.reset();
current_canvas_ = root_canvas_;
}
@@ -228,8 +230,7 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) {
quad->IsLeftEdge() &&
quad->IsBottomEdge() &&
quad->IsRightEdge();
- if (Settings().allow_antialiasing &&
- all_four_edges_are_exterior)
+ if (settings_->allow_antialiasing && all_four_edges_are_exterior)
current_paint_.setAntiAlias(true);
current_paint_.setFilterBitmap(true);
}
diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h
index e07b237..e534f80 100644
--- a/cc/output/software_renderer.h
+++ b/cc/output/software_renderer.h
@@ -29,6 +29,7 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer {
public:
static scoped_ptr<SoftwareRenderer> Create(
RendererClient* client,
+ const LayerTreeSettings* settings,
OutputSurface* output_surface,
ResourceProvider* resource_provider);
@@ -67,10 +68,10 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer {
DrawingFrame* frame,
scoped_ptr<CopyOutputRequest> request) OVERRIDE;
- SoftwareRenderer(
- RendererClient* client,
- OutputSurface* output_surface,
- ResourceProvider* resource_provider);
+ SoftwareRenderer(RendererClient* client,
+ const LayerTreeSettings* settings,
+ OutputSurface* output_surface,
+ ResourceProvider* resource_provider);
private:
void ClearCanvas(SkColor color);
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index b8a5b21..6f61525 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -27,8 +27,6 @@ namespace {
class SoftwareRendererTest : public testing::Test, public RendererClient {
public:
- SoftwareRendererTest() : should_clear_root_render_pass_(true) {}
-
void InitializeRenderer(
scoped_ptr<SoftwareOutputDevice> software_output_device) {
output_surface_ = FakeOutputSurface::CreateSoftware(
@@ -37,7 +35,7 @@ class SoftwareRendererTest : public testing::Test, public RendererClient {
resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0);
renderer_ = SoftwareRenderer::Create(
- this, output_surface_.get(), resource_provider());
+ this, &settings_, output_surface_.get(), resource_provider());
}
ResourceProvider* resource_provider() const {
@@ -50,44 +48,23 @@ class SoftwareRendererTest : public testing::Test, public RendererClient {
viewport_ = viewport;
}
- void set_should_clear_root_render_pass(bool clear_root_render_pass) {
- should_clear_root_render_pass_ = clear_root_render_pass;
- }
-
// RendererClient implementation.
virtual gfx::Rect DeviceViewport() const OVERRIDE {
return viewport_;
}
- virtual gfx::Rect DeviceClip() const OVERRIDE {
- return DeviceViewport();
- }
- virtual float DeviceScaleFactor() const OVERRIDE {
- return 1.f;
- }
- virtual const LayerTreeSettings& Settings() const OVERRIDE {
- return settings_;
- }
+ virtual gfx::Rect DeviceClip() const OVERRIDE { return DeviceViewport(); }
virtual void SetFullRootLayerDamage() OVERRIDE {}
- virtual bool HasImplThread() const OVERRIDE { return false; }
- virtual bool ShouldClearRootRenderPass() const OVERRIDE {
- return should_clear_root_render_pass_;
- }
virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE {
return CompositorFrameMetadata();
}
- virtual bool AllowPartialSwap() const OVERRIDE {
- return true;
- }
- virtual bool ExternalStencilTestEnabled() const OVERRIDE { return false; }
protected:
+ LayerTreeSettings settings_;
FakeOutputSurfaceClient output_surface_client_;
scoped_ptr<FakeOutputSurface> output_surface_;
scoped_ptr<ResourceProvider> resource_provider_;
scoped_ptr<SoftwareRenderer> renderer_;
gfx::Rect viewport_;
- LayerTreeSettings settings_;
- bool should_clear_root_render_pass_;
};
TEST_F(SoftwareRendererTest, SolidColorQuad) {
@@ -118,7 +95,9 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) {
RenderPassList list;
list.push_back(root_render_pass.PassAs<RenderPass>());
- renderer()->DrawFrame(&list, NULL);
+
+ float device_scale_factor = 1.f;
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -207,7 +186,9 @@ TEST_F(SoftwareRendererTest, TileQuad) {
RenderPassList list;
list.push_back(root_render_pass.PassAs<RenderPass>());
- renderer()->DrawFrame(&list, NULL);
+
+ float device_scale_factor = 1.f;
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -275,7 +256,9 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
RenderPassList list;
list.push_back(root_render_pass.PassAs<RenderPass>());
- renderer()->DrawFrame(&list, NULL);
+
+ float device_scale_factor = 1.f;
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -305,9 +288,11 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
}
TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
+ float device_scale_factor = 1.f;
gfx::Rect viewport_rect(0, 0, 100, 100);
set_viewport(viewport_rect);
- set_should_clear_root_render_pass(false);
+
+ settings_.should_clear_root_render_pass = false;
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
RenderPassList list;
@@ -325,7 +310,7 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
@@ -344,7 +329,7 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
// If we didn't clear, the borders should still be green.
@@ -359,6 +344,7 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
}
TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
+ float device_scale_factor = 1.f;
gfx::Rect viewport_rect(0, 0, 100, 100);
set_viewport(viewport_rect);
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
@@ -390,7 +376,7 @@ TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect;
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));