⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i915_xvmc.c

📁 显驱动 Intel英特尔G45G43G41G35G33G31G965Q963Q965GM965系列显卡最新X.Org驱动2.4.0版For Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
    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(&macroblock_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(&macroblock_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(&macroblock_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(&macroblock_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(&macroblock_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(&macroblock_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(&macroblock_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(&macroblock_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 + -