| Index: cc/output/renderer_pixeltest.cc
|
| diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
|
| index 006c57497aa358b14539b8138b7d2916b67b3424..743e1cfe59680e2a05d92d6371246879f9d4233c 100644
|
| --- a/cc/output/renderer_pixeltest.cc
|
| +++ b/cc/output/renderer_pixeltest.cc
|
| @@ -111,52 +111,6 @@
|
| FilterOperations()); // background filters
|
| }
|
|
|
| -void CreateTestTwoColoredTextureDrawQuad(const gfx::Rect& rect,
|
| - SkColor texel_color,
|
| - SkColor texel_stripe_color,
|
| - SkColor background_color,
|
| - bool premultiplied_alpha,
|
| - const SharedQuadState* shared_state,
|
| - ResourceProvider* resource_provider,
|
| - RenderPass* render_pass) {
|
| - SkPMColor pixel_color = premultiplied_alpha
|
| - ? SkPreMultiplyColor(texel_color)
|
| - : SkPackARGB32NoCheck(SkColorGetA(texel_color),
|
| - SkColorGetR(texel_color),
|
| - SkColorGetG(texel_color),
|
| - SkColorGetB(texel_color));
|
| - SkPMColor pixel_stripe_color =
|
| - premultiplied_alpha
|
| - ? SkPreMultiplyColor(texel_stripe_color)
|
| - : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color),
|
| - SkColorGetR(texel_stripe_color),
|
| - SkColorGetG(texel_stripe_color),
|
| - SkColorGetB(texel_stripe_color));
|
| - std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
|
| - for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) {
|
| - for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) {
|
| - pixels[i * rect.width() + k] = pixel_stripe_color;
|
| - }
|
| - }
|
| - ResourceProvider::ResourceId resource = resource_provider->CreateResource(
|
| - rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
|
| - RGBA_8888);
|
| - resource_provider->SetPixels(resource,
|
| - reinterpret_cast<uint8_t*>(&pixels.front()),
|
| - rect, rect, gfx::Vector2d());
|
| -
|
| - float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
| - const gfx::PointF uv_top_left(0.0f, 0.0f);
|
| - const gfx::PointF uv_bottom_right(1.0f, 1.0f);
|
| - const bool flipped = false;
|
| - const bool nearest_neighbor = false;
|
| - TextureDrawQuad* quad =
|
| - render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
|
| - quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource,
|
| - premultiplied_alpha, uv_top_left, uv_bottom_right,
|
| - background_color, vertex_opacity, flipped, nearest_neighbor);
|
| -}
|
| -
|
| void CreateTestTextureDrawQuad(const gfx::Rect& rect,
|
| SkColor texel_color,
|
| SkColor background_color,
|
| @@ -181,216 +135,20 @@
|
|
|
| float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
|
|
| - const gfx::PointF uv_top_left(0.0f, 0.0f);
|
| - const gfx::PointF uv_bottom_right(1.0f, 1.0f);
|
| - const bool flipped = false;
|
| - const bool nearest_neighbor = false;
|
| TextureDrawQuad* quad =
|
| render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
|
| - quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource,
|
| - premultiplied_alpha, uv_top_left, uv_bottom_right,
|
| - background_color, vertex_opacity, flipped, nearest_neighbor);
|
| -}
|
| -
|
| -void CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| - const SharedQuadState* shared_state,
|
| - scoped_refptr<media::VideoFrame> video_frame,
|
| - uint8 alpha_value,
|
| - const gfx::RectF& tex_coord_rect,
|
| - RenderPass* render_pass,
|
| - VideoResourceUpdater* video_resource_updater,
|
| - const gfx::Rect& rect,
|
| - ResourceProvider* resource_provider) {
|
| - const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
|
| - const YUVVideoDrawQuad::ColorSpace color_space =
|
| - (video_frame->format() == media::VideoFrame::YV12J
|
| - ? YUVVideoDrawQuad::JPEG
|
| - : YUVVideoDrawQuad::REC_601);
|
| - const gfx::Rect opaque_rect(0, 0, 0, 0);
|
| -
|
| - if (with_alpha) {
|
| - memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
|
| - video_frame->stride(media::VideoFrame::kAPlane) *
|
| - video_frame->rows(media::VideoFrame::kAPlane));
|
| - }
|
| -
|
| - VideoFrameExternalResources resources =
|
| - video_resource_updater->CreateExternalResourcesFromVideoFrame(
|
| - video_frame);
|
| -
|
| - EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
|
| - EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
|
| - resources.mailboxes.size());
|
| - EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
|
| - resources.release_callbacks.size());
|
| -
|
| - ResourceProvider::ResourceId y_resource =
|
| - resource_provider->CreateResourceFromTextureMailbox(
|
| - resources.mailboxes[media::VideoFrame::kYPlane],
|
| - SingleReleaseCallbackImpl::Create(
|
| - resources.release_callbacks[media::VideoFrame::kYPlane]));
|
| - ResourceProvider::ResourceId u_resource =
|
| - resource_provider->CreateResourceFromTextureMailbox(
|
| - resources.mailboxes[media::VideoFrame::kUPlane],
|
| - SingleReleaseCallbackImpl::Create(
|
| - resources.release_callbacks[media::VideoFrame::kUPlane]));
|
| - ResourceProvider::ResourceId v_resource =
|
| - resource_provider->CreateResourceFromTextureMailbox(
|
| - resources.mailboxes[media::VideoFrame::kVPlane],
|
| - SingleReleaseCallbackImpl::Create(
|
| - resources.release_callbacks[media::VideoFrame::kVPlane]));
|
| - ResourceProvider::ResourceId a_resource = 0;
|
| - if (with_alpha) {
|
| - a_resource = resource_provider->CreateResourceFromTextureMailbox(
|
| - resources.mailboxes[media::VideoFrame::kAPlane],
|
| - SingleReleaseCallbackImpl::Create(
|
| - resources.release_callbacks[media::VideoFrame::kAPlane]));
|
| - }
|
| -
|
| - YUVVideoDrawQuad* yuv_quad =
|
| - render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
|
| - yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
|
| - video_frame->coded_size(), y_resource, u_resource,
|
| - v_resource, a_resource, color_space);
|
| -}
|
| -
|
| -void CreateTestYUVVideoDrawQuad_Striped(
|
| - const SharedQuadState* shared_state,
|
| - media::VideoFrame::Format format,
|
| - bool is_transparent,
|
| - const gfx::RectF& tex_coord_rect,
|
| - RenderPass* render_pass,
|
| - VideoResourceUpdater* video_resource_updater,
|
| - const gfx::Rect& rect,
|
| - ResourceProvider* resource_provider) {
|
| - scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
|
| - format, rect.size(), rect, rect.size(), base::TimeDelta());
|
| -
|
| - // YUV values representing a striped pattern, for validating texture
|
| - // coordinates for sampling.
|
| - uint8_t y_value = 0;
|
| - uint8_t u_value = 0;
|
| - uint8_t v_value = 0;
|
| - for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
|
| - uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
|
| - video_frame->stride(media::VideoFrame::kYPlane) * i;
|
| - for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
|
| - ++j) {
|
| - y_row[j] = (y_value += 1);
|
| - }
|
| - }
|
| - for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
|
| - uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
|
| - video_frame->stride(media::VideoFrame::kUPlane) * i;
|
| - uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
|
| - video_frame->stride(media::VideoFrame::kVPlane) * i;
|
| - for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
|
| - ++j) {
|
| - u_row[j] = (u_value += 3);
|
| - v_row[j] = (v_value += 5);
|
| - }
|
| - }
|
| - uint8 alpha_value = is_transparent ? 0 : 128;
|
| - CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| - shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
|
| - video_resource_updater, rect, resource_provider);
|
| -}
|
| -
|
| -// Creates a video frame of size background_size filled with yuv_background,
|
| -// and then draws a foreground rectangle in a different color on top of
|
| -// that. The foreground rectangle must have coordinates that are divisible
|
| -// by 2 because YUV is a block format.
|
| -void CreateTestYUVVideoDrawQuad_TwoColor(
|
| - const SharedQuadState* shared_state,
|
| - media::VideoFrame::Format format,
|
| - bool is_transparent,
|
| - const gfx::RectF& tex_coord_rect,
|
| - const gfx::Size& background_size,
|
| - uint8 y_background,
|
| - uint8 u_background,
|
| - uint8 v_background,
|
| - const gfx::Rect& foreground_rect,
|
| - uint8 y_foreground,
|
| - uint8 u_foreground,
|
| - uint8 v_foreground,
|
| - RenderPass* render_pass,
|
| - VideoResourceUpdater* video_resource_updater,
|
| - ResourceProvider* resource_provider) {
|
| - const gfx::Rect rect(background_size);
|
| -
|
| - scoped_refptr<media::VideoFrame> video_frame =
|
| - media::VideoFrame::CreateFrame(format, background_size, foreground_rect,
|
| - foreground_rect.size(), base::TimeDelta());
|
| -
|
| - int planes[] = {media::VideoFrame::kYPlane,
|
| - media::VideoFrame::kUPlane,
|
| - media::VideoFrame::kVPlane};
|
| - uint8 yuv_background[] = {y_background, u_background, v_background};
|
| - uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground};
|
| - int sample_size[] = {1, 2, 2};
|
| -
|
| - for (int i = 0; i < 3; ++i) {
|
| - memset(video_frame->data(planes[i]), yuv_background[i],
|
| - video_frame->stride(planes[i]) * video_frame->rows(planes[i]));
|
| - }
|
| -
|
| - for (int i = 0; i < 3; ++i) {
|
| - // Since yuv encoding uses block encoding, widths have to be divisible
|
| - // by the sample size in order for this function to behave properly.
|
| - DCHECK_EQ(foreground_rect.x() % sample_size[i], 0);
|
| - DCHECK_EQ(foreground_rect.y() % sample_size[i], 0);
|
| - DCHECK_EQ(foreground_rect.width() % sample_size[i], 0);
|
| - DCHECK_EQ(foreground_rect.height() % sample_size[i], 0);
|
| -
|
| - gfx::Rect sample_rect(foreground_rect.x() / sample_size[i],
|
| - foreground_rect.y() / sample_size[i],
|
| - foreground_rect.width() / sample_size[i],
|
| - foreground_rect.height() / sample_size[i]);
|
| - for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) {
|
| - for (int x = sample_rect.x(); x < sample_rect.right(); ++x) {
|
| - size_t offset = y * video_frame->stride(planes[i]) + x;
|
| - video_frame->data(planes[i])[offset] = yuv_foreground[i];
|
| - }
|
| - }
|
| - }
|
| -
|
| - uint8 alpha_value = 255;
|
| - CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| - shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
|
| - video_resource_updater, rect, resource_provider);
|
| -}
|
| -
|
| -void CreateTestYUVVideoDrawQuad_Solid(
|
| - const SharedQuadState* shared_state,
|
| - media::VideoFrame::Format format,
|
| - bool is_transparent,
|
| - const gfx::RectF& tex_coord_rect,
|
| - uint8 y,
|
| - uint8 u,
|
| - uint8 v,
|
| - RenderPass* render_pass,
|
| - VideoResourceUpdater* video_resource_updater,
|
| - const gfx::Rect& rect,
|
| - ResourceProvider* resource_provider) {
|
| - scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
|
| - format, rect.size(), rect, rect.size(), base::TimeDelta());
|
| -
|
| - // YUV values of a solid, constant, color. Useful for testing that color
|
| - // space/color range are being handled properly.
|
| - memset(video_frame->data(media::VideoFrame::kYPlane), y,
|
| - video_frame->stride(media::VideoFrame::kYPlane) *
|
| - video_frame->rows(media::VideoFrame::kYPlane));
|
| - memset(video_frame->data(media::VideoFrame::kUPlane), u,
|
| - video_frame->stride(media::VideoFrame::kUPlane) *
|
| - video_frame->rows(media::VideoFrame::kUPlane));
|
| - memset(video_frame->data(media::VideoFrame::kVPlane), v,
|
| - video_frame->stride(media::VideoFrame::kVPlane) *
|
| - video_frame->rows(media::VideoFrame::kVPlane));
|
| -
|
| - uint8 alpha_value = is_transparent ? 0 : 128;
|
| - CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| - shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
|
| - video_resource_updater, rect, resource_provider);
|
| + quad->SetNew(shared_state,
|
| + rect,
|
| + gfx::Rect(),
|
| + rect,
|
| + resource,
|
| + premultiplied_alpha,
|
| + gfx::PointF(0.0f, 0.0f), // uv_top_left
|
| + gfx::PointF(1.0f, 1.0f), // uv_bottom_right
|
| + background_color,
|
| + vertex_opacity,
|
| + false, // flipped
|
| + false); // nearest_neighbor
|
| }
|
|
|
| typedef ::testing::Types<GLRenderer,
|
| @@ -565,278 +323,6 @@
|
| FuzzyPixelOffByOneComparator(true)));
|
| }
|
|
|
| -template <typename QuadType>
|
| -static const base::FilePath::CharType* IntersectingQuadImage() {
|
| - return FILE_PATH_LITERAL("intersecting_blue_green_squares.png");
|
| -}
|
| -template <>
|
| -const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() {
|
| - return FILE_PATH_LITERAL("intersecting_blue_green.png");
|
| -}
|
| -template <>
|
| -const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() {
|
| - return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png");
|
| -}
|
| -
|
| -template <typename TypeParam>
|
| -class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
|
| - protected:
|
| - void SetupQuadStateAndRenderPass() {
|
| - // This sets up a pair of draw quads. They are both rotated
|
| - // relative to the root plane, they are also rotated relative to each other.
|
| - // The intersect in the middle at a non-perpendicular angle so that any
|
| - // errors are hopefully magnified.
|
| - // The quads should intersect correctly, as in the front quad should only
|
| - // be partially in front of the back quad, and partially behind.
|
| -
|
| - viewport_rect_ = gfx::Rect(this->device_viewport_size_);
|
| - quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(),
|
| - this->device_viewport_size_.height() / 2.0);
|
| -
|
| - RenderPassId id(1, 1);
|
| - render_pass_ = CreateTestRootRenderPass(id, viewport_rect_);
|
| -
|
| - // Create the front quad rotated on the Z and Y axis.
|
| - gfx::Transform trans;
|
| - trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0);
|
| - trans.RotateAboutZAxis(45.0);
|
| - trans.RotateAboutYAxis(45.0);
|
| - front_quad_state_ =
|
| - CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
|
| - front_quad_state_->clip_rect = quad_rect_;
|
| - // Make sure they end up in a 3d sorting context.
|
| - front_quad_state_->sorting_context_id = 1;
|
| -
|
| - // Create the back quad, and rotate on just the y axis. This will intersect
|
| - // the first quad partially.
|
| - trans = gfx::Transform();
|
| - trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0);
|
| - trans.RotateAboutYAxis(-45.0);
|
| - back_quad_state_ =
|
| - CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
|
| - back_quad_state_->sorting_context_id = 1;
|
| - back_quad_state_->clip_rect = quad_rect_;
|
| - }
|
| - template <typename T>
|
| - void AppendBackgroundAndRunTest(const PixelComparator& comparator) {
|
| - SharedQuadState* background_quad_state = CreateTestSharedQuadState(
|
| - gfx::Transform(), viewport_rect_, render_pass_.get());
|
| - SolidColorDrawQuad* background_quad =
|
| - render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
|
| - background_quad->SetNew(background_quad_state, viewport_rect_,
|
| - viewport_rect_, SK_ColorWHITE, false);
|
| - pass_list_.push_back(render_pass_.Pass());
|
| - const base::FilePath::CharType* fileName = IntersectingQuadImage<T>();
|
| - EXPECT_TRUE(
|
| - this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator));
|
| - }
|
| - template <typename T>
|
| - T* CreateAndAppendDrawQuad() {
|
| - return render_pass_->CreateAndAppendDrawQuad<T>();
|
| - }
|
| -
|
| - scoped_ptr<RenderPass> render_pass_;
|
| - gfx::Rect viewport_rect_;
|
| - SharedQuadState* front_quad_state_;
|
| - SharedQuadState* back_quad_state_;
|
| - gfx::Rect quad_rect_;
|
| - RenderPassList pass_list_;
|
| -};
|
| -
|
| -template <typename TypeParam>
|
| -class IntersectingQuadGLPixelTest
|
| - : public IntersectingQuadPixelTest<TypeParam> {
|
| - public:
|
| - void SetUp() override {
|
| - IntersectingQuadPixelTest<TypeParam>::SetUp();
|
| - video_resource_updater_.reset(
|
| - new VideoResourceUpdater(this->output_surface_->context_provider(),
|
| - this->resource_provider_.get()));
|
| - video_resource_updater2_.reset(
|
| - new VideoResourceUpdater(this->output_surface_->context_provider(),
|
| - this->resource_provider_.get()));
|
| - }
|
| -
|
| - protected:
|
| - scoped_ptr<VideoResourceUpdater> video_resource_updater_;
|
| - scoped_ptr<VideoResourceUpdater> video_resource_updater2_;
|
| -};
|
| -
|
| -template <typename TypeParam>
|
| -class IntersectingQuadSoftwareTest
|
| - : public IntersectingQuadPixelTest<TypeParam> {};
|
| -
|
| -typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport>
|
| - SoftwareRendererTypes;
|
| -typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport>
|
| - GLRendererTypes;
|
| -
|
| -TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes);
|
| -TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes);
|
| -TYPED_TEST_CASE(IntersectingQuadSoftwareTest, SoftwareRendererTypes);
|
| -
|
| -TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) {
|
| - this->SetupQuadStateAndRenderPass();
|
| -
|
| - SolidColorDrawQuad* quad =
|
| - this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
|
| - SolidColorDrawQuad* quad2 =
|
| - this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
|
| -
|
| - quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_,
|
| - SK_ColorBLUE, false);
|
| - quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_,
|
| - SK_ColorGREEN, false);
|
| - SCOPED_TRACE("IntersectingSolidColorQuads");
|
| - this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>(
|
| - FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
|
| -}
|
| -
|
| -template <typename TypeParam>
|
| -SkColor GetColor(const SkColor& color) {
|
| - return color;
|
| -}
|
| -
|
| -template <>
|
| -SkColor GetColor<GLRenderer>(const SkColor& color) {
|
| - return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color),
|
| - SkColorGetG(color), SkColorGetR(color));
|
| -}
|
| -template <>
|
| -SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) {
|
| - return GetColor<GLRenderer>(color);
|
| -}
|
| -
|
| -TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) {
|
| - this->SetupQuadStateAndRenderPass();
|
| - CreateTestTwoColoredTextureDrawQuad(
|
| - this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
|
| - GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
|
| - true, this->front_quad_state_, this->resource_provider_.get(),
|
| - this->render_pass_.get());
|
| - CreateTestTwoColoredTextureDrawQuad(
|
| - this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
|
| - GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
|
| - true, this->back_quad_state_, this->resource_provider_.get(),
|
| - this->render_pass_.get());
|
| -
|
| - SCOPED_TRACE("IntersectingTexturedQuads");
|
| - this->template AppendBackgroundAndRunTest<TextureDrawQuad>(
|
| - FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
|
| -}
|
| -
|
| -TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) {
|
| - this->SetupQuadStateAndRenderPass();
|
| - gfx::RectF outer_rect(this->quad_rect_);
|
| - gfx::RectF inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4),
|
| - this->quad_rect_.y() + (this->quad_rect_.height() / 4),
|
| - this->quad_rect_.width() / 2,
|
| - this->quad_rect_.height() / 2);
|
| -
|
| - SkPaint black_paint;
|
| - black_paint.setColor(SK_ColorBLACK);
|
| - SkPaint blue_paint;
|
| - blue_paint.setColor(SK_ColorBLUE);
|
| - SkPaint green_paint;
|
| - green_paint.setColor(SK_ColorGREEN);
|
| -
|
| - scoped_ptr<FakePicturePile> blue_recording =
|
| - FakePicturePile::CreateFilledPile(gfx::Size(1000, 1000),
|
| - this->quad_rect_.size());
|
| - blue_recording->add_draw_rect_with_paint(outer_rect, black_paint);
|
| - blue_recording->add_draw_rect_with_paint(inner_rect, blue_paint);
|
| - blue_recording->RerecordPile();
|
| - scoped_refptr<FakePicturePileImpl> blue_pile =
|
| - FakePicturePileImpl::CreateFromPile(blue_recording.get(), nullptr);
|
| -
|
| - PictureDrawQuad* blue_quad =
|
| - this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
|
| -
|
| - blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(),
|
| - this->quad_rect_, this->quad_rect_, this->quad_rect_.size(),
|
| - false, RGBA_8888, this->quad_rect_, 1.f, blue_pile);
|
| -
|
| - scoped_ptr<FakePicturePile> green_recording =
|
| - FakePicturePile::CreateFilledPile(this->quad_rect_.size(),
|
| - this->quad_rect_.size());
|
| - green_recording->add_draw_rect_with_paint(outer_rect, green_paint);
|
| - green_recording->add_draw_rect_with_paint(inner_rect, black_paint);
|
| - green_recording->RerecordPile();
|
| - scoped_refptr<FakePicturePileImpl> green_pile =
|
| - FakePicturePileImpl::CreateFromPile(green_recording.get(), nullptr);
|
| -
|
| - PictureDrawQuad* green_quad =
|
| - this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
|
| - green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(),
|
| - this->quad_rect_, this->quad_rect_,
|
| - this->quad_rect_.size(), false, RGBA_8888,
|
| - this->quad_rect_, 1.f, green_pile);
|
| - SCOPED_TRACE("IntersectingPictureQuadsPass");
|
| - this->template AppendBackgroundAndRunTest<PictureDrawQuad>(
|
| - FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
|
| -}
|
| -
|
| -TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
|
| - this->SetupQuadStateAndRenderPass();
|
| - RenderPassId child_pass_id1(2, 2);
|
| - RenderPassId child_pass_id2(2, 3);
|
| - scoped_ptr<RenderPass> child_pass1 =
|
| - CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform());
|
| - SharedQuadState* child1_quad_state = CreateTestSharedQuadState(
|
| - gfx::Transform(), this->quad_rect_, child_pass1.get());
|
| - scoped_ptr<RenderPass> child_pass2 =
|
| - CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform());
|
| - SharedQuadState* child2_quad_state = CreateTestSharedQuadState(
|
| - gfx::Transform(), this->quad_rect_, child_pass2.get());
|
| -
|
| - CreateTestTwoColoredTextureDrawQuad(
|
| - this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
|
| - GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
|
| - true, child1_quad_state, this->resource_provider_.get(),
|
| - child_pass1.get());
|
| - CreateTestTwoColoredTextureDrawQuad(
|
| - this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
|
| - GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
|
| - true, child2_quad_state, this->resource_provider_.get(),
|
| - child_pass2.get());
|
| -
|
| - CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_,
|
| - child_pass_id1, this->render_pass_.get());
|
| - CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_,
|
| - child_pass_id2, this->render_pass_.get());
|
| -
|
| - this->pass_list_.push_back(child_pass1.Pass());
|
| - this->pass_list_.push_back(child_pass2.Pass());
|
| - SCOPED_TRACE("IntersectingRenderQuadsPass");
|
| - this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>(
|
| - FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f));
|
| -}
|
| -
|
| -TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
|
| - this->SetupQuadStateAndRenderPass();
|
| - gfx::Rect inner_rect(
|
| - (this->quad_rect_.x() + (this->quad_rect_.width() / 4) & ~0xF),
|
| - (this->quad_rect_.y() + (this->quad_rect_.height() / 4) & ~0xF),
|
| - (this->quad_rect_.width() / 2) & ~0xF,
|
| - (this->quad_rect_.height() / 2) & ~0xF);
|
| -
|
| - CreateTestYUVVideoDrawQuad_TwoColor(
|
| - this->front_quad_state_, media::VideoFrame::YV12J, false,
|
| - gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128,
|
| - inner_rect, 29, 255, 107, this->render_pass_.get(),
|
| - this->video_resource_updater_.get(), this->resource_provider_.get());
|
| -
|
| - CreateTestYUVVideoDrawQuad_TwoColor(
|
| - this->back_quad_state_, media::VideoFrame::YV12J, false,
|
| - gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21,
|
| - inner_rect, 0, 128, 128, this->render_pass_.get(),
|
| - this->video_resource_updater2_.get(), this->resource_provider_.get());
|
| -
|
| - SCOPED_TRACE("IntersectingVideoQuads");
|
| - this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
|
| - FuzzyPixelOffByOneComparator(false));
|
| -}
|
| -
|
| // TODO(skaslev): The software renderer does not support non-premultplied alpha.
|
| TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
|
| gfx::Rect rect(this->device_viewport_size_);
|
| @@ -904,6 +390,80 @@
|
|
|
| class VideoGLRendererPixelTest : public GLRendererPixelTest {
|
| protected:
|
| + void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state,
|
| + media::VideoFrame::Format format,
|
| + bool is_transparent,
|
| + const gfx::RectF& tex_coord_rect,
|
| + RenderPass* render_pass) {
|
| + const gfx::Rect rect(this->device_viewport_size_);
|
| +
|
| + scoped_refptr<media::VideoFrame> video_frame =
|
| + media::VideoFrame::CreateFrame(
|
| + format, rect.size(), rect, rect.size(), base::TimeDelta());
|
| +
|
| + // YUV values representing a striped pattern, for validating texture
|
| + // coordinates for sampling.
|
| + uint8_t y_value = 0;
|
| + uint8_t u_value = 0;
|
| + uint8_t v_value = 0;
|
| + for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
|
| + uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
|
| + video_frame->stride(media::VideoFrame::kYPlane) * i;
|
| + for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
|
| + ++j) {
|
| + y_row[j] = (y_value += 1);
|
| + }
|
| + }
|
| + for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
|
| + uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
|
| + video_frame->stride(media::VideoFrame::kUPlane) * i;
|
| + uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
|
| + video_frame->stride(media::VideoFrame::kVPlane) * i;
|
| + for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
|
| + ++j) {
|
| + u_row[j] = (u_value += 3);
|
| + v_row[j] = (v_value += 5);
|
| + }
|
| + }
|
| + uint8 alpha_value = is_transparent ? 0 : 128;
|
| + CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| + shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
|
| + }
|
| +
|
| + void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state,
|
| + media::VideoFrame::Format format,
|
| + bool is_transparent,
|
| + const gfx::RectF& tex_coord_rect,
|
| + uint8 y,
|
| + uint8 u,
|
| + uint8 v,
|
| + RenderPass* render_pass) {
|
| + const gfx::Rect rect(this->device_viewport_size_);
|
| +
|
| + scoped_refptr<media::VideoFrame> video_frame =
|
| + media::VideoFrame::CreateFrame(
|
| + format, rect.size(), rect, rect.size(), base::TimeDelta());
|
| +
|
| + // YUV values of a solid, constant, color. Useful for testing that color
|
| + // space/color range are being handled properly.
|
| + memset(video_frame->data(media::VideoFrame::kYPlane),
|
| + y,
|
| + video_frame->stride(media::VideoFrame::kYPlane) *
|
| + video_frame->rows(media::VideoFrame::kYPlane));
|
| + memset(video_frame->data(media::VideoFrame::kUPlane),
|
| + u,
|
| + video_frame->stride(media::VideoFrame::kUPlane) *
|
| + video_frame->rows(media::VideoFrame::kUPlane));
|
| + memset(video_frame->data(media::VideoFrame::kVPlane),
|
| + v,
|
| + video_frame->stride(media::VideoFrame::kVPlane) *
|
| + video_frame->rows(media::VideoFrame::kVPlane));
|
| +
|
| + uint8 alpha_value = is_transparent ? 0 : 128;
|
| + CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| + shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
|
| + }
|
| +
|
| void CreateEdgeBleedPass(media::VideoFrame::Format format,
|
| RenderPassList* pass_list) {
|
| gfx::Rect rect(200, 200);
|
| @@ -932,11 +492,130 @@
|
| // green sub-rectangle that should be the only thing displayed in
|
| // the final image. Bleeding will appear on all four sides of the video
|
| // if the tex coords are not clamped.
|
| - CreateTestYUVVideoDrawQuad_TwoColor(
|
| - shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0,
|
| - green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(),
|
| - resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_TwoColor(shared_state, format, false,
|
| + tex_coord_rect, background_size, 0, 0,
|
| + 0, green_rect, 149, 43, 21, pass.get());
|
| pass_list->push_back(pass.Pass());
|
| + }
|
| +
|
| + // Creates a video frame of size background_size filled with yuv_background,
|
| + // and then draws a foreground rectangle in a different color on top of
|
| + // that. The foreground rectangle must have coordinates that are divisible
|
| + // by 2 because YUV is a block format.
|
| + void CreateTestYUVVideoDrawQuad_TwoColor(const SharedQuadState* shared_state,
|
| + media::VideoFrame::Format format,
|
| + bool is_transparent,
|
| + const gfx::RectF& tex_coord_rect,
|
| + const gfx::Size& background_size,
|
| + uint8 y_background,
|
| + uint8 u_background,
|
| + uint8 v_background,
|
| + const gfx::Rect& foreground_rect,
|
| + uint8 y_foreground,
|
| + uint8 u_foreground,
|
| + uint8 v_foreground,
|
| + RenderPass* render_pass) {
|
| + const gfx::Rect rect(background_size);
|
| +
|
| + scoped_refptr<media::VideoFrame> video_frame =
|
| + media::VideoFrame::CreateFrame(format, background_size, foreground_rect,
|
| + foreground_rect.size(),
|
| + base::TimeDelta());
|
| +
|
| + int planes[] = {media::VideoFrame::kYPlane,
|
| + media::VideoFrame::kUPlane,
|
| + media::VideoFrame::kVPlane};
|
| + uint8 yuv_background[] = {y_background, u_background, v_background};
|
| + uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground};
|
| + int sample_size[] = {1, 2, 2};
|
| +
|
| + for (int i = 0; i < 3; ++i) {
|
| + memset(video_frame->data(planes[i]), yuv_background[i],
|
| + video_frame->stride(planes[i]) * video_frame->rows(planes[i]));
|
| + }
|
| +
|
| + for (int i = 0; i < 3; ++i) {
|
| + // Since yuv encoding uses block encoding, widths have to be divisible
|
| + // by the sample size in order for this function to behave properly.
|
| + DCHECK_EQ(foreground_rect.x() % sample_size[i], 0);
|
| + DCHECK_EQ(foreground_rect.y() % sample_size[i], 0);
|
| + DCHECK_EQ(foreground_rect.width() % sample_size[i], 0);
|
| + DCHECK_EQ(foreground_rect.height() % sample_size[i], 0);
|
| +
|
| + gfx::Rect sample_rect(foreground_rect.x() / sample_size[i],
|
| + foreground_rect.y() / sample_size[i],
|
| + foreground_rect.width() / sample_size[i],
|
| + foreground_rect.height() / sample_size[i]);
|
| + for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) {
|
| + for (int x = sample_rect.x(); x < sample_rect.right(); ++x) {
|
| + size_t offset = y * video_frame->stride(planes[i]) + x;
|
| + video_frame->data(planes[i])[offset] = yuv_foreground[i];
|
| + }
|
| + }
|
| + }
|
| +
|
| + uint8 alpha_value = 255;
|
| + CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| + shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
|
| + }
|
| +
|
| + void CreateTestYUVVideoDrawQuad_FromVideoFrame(
|
| + const SharedQuadState* shared_state,
|
| + scoped_refptr<media::VideoFrame> video_frame,
|
| + uint8 alpha_value,
|
| + const gfx::RectF& tex_coord_rect,
|
| + RenderPass* render_pass) {
|
| + const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
|
| + const YUVVideoDrawQuad::ColorSpace color_space =
|
| + (video_frame->format() == media::VideoFrame::YV12J
|
| + ? YUVVideoDrawQuad::JPEG
|
| + : YUVVideoDrawQuad::REC_601);
|
| + const gfx::Rect rect(shared_state->content_bounds);
|
| + const gfx::Rect opaque_rect(0, 0, 0, 0);
|
| +
|
| + if (with_alpha)
|
| + memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
|
| + video_frame->stride(media::VideoFrame::kAPlane) *
|
| + video_frame->rows(media::VideoFrame::kAPlane));
|
| +
|
| + VideoFrameExternalResources resources =
|
| + video_resource_updater_->CreateExternalResourcesFromVideoFrame(
|
| + video_frame);
|
| +
|
| + EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
|
| + EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
|
| + resources.mailboxes.size());
|
| + EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
|
| + resources.release_callbacks.size());
|
| +
|
| + ResourceProvider::ResourceId y_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kYPlane],
|
| + SingleReleaseCallbackImpl::Create(
|
| + resources.release_callbacks[media::VideoFrame::kYPlane]));
|
| + ResourceProvider::ResourceId u_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kUPlane],
|
| + SingleReleaseCallbackImpl::Create(
|
| + resources.release_callbacks[media::VideoFrame::kUPlane]));
|
| + ResourceProvider::ResourceId v_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kVPlane],
|
| + SingleReleaseCallbackImpl::Create(
|
| + resources.release_callbacks[media::VideoFrame::kVPlane]));
|
| + ResourceProvider::ResourceId a_resource = 0;
|
| + if (with_alpha) {
|
| + a_resource = resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kAPlane],
|
| + SingleReleaseCallbackImpl::Create(
|
| + resources.release_callbacks[media::VideoFrame::kAPlane]));
|
| + }
|
| +
|
| + YUVVideoDrawQuad* yuv_quad =
|
| + render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
|
| + yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
|
| + video_frame->coded_size(), y_resource, u_resource,
|
| + v_resource, a_resource, color_space);
|
| }
|
|
|
| void SetUp() override {
|
| @@ -945,6 +624,7 @@
|
| output_surface_->context_provider(), resource_provider_.get()));
|
| }
|
|
|
| + private:
|
| scoped_ptr<VideoResourceUpdater> video_resource_updater_;
|
| };
|
|
|
| @@ -957,10 +637,11 @@
|
| SharedQuadState* shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| - CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
|
| - false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| - pass.get(), video_resource_updater_.get(),
|
| - rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Striped(shared_state,
|
| + media::VideoFrame::YV12,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + pass.get());
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| @@ -981,10 +662,11 @@
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| // Intentionally sets frame format to I420 for testing coverage.
|
| - CreateTestYUVVideoDrawQuad_Striped(
|
| - shared_state, media::VideoFrame::I420, false,
|
| - gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(),
|
| - video_resource_updater_.get(), rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Striped(shared_state,
|
| + media::VideoFrame::I420,
|
| + false,
|
| + gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f),
|
| + pass.get());
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| @@ -1005,10 +687,14 @@
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| // In MPEG color range YUV values of (15,128,128) should produce black.
|
| - CreateTestYUVVideoDrawQuad_Solid(
|
| - shared_state, media::VideoFrame::YV12, false,
|
| - gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
|
| - video_resource_updater_.get(), rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Solid(shared_state,
|
| + media::VideoFrame::YV12,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + 15,
|
| + 128,
|
| + 128,
|
| + pass.get());
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| @@ -1030,10 +716,14 @@
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| // YUV of (149,43,21) should be green (0,255,0) in RGB.
|
| - CreateTestYUVVideoDrawQuad_Solid(
|
| - shared_state, media::VideoFrame::YV12J, false,
|
| - gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
|
| - video_resource_updater_.get(), rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Solid(shared_state,
|
| + media::VideoFrame::YV12J,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + 149,
|
| + 43,
|
| + 21,
|
| + pass.get());
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| @@ -1071,10 +761,14 @@
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| // Dark grey in JPEG color range (in MPEG, this is black).
|
| - CreateTestYUVVideoDrawQuad_Solid(
|
| - shared_state, media::VideoFrame::YV12J, false,
|
| - gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
|
| - video_resource_updater_.get(), rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Solid(shared_state,
|
| + media::VideoFrame::YV12J,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + 15,
|
| + 128,
|
| + 128,
|
| + pass.get());
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| @@ -1094,10 +788,11 @@
|
| SharedQuadState* shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| - CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
|
| - false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| - pass.get(), video_resource_updater_.get(),
|
| - rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Striped(shared_state,
|
| + media::VideoFrame::YV12A,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + pass.get());
|
|
|
| SolidColorDrawQuad* color_quad =
|
| pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
|
| @@ -1121,10 +816,11 @@
|
| SharedQuadState* shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
|
|
|
| - CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
|
| - true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| - pass.get(), video_resource_updater_.get(),
|
| - rect, resource_provider_.get());
|
| + CreateTestYUVVideoDrawQuad_Striped(shared_state,
|
| + media::VideoFrame::YV12A,
|
| + true,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
|
| + pass.get());
|
|
|
| SolidColorDrawQuad* color_quad =
|
| pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
|
|
|