diff options
author | Ben Skeggs <darktama@iinet.net.au> | 2006-11-26 13:18:41 +0000 |
---|---|---|
committer | Ben Skeggs <darktama@iinet.net.au> | 2006-11-26 13:18:41 +0000 |
commit | 2f411b0a8bf9af96d7ef582564d8e462abd0f28d (patch) | |
tree | fe51fa9a32a4e6790b76dd66c1e75051ee6c639d | |
parent | 6ff3d2577ec1099a90cce9292118814c00ab0e6a (diff) |
Fix RSQ emulation
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_shader_0_arb.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_shader_0_arb.c b/src/mesa/drivers/dri/nouveau/nouveau_shader_0_arb.c index 8b5222d069..afb889d421 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_shader_0_arb.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_shader_0_arb.c @@ -125,6 +125,7 @@ struct pass0_rec { int next_temp; int swzconst_done; int swzconst_id; + nvsRegister const_half; }; #define X NVS_SWZ_X @@ -488,6 +489,7 @@ pass0_emulate_instruction(nouveauShader *nvs, struct prog_instruction *inst) nvsFunc *shader = nvs->func; nvsRegister src[3], dest, temp; nvsInstruction *nvsinst; + struct pass0_rec *rec = nvs->pass_rec; unsigned int mask = pass0_make_mask(inst->DstReg.WriteMask); int i, sat; @@ -561,11 +563,26 @@ pass0_emulate_instruction(nouveauShader *nvs, struct prog_instruction *inst) } break; case OPCODE_RSQ: + if (rec->const_half.file != NVS_FILE_CONST) { + GLfloat const_half[4] = { 0.5, 0.0, 0.0, 0.0 }; + pass0_make_reg(nvs, &rec->const_half, NVS_FILE_CONST, + _mesa_add_unnamed_constant(nvs->mesa.vp.Base.Parameters, + const_half, 4)); + COPY_4V(nvs->params[rec->const_half.index].val, const_half); + } pass0_make_reg(nvs, &temp, NVS_FILE_TEMP, -1); pass0_emit(nvs, NVS_OP_LG2, temp, SMASK_X, 0, - nvsAbs(nvsSwizzle(src[0], X, X, X, X)), nvr_unused, nvr_unused); + nvsAbs(nvsSwizzle(src[0], X, X, X, X)), + nvr_unused, + nvr_unused); + pass0_emit(nvs, NVS_OP_MUL, temp, SMASK_X, 0, + nvsSwizzle(temp, X, X, X, X), + nvsNegate(rec->const_half), + nvr_unused); pass0_emit(nvs, NVS_OP_EX2, dest, mask, sat, - nvsSwizzle(temp, X, X, X, X), nvr_unused, nvr_unused); + nvsSwizzle(temp, X, X, X, X), + nvr_unused, + nvr_unused); break; case OPCODE_SCS: if (mask & SMASK_X) @@ -607,7 +624,6 @@ static GLboolean pass0_translate_instructions(nouveauShader *nvs) { struct gl_program *prog = (struct gl_program *)&nvs->mesa.vp; - struct pass0_rec *rec = nvs->pass_rec; nvsFunc *shader = nvs->func; int ipos; |