Commit 63a433fc authored by Sunny Sachanandani's avatar Sunny Sachanandani Committed by Commit Bot

canvas: Re-enable swap chains for low latency 2d canvas on Windows

Low latency 2d canvas should use swap chains on Windows when supported,
but this broke a few weeks ago during the canvas shared image
refactoring.

This CL fixes that, and adds a trace integration test to verify that
swap chains are indeed being presented in the GPU service.

Bug: 1009860
Change-Id: Ifeb8a9cc68bbca8d6b379c71a7707adb62921bf1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1836791Reviewed-by: default avatarZhenyao Mo <zmo@chromium.org>
Reviewed-by: default avatarFernando Serboncini <fserb@chromium.org>
Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>
Cr-Commit-Position: refs/heads/master@{#703461}
parent e2237ed8
......@@ -185,6 +185,7 @@ class PixelIntegrationTest(
pages += namespace.MacSpecificPages(cls.test_base_name)
if sys.platform.startswith('win'):
pages += namespace.DirectCompositionPages(cls.test_base_name)
pages += namespace.LowLatencySwapChainPages(cls.test_base_name)
for p in pages:
yield(p.name, gpu_relative_path + p.url, (p))
......
......@@ -954,13 +954,6 @@ class PixelTestPages(object):
test_rect=[0, 0, 100, 100],
browser_args=browser_args),
PixelTestPage(
'pixel_canvas_low_latency_2d.html',
base_name + '_CanvasLowLatency2DSwapChain',
test_rect=[0, 0, 100, 100],
browser_args=browser_args +
['--enable-features=LowLatencyCanvas2dSwapChain']),
PixelTestPage(
'pixel_canvas_low_latency_2d.html',
base_name + '_CanvasUnacceleratedLowLatency2D',
......@@ -982,13 +975,25 @@ class PixelTestPages(object):
'color': [0, 255, 0],
},
]),
]
@staticmethod
def LowLatencySwapChainPages(base_name):
browser_args = [
'--enable-features=LowLatencyWebGLSwapChain,LowLatencyCanvas2dSwapChain'
]
return [
PixelTestPage(
'pixel_canvas_low_latency_2d.html',
base_name + '_CanvasLowLatency2DSwapChain',
test_rect=[0, 0, 100, 100],
browser_args=browser_args),
PixelTestPage(
'pixel_canvas_low_latency_webgl.html',
base_name + '_CanvasLowLatencyWebGLSwapChain',
test_rect=[0, 0, 200, 200],
browser_args=browser_args +
['--enable-features=LowLatencyWebGLSwapChain'],
browser_args=browser_args,
tolerance=0,
expected_colors=[
SCALE_FACTOR_OVERRIDES,
......@@ -1004,8 +1009,7 @@ class PixelTestPages(object):
'pixel_canvas_low_latency_webgl_alpha_false.html',
base_name + '_CanvasLowLatencyWebGLSwapChainAlphaFalse',
test_rect=[0, 0, 200, 200],
browser_args=browser_args +
['--enable-features=LowLatencyWebGLSwapChain'],
browser_args=browser_args,
tolerance=0,
expected_colors=[
SCALE_FACTOR_OVERRIDES,
......
......@@ -29,6 +29,11 @@ crbug.com/867136 [ linux ] OverlayModeTraceTest_* [ Skip ]
crbug.com/867136 [ android ] OverlayModeTraceTest_* [ Skip ]
crbug.com/867136 [ chromeos ] OverlayModeTraceTest_* [ Skip ]
crbug.com/867136 [ win7 ] OverlayModeTraceTest_* [ Skip ]
crbug.com/1009860 [ mac ] SwapChainTraceTest_* [ Skip ]
crbug.com/1009860 [ linux ] SwapChainTraceTest_* [ Skip ]
crbug.com/1009860 [ android ] SwapChainTraceTest_* [ Skip ]
crbug.com/1009860 [ chromeos ] SwapChainTraceTest_* [ Skip ]
crbug.com/1009860 [ win7 ] SwapChainTraceTest_* [ Skip ]
# VP9 videos fail to trigger zero copy video presentation path.
crbug.com/930343 [ win intel ] VideoPathTraceTest_DirectComposition_Video_VP9_Fullsize [ Failure ]
......
......@@ -83,6 +83,7 @@ _SWAP_CHAIN_GET_FRAME_STATISTICS_MEDIA_FAILED = -1
_GET_STATISTICS_EVENT_NAME = 'GetFrameStatisticsMedia'
_SWAP_CHAIN_PRESENT_EVENT_NAME = 'SwapChain::Present'
_PRESENT_TO_SWAP_CHAIN_EVENT_NAME = 'SwapChainPresenter::PresentToSwapChain'
class TraceIntegrationTest(gpu_integration_test.GpuIntegrationTest):
......@@ -122,6 +123,14 @@ class TraceIntegrationTest(gpu_integration_test.GpuIntegrationTest):
'finish_js_condition': 'domAutomationController._finished',
'success_eval_func': 'CheckVideoPath',
'other_args': p.other_args})
for p in namespace.LowLatencySwapChainPages('SwapChainTraceTest'):
yield (p.name, gpu_relative_path + p.url,
{'browser_args': p.browser_args,
'category': 'gpu',
'test_harness_script': basic_test_harness_script,
'finish_js_condition': 'domAutomationController._finished',
'success_eval_func': 'CheckSwapChainPath',
'other_args': p.other_args})
for p in namespace.DirectCompositionPages('OverlayModeTraceTest'):
if p.other_args and p.other_args.get('video_is_rotated', False):
# For all drivers we tested, when a video is rotated, frames won't
......@@ -156,7 +165,7 @@ class TraceIntegrationTest(gpu_integration_test.GpuIntegrationTest):
# Set up tracing.
config = tracing_config.TracingConfig()
config.chrome_trace_config.category_filter.AddExcludedCategory('*')
config.chrome_trace_config.category_filter.AddDisabledByDefault(category)
config.chrome_trace_config.category_filter.AddFilter(category)
config.enable_chrome_trace = True
tab = self.tab
tab.browser.platform.tracing_controller.StartTracing(config, 60)
......@@ -371,6 +380,30 @@ class TraceIntegrationTest(gpu_integration_test.GpuIntegrationTest):
TraceIntegrationTest._SwapChainPresentationModeListToStr(
presentation_mode_history))
def _EvaluateSuccess_CheckSwapChainPath(self, category, event_iterator,
other_args):
"""Verified that swap chains were used for low latency canvas."""
os_name = self.browser.platform.GetOSName()
assert os_name and os_name.lower() == 'win'
overlay_bot_config = self.GetOverlayBotConfig()
if overlay_bot_config is None:
self.fail('Overlay bot config can not be determined')
assert overlay_bot_config.get('direct_composition', False)
# Verify expectations through captured trace events.
for event in event_iterator:
if event.category != category:
continue
if event.name != _PRESENT_TO_SWAP_CHAIN_EVENT_NAME:
continue
presentation_mode = event.args.get('image_type', None)
if presentation_mode == 'swap chain':
break
else:
self.fail('Events with name %s were not found' %
_SWAP_CHAIN_PRESENT_EVENT_NAME)
@classmethod
def ExpectationsFiles(cls):
return [
......
......@@ -602,6 +602,19 @@ const Vector<CanvasResourceType>& GetResourceTypeFallbackList(
CanvasResourceType::kBitmap,
});
static const Vector<CanvasResourceType> kAcceleratedDirect2DFallbackList({
// Needed for low latency canvas on Windows.
CanvasResourceType::kDirect2DSwapChain,
// The rest is equal to |kCompositedFallbackList|.
CanvasResourceType::kSharedImage,
CanvasResourceType::kSharedBitmap,
CanvasResourceType::kBitmap,
});
DCHECK(std::equal(kAcceleratedDirect2DFallbackList.begin() + 1,
kAcceleratedDirect2DFallbackList.end(),
kCompositedFallbackList.begin(),
kCompositedFallbackList.end()));
static const Vector<CanvasResourceType> kAcceleratedDirect3DFallbackList({
// This is used with single-buffered WebGL where the resource comes
// from an external source. The external site should take care of
......@@ -632,7 +645,7 @@ const Vector<CanvasResourceType>& GetResourceTypeFallbackList(
return kCompositedFallbackList;
case CanvasResourceProvider::ResourceUsage::
kAcceleratedDirect2DResourceUsage:
return kCompositedFallbackList;
return kAcceleratedDirect2DFallbackList;
case CanvasResourceProvider::ResourceUsage::
kAcceleratedDirect3DResourceUsage:
return kAcceleratedDirect3DFallbackList;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment