Surface LIC : parallelization & fine tuning features

* Parallelization:
Support for Multiblock datasets and MPI parallel usage. Three compositing
strategies are provided, with a heuristic to automatically make a reasonable
selection between them. [1] INPLACE, [2] INPLACE_DISJOINT, [3] BALANCED.
The inplace strategy processes data where it falls given its parallel domain
decomposition and projection to the screen. For simple surfaces such as
slices where ranks/blocks data does not overlap in screen space this is the
most efficient approach. However where ranks/blocks data have large amount
of screen space overlap, this approach has high communication/compositing
and overhead and a large amount of redundant computation that's discarded.
The inplace-disjoint strategy was designed to address these issues. It
leaves data inplace as much as possible but will assign pixels to ranks
uniquely eliminating redundant computation. The communication costs are
the same as the inplace strategy however they are split into two temporally
disjoint parts with computation in between which tends to reduce congestion
and contention. The balanced strategy divides the screen into equally sized
disjoint regions and assigns each rank a region. This strategy can suffer
from load balancing issues, and because no account is made of the initial
data distribution it may have higher communication/compositing costs than
the others. The parallel implementations have been tested with IceT in
ParaView. The compositors uses non-blocking mpi communications, MPI
subarrays for describing non-contoguous memory extents, and communicates
efficiently by pasing mpi gpu mapped memory via extensions made to
vtkPixelBufferObject. An object factory is used to override the serial
objects with their parallel counterparts  when the parallel module is
linked.

* Contrast and Color Contrast Enhancement:
The new contrast enhancement feature increases both dynamic range contrast
while preserving patterns in the LIC. Contrast enhancment is implemented using
histogram stretching. The color contrast enhancement is made in HSL space on
the L channel to minimize color distortions. During the "enhanced" LIC mode
contrast enhancement is also applied after the first pass of LIC compution.
This helps strengthen streaking patterns.

* Enhanced scalar color shading:
A new mode has been added to the shader that shades surface geometry combining
both LIC and scalar colors. The new shader produces bright colors without
diminishing the visibility of the LIC by multiplying colored lit surface with
computed LIC texture. The original blending implementation is left in place
as it works well in many situations.

* Noise texture customization:
A new noise texture generator has been added to improve control over "streaking"
in the convolved texture. The noise textures produced are fully customizable over
9 degrees of freedom. [1] Noise distribution (Gaussian, Uniform, Perlin); [2] Noise
texture size [3] Noise grain size [4,5] Min/max noise values [6] Number of noise
levels; [7] Impulse noise probability; [8] Impulse noise background color; [9]
Noise generator seed

* Fragment masking controls:
The new fragment masking provides controls over the color and intensity of masked
fragments and their blending with scalars. Fragments are masked by threshold |V|<t,
where t is a user specified threshold value, and V are mask vectors. Masking vectors
can be optionally projected onto the surface or passed through un-modified so that
threshold is provided in the original vector units and matches scalar color shading.

* Vector Normalization Control:
The new vector normalization control lets the user turn on and off normalization
in the integrator. Disabling normalization can help highlight relative strengths
in strongly varying regions of a flow field by making the amount of smoothing that
occurs during convolution proportional to the flow strength.

* Antialiasing:
An optional anti-aliasing stage was added. In some cases the CE and EE stages
produce streaks with sharp jagged transitions from black to white. The AA stage
can be used to soften the result and smooth sharp transitions.

* Optimizations:
The implementation has been split into 8 major steps with the result of each stage
cached in a texture.[1] Vector projection and lighting calculation; [2] Gather;
[3] Compositingand guard pixel generation; [4] LIC Computation; [5] Scatter;
[6] Scalar coloring; [7] Color contrast enhance; [8] Depth test. During user
interaction stages that do not have modfied paramters or input data can be skiped
using the cahced result instead.  This can save large amount of time for expensive
operations such as projecting vectors, computing the LIC etc. Classes
were added to simplify monitoring of various system paramters that would trigger
an update, such as changes to lights, modelview or projection matrices, background
color, etc. A new framebuffer object has been introduced, designed specifically
for efficient buffer ping-pong, as well as efficiency improvements for setting
shader unfiorms on inner parts of buffer ping-pong loops.

* Porting and Testing:
The code has been ported to Apple + ATI systems, and to OS Mesa with the gallium
llvmpipe state tracker. A number of ctests have been introduced to excersize the
new features. Parallel features have testing coverage in ParaView.

Change-Id: I26f90a4e1e4e204289d38993d1e32fe5493b7a0d
Merge topic 'parallel-surface-lic' into master

ad4dddfc Surface LIC : parallelization & fine tuning features