This is a collection of tools for development and testing of the Intel DRM
driver.  There are many macro-level test suites that get used against our
driver, including xtest, rendercheck, piglit, and oglconform, but failures
from those can be difficult to track down to kernel changes, and many require
complicated build procedures or specific testing environments to get useful
results.

Thus, intel-graphics-tools was a project I started to collect some low-level
tools I intended to build.

benchmarks/
	This should be a collection of useful microbenchmarks.  The hope is
	that people can use these to tune some pieces of DRM code in relevant
	ways.

	The benchmarks require KMS to be enabled.  When run with an X Server
	running, they must be run as root to avoid the authentication
	requirement.

	Note that a few other microbenchmarks are in tests (like gem_gtt_speed).

tests/
	This is a set of automated tests to run against the DRM to validate
	changes.  Hopefully this can cover the relevant cases we need to
	worry about, including backwards compatibility.

	Note: The old automake based testrunner had to be scraped due to
	upstream changes which broke dynamic creation of the test list. Of
	course it is still possible to directly run tests, even when not always
	limiting tests to specific subtests (like piglit does).

	The more comfortable way to run tests is with piglit. First grab piglit
	from:

	git://anongit.freedesktop.org/piglit

	and build it (no need to install anything). Then we need to link up the
	i-g-t sources with piglit

	piglit-sources $ cd bin
	piglit-sources/bin $ ln $i-g-t-sources igt -s

	The tests in the i-g-t sources need to have been built already. Then we
	can run the testcases with (as usual as root, no other drm clients
	running):

	piglit-sources # ./piglit-run.py tests/igt.tests <results-file>

	The testlist is built at runtime, so no need to update anything in
	piglit when adding new tests. See

	piglit-sources $ ./piglit-run.py -h

	for some useful options.

	Piglit only runs a default set of tests and is useful for regression
	testing. Other tests not run are:
	- tests that might hang the gpu, see HANG in Makefile.am
	- gem_stress, a stress test suite. Look at the source for all the
	  various options.
	- testdisplay is only run in the default mode. testdisplay has tons of
	  options to test different kms functionality, again read the source for
	  the details.

lib/
	Common helper functions and headers used by the other tools.

man/
	Manpages, unfortunately rather incomplete.

tools/
	This is a collection of debugging tools that had previously been
	built with the 2D driver but not shipped.  Some distros were hacking
	up the 2D build to ship them.  Instead, here's a separate package for
	people debugging the driver.

	These tools generally must be run as root, safe for the ones that just
	decode dumps.

tools/quick_dump
	Quick dumper is a python tool built with SWIG bindings to
	important libraries exported by the rest of the tool suite. The tool
	itself is quite straight forward, and should also be a useful example
	for others wishing to write python based i915 tools.

	Note to package maintainers: It is not recommended to package
	this directory, as the tool is not yet designed for wide usage. If the
	package is installed via "make install" the users will have to set
	their python library path appropriately. Use --disable-dumper

debugger/
	This tool is to be used to do shader debugging. It acts like a
	debug server accepting connections from debug clients such as
	mesa. The connections is made with unix domain sockets, and at some
	point it would be nice if this directory contained a library for
	initiating connections with debug clients..

	The debugger must be run as root: "sudo debugger/eudb"
