static void nine_ureg_tgsi_dump(struct ureg_program *ureg, boolean override)
{
if (debug_get_bool_option("NINE_FF_DUMP", FALSE) || override) {
- unsigned count;
- const struct tgsi_token *toks = ureg_get_tokens(ureg, &count);
+ const struct tgsi_token *toks = ureg_get_tokens(ureg, NULL);
tgsi_dump(toks, 0);
ureg_free_tokens(toks);
}
for (i = 0; i < key->vertexblend; ++i) {
for (c = 0; c < 4; ++c) {
- cWM[c] = ureg_src_register(TGSI_FILE_CONSTANT, (160 + i * 4) * !key->vertexblend_indexed + c);
+ cWM[c] = ureg_src_dimension(ureg_src_register(TGSI_FILE_CONSTANT, (160 + i * 4) * !key->vertexblend_indexed + c), 0);
if (key->vertexblend_indexed)
cWM[c] = ureg_src_indirect(cWM[c], ureg_scalar(ureg_src(AR), i));
}
const unsigned loop_label = l++;
+ /* Declare all light constants to allow indirect adressing */
+ for (i = 32; i < 96; i++)
+ ureg_DECL_constant(ureg, i);
+
ureg_MOV(ureg, rCtr, ureg_imm1f(ureg, 32.0f)); /* &lightconst(0) */
ureg_MOV(ureg, rD, ureg_imm1f(ureg, 0.0f));
ureg_MOV(ureg, rA, ureg_imm1f(ureg, 0.0f));
ureg_MUL(ureg, ps.rMod, ps.rCurSrc, ps.rTexSrc);
}
- colorarg[0] = (key->ts[s].colorarg0 | ((key->colorarg_b4[0] >> s) << 4) | ((key->colorarg_b5[0] >> s) << 5)) & 0x3f;
- colorarg[1] = (key->ts[s].colorarg1 | ((key->colorarg_b4[1] >> s) << 4) | ((key->colorarg_b5[1] >> s) << 5)) & 0x3f;
- colorarg[2] = (key->ts[s].colorarg2 | ((key->colorarg_b4[2] >> s) << 4) | ((key->colorarg_b5[2] >> s) << 5)) & 0x3f;
+ colorarg[0] = (key->ts[s].colorarg0 | (((key->colorarg_b4[0] >> s) & 0x1) << 4) | ((key->colorarg_b5[0] >> s) << 5)) & 0x3f;
+ colorarg[1] = (key->ts[s].colorarg1 | (((key->colorarg_b4[1] >> s) & 0x1) << 4) | ((key->colorarg_b5[1] >> s) << 5)) & 0x3f;
+ colorarg[2] = (key->ts[s].colorarg2 | (((key->colorarg_b4[2] >> s) & 0x1) << 4) | ((key->colorarg_b5[2] >> s) << 5)) & 0x3f;
alphaarg[0] = (key->ts[s].alphaarg0 | ((key->alphaarg_b4[0] >> s) << 4)) & 0x1f;
alphaarg[1] = (key->ts[s].alphaarg1 | ((key->alphaarg_b4[1] >> s) << 4)) & 0x1f;
alphaarg[2] = (key->ts[s].alphaarg2 | ((key->alphaarg_b4[2] >> s) << 4)) & 0x1f;
key.tc_dim_output |= dim << (s * 3);
}
+ DBG("VS ff key hash: %x\n", nine_ff_vs_key_hash(&key));
vs = util_hash_table_get(device->ff.ht_vs, &key);
if (vs)
return vs;
(void)err;
assert(err == PIPE_OK);
device->ff.num_vs++;
- NineUnknown_ConvertRefToBind(NineUnknown(vs));
vs->num_inputs = bld.num_inputs;
for (n = 0; n < bld.num_inputs; ++n)
sampler_mask |= (1 << s);
if (key.ts[s].colorop != D3DTOP_DISABLE) {
- if (used_c & 0x1) key.ts[s].colorarg0 = context->ff.tex_stage[s][D3DTSS_COLORARG0];
- if (used_c & 0x2) key.ts[s].colorarg1 = context->ff.tex_stage[s][D3DTSS_COLORARG1];
- if (used_c & 0x4) key.ts[s].colorarg2 = context->ff.tex_stage[s][D3DTSS_COLORARG2];
- if (used_c & 0x1) key.colorarg_b4[0] |= (context->ff.tex_stage[s][D3DTSS_COLORARG0] >> 4) << s;
- if (used_c & 0x1) key.colorarg_b5[0] |= (context->ff.tex_stage[s][D3DTSS_COLORARG0] >> 5) << s;
- if (used_c & 0x2) key.colorarg_b4[1] |= (context->ff.tex_stage[s][D3DTSS_COLORARG1] >> 4) << s;
- if (used_c & 0x2) key.colorarg_b5[1] |= (context->ff.tex_stage[s][D3DTSS_COLORARG1] >> 5) << s;
- if (used_c & 0x4) key.colorarg_b4[2] |= (context->ff.tex_stage[s][D3DTSS_COLORARG2] >> 4) << s;
- if (used_c & 0x4) key.colorarg_b5[2] |= (context->ff.tex_stage[s][D3DTSS_COLORARG2] >> 5) << s;
+ if (used_c & 0x1) key.ts[s].colorarg0 = context->ff.tex_stage[s][D3DTSS_COLORARG0] & 0x7;
+ if (used_c & 0x2) key.ts[s].colorarg1 = context->ff.tex_stage[s][D3DTSS_COLORARG1] & 0x7;
+ if (used_c & 0x4) key.ts[s].colorarg2 = context->ff.tex_stage[s][D3DTSS_COLORARG2] & 0x7;
+ if (used_c & 0x1) key.colorarg_b4[0] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG0] >> 4) & 0x1) << s;
+ if (used_c & 0x1) key.colorarg_b5[0] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG0] >> 5) & 0x1) << s;
+ if (used_c & 0x2) key.colorarg_b4[1] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG1] >> 4) & 0x1) << s;
+ if (used_c & 0x2) key.colorarg_b5[1] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG1] >> 5) & 0x1) << s;
+ if (used_c & 0x4) key.colorarg_b4[2] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG2] >> 4) & 0x1) << s;
+ if (used_c & 0x4) key.colorarg_b5[2] |= ((context->ff.tex_stage[s][D3DTSS_COLORARG2] >> 5) & 0x1) << s;
}
if (key.ts[s].alphaop != D3DTOP_DISABLE) {
- if (used_a & 0x1) key.ts[s].alphaarg0 = context->ff.tex_stage[s][D3DTSS_ALPHAARG0];
- if (used_a & 0x2) key.ts[s].alphaarg1 = context->ff.tex_stage[s][D3DTSS_ALPHAARG1];
- if (used_a & 0x4) key.ts[s].alphaarg2 = context->ff.tex_stage[s][D3DTSS_ALPHAARG2];
- if (used_a & 0x1) key.alphaarg_b4[0] |= (context->ff.tex_stage[s][D3DTSS_ALPHAARG0] >> 4) << s;
- if (used_a & 0x2) key.alphaarg_b4[1] |= (context->ff.tex_stage[s][D3DTSS_ALPHAARG1] >> 4) << s;
- if (used_a & 0x4) key.alphaarg_b4[2] |= (context->ff.tex_stage[s][D3DTSS_ALPHAARG2] >> 4) << s;
+ if (used_a & 0x1) key.ts[s].alphaarg0 = context->ff.tex_stage[s][D3DTSS_ALPHAARG0] & 0x7;
+ if (used_a & 0x2) key.ts[s].alphaarg1 = context->ff.tex_stage[s][D3DTSS_ALPHAARG1] & 0x7;
+ if (used_a & 0x4) key.ts[s].alphaarg2 = context->ff.tex_stage[s][D3DTSS_ALPHAARG2] & 0x7;
+ if (used_a & 0x1) key.alphaarg_b4[0] |= ((context->ff.tex_stage[s][D3DTSS_ALPHAARG0] >> 4) & 0x1) << s;
+ if (used_a & 0x2) key.alphaarg_b4[1] |= ((context->ff.tex_stage[s][D3DTSS_ALPHAARG1] >> 4) & 0x1) << s;
+ if (used_a & 0x4) key.alphaarg_b4[2] |= ((context->ff.tex_stage[s][D3DTSS_ALPHAARG2] >> 4) & 0x1) << s;
}
key.ts[s].resultarg = context->ff.tex_stage[s][D3DTSS_RESULTARG] == D3DTA_TEMP;
!(projection_matrix->_34 == 0.0f &&
projection_matrix->_44 == 1.0f);
+ DBG("PS ff key hash: %x\n", nine_ff_ps_key_hash(&key));
ps = util_hash_table_get(device->ff.ht_ps, &key);
if (ps)
return ps;
(void)err;
assert(err == PIPE_OK);
device->ff.num_ps++;
- NineUnknown_ConvertRefToBind(NineUnknown(ps));
ps->rt_mask = 0x1;
ps->sampler_mask = sampler_mask;
dst[38 + l * 8].x = cosf(light->Theta * 0.5f);
dst[38 + l * 8].y = cosf(light->Phi * 0.5f);
dst[38 + l * 8].z = 1.0f / (dst[38 + l * 8].x - dst[38 + l * 8].y);
- dst[39 + l * 8].w = (l + 1) == context->ff.num_lights_active;
+ dst[39 + l * 8].w = (float)((l + 1) == context->ff.num_lights_active);
}
}
struct nine_context *context = &device->context;
struct fvec4 *dst = (struct fvec4 *)device->ff.vs_const;
- if (!(context->changed.group & NINE_STATE_FF_OTHER))
+ if (!(context->changed.group & NINE_STATE_FF_VS_OTHER))
return;
dst[26].x = asfloat(context->rs[D3DRS_POINTSIZE_MIN]);
dst[26].y = asfloat(context->rs[D3DRS_POINTSIZE_MAX]);
struct fvec4 *dst = (struct fvec4 *)device->ff.ps_const;
unsigned s;
- if (!(context->changed.group & (NINE_STATE_FF_PSSTAGES | NINE_STATE_FF_OTHER)))
+ if (!(context->changed.group & NINE_STATE_FF_PS_CONSTS))
return;
for (s = 0; s < 8; ++s)
cb.user_buffer = device->ff.vs_const;
cb.buffer_size = NINE_FF_NUM_VS_CONST * 4 * sizeof(float);
- if (!device->driver_caps.user_cbufs) {
- context->pipe_data.cb_vs_ff.buffer_size = cb.buffer_size;
- u_upload_data(device->context.pipe->const_uploader,
- 0,
- cb.buffer_size,
- device->constbuf_alignment,
- cb.user_buffer,
- &context->pipe_data.cb_vs_ff.buffer_offset,
- &context->pipe_data.cb_vs_ff.buffer);
- u_upload_unmap(device->context.pipe->const_uploader);
- context->pipe_data.cb_vs_ff.user_buffer = NULL;
- } else
- context->pipe_data.cb_vs_ff = cb;
+ context->pipe_data.cb_vs_ff = cb;
context->commit |= NINE_STATE_COMMIT_CONST_VS;
+
+ context->changed.group &= ~NINE_STATE_FF_VS;
}
if (!context->ps) {
cb.user_buffer = device->ff.ps_const;
cb.buffer_size = NINE_FF_NUM_PS_CONST * 4 * sizeof(float);
- if (!device->driver_caps.user_cbufs) {
- context->pipe_data.cb_ps_ff.buffer_size = cb.buffer_size;
- u_upload_data(device->context.pipe->const_uploader,
- 0,
- cb.buffer_size,
- device->constbuf_alignment,
- cb.user_buffer,
- &context->pipe_data.cb_ps_ff.buffer_offset,
- &context->pipe_data.cb_ps_ff.buffer);
- u_upload_unmap(device->context.pipe->const_uploader);
- context->pipe_data.cb_ps_ff.user_buffer = NULL;
- } else
- context->pipe_data.cb_ps_ff = cb;
+ context->pipe_data.cb_ps_ff = cb;
context->commit |= NINE_STATE_COMMIT_CONST_PS;
- }
- context->changed.group &= ~NINE_STATE_FF;
+ context->changed.group &= ~NINE_STATE_FF_PS;
+ }
}
M->m[2][0] * D->m[0][2] +
M->m[3][0] * D->m[0][3];
- if (det < 1e-30) {/* non inversible */
+ if (fabsf(det) < 1e-30) {/* non inversible */
*D = *M; /* wine tests */
return;
}