Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4689)

Unified Diff: cc/output/software_renderer_unittest.cc

Issue 280043002: Use Async readbacks in the SoftwareRenderer unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nocnr-software-renderer-tests: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/software_renderer_unittest.cc
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index af4343b42c589f69d23c74be8079a135fe763704..ee5af29f991b7169dbdd4a8f2c1b5ec7592c1358 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -4,8 +4,11 @@
#include "cc/output/software_renderer.h"
+#include "base/run_loop.h"
#include "cc/layers/quad_sink.h"
#include "cc/output/compositor_frame_metadata.h"
+#include "cc/output/copy_output_request.h"
+#include "cc/output/copy_output_result.h"
#include "cc/output/software_output_device.h"
#include "cc/quads/render_pass.h"
#include "cc/quads/render_pass_draw_quad.h"
@@ -50,6 +53,35 @@ class SoftwareRendererTest : public testing::Test, public RendererClient {
// RendererClient implementation.
virtual void SetFullRootLayerDamage() OVERRIDE {}
+ scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list,
+ float device_scale_factor,
+ gfx::Rect device_viewport_rect) {
+ scoped_ptr<SkBitmap> bitmap_result;
+ base::RunLoop loop;
+
+ list->back()->copy_requests.push_back(
+ CopyOutputRequest::CreateBitmapRequest(
+ base::Bind(&SoftwareRendererTest::SaveBitmapResult,
+ base::Unretained(&bitmap_result),
+ loop.QuitClosure())));
+
+ renderer()->DrawFrame(list,
+ device_scale_factor,
+ device_viewport_rect,
+ device_viewport_rect,
+ false);
+ loop.Run();
+ return bitmap_result.Pass();
+ }
+
+ static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result,
+ const base::Closure& quit_closure,
+ scoped_ptr<CopyOutputResult> result) {
+ DCHECK(result->HasBitmap());
+ *bitmap_result = result->TakeBitmap();
+ quit_closure.Run();
+ }
+
protected:
LayerTreeSettings settings_;
FakeOutputSurfaceClient output_surface_client_;
@@ -96,25 +128,18 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) {
float device_scale_factor = 1.f;
gfx::Rect device_viewport_rect(outer_size);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- device_viewport_rect,
- device_viewport_rect,
- false);
-
- SkBitmap output;
- output.setConfig(
- SkBitmap::kARGB_8888_Config, outer_rect.width(), outer_rect.height());
- output.allocPixels();
- renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
-
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
+ scoped_ptr<SkBitmap> output =
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(outer_rect.width(), output->info().fWidth);
+ EXPECT_EQ(outer_rect.width(), output->info().fHeight);
+
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0));
EXPECT_EQ(SK_ColorYELLOW,
- output.getColor(outer_size.width() - 1, outer_size.height() - 1));
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(1, 1));
- EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 2));
+ output->getColor(outer_size.width() - 1, outer_size.height() - 1));
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1));
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2));
EXPECT_EQ(SK_ColorCYAN,
- output.getColor(inner_size.width() - 1, inner_size.height() - 1));
+ output->getColor(inner_size.width() - 1, inner_size.height() - 1));
}
TEST_F(SoftwareRendererTest, TileQuad) {
@@ -200,24 +225,17 @@ TEST_F(SoftwareRendererTest, TileQuad) {
float device_scale_factor = 1.f;
gfx::Rect device_viewport_rect(outer_size);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- device_viewport_rect,
- device_viewport_rect,
- false);
-
- SkBitmap output;
- output.setConfig(
- SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height());
- output.allocPixels();
- renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
+ scoped_ptr<SkBitmap> output =
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(outer_rect.width(), output->info().fWidth);
+ EXPECT_EQ(outer_rect.width(), output->info().fHeight);
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0));
EXPECT_EQ(SK_ColorYELLOW,
- output.getColor(outer_size.width() - 1, outer_size.height() - 1));
- EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1));
+ output->getColor(outer_size.width() - 1, outer_size.height() - 1));
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1));
EXPECT_EQ(SK_ColorCYAN,
- output.getColor(inner_size.width() - 1, inner_size.height() - 1));
+ output->getColor(inner_size.width() - 1, inner_size.height() - 1));
}
TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
@@ -281,70 +299,57 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
float device_scale_factor = 1.f;
gfx::Rect device_viewport_rect(tile_size);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- device_viewport_rect,
- device_viewport_rect,
- false);
-
- SkBitmap output;
- output.setConfig(
- SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height());
- output.allocPixels();
- renderer()->GetFramebufferPixels(output.getPixels(), tile_rect);
+ scoped_ptr<SkBitmap> output =
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(tile_rect.width(), output->info().fWidth);
+ EXPECT_EQ(tile_rect.width(), output->info().fHeight);
// Check portion of tile not in visible rect isn't drawn.
const unsigned int kTransparent = SK_ColorTRANSPARENT;
- EXPECT_EQ(kTransparent, output.getColor(0, 0));
+ EXPECT_EQ(kTransparent, output->getColor(0, 0));
EXPECT_EQ(kTransparent,
- output.getColor(tile_rect.width() - 1, tile_rect.height() - 1));
+ output->getColor(tile_rect.width() - 1, tile_rect.height() - 1));
EXPECT_EQ(kTransparent,
- output.getColor(visible_rect.x() - 1, visible_rect.y() - 1));
+ output->getColor(visible_rect.x() - 1, visible_rect.y() - 1));
EXPECT_EQ(kTransparent,
- output.getColor(visible_rect.right(), visible_rect.bottom()));
+ output->getColor(visible_rect.right(), visible_rect.bottom()));
// Ensure visible part is drawn correctly.
- EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y()));
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y()));
EXPECT_EQ(
SK_ColorCYAN,
- output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2));
+ output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2));
// Ensure last visible line is correct.
EXPECT_EQ(
SK_ColorYELLOW,
- output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1));
+ output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1));
}
TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
float device_scale_factor = 1.f;
- gfx::Rect viewport_rect(0, 0, 100, 100);
+ gfx::Rect device_viewport_rect(0, 0, 100, 100);
settings_.should_clear_root_render_pass = false;
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
RenderPassList list;
- SkBitmap output;
- output.setConfig(SkBitmap::kARGB_8888_Config,
- viewport_rect.width(),
- viewport_rect.height());
- output.allocPixels();
-
// Draw a fullscreen green quad in a first frame.
RenderPass::Id root_clear_pass_id(1, 0);
TestRenderPass* root_clear_pass = AddRenderPass(
- &list, root_clear_pass_id, viewport_rect, gfx::Transform());
- AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
+ &list, root_clear_pass_id, device_viewport_rect, gfx::Transform());
+ AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- viewport_rect,
- viewport_rect,
- false);
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
-
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
+
+ scoped_ptr<SkBitmap> output =
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight);
+
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0));
EXPECT_EQ(SK_ColorGREEN,
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
+ output->getColor(device_viewport_rect.width() - 1,
+ device_viewport_rect.height() - 1));
list.clear();
@@ -354,41 +359,35 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
RenderPass::Id root_smaller_pass_id(2, 0);
TestRenderPass* root_smaller_pass = AddRenderPass(
- &list, root_smaller_pass_id, viewport_rect, gfx::Transform());
+ &list, root_smaller_pass_id, device_viewport_rect, gfx::Transform());
AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- viewport_rect,
- viewport_rect,
- false);
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
+
+ output = DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight);
// If we didn't clear, the borders should still be green.
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0));
EXPECT_EQ(SK_ColorGREEN,
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
+ output->getColor(device_viewport_rect.width() - 1,
+ device_viewport_rect.height() - 1));
EXPECT_EQ(SK_ColorMAGENTA,
- output.getColor(smaller_rect.x(), smaller_rect.y()));
- EXPECT_EQ(SK_ColorMAGENTA,
- output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
+ output->getColor(smaller_rect.x(), smaller_rect.y()));
+ EXPECT_EQ(
+ SK_ColorMAGENTA,
+ output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
}
TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
float device_scale_factor = 1.f;
- gfx::Rect viewport_rect(0, 0, 100, 100);
+ gfx::Rect device_viewport_rect(0, 0, 100, 100);
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
RenderPassList list;
- SkBitmap output;
- output.setConfig(SkBitmap::kARGB_8888_Config,
- viewport_rect.width(),
- viewport_rect.height());
- output.allocPixels();
-
// Pass drawn as inner quad is magenta.
gfx::Rect smaller_rect(20, 20, 60, 60);
RenderPass::Id smaller_pass_id(2, 1);
@@ -398,40 +397,40 @@ TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
// Root pass is green.
RenderPass::Id root_clear_pass_id(1, 0);
- TestRenderPass* root_clear_pass =
- AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform());
+ TestRenderPass* root_clear_pass = AddRenderPass(
+ &list, root_clear_pass_id, device_viewport_rect, gfx::Transform());
AddRenderPassQuad(root_clear_pass, smaller_pass);
- AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
+ AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN);
// Interior pass quad has smaller visible rect.
gfx::Rect interior_visible_rect(30, 30, 40, 40);
root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect;
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list,
- device_scale_factor,
- viewport_rect,
- viewport_rect,
- false);
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
-
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
- EXPECT_EQ(
- SK_ColorGREEN,
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
+
+ scoped_ptr<SkBitmap> output =
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth);
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight);
+
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0));
+ EXPECT_EQ(SK_ColorGREEN,
+ output->getColor(device_viewport_rect.width() - 1,
+ device_viewport_rect.height() - 1));
// Part outside visible rect should remain green.
- EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y()));
+ EXPECT_EQ(SK_ColorGREEN,
+ output->getColor(smaller_rect.x(), smaller_rect.y()));
EXPECT_EQ(
SK_ColorGREEN,
- output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
+ output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
EXPECT_EQ(
SK_ColorMAGENTA,
- output.getColor(interior_visible_rect.x(), interior_visible_rect.y()));
+ output->getColor(interior_visible_rect.x(), interior_visible_rect.y()));
EXPECT_EQ(SK_ColorMAGENTA,
- output.getColor(interior_visible_rect.right() - 1,
- interior_visible_rect.bottom() - 1));
+ output->getColor(interior_visible_rect.right() - 1,
+ interior_visible_rect.bottom() - 1));
}
} // namespace
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698