create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigned mv_per_frame)
{
struct ureg_program *shader;
- struct ureg_src norm;
+ struct ureg_src norm, mbs;
struct ureg_src vpos, vtex[3], vmv[4];
struct ureg_dst temp;
struct ureg_dst o_vpos, o_vtex[3], o_vmv[4];
return NULL;
norm = ureg_DECL_constant(shader, 0);
+ mbs = ureg_imm2f(shader, MACROBLOCK_WIDTH, MACROBLOCK_HEIGHT);
temp = ureg_DECL_temporary(shader);
vpos = ureg_DECL_vs_input(shader, 0);
}
/*
- * o_vpos = vpos * norm
- * o_vtex[0..2] = vtex[0..2] * norm
+ * o_vpos = vpos * norm * mbs
+ * o_vtex[0..2] = vtex[0..2] * norm * mbs
* o_vmv[0..count] = o_vpos + vmv[0..4] * 0.5 // Apply motion vector
*/
- ureg_MUL(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_XY), vpos, norm);
+ ureg_MUL(shader, ureg_writemask(temp, TGSI_WRITEMASK_XY), vpos, mbs);
+ ureg_MUL(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_XY), ureg_src(temp), norm);
ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_ZW), vpos);
for (i = 0; i < 3; ++i) {
- ureg_MUL(shader, ureg_writemask(o_vtex[i], TGSI_WRITEMASK_XY), vtex[i], norm);
+ ureg_MUL(shader, ureg_writemask(temp, TGSI_WRITEMASK_XY), vtex[i], mbs);
+ ureg_MUL(shader, ureg_writemask(o_vtex[i], TGSI_WRITEMASK_XY), ureg_src(temp), norm);
ureg_MOV(shader, ureg_writemask(o_vtex[i], TGSI_WRITEMASK_ZW), vtex[i]);
}
for (i = 0; i < count; ++i) {
static void
gen_block_verts(struct vert_stream_0 *vb, struct pipe_mpeg12_macroblock *mb,
- const struct vertex2f *unit, const struct vertex2f *half, const struct vertex2f *offset,
+ const struct vertex2f *offset,
unsigned luma_mask, unsigned cb_mask, unsigned cr_mask,
bool use_zeroblocks, struct vertex2f *zero_blocks)
{
unsigned mbx = mb->mbx;
unsigned mby = mb->mby;
+ const struct vertex2f half =
+ {
+ 0.5f,
+ 0.5f
+ };
struct vertex2f v;
assert(vb);
- assert(unit && half && offset);
+ assert(offset);
assert(zero_blocks || !use_zeroblocks);
/* Generate vertices for two triangles covering a block */
- v.x = mbx * unit->x + offset->x;
- v.y = mby * unit->y + offset->y;
+ v.x = mbx + offset->x;
+ v.y = mby + offset->y;
vb[0].pos.x = v.x;
vb[0].pos.y = v.y;
vb[1].pos.x = v.x;
- vb[1].pos.y = v.y + half->y;
- vb[2].pos.x = v.x + half->x;
+ vb[1].pos.y = v.y + half.y;
+ vb[2].pos.x = v.x + half.x;
vb[2].pos.y = v.y;
- vb[3].pos.x = v.x + half->x;
+ vb[3].pos.x = v.x + half.x;
vb[3].pos.y = v.y;
vb[4].pos.x = v.x;
- vb[4].pos.y = v.y + half->y;
- vb[5].pos.x = v.x + half->x;
- vb[5].pos.y = v.y + half->y;
+ vb[4].pos.y = v.y + half.y;
+ vb[5].pos.x = v.x + half.x;
+ vb[5].pos.y = v.y + half.y;
/* Generate texcoords for the triangles, either pointing to the correct area on the luma/chroma texture
or if zero blocks are being used, to the zero block if the appropriate CBP bits aren't set (i.e. no data
for this channel is defined for this block) */
if (!use_zeroblocks || cbp & luma_mask || mb->dct_type == PIPE_MPEG12_DCT_TYPE_FIELD) {
- v.x = mbx * unit->x + offset->x;
- v.y = mby * unit->y + offset->y;
+ v.x = mbx + offset->x;
+ v.y = mby + offset->y;
}
else {
v.x = zero_blocks[0].x;
vb[0].luma_tc.x = v.x;
vb[0].luma_tc.y = v.y;
vb[1].luma_tc.x = v.x;
- vb[1].luma_tc.y = v.y + half->y;
- vb[2].luma_tc.x = v.x + half->x;
+ vb[1].luma_tc.y = v.y + half.y;
+ vb[2].luma_tc.x = v.x + half.x;
vb[2].luma_tc.y = v.y;
- vb[3].luma_tc.x = v.x + half->x;
+ vb[3].luma_tc.x = v.x + half.x;
vb[3].luma_tc.y = v.y;
vb[4].luma_tc.x = v.x;
- vb[4].luma_tc.y = v.y + half->y;
- vb[5].luma_tc.x = v.x + half->x;
- vb[5].luma_tc.y = v.y + half->y;
+ vb[4].luma_tc.y = v.y + half.y;
+ vb[5].luma_tc.x = v.x + half.x;
+ vb[5].luma_tc.y = v.y + half.y;
if (!use_zeroblocks || cbp & cb_mask) {
- v.x = mbx * unit->x + offset->x;
- v.y = mby * unit->y + offset->y;
+ v.x = mbx + offset->x;
+ v.y = mby + offset->y;
}
else {
v.x = zero_blocks[1].x;
vb[0].cb_tc.x = v.x;
vb[0].cb_tc.y = v.y;
vb[1].cb_tc.x = v.x;
- vb[1].cb_tc.y = v.y + half->y;
- vb[2].cb_tc.x = v.x + half->x;
+ vb[1].cb_tc.y = v.y + half.y;
+ vb[2].cb_tc.x = v.x + half.x;
vb[2].cb_tc.y = v.y;
- vb[3].cb_tc.x = v.x + half->x;
+ vb[3].cb_tc.x = v.x + half.x;
vb[3].cb_tc.y = v.y;
vb[4].cb_tc.x = v.x;
- vb[4].cb_tc.y = v.y + half->y;
- vb[5].cb_tc.x = v.x + half->x;
- vb[5].cb_tc.y = v.y + half->y;
+ vb[4].cb_tc.y = v.y + half.y;
+ vb[5].cb_tc.x = v.x + half.x;
+ vb[5].cb_tc.y = v.y + half.y;
if (!use_zeroblocks || cbp & cr_mask) {
- v.x = mbx * unit->x + offset->x;
- v.y = mby * unit->y + offset->y;
+ v.x = mbx + offset->x;
+ v.y = mby + offset->y;
}
else {
v.x = zero_blocks[2].x;
vb[0].cr_tc.x = v.x;
vb[0].cr_tc.y = v.y;
vb[1].cr_tc.x = v.x;
- vb[1].cr_tc.y = v.y + half->y;
- vb[2].cr_tc.x = v.x + half->x;
+ vb[1].cr_tc.y = v.y + half.y;
+ vb[2].cr_tc.x = v.x + half.x;
vb[2].cr_tc.y = v.y;
- vb[3].cr_tc.x = v.x + half->x;
+ vb[3].cr_tc.x = v.x + half.x;
vb[3].cr_tc.y = v.y;
vb[4].cr_tc.x = v.x;
- vb[4].cr_tc.y = v.y + half->y;
- vb[5].cr_tc.x = v.x + half->x;
- vb[5].cr_tc.y = v.y + half->y;
+ vb[4].cr_tc.y = v.y + half.y;
+ vb[5].cr_tc.x = v.x + half.x;
+ vb[5].cr_tc.y = v.y + half.y;
}
static void
}
case PIPE_MPEG12_MACROBLOCK_TYPE_INTRA:
{
- const struct vertex2f unit =
- {
- MACROBLOCK_WIDTH,
- MACROBLOCK_HEIGHT
- };
- const struct vertex2f half =
- {
- (MACROBLOCK_WIDTH / 2),
- (MACROBLOCK_HEIGHT / 2)
- };
const struct vertex2f offsets[2][2] =
{
{
- {0, 0}, {0, half.y}
+ {0, 0}, {0, 0.5f}
},
{
- {half.x, 0}, {half.x, half.y}
+ {0.5f, 0}, {0.5f, 0.5f}
}
};
const bool use_zb = r->eb_handling == VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE;
struct vert_stream_0 *vb = ycbcr_vb + pos * 24;
- gen_block_verts(vb, mb,
- &unit, &half, &offsets[0][0],
+ gen_block_verts(vb, mb, &offsets[0][0],
32, 2, 1, use_zb, r->zero_block);
- gen_block_verts(vb + 6, mb,
- &unit, &half, &offsets[1][0],
+ gen_block_verts(vb + 6, mb, &offsets[1][0],
16, 2, 1, use_zb, r->zero_block);
- gen_block_verts(vb + 12, mb,
- &unit, &half, &offsets[0][1],
+ gen_block_verts(vb + 12, mb, &offsets[0][1],
8, 2, 1, use_zb, r->zero_block);
- gen_block_verts(vb + 18, mb,
- &unit, &half, &offsets[1][1],
+ gen_block_verts(vb + 18, mb, &offsets[1][1],
4, 2, 1, use_zb, r->zero_block);
break;
fill_frame_zero_block(texels + y * tex_pitch * BLOCK_WIDTH + x * BLOCK_WIDTH, tex_pitch);
if (r->eb_handling == VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE) {
- r->zero_block[0].x = (mbpx + x * 8);
- r->zero_block[0].y = (mbpy + y * 8);
+ r->zero_block[0].x = (mbx + x * 0.5f);
+ r->zero_block[0].y = (mby + y * 0.5f);
}
}
}
ZERO_BLOCK_IS_NIL(r->zero_block[tb + 1])) {
fill_frame_zero_block(texels, tex_pitch);
if (r->eb_handling == VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE) {
- r->zero_block[tb + 1].x = (mbpx << 1);
- r->zero_block[tb + 1].y = (mbpy << 1);
+ r->zero_block[tb + 1].x = mbx;
+ r->zero_block[tb + 1].y = mby;
}
}
}