How it works
GraphicsFuzz finds graphics driver bugs and helps to quickly fix them. Let's see how we achieve this!
A graphics driver takes a shader program as input and executes it on a GPU (graphics processing unit) to render an image.
Executing shaders is complex, and many graphics drivers are unreliable: a valid shader can lead to wrong images, driver errors or even security issues.
How can we find these graphics driver bugs at design time, to stop them affecting users?
Finding bugs automatically
We start with a reference shader that renders an image. The reference shader can be any shader you like, for example a high-value shader from a game or existing test suite.
Shaders are programs, so by applying semantics-preserving source code transformations, we can obtain a shader with significantly different source code that still has the same effect.
For example, wrapping code in a single-iteration loop does not change the meaning (semantics) of a program. By applying various semantics-preserving transformations to the reference shader, we generate a family of variant shaders, where each variant must render the same image as the reference.
If a variant shader leads to a different image (or a driver error), then we have found a graphics driver bug!
Finding bugs is not the end of the story: a variant shader that exposes a bug is typically very big (thousands of lines), full of code coming from the semantics-preserving transformations. Typically only a fraction of this code is needed to expose the bug, and finding the pattern that triggers the bug is like looking for a needle in a haystack.
Fortunately, our Intelligent Reducer is able to selectively reverse those transformations that are not relevant to the bug. After reduction, we obtain a small difference which is enough to expose the driver issue.
The reduced variant still exposes the bug, and differs from the reference only slightly: this is a great starting point to isolate the bug root cause in the graphics driver!
GraphicsFuzz find bugs in graphics drivers by rendering families of semantically equivalent shaders, and looking for output discrepancies. For each bug, the Intelligent Reducer saves a lot of debugging time by producing a small reproduction test case.
This approach is called metamorphic testing, and with GraphicsFuzz we are pioneering its application to graphics drivers.
Each license for ShaderTest GLES also gives access to our
framework, which includes the Intelligent Reducer. In
addition, our tests and reduced variants can
be exported to run in the
Please contact us for a quote.
The GraphicsFuzz Demo makes it easy to try a few tests via a web browser, give it a try and let us know the results!