Index: gpu/ipc/service/direct_composition_surface_win_unittest.cc |
diff --git a/gpu/ipc/service/direct_composition_surface_win_unittest.cc b/gpu/ipc/service/direct_composition_surface_win_unittest.cc |
index 9837c021b57f2e792c13ee60ef67040bfdd60e59..f1e824a29ee3abb0904003e9aed5766e65d96a83 100644 |
--- a/gpu/ipc/service/direct_composition_surface_win_unittest.cc |
+++ b/gpu/ipc/service/direct_composition_surface_win_unittest.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "gpu/ipc/service/direct_composition_surface_win.h" |
+#include "base/memory/ref_counted_memory.h" |
#include "base/memory/weak_ptr.h" |
#include "base/run_loop.h" |
#include "base/synchronization/waitable_event.h" |
@@ -12,12 +13,14 @@ |
#include "base/win/scoped_select_object.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/base/win/hidden_window.h" |
+#include "ui/gfx/buffer_format_util.h" |
#include "ui/gfx/gdi_util.h" |
#include "ui/gfx/transform.h" |
#include "ui/gl/dc_renderer_layer_params.h" |
#include "ui/gl/gl_angle_util_win.h" |
#include "ui/gl/gl_context.h" |
#include "ui/gl/gl_image_dxgi.h" |
+#include "ui/gl/gl_image_ref_counted_memory.h" |
#include "ui/gl/init/gl_factory.h" |
#include "ui/platform_window/platform_window_delegate.h" |
#include "ui/platform_window/win/win_window.h" |
@@ -506,5 +509,56 @@ TEST_F(DirectCompositionPixelTest, VideoSwapchain) { |
DestroySurface(std::move(surface_)); |
} |
+TEST_F(DirectCompositionPixelTest, SoftwareVideoSwapchain) { |
+ if (!CheckIfDCSupported()) |
+ return; |
+ InitializeSurface(); |
+ surface_->SetEnableDCLayers(true); |
+ gfx::Size window_size(100, 100); |
+ |
+ scoped_refptr<gl::GLContext> context = gl::init::CreateGLContext( |
+ nullptr, surface_.get(), gl::GLContextAttribs()); |
+ EXPECT_TRUE(surface_->Resize(window_size, 1.0, true)); |
+ |
+ base::win::ScopedComPtr<ID3D11Device> d3d11_device = |
+ gl::QueryD3D11DeviceObjectFromANGLE(); |
+ |
+ gfx::Size y_size(50, 50); |
+ gfx::Size uv_size(25, 25); |
+ size_t y_stride = |
+ gfx::RowSizeForBufferFormat(y_size.width(), gfx::BufferFormat::R_8, 0); |
+ size_t uv_stride = |
+ gfx::RowSizeForBufferFormat(uv_size.width(), gfx::BufferFormat::RG_88, 0); |
+ std::vector<uint8_t> y_data(y_stride * y_size.height(), 0xff); |
+ std::vector<uint8_t> uv_data(uv_stride * uv_size.height(), 0xff); |
+ scoped_refptr<gl::GLImageRefCountedMemory> y_image( |
+ new gl::GLImageRefCountedMemory(y_size, GL_BGRA_EXT)); |
+ |
+ y_image->Initialize(new base::RefCountedBytes(y_data), |
+ gfx::BufferFormat::R_8); |
+ scoped_refptr<gl::GLImageRefCountedMemory> uv_image( |
+ new gl::GLImageRefCountedMemory(uv_size, GL_BGRA_EXT)); |
+ uv_image->Initialize(new base::RefCountedBytes(uv_data), |
+ gfx::BufferFormat::RG_88); |
+ |
+ ui::DCRendererLayerParams params( |
+ false, gfx::Rect(), 1, gfx::Transform(), |
+ std::vector<scoped_refptr<gl::GLImage>>{y_image, uv_image}, |
+ gfx::RectF(gfx::Rect(y_size)), gfx::Rect(window_size), 0, 0, 1.0, 0); |
+ surface_->ScheduleDCLayer(params); |
+ |
+ EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface_->SwapBuffers()); |
+ Sleep(1000); |
+ |
+ SkColor expected_color = SkColorSetRGB(0xff, 0xb7, 0xff); |
+ SkColor actual_color = |
+ ReadBackWindowPixel(window_.hwnd(), gfx::Point(75, 75)); |
+ EXPECT_TRUE(AreColorsSimilar(expected_color, actual_color)) |
+ << std::hex << "Expected " << expected_color << " Actual " |
+ << actual_color; |
+ |
+ context = nullptr; |
+ DestroySurface(std::move(surface_)); |
+} |
} // namespace |
} // namespace gpu |