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

📄 i915_xvmc.c

📁 显驱动 Intel英特尔G45G43G41G35G33G31G965Q963Q965GM965系列显卡最新X.Org驱动2.4.0版For Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
    one_time_load_state_imm1 = calloc(1, one_time_load_state_imm1_size);    load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)one_time_load_state_imm1;    load_state_immediate_1->dw0.type = CMD_3D;    load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;    load_state_immediate_1->dw0.load_s3 = 1;    load_state_immediate_1->dw0.load_s6 = 1;    load_state_immediate_1->dw0.length = (one_time_load_state_imm1_size >> 2) - 2;    s3 = (struct s3_dword *)(++load_state_immediate_1);    s3->set0_pcd = 1;    s3->set1_pcd = 1;    s3->set2_pcd = 1;    s3->set3_pcd = 1;    s3->set4_pcd = 1;    s3->set5_pcd = 1;    s3->set6_pcd = 1;    s3->set7_pcd = 1;    s6 = (struct s6_dword *)(++s3);    s6->alpha_test_enable = 0;    s6->alpha_test_function = 0;    s6->alpha_reference_value = 0;    s6->depth_test_enable = 1;    s6->depth_test_function = 0;    s6->color_buffer_blend = 0;    s6->color_blend_function = 0;    s6->src_blend_factor = 1;    s6->dest_blend_factor = 1;    s6->depth_buffer_write = 0;    s6->color_buffer_write = 1;    s6->triangle_pv = 0;    /* 3DSTATE_LOAD_INDIRECT */    one_time_load_indirect_size = sizeof(*load_indirect) + sizeof(*dis) + sizeof(*ssb) + sizeof(*psp) + sizeof(*psc);    one_time_load_indirect = calloc(1, one_time_load_indirect_size);    load_indirect = (struct i915_3dstate_load_indirect *)one_time_load_indirect;    load_indirect->dw0.type = CMD_3D;    load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;    load_indirect->dw0.block_mask = BLOCK_DIS | BLOCK_SSB | BLOCK_PSP | BLOCK_PSC;    load_indirect->dw0.length = (one_time_load_indirect_size >> 2) - 2;    if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||        pI915XvMC->deviceID == PCI_CHIP_I915_GM)	mem_select = 0; /* use physical address */    else	mem_select = 1; /* use gfx address */    load_indirect->dw0.mem_select = mem_select;    /* Dynamic indirect state buffer */    dis = (dis_state *)(++load_indirect);    dis->dw0.valid = 0;    dis->dw0.reset = 0;    dis->dw0.buffer_address = 0;    /* Sample state buffer */    ssb = (ssb_state *)(++dis);    ssb->dw0.valid = 1;    ssb->dw0.force = 1;    ssb->dw1.length = 7; /* 8 - 1 */    if (mem_select)        ssb->dw0.buffer_address = (pI915XvMC->ssb.offset >> 2);    else	ssb->dw0.buffer_address = (pI915XvMC->ssb.bus_addr >> 2);    /* Pixel shader program buffer */    psp = (psp_state *)(++ssb);    psp->dw0.valid = 1;    psp->dw0.force = 1;    psp->dw1.length = 66; /* 4 + 16 + 16 + 31 - 1 */    if (mem_select)	psp->dw0.buffer_address = (pI915XvMC->psp.offset >> 2);    else	psp->dw0.buffer_address = (pI915XvMC->psp.bus_addr >> 2);    /* Pixel shader constant buffer */    psc = (psc_state *)(++psp);    psc->dw0.valid = 1;    psc->dw0.force = 1;    psc->dw1.length = 5; /* 6 - 1 */    if (mem_select)        psc->dw0.buffer_address = (pI915XvMC->psc.offset >> 2);    else        psc->dw0.buffer_address = (pI915XvMC->psc.bus_addr >> 2);}static void i915_mc_one_time_state_emit(void){    i915_emit_batch(one_time_load_state_imm1, one_time_load_state_imm1_size, 0);    i915_emit_batch(one_time_load_indirect, one_time_load_indirect_size, 0);}static void i915_mc_static_indirect_state_init(XvMCContext *context){    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;    struct i915_mc_static_indirect_state_buffer *buffer_info =	(struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;    memset(buffer_info, 0, sizeof(*buffer_info));    /* dest Y */    buffer_info->dest_y.dw0.type = CMD_3D;    buffer_info->dest_y.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;    buffer_info->dest_y.dw0.length = 1;    buffer_info->dest_y.dw1.aux_id = 0;    buffer_info->dest_y.dw1.buffer_id = BUFFERID_COLOR_BACK;    buffer_info->dest_y.dw1.fence_regs = 0;    /* disabled */ /* FIXME: tiled y for performance */    buffer_info->dest_y.dw1.tiled_surface = 0; /* linear */    buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;    /* dest U */    buffer_info->dest_u.dw0.type = CMD_3D;    buffer_info->dest_u.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;    buffer_info->dest_u.dw0.length = 1;    buffer_info->dest_u.dw1.aux_id = 0;    buffer_info->dest_u.dw1.buffer_id = BUFFERID_COLOR_AUX;    buffer_info->dest_u.dw1.fence_regs = 0;    buffer_info->dest_u.dw1.tiled_surface = 0;    buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;    /* dest V */    buffer_info->dest_v.dw0.type = CMD_3D;    buffer_info->dest_v.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;    buffer_info->dest_v.dw0.length = 1;    buffer_info->dest_v.dw1.aux_id = 1;    buffer_info->dest_v.dw1.buffer_id = BUFFERID_COLOR_AUX;    buffer_info->dest_v.dw1.fence_regs = 0;    buffer_info->dest_v.dw1.tiled_surface = 0;    buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;    buffer_info->dest_buf.dw0.type = CMD_3D;    buffer_info->dest_buf.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;    buffer_info->dest_buf.dw0.length = 0;    buffer_info->dest_buf.dw1.dest_v_bias = 8; /* 0.5 */    buffer_info->dest_buf.dw1.dest_h_bias = 8; /* 0.5 */    buffer_info->dest_buf.dw1.color_fmt = COLORBUFFER_8BIT;    buffer_info->dest_buf.dw1.v_ls = 0; /* fill later */    buffer_info->dest_buf.dw1.v_ls_offset = 0; /* fill later */    buffer_info->dest_buf_mpeg.dw0.type = CMD_3D;    buffer_info->dest_buf_mpeg.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES_MPEG;    buffer_info->dest_buf_mpeg.dw0.length = 1;    buffer_info->dest_buf_mpeg.dw1.decode_mode = MPEG_DECODE_MC;    buffer_info->dest_buf_mpeg.dw1.rcontrol = 0;               /* for MPEG-1/MPEG-2 */    buffer_info->dest_buf_mpeg.dw1.bidir_avrg_control = 0;     /* for MPEG-1/MPEG-2/MPEG-4 */    buffer_info->dest_buf_mpeg.dw1.abort_on_error = 1;    buffer_info->dest_buf_mpeg.dw1.intra8 = 0;         /* 16-bit formatted correction data */    buffer_info->dest_buf_mpeg.dw1.tff = 1; /* fill later */    buffer_info->dest_buf_mpeg.dw1.v_subsample_factor = MC_SUB_1V;    buffer_info->dest_buf_mpeg.dw1.h_subsample_factor = MC_SUB_1H;    buffer_info->corr.dw0.type = CMD_3D;    buffer_info->corr.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;    buffer_info->corr.dw0.length = 1;    buffer_info->corr.dw1.aux_id = 0;    buffer_info->corr.dw1.buffer_id = BUFFERID_MC_INTRA_CORR;    buffer_info->corr.dw1.aux_id = 0;    buffer_info->corr.dw1.fence_regs = 0;    buffer_info->corr.dw1.tiled_surface = 0;    buffer_info->corr.dw1.walk = 0;    buffer_info->corr.dw1.pitch = 0;    buffer_info->corr.dw2.base_address = (pI915XvMC->corrdata.offset >> 2);  /* starting DWORD address */}static void i915_mc_static_indirect_state_set(XvMCContext *context, XvMCSurface *dest,	unsigned int picture_structure, unsigned int flags, unsigned int picture_coding_type){    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;    i915XvMCSurface *pI915Surface = (i915XvMCSurface *)dest->privData;    struct i915_mc_static_indirect_state_buffer *buffer_info =	(struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;    unsigned int w = dest->width;    buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2);      /* in DWords */    buffer_info->dest_y.dw2.base_address = (YOFFSET(pI915Surface) >> 2);    /* starting DWORD address */    buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2);      /* in DWords */    buffer_info->dest_u.dw2.base_address = (UOFFSET(pI915Surface) >> 2);      /* starting DWORD address */    buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2);      /* in Dwords */    buffer_info->dest_v.dw2.base_address = (VOFFSET(pI915Surface) >> 2);      /* starting DWORD address */    if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {        ;    } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) {        buffer_info->dest_buf.dw1.v_ls = 1;    } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_BOTTOM_FIELD) {        buffer_info->dest_buf.dw1.v_ls = 1;        buffer_info->dest_buf.dw1.v_ls_offset = 1;    }    if (picture_structure & XVMC_FRAME_PICTURE) {        ;    } else if (picture_structure & XVMC_TOP_FIELD) {        if (flags & XVMC_SECOND_FIELD)            buffer_info->dest_buf_mpeg.dw1.tff = 0;        else            buffer_info->dest_buf_mpeg.dw1.tff = 1;    } else if (picture_structure & XVMC_BOTTOM_FIELD) {        if (flags & XVMC_SECOND_FIELD)            buffer_info->dest_buf_mpeg.dw1.tff = 1;        else            buffer_info->dest_buf_mpeg.dw1.tff = 0;    }    buffer_info->dest_buf_mpeg.dw1.picture_width = (dest->width >> 4);     /* in macroblocks */    buffer_info->dest_buf_mpeg.dw2.picture_coding_type = picture_coding_type;}static void i915_mc_map_state_init(XvMCContext *context){    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;    unsigned int w = context->width;    unsigned int h = context->height;    struct i915_mc_map_state *map_state;    map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;    memset(map_state, 0, sizeof(*map_state));    /* 3DSATE_MAP_STATE: Y */    map_state->y_map.dw0.type = CMD_3D;    map_state->y_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;    map_state->y_map.dw0.retain = 1;    map_state->y_map.dw0.length = 6;    map_state->y_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;    /* Y Forward (Past) */    map_state->y_forward.tm0.v_ls_offset = 0;    map_state->y_forward.tm0.v_ls = 0;    map_state->y_forward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->y_forward.tm1.tiled_surface = 0;    map_state->y_forward.tm1.utilize_fence_regs = 0;    map_state->y_forward.tm1.texel_fmt = 0;      /* 8bit */    map_state->y_forward.tm1.surface_fmt = 1;    /* 8bit */    map_state->y_forward.tm1.width = w - 1;    map_state->y_forward.tm1.height = h - 1;    map_state->y_forward.tm2.depth = 0;    map_state->y_forward.tm2.max_lod = 0;    map_state->y_forward.tm2.cube_face = 0;    /* Y Backward (Future) */    map_state->y_backward.tm0.v_ls_offset = 0;    map_state->y_backward.tm0.v_ls = 0;    map_state->y_backward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->y_backward.tm1.tiled_surface = 0;    map_state->y_backward.tm1.utilize_fence_regs = 0;    map_state->y_backward.tm1.texel_fmt = 0;      /* 8bit */    map_state->y_backward.tm1.surface_fmt = 1;    /* 8bit */    map_state->y_backward.tm1.width = w - 1;    map_state->y_backward.tm1.height = h - 1;    map_state->y_backward.tm2.depth = 0;    map_state->y_backward.tm2.max_lod = 0;    map_state->y_backward.tm2.cube_face = 0;    /* 3DSATE_MAP_STATE: U */    map_state->u_map.dw0.type = CMD_3D;    map_state->u_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;    map_state->u_map.dw0.retain = 1;    map_state->u_map.dw0.length = 6;    map_state->u_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;    /* U Forward */    map_state->u_forward.tm0.v_ls_offset = 0;    map_state->u_forward.tm0.v_ls = 0;    map_state->u_forward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->u_forward.tm1.tiled_surface = 0;    map_state->u_forward.tm1.utilize_fence_regs = 0;    map_state->u_forward.tm1.texel_fmt = 0;      /* 8bit */    map_state->u_forward.tm1.surface_fmt = 1;    /* 8bit */    map_state->u_forward.tm1.width = (w >> 1) - 1;    map_state->u_forward.tm1.height = (h >> 1) - 1;    map_state->u_forward.tm2.depth = 0;    map_state->u_forward.tm2.max_lod = 0;    map_state->u_forward.tm2.cube_face = 0;    /* U Backward */    map_state->u_backward.tm0.v_ls_offset = 0;    map_state->u_backward.tm0.v_ls = 0;    map_state->u_backward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->u_backward.tm1.tiled_surface = 0;    map_state->u_backward.tm1.utilize_fence_regs = 0;    map_state->u_backward.tm1.texel_fmt = 0;    map_state->u_backward.tm1.surface_fmt = 1;    map_state->u_backward.tm1.width = (w >> 1) - 1;    map_state->u_backward.tm1.height = (h >> 1) - 1;    map_state->u_backward.tm2.depth = 0;    map_state->u_backward.tm2.max_lod = 0;    map_state->u_backward.tm2.cube_face = 0;    /* 3DSATE_MAP_STATE: V */    map_state->v_map.dw0.type = CMD_3D;    map_state->v_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;    map_state->v_map.dw0.retain = 1;    map_state->v_map.dw0.length = 6;    map_state->v_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;    /* V Forward */    map_state->v_forward.tm0.v_ls_offset = 0;    map_state->v_forward.tm0.v_ls = 0;    map_state->v_forward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->v_forward.tm1.tiled_surface = 0;    map_state->v_forward.tm1.utilize_fence_regs = 0;    map_state->v_forward.tm1.texel_fmt = 0;    map_state->v_forward.tm1.surface_fmt = 1;    map_state->v_forward.tm1.width = (w >> 1) - 1;    map_state->v_forward.tm1.height = (h >> 1) - 1;    map_state->v_forward.tm2.depth = 0;    map_state->v_forward.tm2.max_lod = 0;    map_state->v_forward.tm2.cube_face = 0;    /* V Backward */    map_state->v_backward.tm0.v_ls_offset = 0;    map_state->v_backward.tm0.v_ls = 0;    map_state->v_backward.tm1.tile_walk = TILEWALK_XMAJOR;    map_state->v_backward.tm1.tiled_surface = 0;    map_state->v_backward.tm1.utilize_fence_regs = 0;    map_state->v_backward.tm1.texel_fmt = 0;    map_state->v_backward.tm1.surface_fmt = 1;    map_state->v_backward.tm1.width = (w >> 1) - 1;    map_state->v_backward.tm1.height = (h >> 1) - 1;    map_state->v_backward.tm2.depth = 0;    map_state->v_backward.tm2.max_lod = 0;    map_state->v_backward.tm2.cube_face = 0;}static void i915_mc_map_state_set(XvMCContext *context,	i915XvMCSurface *privPast,	i915XvMCSurface *privFuture){    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;    struct i915_mc_map_state *map_state;    map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;    map_state->y_forward.tm0.base_address = (YOFFSET(privPast) >> 2);    map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;       /* in DWords - 1 */    map_state->y_backward.tm0.base_address = (YOFFSET(privFuture) >> 2);    map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;    map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);    map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;       /* in DWords - 1 */    map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);    map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;    map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);    map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;       /* in DWords - 1 */    map_state->v_backward.tm0.base_address = (VOFFSET(privFuture) >> 2);    map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;}static void i915_flush(int map, int render){    struct i915_mi_flush mi_flush;    memset(&mi_flush, 0, sizeof(mi_flush));    mi_flush.dw0.type = CMD_MI;    mi_flush.dw0.opcode = OPC_MI_FLUSH;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -