| Index: cc/output/direct_renderer.cc
|
| diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
|
| index e2c17b8a7cdb320d480f5b4905c49bc848a8982b..52498aedcd8f1e8fd8d427e1e2bdfeee9427b150 100644
|
| --- a/cc/output/direct_renderer.cc
|
| +++ b/cc/output/direct_renderer.cc
|
| @@ -82,6 +82,7 @@ void DirectRenderer::QuadRectTransform(gfx::Transform* quad_rect_transform,
|
| // static
|
| void DirectRenderer::InitializeMatrices(DrawingFrame* frame,
|
| gfx::Rect draw_rect,
|
| + gfx::Rect window_rect,
|
| bool flip_y) {
|
| if (flip_y) {
|
| frame->projection_matrix = OrthoProjectionMatrix(draw_rect.x(),
|
| @@ -94,19 +95,26 @@ void DirectRenderer::InitializeMatrices(DrawingFrame* frame,
|
| draw_rect.y(),
|
| draw_rect.bottom());
|
| }
|
| - frame->window_matrix =
|
| - window_matrix(0, 0, draw_rect.width(), draw_rect.height());
|
| +
|
| + frame->window_matrix = window_matrix(window_rect.x(),
|
| + window_rect.y(),
|
| + window_rect.width(),
|
| + window_rect.height());
|
| frame->flipped_y = flip_y;
|
| }
|
|
|
| -// static
|
| gfx::Rect DirectRenderer::MoveScissorToWindowSpace(
|
| const DrawingFrame* frame, const gfx::RectF& scissor_rect) {
|
| gfx::Rect scissor_rect_in_canvas_space = gfx::ToEnclosingRect(scissor_rect);
|
| - // The scissor coordinates must be supplied in viewport space so we need to
|
| + // The scissor coordinates must be supplied in window space so we need to
|
| // offset by the relative position of the top left corner of the current
|
| // render pass.
|
| gfx::Rect framebuffer_output_rect = frame->current_render_pass->output_rect;
|
| + if (!frame->current_texture) {
|
| + framebuffer_output_rect = gfx::Rect(output_surface_->SurfaceSize());
|
| + scissor_rect_in_canvas_space.Offset(client_->DeviceViewport().x(),
|
| + client_->DeviceViewport().y());
|
| + }
|
| scissor_rect_in_canvas_space.set_x(
|
| scissor_rect_in_canvas_space.x() - framebuffer_output_rect.x());
|
| if (frame->flipped_y && !frame->current_texture) {
|
| @@ -121,8 +129,10 @@ gfx::Rect DirectRenderer::MoveScissorToWindowSpace(
|
| }
|
|
|
| DirectRenderer::DirectRenderer(RendererClient* client,
|
| + OutputSurface* output_surface,
|
| ResourceProvider* resource_provider)
|
| : Renderer(client),
|
| + output_surface_(output_surface),
|
| resource_provider_(resource_provider) {}
|
|
|
| DirectRenderer::~DirectRenderer() {}
|
| @@ -197,7 +207,13 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order) {
|
| frame.root_damage_rect =
|
| Capabilities().using_partial_swap && client_->AllowPartialSwap() ?
|
| root_render_pass->damage_rect : root_render_pass->output_rect;
|
| - frame.root_damage_rect.Intersect(gfx::Rect(ViewportSize()));
|
| + frame.root_damage_rect.Intersect(gfx::Rect(client_->DeviceViewport().size()));
|
| +
|
| + // Only reshape when we know we are going to draw. Otherwise, the reshape
|
| + // 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());
|
|
|
| BeginDrawingFrame(&frame);
|
| for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
|
| @@ -327,8 +343,16 @@ bool DirectRenderer::UseRenderPass(DrawingFrame* frame,
|
|
|
| if (render_pass == frame->root_render_pass) {
|
| BindFramebufferToOutputSurface(frame);
|
| - InitializeMatrices(frame, render_pass->output_rect, FlippedFramebuffer());
|
| - SetDrawViewportSize(render_pass->output_rect.size());
|
| + gfx::Rect viewport = client_->DeviceViewport();
|
| + if (FlippedFramebuffer())
|
| + viewport.set_y(output_surface_->SurfaceSize().height() -
|
| + viewport.bottom());
|
| + InitializeMatrices(
|
| + frame,
|
| + render_pass->output_rect,
|
| + viewport,
|
| + FlippedFramebuffer());
|
| + SetDrawViewport(viewport);
|
| return true;
|
| }
|
|
|
|
|