On Mon, Dec 5, 2011 at 14:00, Michael Karcher <freedesktop-bugzi...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev