* Simple pass-through fragment shader to use when we don't have
* a real shader (or it fails to compile for some reason).
*/
-static unsigned passthrough[] =
+static unsigned passthrough[] =
{
_3DSTATE_PIXEL_SHADER_PROGRAM | ((2*3)-1),
/* declare input color:
*/
- (D0_DCL |
- (REG_TYPE_T << D0_TYPE_SHIFT) |
- (T_DIFFUSE << D0_NR_SHIFT) |
+ (D0_DCL |
+ (REG_TYPE_T << D0_TYPE_SHIFT) |
+ (T_DIFFUSE << D0_NR_SHIFT) |
D0_CHANNEL_ALL),
0,
0,
/* move to output color:
*/
- (A0_MOV |
- (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) |
- A0_DEST_CHANNEL_ALL |
+ (A0_MOV |
+ (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) |
+ A0_DEST_CHANNEL_ALL |
(REG_TYPE_T << A0_SRC0_TYPE_SHIFT) |
(T_DIFFUSE << A0_SRC0_NR_SHIFT)),
0x01230000, /* .xyzw */
}
}
+/**
+ * Return the number of coords needed to access a given TGSI_TEXTURE_*
+ */
+static uint
+texture_num_coords(struct i915_fp_compile *p, uint tex)
+{
+ switch (tex) {
+ case TGSI_TEXTURE_SHADOW1D:
+ case TGSI_TEXTURE_1D:
+ return 1;
+
+ case TGSI_TEXTURE_SHADOW2D:
+ case TGSI_TEXTURE_2D:
+ case TGSI_TEXTURE_SHADOWRECT:
+ case TGSI_TEXTURE_RECT:
+ return 2;
+
+ case TGSI_TEXTURE_3D:
+ case TGSI_TEXTURE_CUBE:
+ return 3;
+
+ default:
+ i915_program_error(p, "Num coords");
+ return 2;
+ }
+}
+
/**
* Generate texel lookup instruction.
get_result_flags( inst ),
sampler,
coord,
- opcode);
+ opcode,
+ texture_num_coords(p, texture) );
}
* SIN, COS -- could use another taylor step?
* LIT -- results seem a little different to sw mesa
* LOG -- different to mesa on negative numbers, but this is conformant.
- */
+ */
static void
i915_translate_instruction(struct i915_fp_compile *p,
const struct i915_full_instruction *inst,
src0 = src_vector(p, &inst->Src[0], fs);
src1 = src_vector(p, &inst->Src[1], fs);
src2 = src_vector(p, &inst->Src[2], fs);
- i915_emit_arith(p, A0_CMP,
+ i915_emit_arith(p, A0_CMP,
get_result_vector(p, &inst->Dst[0]),
- get_result_flags(inst),
+ get_result_flags(inst),
0, src0, src2, src1); /* NOTE: order of src2, src1 */
break;
i915_emit_arith(p, A0_MOD, tmp, A0_DEST_CHANNEL_X, 0, tmp, 0, 0);
/*
- * t0.xy = MUL x.xx11, x.x1111 ; x^2, x, 1, 1
+ * t0.xy = MUL x.xx11, x.x111 ; x^2, x, 1, 1
* t0 = MUL t0.xyxy t0.xx11 ; x^4, x^3, x^2, 1
* t0 = MUL t0.xxz1 t0.z111 ; x^6 x^4 x^2 1
* result = DP4 t0, cos_constants
A0_DEST_CHANNEL_ALL, /* dest writemask */
0, /* sampler */
src0, /* coord*/
- T0_TEXKILL); /* opcode */
+ T0_TEXKILL, /* opcode */
+ 1); /* num_coord */
break;
case TGSI_OPCODE_KILP:
- assert(0); /* not tested yet */
+ /* We emit an unconditional kill; we may want to revisit
+ * if we ever implement conditionals.
+ */
+ tmp = i915_get_utemp(p);
+
+ i915_emit_texld(p,
+ tmp, /* dest reg: a dummy reg */
+ A0_DEST_CHANNEL_ALL, /* dest writemask */
+ 0, /* sampler */
+ negate(swizzle(0, ONE, ONE, ONE, ONE), 1, 1, 1, 1), /* coord */
+ T0_TEXKILL, /* opcode */
+ 1); /* num_coord */
break;
case TGSI_OPCODE_LG2:
get_result_vector(p, &inst->Dst[0]),
flags, 0, swizzle(tmp, X, X, X, X), 0, 0);
break;
-
+
case TGSI_OPCODE_RET:
/* XXX: no-op? */
break;
-
+
case TGSI_OPCODE_RCP:
src0 = src_vector(p, &inst->Src[0], fs);
/* Copy compilation results to fragment program struct:
*/
+ assert(!ifs->decl);
assert(!ifs->program);
+
+ ifs->decl
+ = (uint *) MALLOC(decl_size * sizeof(uint));
ifs->program
- = (uint *) MALLOC((program_size + decl_size) * sizeof(uint));
- if (ifs->program) {
- ifs->program_len = program_size + decl_size;
+ = (uint *) MALLOC(program_size * sizeof(uint));
- memcpy(ifs->program,
- p->declarations,
+ if (ifs->decl) {
+ ifs->decl_len = decl_size;
+
+ memcpy(ifs->decl,
+ p->declarations,
decl_size * sizeof(uint));
+ }
+
+ if (ifs->program) {
+ ifs->program_len = program_size;
- memcpy(ifs->program + decl_size,
- p->program,
+ memcpy(ifs->program,
+ p->program,
program_size * sizeof(uint));
}
}
i915_fini_compile(i915, p);
i915_optimize_free(i_tokens);
+
+#if 0
+ i915_disassemble_program(NULL, fs->program, fs->program_len);
+#endif
}