зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1156135 - Add a distribution addon to sanity test hardware accelerated video decoding. r=mossop,glandium
--HG-- extra : rebase_source : 128eb3bdf026b6f9d61afe385d4a3ff03eac15a5
This commit is contained in:
Родитель
f7daa2cb73
Коммит
d927dac1c9
|
@ -0,0 +1,42 @@
|
|||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/:
|
||||
|
||||
|
||||
DISTROEXT = $(abspath $(FINAL_TARGET))/distribution/extensions
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
||||
ifeq (windows,$(MOZ_WIDGET_TOOLKIT))
|
||||
EXTENSIONS = \
|
||||
sanity-gfx@mozilla.org \
|
||||
$(NULL)
|
||||
|
||||
all_xpis = $(foreach dir,$(EXTENSIONS),$(DISTROEXT)/$(dir).xpi)
|
||||
libs:: $(all_xpis)
|
||||
GARBAGE += $(all_xpis)
|
||||
|
||||
define pp_one
|
||||
$(2) := $(2)
|
||||
$(2)_PATH := $(dir $(2))
|
||||
$(2)_TARGET := libs-$(1)
|
||||
PP_TARGETS += $(2)
|
||||
endef
|
||||
$(foreach d,$(EXTENSIONS), \
|
||||
$(foreach in,$(shell cd $(srcdir) ; find $(d) -name '*.in'), \
|
||||
$(eval $(call pp_one,$(d),$(in))) \
|
||||
) \
|
||||
)
|
||||
|
||||
endif
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
$(all_xpis): $(DISTROEXT)/%.xpi: $(call mkdir_deps,$(DISTROEXT)) libs-%
|
||||
cd $* && \
|
||||
$(ZIP) -r9XD $@ * -x \*.in -x \*.mkdir.done
|
||||
cd $(abspath $(srcdir)/$*) && \
|
||||
$(ZIP) -r9XD $@ * -x \*.in -x \*.mkdir.done
|
||||
|
||||
.PHONY: $(all_xpis:.xpi=)
|
|
@ -5,3 +5,5 @@
|
|||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
DIRS += ['{972ce4c6-7e08-4474-a285-3208198ce6fd}']
|
||||
|
||||
DIST_SUBDIR = ''
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
||||
Cu.import('resource://gre/modules/Services.jsm');
|
||||
Cu.import('resource://gre/modules/Preferences.jsm');
|
||||
|
||||
const PAGE_WIDTH=72;
|
||||
const PAGE_HEIGHT=136;
|
||||
const DRIVER_PREF="sanity-test.driver-version";
|
||||
const DEVICE_PREF="sanity-test.device-id";
|
||||
const VERSION_PREF="sanity-test.version";
|
||||
const DISABLE_VIDEO_PREF="media.hardware-video-decoding.failed";
|
||||
const RUNNING_PREF="sanity-test.running";
|
||||
|
||||
// GRAPHICS_SANITY_TEST histogram enumeration values
|
||||
const TEST_PASSED=0;
|
||||
const TEST_FAILED_RENDER=1;
|
||||
const TEST_FAILED_VIDEO=2;
|
||||
const TEST_CRASHED=3;
|
||||
|
||||
function install() {}
|
||||
function uninstall() {}
|
||||
|
||||
function testPixel(ctx, x, y, r, g, b, a, fuzz) {
|
||||
var data = ctx.getImageData(x, y, 1, 1);
|
||||
|
||||
if (Math.abs(data.data[0] - r) <= fuzz &&
|
||||
Math.abs(data.data[1] - g) <= fuzz &&
|
||||
Math.abs(data.data[2] - b) <= fuzz &&
|
||||
Math.abs(data.data[3] - a) <= fuzz) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Verify that all the 4 coloured squares of the video
|
||||
// render as expected (with a tolerance of 5 to allow for
|
||||
// yuv->rgb differences between platforms).
|
||||
//
|
||||
// The video is 64x64, and is split into quadrants of
|
||||
// different colours. The top left of the video is 8,72
|
||||
// and we test a pixel 10,10 into each quadrant to avoid
|
||||
// blending differences at the edges.
|
||||
//
|
||||
// We allow massive amounts of fuzz for the colours since
|
||||
// it can depend hugely on the yuv -> rgb conversion, and
|
||||
// we don't want to fail unnecessarily.
|
||||
function testVideoRendering(ctx) {
|
||||
return testPixel(ctx, 18, 82, 255, 255, 255, 255, 64) &&
|
||||
testPixel(ctx, 50, 82, 0, 255, 0, 255, 64) &&
|
||||
testPixel(ctx, 18, 114, 0, 0, 255, 255, 64) &&
|
||||
testPixel(ctx, 50, 114, 255, 0, 0, 255, 64);
|
||||
}
|
||||
|
||||
function hasHardwareLayers(win) {
|
||||
var winUtils = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
|
||||
if (winUtils.layerManagerType != "Basic") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function reportResult(val) {
|
||||
try {
|
||||
let histogram = Services.telemetry.getHistogramById("GRAPHICS_SANITY_TEST");
|
||||
histogram.add(val);
|
||||
} catch (e) {}
|
||||
|
||||
Preferences.set(RUNNING_PREF, false);
|
||||
Services.prefs.savePrefFile(null);
|
||||
}
|
||||
|
||||
function windowLoaded(event) {
|
||||
var win = event.target;
|
||||
|
||||
// Take a snapshot of the window contents, and then close the window
|
||||
var canvas = win.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
|
||||
canvas.setAttribute("width", PAGE_WIDTH);
|
||||
canvas.setAttribute("height", PAGE_HEIGHT);
|
||||
|
||||
// TODO: drawWindow reads back from the gpu's backbuffer, which won't catch issues with presenting
|
||||
// the front buffer via the window manager. Ideally we'd use an OS level API for reading back
|
||||
// from the desktop itself to get a more accurate test.
|
||||
var ctx = canvas.getContext("2d");
|
||||
var flags = ctx.DRAWWINDOW_DRAW_CARET | ctx.DRAWWINDOW_DRAW_VIEW | ctx.DRAWWINDOW_USE_WIDGET_LAYERS;
|
||||
ctx.drawWindow(win.ownerGlobal, 0, 0, PAGE_WIDTH, PAGE_HEIGHT, "rgb(255,255,255)", flags);
|
||||
|
||||
win.ownerGlobal.close();
|
||||
|
||||
// Verify that the snapshot contains the expected contents. If it doesn't, then
|
||||
// try disabling gfx features and restart the browser.
|
||||
|
||||
// TODO: When Bug 1151611 lands we can test hardware video decoding status
|
||||
// directly instead of checking the pref.
|
||||
if (!testVideoRendering(ctx)) {
|
||||
reportResult(TEST_FAILED_VIDEO);
|
||||
if (Preferences.get("layers.hardware-video-decoding.enabled", false)) {
|
||||
Preferences.set(DISABLE_VIDEO_PREF, true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
reportResult(TEST_PASSED);
|
||||
}
|
||||
|
||||
function startup(data, reason) {
|
||||
// Only test gfx features if firefox has updated, or if the user has a new
|
||||
// gpu or drivers.
|
||||
var gfxinfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
|
||||
|
||||
// If the running pref is still true then we must have crashed before
|
||||
// finishing the test. Report this and don't try running again.
|
||||
if (Preferences.get(RUNNING_PREF, false)) {
|
||||
reportResult(TEST_CRASHED);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Handle dual GPU setups
|
||||
if (Preferences.get(DRIVER_PREF, "") == gfxinfo.adapterDriver &&
|
||||
Preferences.get(DEVICE_PREF, "") == gfxinfo.adapterDeviceID &&
|
||||
Preferences.get(VERSION_PREF, "") == data.version) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the prefs so that this test doesn't run again until the next update.
|
||||
Preferences.set(DRIVER_PREF, gfxinfo.adapterDriver);
|
||||
Preferences.set(DEVICE_PREF, gfxinfo.adapterDeviceID);
|
||||
Preferences.set(VERSION_PREF, data.version);
|
||||
Preferences.set(RUNNING_PREF, true);
|
||||
Services.prefs.savePrefFile(null);
|
||||
|
||||
// Remove any previously set failure data. These should be live prefs that
|
||||
// will take effect for the window we're about to open.
|
||||
Preferences.set(DISABLE_VIDEO_PREF, false);
|
||||
|
||||
// Open a tiny window to render our test page, and notify us when it's loaded
|
||||
var win = Services.ww.openWindow(null,
|
||||
"chrome://sanity-test/content/sanitytest.html",
|
||||
"Test Page",
|
||||
"width=" + PAGE_WIDTH + ",height=" + PAGE_HEIGHT + ",chrome,titlebar=0,scrollbars=0",
|
||||
null);
|
||||
win.onload = windowLoaded;
|
||||
}
|
||||
|
||||
function shutdown() {}
|
|
@ -0,0 +1 @@
|
|||
content sanity-test content/chrome/
|
|
@ -0,0 +1,6 @@
|
|||
<html>
|
||||
<body>
|
||||
<div style="width:64px; height:64px; background-color:red;"></div>
|
||||
<video src="videotest.mp4"></video>
|
||||
</body>
|
||||
</html>
|
Двоичные данные
browser/app/profile/extensions/sanity-gfx@mozilla.org/content/chrome/videotest.mp4
Normal file
Двоичные данные
browser/app/profile/extensions/sanity-gfx@mozilla.org/content/chrome/videotest.mp4
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
#filter substitution
|
||||
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:id>sanity-gfx@mozilla.org</em:id>
|
||||
<em:version>@FIREFOX_VERSION@</em:version>
|
||||
<em:type>2</em:type>
|
||||
<em:bootstrap>true</em:bootstrap>
|
||||
<em:unpack>false</em:unpack>
|
||||
|
||||
<!-- Firefox -->
|
||||
<em:targetApplication>
|
||||
<Description>
|
||||
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
|
||||
<em:minVersion>@FIREFOX_VERSION@</em:minVersion>
|
||||
<em:maxVersion>@FIREFOX_VERSION@</em:maxVersion>
|
||||
</Description>
|
||||
</em:targetApplication>
|
||||
|
||||
<!-- Front End MetaData -->
|
||||
<em:name>Firefox Gfx Sanity Test</em:name>
|
||||
<em:description>Does basic testing for firefox graphics features, and disables them if they don't work correctly </em:description>
|
||||
<em:creator>Mozilla</em:creator>
|
||||
</Description>
|
||||
</RDF>
|
|
@ -4,3 +4,4 @@
|
|||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
DIST_SUBDIR = 'browser'
|
||||
|
|
Загрузка…
Ссылка в новой задаче