📄 i915_xvmc.c
字号:
mi_flush.dw0.map_cache_invalidate = map; mi_flush.dw0.render_cache_flush_inhibit = render; intelBatchbufferData(&mi_flush, sizeof(mi_flush), 0);}static void i915_mc_load_indirect_render_init(XvMCContext *context){ i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData; sis_state *sis; msb_state *msb; struct i915_3dstate_load_indirect *load_indirect; int mem_select; mc_render_load_indirect_size = sizeof(*load_indirect) + sizeof(*sis) + sizeof(*msb); mc_render_load_indirect = calloc(1, mc_render_load_indirect_size); load_indirect = (struct i915_3dstate_load_indirect *)mc_render_load_indirect; load_indirect->dw0.type = CMD_3D; load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT; load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_MSB; load_indirect->dw0.length = (mc_render_load_indirect_size >> 2) - 2; if (pI915XvMC->deviceID == PCI_CHIP_I915_G || pI915XvMC->deviceID == PCI_CHIP_I915_GM) mem_select = 0; else mem_select = 1; load_indirect->dw0.mem_select = mem_select; /* Static Indirect state buffer (dest buffer info) */ sis = (sis_state *)(++load_indirect); sis->dw0.valid = 1; sis->dw0.force = 1; sis->dw1.length = 16; /* 4 * 3 + 2 + 3 - 1 */ if (mem_select) sis->dw0.buffer_address = (pI915XvMC->sis.offset >> 2); else sis->dw0.buffer_address = (pI915XvMC->sis.bus_addr >> 2); /* Map state buffer (reference buffer info) */ msb = (msb_state *)(++sis); msb->dw0.valid = 1; msb->dw0.force = 1; msb->dw1.length = 23; /* 3 * 8 - 1 */ if (mem_select) msb->dw0.buffer_address = (pI915XvMC->msb.offset >> 2); else msb->dw0.buffer_address = (pI915XvMC->msb.bus_addr >> 2);}static void i915_mc_load_indirect_render_emit(void){ i915_emit_batch(mc_render_load_indirect, mc_render_load_indirect_size, 0);}static void i915_mc_mpeg_set_origin(XvMCContext *context, XvMCMacroBlock *mb){ struct i915_3dmpeg_set_origin set_origin; /* 3DMPEG_SET_ORIGIN */ memset(&set_origin, 0, sizeof(set_origin)); set_origin.dw0.type = CMD_3D; set_origin.dw0.opcode = OPC_3DMPEG_SET_ORIGIN; set_origin.dw0.length = 0; set_origin.dw1.h_origin = mb->x; set_origin.dw1.v_origin = mb->y; intelBatchbufferData(&set_origin, sizeof(set_origin), 0);}static void i915_mc_mpeg_macroblock_ipicture(XvMCContext *context, XvMCMacroBlock *mb){ struct i915_3dmpeg_macroblock_ipicture macroblock_ipicture; /* 3DMPEG_MACROBLOCK_IPICTURE */ memset(¯oblock_ipicture, 0, sizeof(macroblock_ipicture)); macroblock_ipicture.dw0.type = CMD_3D; macroblock_ipicture.dw0.opcode = OPC_3DMPEG_MACROBLOCK_IPICTURE; macroblock_ipicture.dw0.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD); intelBatchbufferData(¯oblock_ipicture, sizeof(macroblock_ipicture), 0);}#if 0static void i915_mc_mpeg_macroblock_0mv(XvMCContext *context, XvMCMacroBlock *mb){ struct i915_3dmpeg_macroblock_0mv macroblock_0mv; /* 3DMPEG_MACROBLOCK(0mv) */ memset(¯oblock_0mv, 0, sizeof(macroblock_0mv)); macroblock_0mv.header.dw0.type = CMD_3D; macroblock_0mv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK; macroblock_0mv.header.dw0.length = 0; macroblock_0mv.header.dw1.mb_intra = 1; /* should be 1 */ macroblock_0mv.header.dw1.forward = 0; /* should be 0 */ macroblock_0mv.header.dw1.backward = 0; /* should be 0 */ macroblock_0mv.header.dw1.h263_4mv = 0; /* should be 0 */ macroblock_0mv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);/* if (!mb->coded_block_pattern) macroblock_0mv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;*/ macroblock_0mv.header.dw1.motion_type = 0; // (mb->motion_type & 0x3); macroblock_0mv.header.dw1.vertical_field_select = 0; // mb->motion_vertical_field_select & 0xf; macroblock_0mv.header.dw1.coded_block_pattern = mb->coded_block_pattern; macroblock_0mv.header.dw1.skipped_macroblocks = 0; intelBatchbufferData(¯oblock_0mv, sizeof(macroblock_0mv), 0);}#endifstatic void i915_mc_mpeg_macroblock_1fbmv(XvMCContext *context, XvMCMacroBlock *mb){ struct i915_3dmpeg_macroblock_1fbmv macroblock_1fbmv; vector_t mv0[2]; /* 3DMPEG_MACROBLOCK(1fbmv) */ memset(¯oblock_1fbmv, 0, sizeof(macroblock_1fbmv)); macroblock_1fbmv.header.dw0.type = CMD_3D; macroblock_1fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK; macroblock_1fbmv.header.dw0.length = 2; macroblock_1fbmv.header.dw1.mb_intra = 0; /* should be 0 */ macroblock_1fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0); macroblock_1fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0); macroblock_1fbmv.header.dw1.h263_4mv = 0; /* should be 0 */ macroblock_1fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD); if (!(mb->coded_block_pattern & 0x3f)) macroblock_1fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME; macroblock_1fbmv.header.dw1.motion_type = (mb->motion_type & 0x03); macroblock_1fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f); macroblock_1fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern; macroblock_1fbmv.header.dw1.skipped_macroblocks = 0; mv0[0].component[0] = mb->PMV[0][0][0]; mv0[0].component[1] = mb->PMV[0][0][1]; mv0[1].component[0] = mb->PMV[0][1][0]; mv0[1].component[1] = mb->PMV[0][1][1]; macroblock_1fbmv.dw2 = mv0[0].v; macroblock_1fbmv.dw3 = mv0[1].v; intelBatchbufferData(¯oblock_1fbmv, sizeof(macroblock_1fbmv), 0);}static void i915_mc_mpeg_macroblock_2fbmv(XvMCContext *context, XvMCMacroBlock *mb, unsigned int ps){ struct i915_3dmpeg_macroblock_2fbmv macroblock_2fbmv; vector_t mv0[2]; vector_t mv1[2]; /* 3DMPEG_MACROBLOCK(2fbmv) */ memset(¯oblock_2fbmv, 0, sizeof(macroblock_2fbmv)); macroblock_2fbmv.header.dw0.type = CMD_3D; macroblock_2fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK; macroblock_2fbmv.header.dw0.length = 4; macroblock_2fbmv.header.dw1.mb_intra = 0; /* should be 0 */ macroblock_2fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0); macroblock_2fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0); macroblock_2fbmv.header.dw1.h263_4mv = 0; /* should be 0 */ macroblock_2fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD); if (!(mb->coded_block_pattern & 0x3f)) macroblock_2fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME; macroblock_2fbmv.header.dw1.motion_type = (mb->motion_type & 0x03); macroblock_2fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f); macroblock_2fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern; macroblock_2fbmv.header.dw1.skipped_macroblocks = 0; mv0[0].component[0] = mb->PMV[0][0][0]; mv0[0].component[1] = mb->PMV[0][0][1]; mv0[1].component[0] = mb->PMV[0][1][0]; mv0[1].component[1] = mb->PMV[0][1][1]; mv1[0].component[0] = mb->PMV[1][0][0]; mv1[0].component[1] = mb->PMV[1][0][1]; mv1[1].component[0] = mb->PMV[1][1][0]; mv1[1].component[1] = mb->PMV[1][1][1]; if ((ps & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) { if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) { mv0[0].component[1] = mb->PMV[0][0][1] >> 1; mv0[1].component[1] = mb->PMV[0][1][1] >> 1; mv1[0].component[1] = mb->PMV[1][0][1] >> 1; mv1[1].component[1] = mb->PMV[1][1][1] >> 1; } else if ((mb->motion_type & 3) == XVMC_PREDICTION_DUAL_PRIME) { mv0[0].component[1] = mb->PMV[0][0][1] >> 1; mv0[1].component[1] = mb->PMV[0][1][1] >> 1; // MPEG2 MV[0][1] isn't used mv1[0].component[1] = mb->PMV[1][0][1] >> 1; mv1[1].component[1] = mb->PMV[1][1][1] >> 1; } } macroblock_2fbmv.dw2 = mv0[0].v; macroblock_2fbmv.dw3 = mv0[1].v; macroblock_2fbmv.dw4 = mv1[0].v; macroblock_2fbmv.dw5 = mv1[1].v; intelBatchbufferData(¯oblock_2fbmv, sizeof(macroblock_2fbmv), 0);}#if 0static void i915_mc_invalidate_subcontext_buffers(XvMCContext *context, unsigned int mask){ struct i915_3dstate_load_indirect *load_indirect = NULL; sis_state *sis = NULL; dis_state *dis = NULL; ssb_state *ssb = NULL; msb_state *msb = NULL; psp_state *psp = NULL; psc_state *psc = NULL; i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData; unsigned int size; void *base = NULL, *ptr = NULL; size = sizeof(*load_indirect); if (mask & BLOCK_SIS) size += sizeof(*sis); if (mask & BLOCK_DIS) size += sizeof(*dis); if (mask & BLOCK_SSB) size += sizeof(*ssb); if (mask & BLOCK_MSB) size += sizeof(*msb); if (mask & BLOCK_PSP) size += sizeof(*psp); if (mask & BLOCK_PSC) size += sizeof(*psc); if (size == sizeof(*load_indirect)) { XVMC_ERR("There must be at least one bit set\n"); return; } /* 3DSTATE_LOAD_INDIRECT */ base = calloc(1, size); load_indirect = (struct i915_3dstate_load_indirect *)base; load_indirect->dw0.type = CMD_3D; load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT; if (pI915XvMC->deviceID == PCI_CHIP_I915_G || pI915XvMC->deviceID == PCI_CHIP_I915_GM || pI915XvMC->deviceID == PCI_CHIP_I945_G || pI915XvMC->deviceID == PCI_CHIP_I945_GM) load_indirect->dw0.mem_select = 0; else load_indirect->dw0.mem_select = 1; load_indirect->dw0.block_mask = mask; load_indirect->dw0.length = (size >> 2) - 2; ptr = ++load_indirect; /* SIS */ if (mask & BLOCK_SIS) { sis = (sis_state *)ptr; sis->dw0.valid = 0; sis->dw0.buffer_address = 0; sis->dw1.length = 0; ptr = ++sis; } /* DIS */ if (mask & BLOCK_DIS) { dis = (dis_state *)ptr; dis->dw0.valid = 0; dis->dw0.reset = 0; dis->dw0.buffer_address = 0; ptr = ++dis; } /* SSB */ if (mask & BLOCK_SSB) { ssb = (ssb_state *)ptr; ssb->dw0.valid = 0; ssb->dw0.buffer_address = 0; ssb->dw1.length = 0; ptr = ++ssb; } /* MSB */ if (mask & BLOCK_MSB) { msb = (msb_state *)ptr; msb->dw0.valid = 0; msb->dw0.buffer_address = 0; msb->dw1.length = 0; ptr = ++msb; } /* PSP */ if (mask & BLOCK_PSP) { psp = (psp_state *)ptr; psp->dw0.valid = 0; psp->dw0.buffer_address = 0; psp->dw1.length = 0; ptr = ++psp; } /* PSC */ if (mask & BLOCK_PSC) { psc = (psc_state *)ptr; psc->dw0.valid = 0; psc->dw0.buffer_address = 0; psc->dw1.length = 0; ptr = ++psc; } intelBatchbufferData(base, size, 0); free(base);}#endifstatic int i915_xvmc_map_buffers(i915XvMCContext *pI915XvMC){ if (drmMap(xvmc_driver->fd, pI915XvMC->sis.handle, pI915XvMC->sis.size, (drmAddress *)&pI915XvMC->sis.map) != 0) { return -1; } if (drmMap(xvmc_driver->fd, pI915XvMC->ssb.handle, pI915XvMC->ssb.size, (drmAddress *)&pI915XvMC->ssb.map) != 0) { return -1; } if (drmMap(xvmc_driver->fd, pI915XvMC->msb.handle, pI915XvMC->msb.size, (drmAddress *)&pI915XvMC->msb.map) != 0) { return -1; } if (drmMap(xvmc_driver->fd, pI915XvMC->psp.handle, pI915XvMC->psp.size, (drmAddress *)&pI915XvMC->psp.map) != 0) { return -1; } if (drmMap(xvmc_driver->fd, pI915XvMC->psc.handle, pI915XvMC->psc.size, (drmAddress *)&pI915XvMC->psc.map) != 0) { return -1; } if (drmMap(xvmc_driver->fd, pI915XvMC->corrdata.handle,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -