[Mesa-dev] [i915g] i915_fpc_optimize_useless_mov is invalid in the general case

Stéphane Marchesin stephane.marchesin at gmail.com
Mon Dec 5 13:03:11 PST 2011


On Mon, Dec 5, 2011 at 14:00, Michael Karcher
<freedesktop-bugzilla at mkarcher.dialup.fu-berlin.de> wrote:
> Hello developers,
>
> trying some sample programs on the i915 gallium based driver, I stumbled
> upon getting black/white rendering in teapot, if using the hardware
> pixel shader backend, but getting correct output (yellow textured base)
> with software rendering. It turned out that
> i915_fpc_optimize_useless_mov is the culprit, as it kills the pixel
> shader created by the classic render pipeline:
>
> FRAG
> PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1
> DCL IN[0], COLOR, LINEAR
> DCL IN[1], FOG, PERSPECTIVE
> DCL IN[2], GENERIC[0], PERSPECTIVE
> DCL OUT[0], COLOR
> DCL SAMP[0]
> DCL CONST[1..3]
> DCL TEMP[0..3]
> IMM FLT32 {    1.0000,     0.0000,     0.0000,     0.0000}
>  0: TXP TEMP[0], IN[2].xyyw, SAMP[0], 2D
>  1: MUL TEMP[0].xyz, TEMP[0], IN[0]
>  2: MOV TEMP[1].xyz, TEMP[0].xyzx
>  3: MOV TEMP[1].w, IN[0].wwww
>  4: MOV TEMP[1].w, TEMP[1]
>  5: MUL TEMP[2].x, IN[1].xxxx, CONST[1].wwww
>  6: MUL TEMP[2].x, TEMP[2].xxxx, TEMP[2].xxxx
>  7: EX2 TEMP[2].x, -TEMP[2].xxxx
>  8: MOV_SAT TEMP[2].x, TEMP[2].xxxx
>  9: ADD TEMP[3].x, IMM[0].xxxx, -TEMP[2].xxxx
>  10: MUL TEMP[3].xyz, CONST[2].xyzz, TEMP[3].xxxx
>  11: MAD TEMP[1].xyz, TEMP[0].xyzz, TEMP[2].xxxx, TEMP[3].xyzz
>  12: MOV OUT[0], TEMP[1]
>  13: END
>
> gets translated without the optimization into
>  0: BEGIN
>  1: DCL S[0]
>  2: DCL T_TEX0
>  3: DCL T_DIFFUSE
>  4: DCL T_FOG_W
>  5: R[0] = TEXLDP S[0],T_TEX0
>  6: R[0].xyz = MUL R[0], T_DIFFUSE
>  7: R[1].xyz = MOV R[0].xyzx
>  8: R[1].w = MOV T_DIFFUSE.wwww
>  9: R[1].w = MOV R[1]
>  10: R[2].x = MUL T_FOG_W.wwww, CONST[1].wwww
>  11: R[2].x = MUL R[2].xxxx, R[2].xxxx
>  12: R[2].x = EXP R[2].-x-x-x-x
>  13: R[2].x = SATURATE MOV R[2].xxxx
>  14: R[3].x = ADD CONST[0].xxxx, R[2].-x-x-x-x
>  15: R[3].xyz = MUL CONST[2].xyzz, R[3].xxxx
>  16: R[1].xyz = MAD R[0].xyzz, R[2].xxxx, R[3].xyzz
>  17: oC = MOV R[1]
>  18: END
>
> This translation is correct. The mentioned optimization now kicks in
> corrrectly removing line 9, but it also reokaces line 6/7 by
>  6: R[1].xyz = MUL R[0], T_DIFFUSE
> This does yield the correct result in R[1].xyz, but it does (of course)
> not update R[0].xyz, which is a problem, because R[0].xyzz is used in
> line 16. In this special case, we could get away with renaming R[0].xyzz
> into R[1].xyzz in line 16, but in the general case, there is no warranty
> that R[1].xyz still contains in line 16 what it did in line 7.
>
> Any suggestions? Just remove this optimization? Improve the optimizer to
> have it check that the eliminated temporary is not used in any further
> lines?

Yeah we need to replace the temporary in all further lines. Patches welcome.

Stéphane


More information about the mesa-dev mailing list