gallivm: simplify and clean-up Z/stencil bit mask/shift code
Refactor the code into two helper functions which compute the bit mask
and shift terms for Z and stencil. Plus add a bunch of new comments to
explain everything.
gallivm/llvmpipe: added lp_rast_shader_inputs::facing and pass through
The triangle rasterizer sets this field to indicate front/back-facing.
It gets passed into the generated fragment code as another parameter.
Used now for stencil front/back selection but will also be used for
fragment shaders in general (see TGSI_SEMANTIC_FACE).
With this commit two-sided stenciling mostly works but there's
still a bug or two...
Most stencil demos look OK (modulo some unrelated rendering glitches).
Only single-sided stencil test works at this point.
There are probably some bugs to be found...
The llvm wrapper wasn't really an OS thing.
Use lp_bld.h for now but we eventually should rename/re-prefix all the
files/functions in the gallivm/ directory.
gallivm: add min_lod==max_lod special-case code in lp_build_lod_selector()
When min_lod==max_lod we don't need to go through all the work of
computing the lod from partial derivatives. This is hit by the mipmap
generation utility code.
LLVMBuildFPTrunc() should be used for double->float conversion, not
float->int conversion.
There should be a better way to compute floor(), ceil(), etc that doesn't
involve float->int->float conversion.
gallivm/llvmpipe: replace 'int stride' with 'int row_stride[MAX_LEVELS]'
The stride depends on the mipmap level. Rename to row_stride to
distinguish from img_stride for 3D textures.
Fixes incorrect texel addressing in small mipmap levels.
We could use single 1 bit conditions for scalar masks, but a lot of code
expects masks. The compiler easily optimzes away masks
extensions/truncations so consistency is preferable.
We can revisit this when LLVM backends have more support for vector
conditions.
The new lp_build_sample_general() function will handle all sampling
modes for all texture types. Still incomplete, but a few additional
sampling modes are now supported.
1D textures should work and most of the code for 3D textures is in place.
No support for cube maps yet. No support for different min/mag filters.