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? Regards, Michael Karcher _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev