mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-25 16:40:30 +01:00
i965/gen6: Fix multisample resolve blits for luminance/intensity 32F formats.
On gen6, multisamble resolve blits use the SAMPLE message to blend
together the 4 samples for each texel. For some reason, SAMPLE
doesn't blend together the proper samples when the source format is
L32_FLOAT or I32_FLOAT, resulting in blocky artifacts.
To work around this problem, sample from the source surface using
R32_FLOAT. This shouldn't affect rendering correctness, because when
doing these resolve blits, the destination format is R32_FLOAT, so the
channel replication done by L32_FLOAT and I32_FLOAT is unnecessary.
Fixes piglit tests on Sandy Bridge:
- spec/ARB_texture_float/multisample-formats 2 GL_ARB_texture_float
- spec/ARB_texture_float/multisample-formats 4 GL_ARB_texture_float
No piglit regressions on Sandy Bridge.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70601
Cc: Kenneth Graunke <kenneth@whitecape.org>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
(cherry picked from commit c4cf487315)
This commit is contained in:
parent
edb4956932
commit
2457b5bfa4
1 changed files with 15 additions and 0 deletions
|
|
@ -2102,6 +2102,21 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
|
|||
src.brw_surfaceformat = dst.brw_surfaceformat;
|
||||
}
|
||||
|
||||
/* When doing a multisample resolve of a GL_LUMINANCE32F or GL_INTENSITY32F
|
||||
* texture, the above code configures the source format for L32_FLOAT or
|
||||
* I32_FLOAT, and the destination format for R32_FLOAT. On Sandy Bridge,
|
||||
* the SAMPLE message appears to handle multisampled L32_FLOAT and
|
||||
* I32_FLOAT textures incorrectly, resulting in blocky artifacts. So work
|
||||
* around the problem by using a source format of R32_FLOAT. This
|
||||
* shouldn't affect rendering correctness, since the destination format is
|
||||
* R32_FLOAT, so only the contents of the red channel matters.
|
||||
*/
|
||||
if (brw->gen == 6 && src.num_samples > 1 && dst.num_samples <= 1 &&
|
||||
src_mt->format == dst_mt->format &&
|
||||
dst.brw_surfaceformat == BRW_SURFACEFORMAT_R32_FLOAT) {
|
||||
src.brw_surfaceformat = dst.brw_surfaceformat;
|
||||
}
|
||||
|
||||
use_wm_prog = true;
|
||||
memset(&wm_prog_key, 0, sizeof(wm_prog_key));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue