1fa225cbcSrjs/*
2fa225cbcSrjs * Copyright © 2006 Intel Corporation
3fa225cbcSrjs *
4fa225cbcSrjs * Permission is hereby granted, free of charge, to any person obtaining a
5fa225cbcSrjs * copy of this software and associated documentation files (the "Software"),
6fa225cbcSrjs * to deal in the Software without restriction, including without limitation
7fa225cbcSrjs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fa225cbcSrjs * and/or sell copies of the Software, and to permit persons to whom the
9fa225cbcSrjs * Software is furnished to do so, subject to the following conditions:
10fa225cbcSrjs *
11fa225cbcSrjs * The above copyright notice and this permission notice (including the next
12fa225cbcSrjs * paragraph) shall be included in all copies or substantial portions of the
13fa225cbcSrjs * Software.
14fa225cbcSrjs *
15fa225cbcSrjs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16fa225cbcSrjs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17fa225cbcSrjs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18fa225cbcSrjs * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19fa225cbcSrjs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20fa225cbcSrjs * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21fa225cbcSrjs * SOFTWARE.
22fa225cbcSrjs *
23fa225cbcSrjs * Authors:
24fa225cbcSrjs *    Xiang Haihao <haihao.xiang@intel.com>
25fa225cbcSrjs *
26fa225cbcSrjs */
27fa225cbcSrjs
28fa225cbcSrjs#include <sys/ioctl.h>
29fa225cbcSrjs
30fa225cbcSrjs#include "i915_xvmc.h"
31fa225cbcSrjs#include "i915_structs.h"
32fa225cbcSrjs#include "i915_program.h"
33fa225cbcSrjs
34fa225cbcSrjs#define YOFFSET(surface)        (surface->srf.offset)
35fa225cbcSrjs#define UOFFSET(surface)        (surface->srf.offset + \
36fa225cbcSrjs                                 SIZE_Y420(surface->width, surface->height) + \
37fa225cbcSrjs                                 SIZE_UV420(surface->width, surface->height))
38fa225cbcSrjs#define VOFFSET(surface)        (surface->srf.offset + \
39fa225cbcSrjs                                 SIZE_Y420(surface->width, surface->height))
40fa225cbcSrjs
41fa225cbcSrjstypedef union {
42fa225cbcSrjs    int16_t component[2];
43fa225cbcSrjs    int32_t v;
44fa225cbcSrjs} vector_t;
45fa225cbcSrjs
46fa225cbcSrjs#if 0
47fa225cbcSrjsstatic int findOverlap(unsigned int width, unsigned int height,
48fa225cbcSrjs                       short *dstX, short *dstY,
49fa225cbcSrjs                       short *srcX, short *srcY,
50fa225cbcSrjs                       unsigned short *areaW, unsigned short *areaH)
51fa225cbcSrjs{
52fa225cbcSrjs    int w, h;
53fa225cbcSrjs    unsigned int mWidth, mHeight;
54fa225cbcSrjs
55fa225cbcSrjs    w = *areaW;
56fa225cbcSrjs    h = *areaH;
57fa225cbcSrjs
58fa225cbcSrjs    if ((*dstX >= width) || (*dstY >= height))
59fa225cbcSrjs        return 1;
60fa225cbcSrjs
61fa225cbcSrjs    if (*dstX < 0) {
62fa225cbcSrjs        w += *dstX;
63fa225cbcSrjs        *srcX -= *dstX;
64fa225cbcSrjs        *dstX = 0;
65fa225cbcSrjs    }
66fa225cbcSrjs
67fa225cbcSrjs    if (*dstY < 0) {
68fa225cbcSrjs        h += *dstY;
69fa225cbcSrjs        *srcY -= *dstY;
70fa225cbcSrjs        *dstY = 0;
71fa225cbcSrjs    }
72fa225cbcSrjs
73fa225cbcSrjs    if ((w <= 0) || ((h <= 0)))
74fa225cbcSrjs        return 1;
75fa225cbcSrjs
76fa225cbcSrjs    mWidth = width - *dstX;
77fa225cbcSrjs    mHeight = height - *dstY;
78fa225cbcSrjs    *areaW = (w <= mWidth) ? w : mWidth;
79fa225cbcSrjs    *areaH = (h <= mHeight) ? h : mHeight;
80fa225cbcSrjs    return 0;
81fa225cbcSrjs}
82fa225cbcSrjs#endif
83fa225cbcSrjs
84fa225cbcSrjsstatic void i915_inst_arith(unsigned int *inst,
85fa225cbcSrjs                            unsigned int op,
86fa225cbcSrjs                            unsigned int dest,
87fa225cbcSrjs                            unsigned int mask,
88fa225cbcSrjs                            unsigned int saturate,
89fa225cbcSrjs                            unsigned int src0, unsigned int src1, unsigned int src2)
90fa225cbcSrjs{
91fa225cbcSrjs    dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
92fa225cbcSrjs    *inst = (op | A0_DEST(dest) | mask | saturate | A0_SRC0(src0));
93fa225cbcSrjs    inst++;
94fa225cbcSrjs    *inst = (A1_SRC0(src0) | A1_SRC1(src1));
95fa225cbcSrjs    inst++;
96fa225cbcSrjs    *inst = (A2_SRC1(src1) | A2_SRC2(src2));
97fa225cbcSrjs}
98fa225cbcSrjs
99fa225cbcSrjsstatic void i915_inst_decl(unsigned int *inst,
100fa225cbcSrjs                           unsigned int type,
101fa225cbcSrjs                           unsigned int nr,
102fa225cbcSrjs                           unsigned int d0_flags)
103fa225cbcSrjs{
104fa225cbcSrjs    unsigned int reg = UREG(type, nr);
105fa225cbcSrjs
106fa225cbcSrjs    *inst = (D0_DCL | D0_DEST(reg) | d0_flags);
107fa225cbcSrjs    inst++;
108fa225cbcSrjs    *inst = D1_MBZ;
109fa225cbcSrjs    inst++;
110fa225cbcSrjs    *inst = D2_MBZ;
111fa225cbcSrjs}
112fa225cbcSrjs
113fa225cbcSrjsstatic void i915_inst_texld(unsigned int *inst,
114fa225cbcSrjs                              unsigned int op,
115fa225cbcSrjs                              unsigned int dest,
116fa225cbcSrjs                              unsigned int coord,
117fa225cbcSrjs                              unsigned int sampler)
118fa225cbcSrjs{
119fa225cbcSrjs   dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
120fa225cbcSrjs   *inst = (op | T0_DEST(dest) | T0_SAMPLER(sampler));
121fa225cbcSrjs   inst++;
122fa225cbcSrjs   *inst = T1_ADDRESS_REG(coord);
123fa225cbcSrjs   inst++;
124fa225cbcSrjs   *inst = T2_MBZ;
125fa225cbcSrjs}
126fa225cbcSrjs
127fa225cbcSrjsstatic void i915_emit_batch(void *data, int size, int flag)
128fa225cbcSrjs{
129fa225cbcSrjs    intelBatchbufferData(data, size, flag);
130fa225cbcSrjs}
131fa225cbcSrjs
132fa225cbcSrjs/* one time context initialization buffer */
133fa225cbcSrjsstatic uint32_t *one_time_load_state_imm1;
134fa225cbcSrjsstatic uint32_t *one_time_load_indirect;
135fa225cbcSrjsstatic int one_time_load_state_imm1_size, one_time_load_indirect_size;
136fa225cbcSrjs
137fa225cbcSrjs/* load indirect buffer for mc rendering */
138fa225cbcSrjsstatic uint32_t *mc_render_load_indirect;
139fa225cbcSrjsstatic int mc_render_load_indirect_size;
140fa225cbcSrjs
141fa225cbcSrjsstatic void i915_mc_one_time_context_init(XvMCContext *context)
142fa225cbcSrjs{
143fa225cbcSrjs    unsigned int dest, src0, src1, src2;
144fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
145fa225cbcSrjs    int i;
146fa225cbcSrjs    struct i915_3dstate_sampler_state *sampler_state;
147fa225cbcSrjs    struct i915_3dstate_pixel_shader_program *pixel_shader_program;
148fa225cbcSrjs    struct i915_3dstate_pixel_shader_constants *pixel_shader_constants;
149fa225cbcSrjs
150fa225cbcSrjs    /* sampler static state */
151fa225cbcSrjs    sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
152fa225cbcSrjs    /* pixel shader static state */
153fa225cbcSrjs    pixel_shader_program = (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
154fa225cbcSrjs    /* pixel shader contant static state */
155fa225cbcSrjs    pixel_shader_constants = (struct i915_3dstate_pixel_shader_constants *)pI915XvMC->psc.map;
156fa225cbcSrjs
157fa225cbcSrjs    memset(sampler_state, 0, sizeof(*sampler_state));
158fa225cbcSrjs    sampler_state->dw0.type = CMD_3D;
159fa225cbcSrjs    sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
160fa225cbcSrjs    sampler_state->dw0.length = 6;
161fa225cbcSrjs    sampler_state->dw1.sampler_masker = SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1;
162fa225cbcSrjs
163fa225cbcSrjs    sampler_state->sampler0.ts0.reverse_gamma = 0;
164fa225cbcSrjs    sampler_state->sampler0.ts0.planar2packet = 0;
165fa225cbcSrjs    sampler_state->sampler0.ts0.color_conversion = 0;
166fa225cbcSrjs    sampler_state->sampler0.ts0.chromakey_index = 0;
167fa225cbcSrjs    sampler_state->sampler0.ts0.base_level = 0;
168fa225cbcSrjs    sampler_state->sampler0.ts0.mip_filter = MIPFILTER_NONE;        /* NONE */
169fa225cbcSrjs    sampler_state->sampler0.ts0.mag_filter = MAPFILTER_LINEAR;      /* LINEAR */
170fa225cbcSrjs    sampler_state->sampler0.ts0.min_filter = MAPFILTER_LINEAR;      /* LINEAR */
171fa225cbcSrjs    sampler_state->sampler0.ts0.lod_bias = 0;       /* 0.0 */
172fa225cbcSrjs    sampler_state->sampler0.ts0.shadow_enable = 0;
173fa225cbcSrjs    sampler_state->sampler0.ts0.max_anisotropy = ANISORATIO_2;
174fa225cbcSrjs    sampler_state->sampler0.ts0.shadow_function = PREFILTEROP_ALWAYS;
175fa225cbcSrjs    sampler_state->sampler0.ts1.min_lod = 0;        /* 0.0 Maximum Mip Level */
176fa225cbcSrjs    sampler_state->sampler0.ts1.kill_pixel = 0;
177fa225cbcSrjs    sampler_state->sampler0.ts1.keyed_texture_filter = 0;
178fa225cbcSrjs    sampler_state->sampler0.ts1.chromakey_enable = 0;
179fa225cbcSrjs    sampler_state->sampler0.ts1.tcx_control = TEXCOORDMODE_CLAMP;
180fa225cbcSrjs    sampler_state->sampler0.ts1.tcy_control = TEXCOORDMODE_CLAMP;
181fa225cbcSrjs    sampler_state->sampler0.ts1.tcz_control = TEXCOORDMODE_CLAMP;
182fa225cbcSrjs    sampler_state->sampler0.ts1.normalized_coor = 0;
183fa225cbcSrjs    sampler_state->sampler0.ts1.map_index = 0;
184fa225cbcSrjs    sampler_state->sampler0.ts1.east_deinterlacer = 0;
185fa225cbcSrjs    sampler_state->sampler0.ts2.default_color = 0;
186fa225cbcSrjs
187fa225cbcSrjs    sampler_state->sampler1.ts0.reverse_gamma = 0;
188fa225cbcSrjs    sampler_state->sampler1.ts0.planar2packet = 0;
189fa225cbcSrjs    sampler_state->sampler1.ts0.color_conversion = 0;
190fa225cbcSrjs    sampler_state->sampler1.ts0.chromakey_index = 0;
191fa225cbcSrjs    sampler_state->sampler1.ts0.base_level = 0;
192fa225cbcSrjs    sampler_state->sampler1.ts0.mip_filter = MIPFILTER_NONE;        /* NONE */
193fa225cbcSrjs    sampler_state->sampler1.ts0.mag_filter = MAPFILTER_LINEAR;      /* LINEAR */
194fa225cbcSrjs    sampler_state->sampler1.ts0.min_filter = MAPFILTER_LINEAR;      /* LINEAR */
195fa225cbcSrjs    sampler_state->sampler1.ts0.lod_bias = 0;       /* 0.0 */
196fa225cbcSrjs    sampler_state->sampler1.ts0.shadow_enable = 0;
197fa225cbcSrjs    sampler_state->sampler1.ts0.max_anisotropy = ANISORATIO_2;
198fa225cbcSrjs    sampler_state->sampler1.ts0.shadow_function = PREFILTEROP_ALWAYS;
199fa225cbcSrjs    sampler_state->sampler1.ts1.min_lod = 0;        /* 0.0 Maximum Mip Level */
200fa225cbcSrjs    sampler_state->sampler1.ts1.kill_pixel = 0;
201fa225cbcSrjs    sampler_state->sampler1.ts1.keyed_texture_filter = 0;
202fa225cbcSrjs    sampler_state->sampler1.ts1.chromakey_enable = 0;
203fa225cbcSrjs    sampler_state->sampler1.ts1.tcx_control = TEXCOORDMODE_CLAMP;
204fa225cbcSrjs    sampler_state->sampler1.ts1.tcy_control = TEXCOORDMODE_CLAMP;
205fa225cbcSrjs    sampler_state->sampler1.ts1.tcz_control = TEXCOORDMODE_CLAMP;
206fa225cbcSrjs    sampler_state->sampler1.ts1.normalized_coor = 0;
207fa225cbcSrjs    sampler_state->sampler1.ts1.map_index = 1;
208fa225cbcSrjs    sampler_state->sampler1.ts1.east_deinterlacer = 0;
209fa225cbcSrjs    sampler_state->sampler1.ts2.default_color = 0;
210fa225cbcSrjs
211fa225cbcSrjs    memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
212fa225cbcSrjs    pixel_shader_program->shader0.type = CMD_3D;
213fa225cbcSrjs    pixel_shader_program->shader0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
214fa225cbcSrjs    pixel_shader_program->shader0.retain = 1;
215fa225cbcSrjs    pixel_shader_program->shader0.length = 2; /* 1 inst */
216fa225cbcSrjs    i = 0;
217fa225cbcSrjs
218fa225cbcSrjs    dest = UREG(REG_TYPE_OC, 0);
219fa225cbcSrjs    src0 = UREG(REG_TYPE_CONST, 0);
220fa225cbcSrjs    src1 = 0;
221fa225cbcSrjs    src2 = 0;
222fa225cbcSrjs    i915_inst_arith(&pixel_shader_program->inst0[i], A0_MOV,
223fa225cbcSrjs	    dest, A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1, src2);
224fa225cbcSrjs
225fa225cbcSrjs    pixel_shader_program->shader1.type = CMD_3D;
226fa225cbcSrjs    pixel_shader_program->shader1.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
227fa225cbcSrjs    pixel_shader_program->shader1.retain = 1;
228fa225cbcSrjs    pixel_shader_program->shader1.length = 14; /* 5 inst */
229fa225cbcSrjs    i = 0;
230fa225cbcSrjs    /* dcl t0.xy */
231fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
232fa225cbcSrjs    i+=3;
233fa225cbcSrjs    /* dcl t1.xy */
234fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
235fa225cbcSrjs    /* dcl_2D s0 */
236fa225cbcSrjs    i += 3;
237fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
238fa225cbcSrjs    /* texld r0, t0, s0 */
239fa225cbcSrjs    i += 3;
240fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
241fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 0); /* COORD */
242fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
243fa225cbcSrjs    i915_inst_texld(&pixel_shader_program->inst1[i], T0_TEXLD, dest, src0, src1);
244fa225cbcSrjs    /* mov oC, r0 */
245fa225cbcSrjs    i += 3;
246fa225cbcSrjs    dest = UREG(REG_TYPE_OC, 0);
247fa225cbcSrjs    src0 = UREG(REG_TYPE_R, 0);
248fa225cbcSrjs    src1 = src2 = 0;
249fa225cbcSrjs    i915_inst_arith(&pixel_shader_program->inst1[i], A0_MOV, dest, A0_DEST_CHANNEL_ALL,
250fa225cbcSrjs                    A0_DEST_SATURATE, src0, src1, src2);
251fa225cbcSrjs
252fa225cbcSrjs
253fa225cbcSrjs    pixel_shader_program->shader2.type = CMD_3D;
254fa225cbcSrjs    pixel_shader_program->shader2.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
255fa225cbcSrjs    pixel_shader_program->shader2.retain = 1;
256fa225cbcSrjs    pixel_shader_program->shader2.length = 14; /* 5 inst */
257fa225cbcSrjs    i = 0;
258fa225cbcSrjs    /* dcl t2.xy */
259fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX2, D0_CHANNEL_XY);
260fa225cbcSrjs    /* dcl t3.xy */
261fa225cbcSrjs    i += 3;
262fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX3, D0_CHANNEL_XY);
263fa225cbcSrjs    /* dcl_2D s1 */
264fa225cbcSrjs    i += 3;
265fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
266fa225cbcSrjs    /* texld r0, t2, s1 */
267fa225cbcSrjs    i += 3;
268fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
269fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 2); /* COORD */
270fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
271fa225cbcSrjs    i915_inst_texld(&pixel_shader_program->inst2[i], T0_TEXLD, dest, src0, src1);
272fa225cbcSrjs    /* mov oC, r0 */
273fa225cbcSrjs    i += 3;
274fa225cbcSrjs    dest = UREG(REG_TYPE_OC, 0);
275fa225cbcSrjs    src0 = UREG(REG_TYPE_R, 0);
276fa225cbcSrjs    src1 = src2 = 0;
277fa225cbcSrjs    i915_inst_arith(&pixel_shader_program->inst2[i], A0_MOV, dest, A0_DEST_CHANNEL_ALL,
278fa225cbcSrjs                    A0_DEST_SATURATE, src0, src1, src2);
279fa225cbcSrjs
280fa225cbcSrjs    /* Shader 3 */
281fa225cbcSrjs    pixel_shader_program->shader3.type = CMD_3D;
282fa225cbcSrjs    pixel_shader_program->shader3.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
283fa225cbcSrjs    pixel_shader_program->shader3.retain = 1;
284fa225cbcSrjs    pixel_shader_program->shader3.length = 29; /* 10 inst */
285fa225cbcSrjs    i = 0;
286fa225cbcSrjs    /* dcl t0.xy */
287fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
288fa225cbcSrjs    /* dcl t1.xy */
289fa225cbcSrjs    i += 3;
290fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
291fa225cbcSrjs    /* dcl t2.xy */
292fa225cbcSrjs    i += 3;
293fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX2, D0_CHANNEL_XY);
294fa225cbcSrjs    /* dcl t3.xy */
295fa225cbcSrjs    i += 3;
296fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX3, D0_CHANNEL_XY);
297fa225cbcSrjs    /* dcl_2D s0 */
298fa225cbcSrjs    i += 3;
299fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
300fa225cbcSrjs    /* dcl_2D s1 */
301fa225cbcSrjs    i += 3;
302fa225cbcSrjs    i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
303fa225cbcSrjs    /* texld r0, t0, s0 */
304fa225cbcSrjs    i += 3;
305fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
306fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 0); /* COORD */
307fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
308fa225cbcSrjs    i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0, src1);
309fa225cbcSrjs    /* texld r1, t2, s1 */
310fa225cbcSrjs    i += 3;
311fa225cbcSrjs    dest = UREG(REG_TYPE_R, 1);
312fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 2); /* COORD */
313fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
314fa225cbcSrjs    i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0, src1);
315fa225cbcSrjs    /* add r0, r0, r1 */
316fa225cbcSrjs    i += 3;
317fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
318fa225cbcSrjs    src0 = UREG(REG_TYPE_R, 0);
319fa225cbcSrjs    src1 = UREG(REG_TYPE_R, 1);
320fa225cbcSrjs    src2 = 0;
321fa225cbcSrjs    i915_inst_arith(&pixel_shader_program->inst3[i], A0_ADD, dest, A0_DEST_CHANNEL_ALL,
322fa225cbcSrjs                    0 /* A0_DEST_SATURATE */, src0, src1, src2);
323fa225cbcSrjs    /* mul oC, r0, c0 */
324fa225cbcSrjs    i += 3;
325fa225cbcSrjs    dest = UREG(REG_TYPE_OC, 0);
326fa225cbcSrjs    src0 = UREG(REG_TYPE_R, 0);
327fa225cbcSrjs    src1 = UREG(REG_TYPE_CONST, 0);
328fa225cbcSrjs    src2 = 0;
329fa225cbcSrjs    i915_inst_arith(&pixel_shader_program->inst3[i], A0_MUL, dest, A0_DEST_CHANNEL_ALL,
330fa225cbcSrjs                    A0_DEST_SATURATE, src0, src1, src2);
331fa225cbcSrjs
332fa225cbcSrjs    memset(pixel_shader_constants, 0, sizeof(*pixel_shader_constants));
333fa225cbcSrjs    pixel_shader_constants->dw0.type = CMD_3D;
334fa225cbcSrjs    pixel_shader_constants->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_CONSTANTS;
335fa225cbcSrjs    pixel_shader_constants->dw0.length = 4;
336fa225cbcSrjs    pixel_shader_constants->dw1.reg_mask = REG_CR0;
337fa225cbcSrjs    pixel_shader_constants->value.x = 0.5;
338fa225cbcSrjs    pixel_shader_constants->value.y = 0.5;
339fa225cbcSrjs    pixel_shader_constants->value.z = 0.5;
340fa225cbcSrjs    pixel_shader_constants->value.w = 0.5;
341fa225cbcSrjs
342fa225cbcSrjs}
343fa225cbcSrjs
344fa225cbcSrjsstatic void i915_mc_one_time_state_init(XvMCContext *context)
345fa225cbcSrjs{
346fa225cbcSrjs    struct s3_dword *s3 = NULL;
347fa225cbcSrjs    struct s6_dword *s6 = NULL;
348fa225cbcSrjs    dis_state *dis = NULL;
349fa225cbcSrjs    ssb_state *ssb = NULL;
350fa225cbcSrjs    psp_state *psp = NULL;
351fa225cbcSrjs    psc_state *psc = NULL;
352fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
353fa225cbcSrjs    struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1;
354fa225cbcSrjs    struct i915_3dstate_load_indirect *load_indirect;
355fa225cbcSrjs    int mem_select;
356fa225cbcSrjs
357fa225cbcSrjs    /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
358fa225cbcSrjs    one_time_load_state_imm1_size = sizeof(*load_state_immediate_1) + sizeof(*s3) + sizeof(*s6);
359fa225cbcSrjs    one_time_load_state_imm1 = calloc(1, one_time_load_state_imm1_size);
360fa225cbcSrjs    load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)one_time_load_state_imm1;
361fa225cbcSrjs    load_state_immediate_1->dw0.type = CMD_3D;
362fa225cbcSrjs    load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
363fa225cbcSrjs    load_state_immediate_1->dw0.load_s3 = 1;
364fa225cbcSrjs    load_state_immediate_1->dw0.load_s6 = 1;
365fa225cbcSrjs    load_state_immediate_1->dw0.length = (one_time_load_state_imm1_size >> 2) - 2;
366fa225cbcSrjs
367fa225cbcSrjs    s3 = (struct s3_dword *)(++load_state_immediate_1);
368fa225cbcSrjs    s3->set0_pcd = 1;
369fa225cbcSrjs    s3->set1_pcd = 1;
370fa225cbcSrjs    s3->set2_pcd = 1;
371fa225cbcSrjs    s3->set3_pcd = 1;
372fa225cbcSrjs    s3->set4_pcd = 1;
373fa225cbcSrjs    s3->set5_pcd = 1;
374fa225cbcSrjs    s3->set6_pcd = 1;
375fa225cbcSrjs    s3->set7_pcd = 1;
376fa225cbcSrjs
377fa225cbcSrjs    s6 = (struct s6_dword *)(++s3);
378fa225cbcSrjs    s6->alpha_test_enable = 0;
379fa225cbcSrjs    s6->alpha_test_function = 0;
380fa225cbcSrjs    s6->alpha_reference_value = 0;
381fa225cbcSrjs    s6->depth_test_enable = 1;
382fa225cbcSrjs    s6->depth_test_function = 0;
383fa225cbcSrjs    s6->color_buffer_blend = 0;
384fa225cbcSrjs    s6->color_blend_function = 0;
385fa225cbcSrjs    s6->src_blend_factor = 1;
386fa225cbcSrjs    s6->dest_blend_factor = 1;
387fa225cbcSrjs    s6->depth_buffer_write = 0;
388fa225cbcSrjs    s6->color_buffer_write = 1;
389fa225cbcSrjs    s6->triangle_pv = 0;
390fa225cbcSrjs
391fa225cbcSrjs    /* 3DSTATE_LOAD_INDIRECT */
392fa225cbcSrjs    one_time_load_indirect_size = sizeof(*load_indirect) + sizeof(*dis) + sizeof(*ssb) + sizeof(*psp) + sizeof(*psc);
393fa225cbcSrjs    one_time_load_indirect = calloc(1, one_time_load_indirect_size);
394fa225cbcSrjs    load_indirect = (struct i915_3dstate_load_indirect *)one_time_load_indirect;
395fa225cbcSrjs    load_indirect->dw0.type = CMD_3D;
396fa225cbcSrjs    load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
397fa225cbcSrjs    load_indirect->dw0.block_mask = BLOCK_DIS | BLOCK_SSB | BLOCK_PSP | BLOCK_PSC;
398fa225cbcSrjs    load_indirect->dw0.length = (one_time_load_indirect_size >> 2) - 2;
399fa225cbcSrjs
400fa225cbcSrjs    if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
401fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I915_GM)
402fa225cbcSrjs	mem_select = 0; /* use physical address */
403fa225cbcSrjs    else
404fa225cbcSrjs	mem_select = 1; /* use gfx address */
405fa225cbcSrjs
406fa225cbcSrjs    load_indirect->dw0.mem_select = mem_select;
407fa225cbcSrjs
408fa225cbcSrjs
409fa225cbcSrjs    /* Dynamic indirect state buffer */
410fa225cbcSrjs    dis = (dis_state *)(++load_indirect);
411fa225cbcSrjs    dis->dw0.valid = 0;
412fa225cbcSrjs    dis->dw0.reset = 0;
413fa225cbcSrjs    dis->dw0.buffer_address = 0;
414fa225cbcSrjs
415fa225cbcSrjs    /* Sample state buffer */
416fa225cbcSrjs    ssb = (ssb_state *)(++dis);
417fa225cbcSrjs    ssb->dw0.valid = 1;
418fa225cbcSrjs    ssb->dw0.force = 1;
419fa225cbcSrjs    ssb->dw1.length = 7; /* 8 - 1 */
420fa225cbcSrjs
421fa225cbcSrjs    if (mem_select)
422fa225cbcSrjs        ssb->dw0.buffer_address = (pI915XvMC->ssb.offset >> 2);
423fa225cbcSrjs    else
424fa225cbcSrjs	ssb->dw0.buffer_address = (pI915XvMC->ssb.bus_addr >> 2);
425fa225cbcSrjs
426fa225cbcSrjs    /* Pixel shader program buffer */
427fa225cbcSrjs    psp = (psp_state *)(++ssb);
428fa225cbcSrjs    psp->dw0.valid = 1;
429fa225cbcSrjs    psp->dw0.force = 1;
430fa225cbcSrjs    psp->dw1.length = 66; /* 4 + 16 + 16 + 31 - 1 */
431fa225cbcSrjs
432fa225cbcSrjs    if (mem_select)
433fa225cbcSrjs	psp->dw0.buffer_address = (pI915XvMC->psp.offset >> 2);
434fa225cbcSrjs    else
435fa225cbcSrjs	psp->dw0.buffer_address = (pI915XvMC->psp.bus_addr >> 2);
436fa225cbcSrjs
437fa225cbcSrjs    /* Pixel shader constant buffer */
438fa225cbcSrjs    psc = (psc_state *)(++psp);
439fa225cbcSrjs    psc->dw0.valid = 1;
440fa225cbcSrjs    psc->dw0.force = 1;
441fa225cbcSrjs    psc->dw1.length = 5; /* 6 - 1 */
442fa225cbcSrjs
443fa225cbcSrjs    if (mem_select)
444fa225cbcSrjs        psc->dw0.buffer_address = (pI915XvMC->psc.offset >> 2);
445fa225cbcSrjs    else
446fa225cbcSrjs        psc->dw0.buffer_address = (pI915XvMC->psc.bus_addr >> 2);
447fa225cbcSrjs}
448fa225cbcSrjs
449fa225cbcSrjsstatic void i915_mc_one_time_state_emit(void)
450fa225cbcSrjs{
451fa225cbcSrjs    i915_emit_batch(one_time_load_state_imm1, one_time_load_state_imm1_size, 0);
452fa225cbcSrjs    i915_emit_batch(one_time_load_indirect, one_time_load_indirect_size, 0);
453fa225cbcSrjs}
454fa225cbcSrjs
455fa225cbcSrjsstatic void i915_mc_static_indirect_state_init(XvMCContext *context)
456fa225cbcSrjs{
457fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
458fa225cbcSrjs    struct i915_mc_static_indirect_state_buffer *buffer_info =
459fa225cbcSrjs	(struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
460fa225cbcSrjs
461fa225cbcSrjs    memset(buffer_info, 0, sizeof(*buffer_info));
462fa225cbcSrjs    /* dest Y */
463fa225cbcSrjs    buffer_info->dest_y.dw0.type = CMD_3D;
464fa225cbcSrjs    buffer_info->dest_y.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
465fa225cbcSrjs    buffer_info->dest_y.dw0.length = 1;
466fa225cbcSrjs    buffer_info->dest_y.dw1.aux_id = 0;
467fa225cbcSrjs    buffer_info->dest_y.dw1.buffer_id = BUFFERID_COLOR_BACK;
468fa225cbcSrjs    buffer_info->dest_y.dw1.fence_regs = 0;    /* disabled */ /* FIXME: tiled y for performance */
469fa225cbcSrjs    buffer_info->dest_y.dw1.tiled_surface = 0; /* linear */
470fa225cbcSrjs    buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
471fa225cbcSrjs
472fa225cbcSrjs    /* dest U */
473fa225cbcSrjs    buffer_info->dest_u.dw0.type = CMD_3D;
474fa225cbcSrjs    buffer_info->dest_u.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
475fa225cbcSrjs    buffer_info->dest_u.dw0.length = 1;
476fa225cbcSrjs    buffer_info->dest_u.dw1.aux_id = 0;
477fa225cbcSrjs    buffer_info->dest_u.dw1.buffer_id = BUFFERID_COLOR_AUX;
478fa225cbcSrjs    buffer_info->dest_u.dw1.fence_regs = 0;
479fa225cbcSrjs    buffer_info->dest_u.dw1.tiled_surface = 0;
480fa225cbcSrjs    buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
481fa225cbcSrjs
482fa225cbcSrjs    /* dest V */
483fa225cbcSrjs    buffer_info->dest_v.dw0.type = CMD_3D;
484fa225cbcSrjs    buffer_info->dest_v.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
485fa225cbcSrjs    buffer_info->dest_v.dw0.length = 1;
486fa225cbcSrjs    buffer_info->dest_v.dw1.aux_id = 1;
487fa225cbcSrjs    buffer_info->dest_v.dw1.buffer_id = BUFFERID_COLOR_AUX;
488fa225cbcSrjs    buffer_info->dest_v.dw1.fence_regs = 0;
489fa225cbcSrjs    buffer_info->dest_v.dw1.tiled_surface = 0;
490fa225cbcSrjs    buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
491fa225cbcSrjs
492fa225cbcSrjs    buffer_info->dest_buf.dw0.type = CMD_3D;
493fa225cbcSrjs    buffer_info->dest_buf.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
494fa225cbcSrjs    buffer_info->dest_buf.dw0.length = 0;
495fa225cbcSrjs    buffer_info->dest_buf.dw1.dest_v_bias = 8; /* 0.5 */
496fa225cbcSrjs    buffer_info->dest_buf.dw1.dest_h_bias = 8; /* 0.5 */
497fa225cbcSrjs    buffer_info->dest_buf.dw1.color_fmt = COLORBUFFER_8BIT;
498fa225cbcSrjs    buffer_info->dest_buf.dw1.v_ls = 0; /* fill later */
499fa225cbcSrjs    buffer_info->dest_buf.dw1.v_ls_offset = 0; /* fill later */
500fa225cbcSrjs
501fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw0.type = CMD_3D;
502fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES_MPEG;
503fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw0.length = 1;
504fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.decode_mode = MPEG_DECODE_MC;
505fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.rcontrol = 0;               /* for MPEG-1/MPEG-2 */
506fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.bidir_avrg_control = 0;     /* for MPEG-1/MPEG-2/MPEG-4 */
507fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.abort_on_error = 1;
508fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.intra8 = 0;         /* 16-bit formatted correction data */
509fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.tff = 1; /* fill later */
510fa225cbcSrjs
511fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.v_subsample_factor = MC_SUB_1V;
512fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.h_subsample_factor = MC_SUB_1H;
513fa225cbcSrjs
514fa225cbcSrjs    buffer_info->corr.dw0.type = CMD_3D;
515fa225cbcSrjs    buffer_info->corr.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
516fa225cbcSrjs    buffer_info->corr.dw0.length = 1;
517fa225cbcSrjs    buffer_info->corr.dw1.aux_id = 0;
518fa225cbcSrjs    buffer_info->corr.dw1.buffer_id = BUFFERID_MC_INTRA_CORR;
519fa225cbcSrjs    buffer_info->corr.dw1.aux_id = 0;
520fa225cbcSrjs    buffer_info->corr.dw1.fence_regs = 0;
521fa225cbcSrjs    buffer_info->corr.dw1.tiled_surface = 0;
522fa225cbcSrjs    buffer_info->corr.dw1.walk = 0;
523fa225cbcSrjs    buffer_info->corr.dw1.pitch = 0;
524fa225cbcSrjs    buffer_info->corr.dw2.base_address = (pI915XvMC->corrdata.offset >> 2);  /* starting DWORD address */
525fa225cbcSrjs}
526fa225cbcSrjs
527fa225cbcSrjsstatic void i915_mc_static_indirect_state_set(XvMCContext *context, XvMCSurface *dest,
528fa225cbcSrjs	unsigned int picture_structure, unsigned int flags, unsigned int picture_coding_type)
529fa225cbcSrjs{
530fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
531fa225cbcSrjs    i915XvMCSurface *pI915Surface = (i915XvMCSurface *)dest->privData;
532fa225cbcSrjs    struct i915_mc_static_indirect_state_buffer *buffer_info =
533fa225cbcSrjs	(struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
534fa225cbcSrjs    unsigned int w = dest->width;
535fa225cbcSrjs
536fa225cbcSrjs    buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2);      /* in DWords */
537fa225cbcSrjs    buffer_info->dest_y.dw2.base_address = (YOFFSET(pI915Surface) >> 2);    /* starting DWORD address */
538fa225cbcSrjs    buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2);      /* in DWords */
539fa225cbcSrjs    buffer_info->dest_u.dw2.base_address = (UOFFSET(pI915Surface) >> 2);      /* starting DWORD address */
540fa225cbcSrjs    buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2);      /* in Dwords */
541fa225cbcSrjs    buffer_info->dest_v.dw2.base_address = (VOFFSET(pI915Surface) >> 2);      /* starting DWORD address */
542fa225cbcSrjs
543fa225cbcSrjs    if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
544fa225cbcSrjs        ;
545fa225cbcSrjs    } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) {
546fa225cbcSrjs        buffer_info->dest_buf.dw1.v_ls = 1;
547fa225cbcSrjs    } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_BOTTOM_FIELD) {
548fa225cbcSrjs        buffer_info->dest_buf.dw1.v_ls = 1;
549fa225cbcSrjs        buffer_info->dest_buf.dw1.v_ls_offset = 1;
550fa225cbcSrjs    }
551fa225cbcSrjs
552fa225cbcSrjs    if (picture_structure & XVMC_FRAME_PICTURE) {
553fa225cbcSrjs        ;
554fa225cbcSrjs    } else if (picture_structure & XVMC_TOP_FIELD) {
555fa225cbcSrjs        if (flags & XVMC_SECOND_FIELD)
556fa225cbcSrjs            buffer_info->dest_buf_mpeg.dw1.tff = 0;
557fa225cbcSrjs        else
558fa225cbcSrjs            buffer_info->dest_buf_mpeg.dw1.tff = 1;
559fa225cbcSrjs    } else if (picture_structure & XVMC_BOTTOM_FIELD) {
560fa225cbcSrjs        if (flags & XVMC_SECOND_FIELD)
561fa225cbcSrjs            buffer_info->dest_buf_mpeg.dw1.tff = 1;
562fa225cbcSrjs        else
563fa225cbcSrjs            buffer_info->dest_buf_mpeg.dw1.tff = 0;
564fa225cbcSrjs    }
565fa225cbcSrjs
566fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw1.picture_width = (dest->width >> 4);     /* in macroblocks */
567fa225cbcSrjs    buffer_info->dest_buf_mpeg.dw2.picture_coding_type = picture_coding_type;
568fa225cbcSrjs}
569fa225cbcSrjs
570fa225cbcSrjsstatic void i915_mc_map_state_init(XvMCContext *context)
571fa225cbcSrjs{
572fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
573fa225cbcSrjs    unsigned int w = context->width;
574fa225cbcSrjs    unsigned int h = context->height;
575fa225cbcSrjs    struct i915_mc_map_state *map_state;
576fa225cbcSrjs
577fa225cbcSrjs    map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
578fa225cbcSrjs
579fa225cbcSrjs    memset(map_state, 0, sizeof(*map_state));
580fa225cbcSrjs
581fa225cbcSrjs    /* 3DSATE_MAP_STATE: Y */
582fa225cbcSrjs    map_state->y_map.dw0.type = CMD_3D;
583fa225cbcSrjs    map_state->y_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
584fa225cbcSrjs    map_state->y_map.dw0.retain = 1;
585fa225cbcSrjs    map_state->y_map.dw0.length = 6;
586fa225cbcSrjs    map_state->y_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
587fa225cbcSrjs
588fa225cbcSrjs    /* Y Forward (Past) */
589fa225cbcSrjs    map_state->y_forward.tm0.v_ls_offset = 0;
590fa225cbcSrjs    map_state->y_forward.tm0.v_ls = 0;
591fa225cbcSrjs    map_state->y_forward.tm1.tile_walk = TILEWALK_XMAJOR;
592fa225cbcSrjs    map_state->y_forward.tm1.tiled_surface = 0;
593fa225cbcSrjs    map_state->y_forward.tm1.utilize_fence_regs = 0;
594fa225cbcSrjs    map_state->y_forward.tm1.texel_fmt = 0;      /* 8bit */
595fa225cbcSrjs    map_state->y_forward.tm1.surface_fmt = 1;    /* 8bit */
596fa225cbcSrjs    map_state->y_forward.tm1.width = w - 1;
597fa225cbcSrjs    map_state->y_forward.tm1.height = h - 1;
598fa225cbcSrjs    map_state->y_forward.tm2.depth = 0;
599fa225cbcSrjs    map_state->y_forward.tm2.max_lod = 0;
600fa225cbcSrjs    map_state->y_forward.tm2.cube_face = 0;
601fa225cbcSrjs
602fa225cbcSrjs    /* Y Backward (Future) */
603fa225cbcSrjs    map_state->y_backward.tm0.v_ls_offset = 0;
604fa225cbcSrjs    map_state->y_backward.tm0.v_ls = 0;
605fa225cbcSrjs    map_state->y_backward.tm1.tile_walk = TILEWALK_XMAJOR;
606fa225cbcSrjs    map_state->y_backward.tm1.tiled_surface = 0;
607fa225cbcSrjs    map_state->y_backward.tm1.utilize_fence_regs = 0;
608fa225cbcSrjs    map_state->y_backward.tm1.texel_fmt = 0;      /* 8bit */
609fa225cbcSrjs    map_state->y_backward.tm1.surface_fmt = 1;    /* 8bit */
610fa225cbcSrjs    map_state->y_backward.tm1.width = w - 1;
611fa225cbcSrjs    map_state->y_backward.tm1.height = h - 1;
612fa225cbcSrjs    map_state->y_backward.tm2.depth = 0;
613fa225cbcSrjs    map_state->y_backward.tm2.max_lod = 0;
614fa225cbcSrjs    map_state->y_backward.tm2.cube_face = 0;
615fa225cbcSrjs
616fa225cbcSrjs    /* 3DSATE_MAP_STATE: U */
617fa225cbcSrjs    map_state->u_map.dw0.type = CMD_3D;
618fa225cbcSrjs    map_state->u_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
619fa225cbcSrjs    map_state->u_map.dw0.retain = 1;
620fa225cbcSrjs    map_state->u_map.dw0.length = 6;
621fa225cbcSrjs    map_state->u_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
622fa225cbcSrjs
623fa225cbcSrjs    /* U Forward */
624fa225cbcSrjs    map_state->u_forward.tm0.v_ls_offset = 0;
625fa225cbcSrjs    map_state->u_forward.tm0.v_ls = 0;
626fa225cbcSrjs    map_state->u_forward.tm1.tile_walk = TILEWALK_XMAJOR;
627fa225cbcSrjs    map_state->u_forward.tm1.tiled_surface = 0;
628fa225cbcSrjs    map_state->u_forward.tm1.utilize_fence_regs = 0;
629fa225cbcSrjs    map_state->u_forward.tm1.texel_fmt = 0;      /* 8bit */
630fa225cbcSrjs    map_state->u_forward.tm1.surface_fmt = 1;    /* 8bit */
631fa225cbcSrjs    map_state->u_forward.tm1.width = (w >> 1) - 1;
632fa225cbcSrjs    map_state->u_forward.tm1.height = (h >> 1) - 1;
633fa225cbcSrjs    map_state->u_forward.tm2.depth = 0;
634fa225cbcSrjs    map_state->u_forward.tm2.max_lod = 0;
635fa225cbcSrjs    map_state->u_forward.tm2.cube_face = 0;
636fa225cbcSrjs
637fa225cbcSrjs    /* U Backward */
638fa225cbcSrjs    map_state->u_backward.tm0.v_ls_offset = 0;
639fa225cbcSrjs    map_state->u_backward.tm0.v_ls = 0;
640fa225cbcSrjs    map_state->u_backward.tm1.tile_walk = TILEWALK_XMAJOR;
641fa225cbcSrjs    map_state->u_backward.tm1.tiled_surface = 0;
642fa225cbcSrjs    map_state->u_backward.tm1.utilize_fence_regs = 0;
643fa225cbcSrjs    map_state->u_backward.tm1.texel_fmt = 0;
644fa225cbcSrjs    map_state->u_backward.tm1.surface_fmt = 1;
645fa225cbcSrjs    map_state->u_backward.tm1.width = (w >> 1) - 1;
646fa225cbcSrjs    map_state->u_backward.tm1.height = (h >> 1) - 1;
647fa225cbcSrjs    map_state->u_backward.tm2.depth = 0;
648fa225cbcSrjs    map_state->u_backward.tm2.max_lod = 0;
649fa225cbcSrjs    map_state->u_backward.tm2.cube_face = 0;
650fa225cbcSrjs
651fa225cbcSrjs    /* 3DSATE_MAP_STATE: V */
652fa225cbcSrjs    map_state->v_map.dw0.type = CMD_3D;
653fa225cbcSrjs    map_state->v_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
654fa225cbcSrjs    map_state->v_map.dw0.retain = 1;
655fa225cbcSrjs    map_state->v_map.dw0.length = 6;
656fa225cbcSrjs    map_state->v_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
657fa225cbcSrjs
658fa225cbcSrjs    /* V Forward */
659fa225cbcSrjs    map_state->v_forward.tm0.v_ls_offset = 0;
660fa225cbcSrjs    map_state->v_forward.tm0.v_ls = 0;
661fa225cbcSrjs    map_state->v_forward.tm1.tile_walk = TILEWALK_XMAJOR;
662fa225cbcSrjs    map_state->v_forward.tm1.tiled_surface = 0;
663fa225cbcSrjs    map_state->v_forward.tm1.utilize_fence_regs = 0;
664fa225cbcSrjs    map_state->v_forward.tm1.texel_fmt = 0;
665fa225cbcSrjs    map_state->v_forward.tm1.surface_fmt = 1;
666fa225cbcSrjs    map_state->v_forward.tm1.width = (w >> 1) - 1;
667fa225cbcSrjs    map_state->v_forward.tm1.height = (h >> 1) - 1;
668fa225cbcSrjs    map_state->v_forward.tm2.depth = 0;
669fa225cbcSrjs    map_state->v_forward.tm2.max_lod = 0;
670fa225cbcSrjs    map_state->v_forward.tm2.cube_face = 0;
671fa225cbcSrjs
672fa225cbcSrjs    /* V Backward */
673fa225cbcSrjs    map_state->v_backward.tm0.v_ls_offset = 0;
674fa225cbcSrjs    map_state->v_backward.tm0.v_ls = 0;
675fa225cbcSrjs    map_state->v_backward.tm1.tile_walk = TILEWALK_XMAJOR;
676fa225cbcSrjs    map_state->v_backward.tm1.tiled_surface = 0;
677fa225cbcSrjs    map_state->v_backward.tm1.utilize_fence_regs = 0;
678fa225cbcSrjs    map_state->v_backward.tm1.texel_fmt = 0;
679fa225cbcSrjs    map_state->v_backward.tm1.surface_fmt = 1;
680fa225cbcSrjs    map_state->v_backward.tm1.width = (w >> 1) - 1;
681fa225cbcSrjs    map_state->v_backward.tm1.height = (h >> 1) - 1;
682fa225cbcSrjs    map_state->v_backward.tm2.depth = 0;
683fa225cbcSrjs    map_state->v_backward.tm2.max_lod = 0;
684fa225cbcSrjs    map_state->v_backward.tm2.cube_face = 0;
685fa225cbcSrjs}
686fa225cbcSrjs
687fa225cbcSrjsstatic void i915_mc_map_state_set(XvMCContext *context,
688fa225cbcSrjs	i915XvMCSurface *privPast,
689fa225cbcSrjs	i915XvMCSurface *privFuture)
690fa225cbcSrjs{
691fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
692fa225cbcSrjs    struct i915_mc_map_state *map_state;
693fa225cbcSrjs
694fa225cbcSrjs    map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
695fa225cbcSrjs
696fa225cbcSrjs    map_state->y_forward.tm0.base_address = (YOFFSET(privPast) >> 2);
697fa225cbcSrjs    map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;       /* in DWords - 1 */
698fa225cbcSrjs    map_state->y_backward.tm0.base_address = (YOFFSET(privFuture) >> 2);
699fa225cbcSrjs    map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
700fa225cbcSrjs    map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);
701fa225cbcSrjs    map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;       /* in DWords - 1 */
702fa225cbcSrjs    map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);
703fa225cbcSrjs    map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
704fa225cbcSrjs    map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);
705fa225cbcSrjs    map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;       /* in DWords - 1 */
706fa225cbcSrjs    map_state->v_backward.tm0.base_address = (VOFFSET(privFuture) >> 2);
707fa225cbcSrjs    map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
708fa225cbcSrjs}
709fa225cbcSrjs
710fa225cbcSrjsstatic void i915_flush(int map, int render)
711fa225cbcSrjs{
712fa225cbcSrjs    struct i915_mi_flush mi_flush;
713fa225cbcSrjs
714fa225cbcSrjs    memset(&mi_flush, 0, sizeof(mi_flush));
715fa225cbcSrjs    mi_flush.dw0.type = CMD_MI;
716fa225cbcSrjs    mi_flush.dw0.opcode = OPC_MI_FLUSH;
717fa225cbcSrjs    mi_flush.dw0.map_cache_invalidate = map;
718fa225cbcSrjs    mi_flush.dw0.render_cache_flush_inhibit = render;
719fa225cbcSrjs
720fa225cbcSrjs    intelBatchbufferData(&mi_flush, sizeof(mi_flush), 0);
721fa225cbcSrjs}
722fa225cbcSrjs
723fa225cbcSrjsstatic void i915_mc_load_indirect_render_init(XvMCContext *context)
724fa225cbcSrjs{
725fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
726fa225cbcSrjs    sis_state *sis;
727fa225cbcSrjs    msb_state *msb;
728fa225cbcSrjs    struct i915_3dstate_load_indirect *load_indirect;
729fa225cbcSrjs    int mem_select;
730fa225cbcSrjs
731fa225cbcSrjs    mc_render_load_indirect_size = sizeof(*load_indirect) + sizeof(*sis)
732fa225cbcSrjs					+ sizeof(*msb);
733fa225cbcSrjs    mc_render_load_indirect = calloc(1, mc_render_load_indirect_size);
734fa225cbcSrjs
735fa225cbcSrjs    load_indirect = (struct i915_3dstate_load_indirect *)mc_render_load_indirect;
736fa225cbcSrjs    load_indirect->dw0.type = CMD_3D;
737fa225cbcSrjs    load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
738fa225cbcSrjs    load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_MSB;
739fa225cbcSrjs    load_indirect->dw0.length = (mc_render_load_indirect_size >> 2) - 2;
740fa225cbcSrjs
741fa225cbcSrjs    if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
742fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I915_GM)
743fa225cbcSrjs        mem_select = 0;
744fa225cbcSrjs    else
745fa225cbcSrjs	mem_select = 1;
746fa225cbcSrjs
747fa225cbcSrjs    load_indirect->dw0.mem_select = mem_select;
748fa225cbcSrjs
749fa225cbcSrjs    /* Static Indirect state buffer (dest buffer info) */
750fa225cbcSrjs    sis = (sis_state *)(++load_indirect);
751fa225cbcSrjs    sis->dw0.valid = 1;
752fa225cbcSrjs    sis->dw0.force = 1;
753fa225cbcSrjs    sis->dw1.length = 16; /* 4 * 3 + 2 + 3 - 1 */
754fa225cbcSrjs
755fa225cbcSrjs    if (mem_select)
756fa225cbcSrjs	sis->dw0.buffer_address = (pI915XvMC->sis.offset >> 2);
757fa225cbcSrjs    else
758fa225cbcSrjs	sis->dw0.buffer_address = (pI915XvMC->sis.bus_addr >> 2);
759fa225cbcSrjs
760fa225cbcSrjs    /* Map state buffer (reference buffer info) */
761fa225cbcSrjs    msb = (msb_state *)(++sis);
762fa225cbcSrjs    msb->dw0.valid = 1;
763fa225cbcSrjs    msb->dw0.force = 1;
764fa225cbcSrjs    msb->dw1.length = 23; /* 3 * 8 - 1 */
765fa225cbcSrjs
766fa225cbcSrjs    if (mem_select)
767fa225cbcSrjs	msb->dw0.buffer_address = (pI915XvMC->msb.offset >> 2);
768fa225cbcSrjs    else
769fa225cbcSrjs	msb->dw0.buffer_address = (pI915XvMC->msb.bus_addr >> 2);
770fa225cbcSrjs}
771fa225cbcSrjs
772fa225cbcSrjsstatic void i915_mc_load_indirect_render_emit(void)
773fa225cbcSrjs{
774fa225cbcSrjs    i915_emit_batch(mc_render_load_indirect, mc_render_load_indirect_size, 0);
775fa225cbcSrjs}
776fa225cbcSrjs
777fa225cbcSrjsstatic void i915_mc_mpeg_set_origin(XvMCContext *context, XvMCMacroBlock *mb)
778fa225cbcSrjs{
779fa225cbcSrjs    struct i915_3dmpeg_set_origin set_origin;
780fa225cbcSrjs
781fa225cbcSrjs    /* 3DMPEG_SET_ORIGIN */
782fa225cbcSrjs    memset(&set_origin, 0, sizeof(set_origin));
783fa225cbcSrjs    set_origin.dw0.type = CMD_3D;
784fa225cbcSrjs    set_origin.dw0.opcode = OPC_3DMPEG_SET_ORIGIN;
785fa225cbcSrjs    set_origin.dw0.length = 0;
786fa225cbcSrjs    set_origin.dw1.h_origin = mb->x;
787fa225cbcSrjs    set_origin.dw1.v_origin = mb->y;
788fa225cbcSrjs
789fa225cbcSrjs    intelBatchbufferData(&set_origin, sizeof(set_origin), 0);
790fa225cbcSrjs}
791fa225cbcSrjs
792fa225cbcSrjsstatic void i915_mc_mpeg_macroblock_ipicture(XvMCContext *context, XvMCMacroBlock *mb)
793fa225cbcSrjs{
794fa225cbcSrjs    struct i915_3dmpeg_macroblock_ipicture macroblock_ipicture;
795fa225cbcSrjs
796fa225cbcSrjs    /* 3DMPEG_MACROBLOCK_IPICTURE */
797fa225cbcSrjs    memset(&macroblock_ipicture, 0, sizeof(macroblock_ipicture));
798fa225cbcSrjs    macroblock_ipicture.dw0.type = CMD_3D;
799fa225cbcSrjs    macroblock_ipicture.dw0.opcode = OPC_3DMPEG_MACROBLOCK_IPICTURE;
800fa225cbcSrjs    macroblock_ipicture.dw0.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
801fa225cbcSrjs
802fa225cbcSrjs    intelBatchbufferData(&macroblock_ipicture, sizeof(macroblock_ipicture), 0);
803fa225cbcSrjs}
804fa225cbcSrjs
805fa225cbcSrjs#if 0
806fa225cbcSrjsstatic void i915_mc_mpeg_macroblock_0mv(XvMCContext *context, XvMCMacroBlock *mb)
807fa225cbcSrjs{
808fa225cbcSrjs    struct i915_3dmpeg_macroblock_0mv macroblock_0mv;
809fa225cbcSrjs
810fa225cbcSrjs    /* 3DMPEG_MACROBLOCK(0mv) */
811fa225cbcSrjs    memset(&macroblock_0mv, 0, sizeof(macroblock_0mv));
812fa225cbcSrjs    macroblock_0mv.header.dw0.type = CMD_3D;
813fa225cbcSrjs    macroblock_0mv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
814fa225cbcSrjs    macroblock_0mv.header.dw0.length = 0;
815fa225cbcSrjs    macroblock_0mv.header.dw1.mb_intra = 1;     /* should be 1 */
816fa225cbcSrjs    macroblock_0mv.header.dw1.forward = 0;      /* should be 0 */
817fa225cbcSrjs    macroblock_0mv.header.dw1.backward = 0;     /* should be 0 */
818fa225cbcSrjs    macroblock_0mv.header.dw1.h263_4mv = 0;     /* should be 0 */
819fa225cbcSrjs    macroblock_0mv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
820fa225cbcSrjs
821fa225cbcSrjs/*
822fa225cbcSrjs    if (!mb->coded_block_pattern)
823fa225cbcSrjs        macroblock_0mv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
824fa225cbcSrjs*/
825fa225cbcSrjs
826fa225cbcSrjs    macroblock_0mv.header.dw1.motion_type = 0; // (mb->motion_type & 0x3);
827fa225cbcSrjs    macroblock_0mv.header.dw1.vertical_field_select = 0; // mb->motion_vertical_field_select & 0xf;
828fa225cbcSrjs    macroblock_0mv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
829fa225cbcSrjs    macroblock_0mv.header.dw1.skipped_macroblocks = 0;
830fa225cbcSrjs
831fa225cbcSrjs    intelBatchbufferData(&macroblock_0mv, sizeof(macroblock_0mv), 0);
832fa225cbcSrjs}
833fa225cbcSrjs#endif
834fa225cbcSrjs
835fa225cbcSrjsstatic void i915_mc_mpeg_macroblock_1fbmv(XvMCContext *context, XvMCMacroBlock *mb)
836fa225cbcSrjs{
837fa225cbcSrjs    struct i915_3dmpeg_macroblock_1fbmv macroblock_1fbmv;
838fa225cbcSrjs    vector_t mv0[2];
839fa225cbcSrjs
840fa225cbcSrjs    /* 3DMPEG_MACROBLOCK(1fbmv) */
841fa225cbcSrjs    memset(&macroblock_1fbmv, 0, sizeof(macroblock_1fbmv));
842fa225cbcSrjs    macroblock_1fbmv.header.dw0.type = CMD_3D;
843fa225cbcSrjs    macroblock_1fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
844fa225cbcSrjs    macroblock_1fbmv.header.dw0.length = 2;
845fa225cbcSrjs    macroblock_1fbmv.header.dw1.mb_intra = 0;   /* should be 0 */
846fa225cbcSrjs    macroblock_1fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
847fa225cbcSrjs    macroblock_1fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
848fa225cbcSrjs    macroblock_1fbmv.header.dw1.h263_4mv = 0;   /* should be 0 */
849fa225cbcSrjs    macroblock_1fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
850fa225cbcSrjs
851fa225cbcSrjs    if (!(mb->coded_block_pattern & 0x3f))
852fa225cbcSrjs        macroblock_1fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
853fa225cbcSrjs
854fa225cbcSrjs    macroblock_1fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
855fa225cbcSrjs    macroblock_1fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f);
856fa225cbcSrjs    macroblock_1fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
857fa225cbcSrjs    macroblock_1fbmv.header.dw1.skipped_macroblocks = 0;
858fa225cbcSrjs
859fa225cbcSrjs    mv0[0].component[0] = mb->PMV[0][0][0];
860fa225cbcSrjs    mv0[0].component[1] = mb->PMV[0][0][1];
861fa225cbcSrjs    mv0[1].component[0] = mb->PMV[0][1][0];
862fa225cbcSrjs    mv0[1].component[1] = mb->PMV[0][1][1];
863fa225cbcSrjs
864fa225cbcSrjs    macroblock_1fbmv.dw2 = mv0[0].v;
865fa225cbcSrjs    macroblock_1fbmv.dw3 = mv0[1].v;
866fa225cbcSrjs
867fa225cbcSrjs    intelBatchbufferData(&macroblock_1fbmv, sizeof(macroblock_1fbmv), 0);
868fa225cbcSrjs}
869fa225cbcSrjs
870fa225cbcSrjsstatic void i915_mc_mpeg_macroblock_2fbmv(XvMCContext *context, XvMCMacroBlock *mb, unsigned int ps)
871fa225cbcSrjs{
872fa225cbcSrjs    struct i915_3dmpeg_macroblock_2fbmv macroblock_2fbmv;
873fa225cbcSrjs    vector_t mv0[2];
874fa225cbcSrjs    vector_t mv1[2];
875fa225cbcSrjs
876fa225cbcSrjs    /* 3DMPEG_MACROBLOCK(2fbmv) */
877fa225cbcSrjs    memset(&macroblock_2fbmv, 0, sizeof(macroblock_2fbmv));
878fa225cbcSrjs    macroblock_2fbmv.header.dw0.type = CMD_3D;
879fa225cbcSrjs    macroblock_2fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
880fa225cbcSrjs    macroblock_2fbmv.header.dw0.length = 4;
881fa225cbcSrjs    macroblock_2fbmv.header.dw1.mb_intra = 0;   /* should be 0 */
882fa225cbcSrjs    macroblock_2fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
883fa225cbcSrjs    macroblock_2fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
884fa225cbcSrjs    macroblock_2fbmv.header.dw1.h263_4mv = 0;   /* should be 0 */
885fa225cbcSrjs    macroblock_2fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
886fa225cbcSrjs
887fa225cbcSrjs    if (!(mb->coded_block_pattern & 0x3f))
888fa225cbcSrjs        macroblock_2fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
889fa225cbcSrjs
890fa225cbcSrjs    macroblock_2fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
891fa225cbcSrjs    macroblock_2fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f);
892fa225cbcSrjs    macroblock_2fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
893fa225cbcSrjs    macroblock_2fbmv.header.dw1.skipped_macroblocks = 0;
894fa225cbcSrjs
895fa225cbcSrjs    mv0[0].component[0] = mb->PMV[0][0][0];
896fa225cbcSrjs    mv0[0].component[1] = mb->PMV[0][0][1];
897fa225cbcSrjs    mv0[1].component[0] = mb->PMV[0][1][0];
898fa225cbcSrjs    mv0[1].component[1] = mb->PMV[0][1][1];
899fa225cbcSrjs    mv1[0].component[0] = mb->PMV[1][0][0];
900fa225cbcSrjs    mv1[0].component[1] = mb->PMV[1][0][1];
901fa225cbcSrjs    mv1[1].component[0] = mb->PMV[1][1][0];
902fa225cbcSrjs    mv1[1].component[1] = mb->PMV[1][1][1];
903fa225cbcSrjs
904fa225cbcSrjs    if ((ps & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
905fa225cbcSrjs        if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) {
906fa225cbcSrjs            mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
907fa225cbcSrjs            mv0[1].component[1] = mb->PMV[0][1][1] >> 1;
908fa225cbcSrjs            mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
909fa225cbcSrjs            mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
910fa225cbcSrjs        } else if ((mb->motion_type & 3) == XVMC_PREDICTION_DUAL_PRIME) {
911fa225cbcSrjs            mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
912fa225cbcSrjs            mv0[1].component[1] = mb->PMV[0][1][1] >> 1;  // MPEG2 MV[0][1] isn't used
913fa225cbcSrjs            mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
914fa225cbcSrjs            mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
915fa225cbcSrjs        }
916fa225cbcSrjs    }
917fa225cbcSrjs
918fa225cbcSrjs    macroblock_2fbmv.dw2 = mv0[0].v;
919fa225cbcSrjs    macroblock_2fbmv.dw3 = mv0[1].v;
920fa225cbcSrjs    macroblock_2fbmv.dw4 = mv1[0].v;
921fa225cbcSrjs    macroblock_2fbmv.dw5 = mv1[1].v;
922fa225cbcSrjs
923fa225cbcSrjs    intelBatchbufferData(&macroblock_2fbmv, sizeof(macroblock_2fbmv), 0);
924fa225cbcSrjs}
925fa225cbcSrjs
926fa225cbcSrjs#if 0
927fa225cbcSrjsstatic void i915_mc_invalidate_subcontext_buffers(XvMCContext *context, unsigned int mask)
928fa225cbcSrjs{
929fa225cbcSrjs    struct i915_3dstate_load_indirect *load_indirect = NULL;
930fa225cbcSrjs    sis_state *sis = NULL;
931fa225cbcSrjs    dis_state *dis = NULL;
932fa225cbcSrjs    ssb_state *ssb = NULL;
933fa225cbcSrjs    msb_state *msb = NULL;
934fa225cbcSrjs    psp_state *psp = NULL;
935fa225cbcSrjs    psc_state *psc = NULL;
936fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
937fa225cbcSrjs    unsigned int size;
938fa225cbcSrjs    void *base = NULL, *ptr = NULL;
939fa225cbcSrjs
940fa225cbcSrjs    size = sizeof(*load_indirect);
941fa225cbcSrjs    if (mask & BLOCK_SIS)
942fa225cbcSrjs        size += sizeof(*sis);
943fa225cbcSrjs    if (mask & BLOCK_DIS)
944fa225cbcSrjs        size += sizeof(*dis);
945fa225cbcSrjs    if (mask & BLOCK_SSB)
946fa225cbcSrjs        size += sizeof(*ssb);
947fa225cbcSrjs    if (mask & BLOCK_MSB)
948fa225cbcSrjs        size += sizeof(*msb);
949fa225cbcSrjs    if (mask & BLOCK_PSP)
950fa225cbcSrjs        size += sizeof(*psp);
951fa225cbcSrjs    if (mask & BLOCK_PSC)
952fa225cbcSrjs        size += sizeof(*psc);
953fa225cbcSrjs
954fa225cbcSrjs    if (size == sizeof(*load_indirect)) {
955fa225cbcSrjs        XVMC_ERR("There must be at least one bit set\n");
956fa225cbcSrjs        return;
957fa225cbcSrjs    }
958fa225cbcSrjs
959fa225cbcSrjs    /* 3DSTATE_LOAD_INDIRECT */
960fa225cbcSrjs    base = calloc(1, size);
961fa225cbcSrjs    load_indirect = (struct i915_3dstate_load_indirect *)base;
962fa225cbcSrjs    load_indirect->dw0.type = CMD_3D;
963fa225cbcSrjs    load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
964fa225cbcSrjs
965fa225cbcSrjs    if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
966fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I915_GM ||
967fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I945_G ||
968fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I945_GM)
969fa225cbcSrjs        load_indirect->dw0.mem_select = 0;
970fa225cbcSrjs    else
971fa225cbcSrjs        load_indirect->dw0.mem_select = 1;
972fa225cbcSrjs
973fa225cbcSrjs    load_indirect->dw0.block_mask = mask;
974fa225cbcSrjs    load_indirect->dw0.length = (size >> 2) - 2;
975fa225cbcSrjs    ptr = ++load_indirect;
976fa225cbcSrjs
977fa225cbcSrjs    /* SIS */
978fa225cbcSrjs    if (mask & BLOCK_SIS) {
979fa225cbcSrjs        sis = (sis_state *)ptr;
980fa225cbcSrjs        sis->dw0.valid = 0;
981fa225cbcSrjs        sis->dw0.buffer_address = 0;
982fa225cbcSrjs        sis->dw1.length = 0;
983fa225cbcSrjs        ptr = ++sis;
984fa225cbcSrjs    }
985fa225cbcSrjs
986fa225cbcSrjs    /* DIS */
987fa225cbcSrjs    if (mask & BLOCK_DIS) {
988fa225cbcSrjs        dis = (dis_state *)ptr;
989fa225cbcSrjs        dis->dw0.valid = 0;
990fa225cbcSrjs        dis->dw0.reset = 0;
991fa225cbcSrjs        dis->dw0.buffer_address = 0;
992fa225cbcSrjs        ptr = ++dis;
993fa225cbcSrjs    }
994fa225cbcSrjs
995fa225cbcSrjs    /* SSB */
996fa225cbcSrjs    if (mask & BLOCK_SSB) {
997fa225cbcSrjs        ssb = (ssb_state *)ptr;
998fa225cbcSrjs        ssb->dw0.valid = 0;
999fa225cbcSrjs        ssb->dw0.buffer_address = 0;
1000fa225cbcSrjs        ssb->dw1.length = 0;
1001fa225cbcSrjs        ptr = ++ssb;
1002fa225cbcSrjs    }
1003fa225cbcSrjs
1004fa225cbcSrjs    /* MSB */
1005fa225cbcSrjs    if (mask & BLOCK_MSB) {
1006fa225cbcSrjs        msb = (msb_state *)ptr;
1007fa225cbcSrjs        msb->dw0.valid = 0;
1008fa225cbcSrjs        msb->dw0.buffer_address = 0;
1009fa225cbcSrjs        msb->dw1.length = 0;
1010fa225cbcSrjs        ptr = ++msb;
1011fa225cbcSrjs    }
1012fa225cbcSrjs
1013fa225cbcSrjs    /* PSP */
1014fa225cbcSrjs    if (mask & BLOCK_PSP) {
1015fa225cbcSrjs        psp = (psp_state *)ptr;
1016fa225cbcSrjs        psp->dw0.valid = 0;
1017fa225cbcSrjs        psp->dw0.buffer_address = 0;
1018fa225cbcSrjs        psp->dw1.length = 0;
1019fa225cbcSrjs        ptr = ++psp;
1020fa225cbcSrjs    }
1021fa225cbcSrjs
1022fa225cbcSrjs    /* PSC */
1023fa225cbcSrjs    if (mask & BLOCK_PSC) {
1024fa225cbcSrjs        psc = (psc_state *)ptr;
1025fa225cbcSrjs        psc->dw0.valid = 0;
1026fa225cbcSrjs        psc->dw0.buffer_address = 0;
1027fa225cbcSrjs        psc->dw1.length = 0;
1028fa225cbcSrjs        ptr = ++psc;
1029fa225cbcSrjs    }
1030fa225cbcSrjs
1031fa225cbcSrjs    intelBatchbufferData(base, size, 0);
1032fa225cbcSrjs    free(base);
1033fa225cbcSrjs}
1034fa225cbcSrjs#endif
1035fa225cbcSrjs
1036fa225cbcSrjsstatic int i915_xvmc_map_buffers(i915XvMCContext *pI915XvMC)
1037fa225cbcSrjs{
1038fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1039fa225cbcSrjs               pI915XvMC->sis.handle,
1040fa225cbcSrjs               pI915XvMC->sis.size,
1041fa225cbcSrjs               (drmAddress *)&pI915XvMC->sis.map) != 0) {
1042fa225cbcSrjs        return -1;
1043fa225cbcSrjs    }
1044fa225cbcSrjs
1045fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1046fa225cbcSrjs               pI915XvMC->ssb.handle,
1047fa225cbcSrjs               pI915XvMC->ssb.size,
1048fa225cbcSrjs               (drmAddress *)&pI915XvMC->ssb.map) != 0) {
1049fa225cbcSrjs        return -1;
1050fa225cbcSrjs    }
1051fa225cbcSrjs
1052fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1053fa225cbcSrjs               pI915XvMC->msb.handle,
1054fa225cbcSrjs               pI915XvMC->msb.size,
1055fa225cbcSrjs               (drmAddress *)&pI915XvMC->msb.map) != 0) {
1056fa225cbcSrjs        return -1;
1057fa225cbcSrjs    }
1058fa225cbcSrjs
1059fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1060fa225cbcSrjs               pI915XvMC->psp.handle,
1061fa225cbcSrjs               pI915XvMC->psp.size,
1062fa225cbcSrjs               (drmAddress *)&pI915XvMC->psp.map) != 0) {
1063fa225cbcSrjs        return -1;
1064fa225cbcSrjs    }
1065fa225cbcSrjs
1066fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1067fa225cbcSrjs               pI915XvMC->psc.handle,
1068fa225cbcSrjs               pI915XvMC->psc.size,
1069fa225cbcSrjs               (drmAddress *)&pI915XvMC->psc.map) != 0) {
1070fa225cbcSrjs        return -1;
1071fa225cbcSrjs    }
1072fa225cbcSrjs
1073fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1074fa225cbcSrjs               pI915XvMC->corrdata.handle,
1075fa225cbcSrjs               pI915XvMC->corrdata.size,
1076fa225cbcSrjs               (drmAddress *)&pI915XvMC->corrdata.map) != 0) {
1077fa225cbcSrjs        return -1;
1078fa225cbcSrjs    }
1079fa225cbcSrjs
1080fa225cbcSrjs    return 0;
1081fa225cbcSrjs}
1082fa225cbcSrjs
1083fa225cbcSrjsstatic void i915_xvmc_unmap_buffers(i915XvMCContext *pI915XvMC)
1084fa225cbcSrjs{
1085fa225cbcSrjs    if (pI915XvMC->sis.map) {
1086fa225cbcSrjs        drmUnmap(pI915XvMC->sis.map, pI915XvMC->sis.size);
1087fa225cbcSrjs        pI915XvMC->sis.map = NULL;
1088fa225cbcSrjs    }
1089fa225cbcSrjs
1090fa225cbcSrjs    if (pI915XvMC->ssb.map) {
1091fa225cbcSrjs        drmUnmap(pI915XvMC->ssb.map, pI915XvMC->ssb.size);
1092fa225cbcSrjs        pI915XvMC->ssb.map = NULL;
1093fa225cbcSrjs    }
1094fa225cbcSrjs
1095fa225cbcSrjs    if (pI915XvMC->msb.map) {
1096fa225cbcSrjs        drmUnmap(pI915XvMC->msb.map, pI915XvMC->msb.size);
1097fa225cbcSrjs        pI915XvMC->msb.map = NULL;
1098fa225cbcSrjs    }
1099fa225cbcSrjs
1100fa225cbcSrjs    if (pI915XvMC->psp.map) {
1101fa225cbcSrjs        drmUnmap(pI915XvMC->psp.map, pI915XvMC->psp.size);
1102fa225cbcSrjs        pI915XvMC->psp.map = NULL;
1103fa225cbcSrjs    }
1104fa225cbcSrjs
1105fa225cbcSrjs    if (pI915XvMC->psc.map) {
1106fa225cbcSrjs        drmUnmap(pI915XvMC->psc.map, pI915XvMC->psc.size);
1107fa225cbcSrjs        pI915XvMC->psc.map = NULL;
1108fa225cbcSrjs    }
1109fa225cbcSrjs
1110fa225cbcSrjs    if (pI915XvMC->corrdata.map) {
1111fa225cbcSrjs        drmUnmap(pI915XvMC->corrdata.map, pI915XvMC->corrdata.size);
1112fa225cbcSrjs        pI915XvMC->corrdata.map = NULL;
1113fa225cbcSrjs    }
1114fa225cbcSrjs}
1115fa225cbcSrjs
1116fa225cbcSrjs#if 0
1117fa225cbcSrjs/*
1118fa225cbcSrjs * Video post processing
1119fa225cbcSrjs */
1120fa225cbcSrjsstatic void i915_yuv2rgb_map_state_buffer(XvMCSurface *target_surface)
1121fa225cbcSrjs{
1122fa225cbcSrjs    struct i915_3dstate_map_state *map_state;
1123fa225cbcSrjs    struct texture_map *tm;
1124fa225cbcSrjs    i915XvMCSurface *privTarget = NULL;
1125fa225cbcSrjs    i915XvMCContext *pI915XvMC = NULL;
1126fa225cbcSrjs    unsigned int w = target_surface->width, h = target_surface->height;
1127fa225cbcSrjs
1128fa225cbcSrjs    privTarget = (i915XvMCSurface *)target_surface->privData;
1129fa225cbcSrjs    pI915XvMC = (i915XvMCContext *)privTarget->privContext;
1130fa225cbcSrjs    /* 3DSATE_MAP_STATE */
1131fa225cbcSrjs    map_state = (struct i915_3dstate_map_state *)pI915XvMC->msb.map;
1132fa225cbcSrjs    memset(map_state, 0, sizeof(*map_state));
1133fa225cbcSrjs    map_state->dw0.type = CMD_3D;
1134fa225cbcSrjs    map_state->dw0.opcode = OPC_3DSTATE_MAP_STATE;
1135fa225cbcSrjs    map_state->dw0.retain = 0;
1136fa225cbcSrjs    map_state->dw0.length = 9;
1137fa225cbcSrjs    map_state->dw1.map_mask = MAP_MAP0 | MAP_MAP1 | MAP_MAP2;
1138fa225cbcSrjs
1139fa225cbcSrjs    /* texture map 0: V Plane */
1140fa225cbcSrjs    tm = (struct texture_map *)(++map_state);
1141fa225cbcSrjs    memset(tm, 0, sizeof(*tm));
1142fa225cbcSrjs    tm->tm0.v_ls_offset = 0;
1143fa225cbcSrjs    tm->tm0.v_ls = 0;
1144fa225cbcSrjs    tm->tm0.base_address = VOFFSET(privTarget);
1145fa225cbcSrjs    tm->tm1.tile_walk = TILEWALK_XMAJOR;
1146fa225cbcSrjs    tm->tm1.tiled_surface = 0;
1147fa225cbcSrjs    tm->tm1.utilize_fence_regs = 1;
1148fa225cbcSrjs    tm->tm1.texel_fmt = 0;
1149fa225cbcSrjs    tm->tm1.surface_fmt = 1;
1150fa225cbcSrjs    tm->tm1.width = (w >> 1) - 1;
1151fa225cbcSrjs    tm->tm1.height = (h >> 1) - 1;
1152fa225cbcSrjs    tm->tm2.depth = 0;
1153fa225cbcSrjs    tm->tm2.max_lod = 0;
1154fa225cbcSrjs    tm->tm2.cube_face = 0;
1155fa225cbcSrjs    tm->tm2.pitch = (privTarget->uvStride >> 2) - 1;    /* in DWords - 1 */
1156fa225cbcSrjs
1157fa225cbcSrjs    /* texture map 1: Y Plane */
1158fa225cbcSrjs    ++tm;
1159fa225cbcSrjs    memset(tm, 0, sizeof(*tm));
1160fa225cbcSrjs    tm->tm0.v_ls_offset = 0;
1161fa225cbcSrjs    tm->tm0.v_ls = 0;
1162fa225cbcSrjs    tm->tm0.base_address = YOFFSET(privTarget);
1163fa225cbcSrjs    tm->tm1.tile_walk = TILEWALK_XMAJOR;
1164fa225cbcSrjs    tm->tm1.tiled_surface = 0;
1165fa225cbcSrjs    tm->tm1.utilize_fence_regs = 1;
1166fa225cbcSrjs    tm->tm1.texel_fmt = 0;
1167fa225cbcSrjs    tm->tm1.surface_fmt = 1;
1168fa225cbcSrjs    tm->tm1.width = w - 1;
1169fa225cbcSrjs    tm->tm1.height = h - 1;
1170fa225cbcSrjs    tm->tm2.depth = 0;
1171fa225cbcSrjs    tm->tm2.max_lod = 0;
1172fa225cbcSrjs    tm->tm2.cube_face = 0;
1173fa225cbcSrjs    tm->tm2.pitch = (privTarget->yStride >> 2) - 1;     /* in DWords - 1 */
1174fa225cbcSrjs
1175fa225cbcSrjs    /* texture map 2: U Plane */
1176fa225cbcSrjs    ++tm;
1177fa225cbcSrjs    memset(tm, 0, sizeof(*tm));
1178fa225cbcSrjs    tm->tm0.v_ls_offset = 0;
1179fa225cbcSrjs    tm->tm0.v_ls = 0;
1180fa225cbcSrjs    tm->tm0.base_address = UOFFSET(privTarget);
1181fa225cbcSrjs    tm->tm1.tile_walk = TILEWALK_XMAJOR;
1182fa225cbcSrjs    tm->tm1.tiled_surface = 0;
1183fa225cbcSrjs    tm->tm1.utilize_fence_regs = 1;
1184fa225cbcSrjs    tm->tm1.texel_fmt = 0;
1185fa225cbcSrjs    tm->tm1.surface_fmt = 1;
1186fa225cbcSrjs    tm->tm1.width = (w >> 1) - 1;
1187fa225cbcSrjs    tm->tm1.height = (h >> 1) - 1;
1188fa225cbcSrjs    tm->tm2.depth = 0;
1189fa225cbcSrjs    tm->tm2.max_lod = 0;
1190fa225cbcSrjs    tm->tm2.cube_face = 0;
1191fa225cbcSrjs    tm->tm2.pitch = (privTarget->uvStride >> 2) - 1;    /* in DWords - 1 */
1192fa225cbcSrjs}
1193fa225cbcSrjs#endif
1194fa225cbcSrjs
1195fa225cbcSrjs#if 0
1196fa225cbcSrjsstatic void i915_yuv2rgb_sampler_state_buffer(XvMCSurface *surface)
1197fa225cbcSrjs{
1198fa225cbcSrjs    struct i915_3dstate_sampler_state *sampler_state;
1199fa225cbcSrjs    struct texture_sampler *ts;
1200fa225cbcSrjs    i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
1201fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
1202fa225cbcSrjs
1203fa225cbcSrjs    /* 3DSATE_SAMPLER_STATE */
1204fa225cbcSrjs    sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
1205fa225cbcSrjs    memset(sampler_state, 0, sizeof(*sampler_state));
1206fa225cbcSrjs    sampler_state->dw0.type = CMD_3D;
1207fa225cbcSrjs    sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
1208fa225cbcSrjs    sampler_state->dw0.length = 9;
1209fa225cbcSrjs    sampler_state->dw1.sampler_masker = SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1 | SAMPLER_SAMPLER2;
1210fa225cbcSrjs
1211fa225cbcSrjs    /* Sampler 0 */
1212fa225cbcSrjs    ts = (struct texture_sampler *)(++sampler_state);
1213fa225cbcSrjs    memset(ts, 0, sizeof(*ts));
1214fa225cbcSrjs    ts->ts0.reverse_gamma = 0;
1215fa225cbcSrjs    ts->ts0.planar2packet = 1;
1216fa225cbcSrjs    ts->ts0.color_conversion = 1;
1217fa225cbcSrjs    ts->ts0.chromakey_index = 0;
1218fa225cbcSrjs    ts->ts0.base_level = 0;
1219fa225cbcSrjs    ts->ts0.mip_filter = MIPFILTER_NONE;        /* NONE */
1220fa225cbcSrjs    ts->ts0.mag_filter = MAPFILTER_LINEAR;      /* LINEAR */
1221fa225cbcSrjs    ts->ts0.min_filter = MAPFILTER_LINEAR;      /* LINEAR */
1222fa225cbcSrjs    ts->ts0.lod_bias = 0;
1223fa225cbcSrjs    ts->ts0.shadow_enable = 0;
1224fa225cbcSrjs    ts->ts0.max_anisotropy = ANISORATIO_2;
1225fa225cbcSrjs    ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
1226fa225cbcSrjs    ts->ts1.min_lod = 0;        /* Maximum Mip Level */
1227fa225cbcSrjs    ts->ts1.kill_pixel = 0;
1228fa225cbcSrjs    ts->ts1.keyed_texture_filter = 0;
1229fa225cbcSrjs    ts->ts1.chromakey_enable = 0;
1230fa225cbcSrjs    ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
1231fa225cbcSrjs    ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
1232fa225cbcSrjs    ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
1233fa225cbcSrjs    ts->ts1.normalized_coor = 0;
1234fa225cbcSrjs    ts->ts1.map_index = 0;
1235fa225cbcSrjs    ts->ts1.east_deinterlacer = 0;
1236fa225cbcSrjs    ts->ts2.default_color = 0;
1237fa225cbcSrjs
1238fa225cbcSrjs    /* Sampler 1 */
1239fa225cbcSrjs    ++ts;
1240fa225cbcSrjs    memset(ts, 0, sizeof(*ts));
1241fa225cbcSrjs    ts->ts0.reverse_gamma = 0;
1242fa225cbcSrjs    ts->ts0.planar2packet = 1;
1243fa225cbcSrjs    ts->ts0.color_conversion = 1;
1244fa225cbcSrjs    ts->ts0.chromakey_index = 0;
1245fa225cbcSrjs    ts->ts0.base_level = 0;
1246fa225cbcSrjs    ts->ts0.mip_filter = MIPFILTER_NONE;        /* NONE */
1247fa225cbcSrjs    ts->ts0.mag_filter = MAPFILTER_LINEAR;      /* LINEAR */
1248fa225cbcSrjs    ts->ts0.min_filter = MAPFILTER_LINEAR;      /* LINEAR */
1249fa225cbcSrjs    ts->ts0.lod_bias = 0;
1250fa225cbcSrjs    ts->ts0.shadow_enable = 0;
1251fa225cbcSrjs    ts->ts0.max_anisotropy = ANISORATIO_2;
1252fa225cbcSrjs    ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
1253fa225cbcSrjs    ts->ts1.min_lod = 0;        /* Maximum Mip Level */
1254fa225cbcSrjs    ts->ts1.kill_pixel = 0;
1255fa225cbcSrjs    ts->ts1.keyed_texture_filter = 0;
1256fa225cbcSrjs    ts->ts1.chromakey_enable = 0;
1257fa225cbcSrjs    ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
1258fa225cbcSrjs    ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
1259fa225cbcSrjs    ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
1260fa225cbcSrjs    ts->ts1.normalized_coor = 0;
1261fa225cbcSrjs    ts->ts1.map_index = 1;
1262fa225cbcSrjs    ts->ts1.east_deinterlacer = 0;
1263fa225cbcSrjs    ts->ts2.default_color = 0;
1264fa225cbcSrjs
1265fa225cbcSrjs    /* Sampler 2 */
1266fa225cbcSrjs    ++ts;
1267fa225cbcSrjs    memset(ts, 0, sizeof(*ts));
1268fa225cbcSrjs    ts->ts0.reverse_gamma = 0;
1269fa225cbcSrjs    ts->ts0.planar2packet = 1;
1270fa225cbcSrjs    ts->ts0.color_conversion = 1;
1271fa225cbcSrjs    ts->ts0.chromakey_index = 0;
1272fa225cbcSrjs    ts->ts0.base_level = 0;
1273fa225cbcSrjs    ts->ts0.mip_filter = MIPFILTER_NONE;        /* NONE */
1274fa225cbcSrjs    ts->ts0.mag_filter = MAPFILTER_LINEAR;      /* LINEAR */
1275fa225cbcSrjs    ts->ts0.min_filter = MAPFILTER_LINEAR;      /* LINEAR */
1276fa225cbcSrjs    ts->ts0.lod_bias = 0;
1277fa225cbcSrjs    ts->ts0.shadow_enable = 0;
1278fa225cbcSrjs    ts->ts0.max_anisotropy = ANISORATIO_2;
1279fa225cbcSrjs    ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
1280fa225cbcSrjs    ts->ts1.min_lod = 0;        /* Maximum Mip Level */
1281fa225cbcSrjs    ts->ts1.kill_pixel = 0;
1282fa225cbcSrjs    ts->ts1.keyed_texture_filter = 0;
1283fa225cbcSrjs    ts->ts1.chromakey_enable = 0;
1284fa225cbcSrjs    ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
1285fa225cbcSrjs    ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
1286fa225cbcSrjs    ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
1287fa225cbcSrjs    ts->ts1.normalized_coor = 0;
1288fa225cbcSrjs    ts->ts1.map_index = 2;
1289fa225cbcSrjs    ts->ts1.east_deinterlacer = 0;
1290fa225cbcSrjs    ts->ts2.default_color = 0;
1291fa225cbcSrjs}
1292fa225cbcSrjs#endif
1293fa225cbcSrjs
1294fa225cbcSrjs#if 0
1295fa225cbcSrjsstatic void i915_yuv2rgb_static_indirect_state_buffer(XvMCSurface *surface,
1296fa225cbcSrjs                                                      unsigned int dstaddr,
1297fa225cbcSrjs                                                      int dstpitch)
1298fa225cbcSrjs{
1299fa225cbcSrjs    struct i915_3dstate_buffer_info *buffer_info;
1300fa225cbcSrjs    struct i915_3dstate_dest_buffer_variables *dest_buffer_variables;
1301fa225cbcSrjs    i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
1302fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
1303fa225cbcSrjs
1304fa225cbcSrjs    /* 3DSTATE_BUFFER_INFO */
1305fa225cbcSrjs    buffer_info = (struct i915_3dstate_buffer_info *)pI915XvMC->sis.map;
1306fa225cbcSrjs    memset(buffer_info, 0, sizeof(*buffer_info));
1307fa225cbcSrjs    buffer_info->dw0.type = CMD_3D;
1308fa225cbcSrjs    buffer_info->dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
1309fa225cbcSrjs    buffer_info->dw0.length = 1;
1310fa225cbcSrjs    buffer_info->dw1.aux_id = 0;
1311fa225cbcSrjs    buffer_info->dw1.buffer_id = BUFFERID_COLOR_BACK;
1312fa225cbcSrjs    buffer_info->dw1.fence_regs = 1;
1313fa225cbcSrjs    buffer_info->dw1.tiled_surface = 0;   /* linear */
1314fa225cbcSrjs    buffer_info->dw1.walk = TILEWALK_XMAJOR;
1315fa225cbcSrjs    buffer_info->dw1.pitch = dstpitch;
1316fa225cbcSrjs    buffer_info->dw2.base_address = dstaddr;
1317fa225cbcSrjs
1318fa225cbcSrjs    /* 3DSTATE_DEST_BUFFER_VARIABLES */
1319fa225cbcSrjs    dest_buffer_variables = (struct i915_3dstate_dest_buffer_variables *)(++buffer_info);
1320fa225cbcSrjs    memset(dest_buffer_variables, 0, sizeof(*dest_buffer_variables));
1321fa225cbcSrjs    dest_buffer_variables->dw0.type = CMD_3D;
1322fa225cbcSrjs    dest_buffer_variables->dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
1323fa225cbcSrjs    dest_buffer_variables->dw0.length = 0;
1324fa225cbcSrjs    dest_buffer_variables->dw1.dest_v_bias = 8; /* FIXME 0x1000 .5 ??? */
1325fa225cbcSrjs    dest_buffer_variables->dw1.dest_h_bias = 8;
1326fa225cbcSrjs    dest_buffer_variables->dw1.color_fmt = COLORBUFFER_A8R8G8B8;  /* FIXME */
1327fa225cbcSrjs}
1328fa225cbcSrjs#endif
1329fa225cbcSrjs
1330fa225cbcSrjs#if 0
1331fa225cbcSrjsstatic void i915_yuv2rgb_pixel_shader_program_buffer(XvMCSurface *surface)
1332fa225cbcSrjs{
1333fa225cbcSrjs    struct i915_3dstate_pixel_shader_program *pixel_shader_program;
1334fa225cbcSrjs    i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
1335fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
1336fa225cbcSrjs    unsigned int *inst;
1337fa225cbcSrjs    unsigned int dest, src0, src1;
1338fa225cbcSrjs
1339fa225cbcSrjs    /* Shader 0 */
1340fa225cbcSrjs    pixel_shader_program = (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
1341fa225cbcSrjs    memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
1342fa225cbcSrjs    pixel_shader_program->dw0.type = CMD_3D;
1343fa225cbcSrjs    pixel_shader_program->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
1344fa225cbcSrjs    pixel_shader_program->dw0.retain = 0;
1345fa225cbcSrjs    pixel_shader_program->dw0.length = 23;
1346fa225cbcSrjs    /* dcl      t0.xy */
1347fa225cbcSrjs    inst = (unsigned int*)(++pixel_shader_program);
1348fa225cbcSrjs    i915_inst_decl(inst, REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
1349fa225cbcSrjs    /* dcl         t1.xy */
1350fa225cbcSrjs    inst += 3;
1351fa225cbcSrjs    i915_inst_decl(inst, REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
1352fa225cbcSrjs    /* dcl_2D   s0 */
1353fa225cbcSrjs    inst += 3;
1354fa225cbcSrjs    i915_inst_decl(inst, REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
1355fa225cbcSrjs    /* dcl_2D   s1 */
1356fa225cbcSrjs    inst += 3;
1357fa225cbcSrjs    i915_inst_decl(inst, REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
1358fa225cbcSrjs    /* dcl_2D   s2 */
1359fa225cbcSrjs    inst += 3;
1360fa225cbcSrjs    i915_inst_decl(inst, REG_TYPE_S, 2, D0_SAMPLE_TYPE_2D);
1361fa225cbcSrjs    /* texld    r0 t1 s0 */
1362fa225cbcSrjs    inst += 3;
1363fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
1364fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 1); /* COORD */
1365fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
1366fa225cbcSrjs    i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
1367fa225cbcSrjs    /* texld    r0 t0 s1 */
1368fa225cbcSrjs    inst += 3;
1369fa225cbcSrjs    dest = UREG(REG_TYPE_R, 0);
1370fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 0); /* COORD */
1371fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
1372fa225cbcSrjs    i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
1373fa225cbcSrjs    /* texld    oC t1 s2 */
1374fa225cbcSrjs    inst += 3;
1375fa225cbcSrjs    dest = UREG(REG_TYPE_OC, 0);
1376fa225cbcSrjs    src0 = UREG(REG_TYPE_T, 1); /* COORD */
1377fa225cbcSrjs    src1 = UREG(REG_TYPE_S, 2); /* SAMPLER */
1378fa225cbcSrjs    i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
1379fa225cbcSrjs}
1380fa225cbcSrjs#endif
1381fa225cbcSrjs
1382fa225cbcSrjs#if 0
1383fa225cbcSrjsstatic void i915_yuv2rgb_proc(XvMCSurface *surface)
1384fa225cbcSrjs{
1385fa225cbcSrjs    i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
1386fa225cbcSrjs    i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
1387fa225cbcSrjs    struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1 = NULL;
1388fa225cbcSrjs    struct s2_dword *s2 = NULL;
1389fa225cbcSrjs    struct s3_dword *s3 = NULL;
1390fa225cbcSrjs    struct s4_dword *s4 = NULL;
1391fa225cbcSrjs    struct s5_dword *s5 = NULL;
1392fa225cbcSrjs    struct s6_dword *s6 = NULL;
1393fa225cbcSrjs    struct s7_dword *s7 = NULL;
1394fa225cbcSrjs    struct i915_3dstate_scissor_rectangle scissor_rectangle;
1395fa225cbcSrjs    struct i915_3dstate_load_indirect *load_indirect = NULL;
1396fa225cbcSrjs    sis_state *sis = NULL;
1397fa225cbcSrjs    ssb_state *ssb = NULL;
1398fa225cbcSrjs    msb_state *msb = NULL;
1399fa225cbcSrjs    psp_state *psp = NULL;
1400fa225cbcSrjs    struct i915_3dprimitive *_3dprimitive = NULL;
1401fa225cbcSrjs    struct vertex_data *vd = NULL;
1402fa225cbcSrjs    unsigned int size;
1403fa225cbcSrjs    void *base = NULL;
1404fa225cbcSrjs
1405fa225cbcSrjs    /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
1406fa225cbcSrjs    size = sizeof(*load_state_immediate_1) + sizeof(*s2) + sizeof(*s3) +
1407fa225cbcSrjs        sizeof(*s4) + sizeof(*s5) + sizeof(*s6) + sizeof(*s7);
1408fa225cbcSrjs    base = calloc(1, size);
1409fa225cbcSrjs    load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)base;
1410fa225cbcSrjs    load_state_immediate_1->dw0.type = CMD_3D;
1411fa225cbcSrjs    load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
1412fa225cbcSrjs    load_state_immediate_1->dw0.load_s2 = 1;
1413fa225cbcSrjs    load_state_immediate_1->dw0.load_s3 = 1;
1414fa225cbcSrjs    load_state_immediate_1->dw0.load_s4 = 1;
1415fa225cbcSrjs    load_state_immediate_1->dw0.load_s5 = 1;
1416fa225cbcSrjs    load_state_immediate_1->dw0.load_s6 = 1;
1417fa225cbcSrjs    load_state_immediate_1->dw0.load_s7 = 1;
1418fa225cbcSrjs    load_state_immediate_1->dw0.length = 5;
1419fa225cbcSrjs
1420fa225cbcSrjs    s2 = (struct s2_dword *)(++load_state_immediate_1);
1421fa225cbcSrjs    s2->set0_texcoord_fmt = TEXCOORDFMT_2FP;
1422fa225cbcSrjs    s2->set1_texcoord_fmt = TEXCOORDFMT_2FP;
1423fa225cbcSrjs    s2->set2_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1424fa225cbcSrjs    s2->set3_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1425fa225cbcSrjs    s2->set4_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1426fa225cbcSrjs    s2->set5_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1427fa225cbcSrjs    s2->set6_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1428fa225cbcSrjs    s2->set7_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
1429fa225cbcSrjs
1430fa225cbcSrjs    s3 = (struct s3_dword *)(++s2);
1431fa225cbcSrjs    s4 = (struct s4_dword *)(++s3);
1432fa225cbcSrjs    s4->position_mask = VERTEXHAS_XY;
1433fa225cbcSrjs    s4->cull_mode = CULLMODE_NONE;
1434fa225cbcSrjs    s4->color_shade_mode = SHADEMODE_FLAT;
1435fa225cbcSrjs    s4->specular_shade_mode = SHADEMODE_FLAT;
1436fa225cbcSrjs    s4->fog_shade_mode = SHADEMODE_FLAT;
1437fa225cbcSrjs    s4->alpha_shade_mode = SHADEMODE_FLAT;
1438fa225cbcSrjs    s4->line_width = 0x2;     /* FIXME: 1.0??? */
1439fa225cbcSrjs    s4->point_width = 0x1;
1440fa225cbcSrjs
1441fa225cbcSrjs    s5 = (struct s5_dword *)(++s4);
1442fa225cbcSrjs    s6 = (struct s6_dword *)(++s5);
1443fa225cbcSrjs    s6->src_blend_factor = 1;
1444fa225cbcSrjs    s6->dest_blend_factor = 1;
1445fa225cbcSrjs    s6->color_buffer_write = 1;
1446fa225cbcSrjs
1447fa225cbcSrjs    s7 = (struct s7_dword *)(++s6);
1448fa225cbcSrjs    intelBatchbufferData(base, size, 0);
1449fa225cbcSrjs    free(base);
1450fa225cbcSrjs
1451fa225cbcSrjs    /* 3DSTATE_3DSTATE_SCISSOR_RECTANGLE */
1452fa225cbcSrjs    scissor_rectangle.dw0.type = CMD_3D;
1453fa225cbcSrjs    scissor_rectangle.dw0.opcode = OPC_3DSTATE_SCISSOR_RECTANGLE;
1454fa225cbcSrjs    scissor_rectangle.dw0.length = 1;
1455fa225cbcSrjs    scissor_rectangle.dw1.min_x = 0;
1456fa225cbcSrjs    scissor_rectangle.dw1.min_y = 0;
1457fa225cbcSrjs    scissor_rectangle.dw2.max_x = 2047;
1458fa225cbcSrjs    scissor_rectangle.dw2.max_y = 2047;
1459fa225cbcSrjs    intelBatchbufferData(&scissor_rectangle, sizeof(scissor_rectangle), 0);
1460fa225cbcSrjs
1461fa225cbcSrjs    /* 3DSTATE_LOAD_INDIRECT */
1462fa225cbcSrjs    size = sizeof(*load_indirect) + sizeof(*sis) + sizeof(*ssb) + sizeof(*msb) + sizeof(*psp);
1463fa225cbcSrjs    base = calloc(1, size);
1464fa225cbcSrjs    load_indirect = (struct i915_3dstate_load_indirect *)base;
1465fa225cbcSrjs    load_indirect->dw0.type = CMD_3D;
1466fa225cbcSrjs    load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
1467fa225cbcSrjs    load_indirect->dw0.mem_select = 1;  /* Bearlake only */
1468fa225cbcSrjs    load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_SSB | BLOCK_MSB | BLOCK_PSP;
1469fa225cbcSrjs    load_indirect->dw0.length = 7;
1470fa225cbcSrjs
1471fa225cbcSrjs    /* SIS */
1472fa225cbcSrjs    sis = (sis_state *)(++load_indirect);
1473fa225cbcSrjs    sis->dw0.valid = 1;
1474fa225cbcSrjs    sis->dw0.buffer_address = pI915XvMC->sis.offset;
1475fa225cbcSrjs    sis->dw1.length = ((sizeof(struct i915_3dstate_buffer_info) +
1476fa225cbcSrjs                        sizeof(struct i915_3dstate_dest_buffer_variables)) >> 2) - 1;
1477fa225cbcSrjs
1478fa225cbcSrjs    /* SSB */
1479fa225cbcSrjs    ssb = (ssb_state *)(++sis);
1480fa225cbcSrjs    ssb->dw0.valid = 1;
1481fa225cbcSrjs    ssb->dw0.buffer_address = pI915XvMC->ssb.offset;
1482fa225cbcSrjs    ssb->dw1.length = ((sizeof(struct i915_3dstate_sampler_state) +
1483fa225cbcSrjs                        sizeof(struct texture_sampler) * 3) >> 2) - 1;
1484fa225cbcSrjs
1485fa225cbcSrjs    /* MSB */
1486fa225cbcSrjs    msb = (msb_state *)(++ssb);
1487fa225cbcSrjs    msb->dw0.valid = 1;
1488fa225cbcSrjs    msb->dw0.buffer_address = pI915XvMC->msb.offset;
1489fa225cbcSrjs    msb->dw1.length = ((sizeof(struct i915_3dstate_map_state) +
1490fa225cbcSrjs                        sizeof(struct texture_map) * 3) >> 2) - 1;
1491fa225cbcSrjs
1492fa225cbcSrjs    /* PSP */
1493fa225cbcSrjs    psp = (psp_state *)(++msb);
1494fa225cbcSrjs    psp->dw0.valid = 1;
1495fa225cbcSrjs    psp->dw0.buffer_address = pI915XvMC->psp.offset;
1496fa225cbcSrjs    psp->dw1.length = ((sizeof(struct i915_3dstate_pixel_shader_program) +
1497fa225cbcSrjs                        sizeof(union shader_inst)) >> 2) - 1;
1498fa225cbcSrjs
1499fa225cbcSrjs    intelBatchbufferData(base, size, 0);
1500fa225cbcSrjs    free(base);
1501fa225cbcSrjs
1502fa225cbcSrjs    /* 3DPRIMITIVE */
1503fa225cbcSrjs    size = sizeof(*_3dprimitive) + sizeof(*vd) * 3;
1504fa225cbcSrjs    base = calloc(1, size);
1505fa225cbcSrjs    _3dprimitive = (struct i915_3dprimitive *)base;
1506fa225cbcSrjs    _3dprimitive->dw0.inline_prim.type = CMD_3D;
1507fa225cbcSrjs    _3dprimitive->dw0.inline_prim.opcode = OPC_3DPRIMITIVE;
1508fa225cbcSrjs    _3dprimitive->dw0.inline_prim.vertex_location = VERTEX_INLINE;
1509fa225cbcSrjs    _3dprimitive->dw0.inline_prim.prim = PRIM_RECTLIST;
1510fa225cbcSrjs    _3dprimitive->dw0.inline_prim.length = size - 2;
1511fa225cbcSrjs
1512fa225cbcSrjs    vd = (struct vertex_data *)(++_3dprimitive);
1513fa225cbcSrjs    vd->x = 0;          /* FIXME!!! */
1514fa225cbcSrjs    vd->x = 0;          /* FIXME */
1515fa225cbcSrjs    vd->tc0.tcx = 0;
1516fa225cbcSrjs    vd->tc0.tcy = 0;
1517fa225cbcSrjs    vd->tc1.tcx = 0;
1518fa225cbcSrjs    vd->tc1.tcy = 0;
1519fa225cbcSrjs
1520fa225cbcSrjs    ++vd;
1521fa225cbcSrjs    vd->x = 0;          /* FIXME!!! */
1522fa225cbcSrjs    vd->x = 0;          /* FIXME */
1523fa225cbcSrjs    vd->tc0.tcx = 0;
1524fa225cbcSrjs    vd->tc0.tcy = 0;
1525fa225cbcSrjs    vd->tc1.tcx = 0;
1526fa225cbcSrjs    vd->tc1.tcy = 0;
1527fa225cbcSrjs
1528fa225cbcSrjs    ++vd;
1529fa225cbcSrjs    vd->x = 0;          /* FIXME!!! */
1530fa225cbcSrjs    vd->x = 0;          /* FIXME */
1531fa225cbcSrjs    vd->tc0.tcx = 0;
1532fa225cbcSrjs    vd->tc0.tcy = 0;
1533fa225cbcSrjs    vd->tc1.tcx = 0;
1534fa225cbcSrjs    vd->tc1.tcy = 0;
1535fa225cbcSrjs
1536fa225cbcSrjs    intelBatchbufferData(base, size, 0);
1537fa225cbcSrjs    free(base);
1538fa225cbcSrjs}
1539fa225cbcSrjs#endif
1540fa225cbcSrjs
1541fa225cbcSrjs/*
1542fa225cbcSrjs * Function: i915_release_resource
1543fa225cbcSrjs */
1544fa225cbcSrjsstatic void i915_release_resource(Display *display, XvMCContext *context)
1545fa225cbcSrjs{
1546fa225cbcSrjs    i915XvMCContext *pI915XvMC;
1547fa225cbcSrjs
1548fa225cbcSrjs    if (!(pI915XvMC = context->privData))
1549fa225cbcSrjs        return;
1550fa225cbcSrjs
1551fa225cbcSrjs    pI915XvMC->ref--;
1552fa225cbcSrjs    i915_xvmc_unmap_buffers(pI915XvMC);
1553fa225cbcSrjs
1554fa225cbcSrjs    free(pI915XvMC);
1555fa225cbcSrjs    context->privData = NULL;
1556fa225cbcSrjs}
1557fa225cbcSrjs
1558fa225cbcSrjsstatic Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context,
1559fa225cbcSrjs	int priv_count, CARD32 *priv_data)
1560fa225cbcSrjs{
1561fa225cbcSrjs    i915XvMCContext *pI915XvMC = NULL;
1562fa225cbcSrjs    I915XvMCCreateContextRec *tmpComm = NULL;
1563fa225cbcSrjs
1564fa225cbcSrjs    XVMC_DBG("%s\n", __FUNCTION__);
1565fa225cbcSrjs
1566fa225cbcSrjs    if (priv_count != (sizeof(I915XvMCCreateContextRec) >> 2)) {
1567fa225cbcSrjs        XVMC_ERR("_xvmc_create_context() returned incorrect data size!");
1568fa225cbcSrjs        XVMC_INFO("\tExpected %d, got %d",
1569fa225cbcSrjs               (int)(sizeof(I915XvMCCreateContextRec) >> 2),priv_count);
1570fa225cbcSrjs        _xvmc_destroy_context(display, context);
1571fa225cbcSrjs        XFree(priv_data);
1572fa225cbcSrjs        context->privData = NULL;
1573fa225cbcSrjs        return BadValue;
1574fa225cbcSrjs    }
1575fa225cbcSrjs
1576fa225cbcSrjs    context->privData = (void *)calloc(1, sizeof(i915XvMCContext));
1577fa225cbcSrjs    if (!context->privData) {
1578fa225cbcSrjs        XVMC_ERR("Unable to allocate resources for XvMC context.");
1579fa225cbcSrjs        return BadAlloc;
1580fa225cbcSrjs    }
1581fa225cbcSrjs    pI915XvMC = (i915XvMCContext *)context->privData;
1582fa225cbcSrjs
1583fa225cbcSrjs    tmpComm = (I915XvMCCreateContextRec *)priv_data;
1584fa225cbcSrjs    pI915XvMC->ctxno = tmpComm->ctxno;
1585fa225cbcSrjs    pI915XvMC->deviceID = tmpComm->deviceID;
1586fa225cbcSrjs    pI915XvMC->sis.handle = tmpComm->sis.handle;
1587fa225cbcSrjs    pI915XvMC->sis.offset = tmpComm->sis.offset;
1588fa225cbcSrjs    pI915XvMC->sis.size = tmpComm->sis.size;
1589fa225cbcSrjs    pI915XvMC->ssb.handle = tmpComm->ssb.handle;
1590fa225cbcSrjs    pI915XvMC->ssb.offset = tmpComm->ssb.offset;
1591fa225cbcSrjs    pI915XvMC->ssb.size = tmpComm->ssb.size;
1592fa225cbcSrjs    pI915XvMC->msb.handle = tmpComm->msb.handle;
1593fa225cbcSrjs    pI915XvMC->msb.offset = tmpComm->msb.offset;
1594fa225cbcSrjs    pI915XvMC->msb.size = tmpComm->msb.size;
1595fa225cbcSrjs    pI915XvMC->psp.handle = tmpComm->psp.handle;
1596fa225cbcSrjs    pI915XvMC->psp.offset = tmpComm->psp.offset;
1597fa225cbcSrjs    pI915XvMC->psp.size = tmpComm->psp.size;
1598fa225cbcSrjs    pI915XvMC->psc.handle = tmpComm->psc.handle;
1599fa225cbcSrjs    pI915XvMC->psc.offset = tmpComm->psc.offset;
1600fa225cbcSrjs    pI915XvMC->psc.size = tmpComm->psc.size;
1601fa225cbcSrjs
1602fa225cbcSrjs    if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
1603fa225cbcSrjs        pI915XvMC->deviceID == PCI_CHIP_I915_GM) {
1604fa225cbcSrjs        pI915XvMC->sis.bus_addr = tmpComm->sis.bus_addr;
1605fa225cbcSrjs        pI915XvMC->ssb.bus_addr = tmpComm->ssb.bus_addr;
1606fa225cbcSrjs        pI915XvMC->msb.bus_addr = tmpComm->msb.bus_addr;
1607fa225cbcSrjs        pI915XvMC->psp.bus_addr = tmpComm->psp.bus_addr;
1608fa225cbcSrjs        pI915XvMC->psc.bus_addr = tmpComm->psc.bus_addr;
1609fa225cbcSrjs    }
1610fa225cbcSrjs
1611fa225cbcSrjs    pI915XvMC->corrdata.handle = tmpComm->corrdata.handle;
1612fa225cbcSrjs    pI915XvMC->corrdata.offset = tmpComm->corrdata.offset;
1613fa225cbcSrjs    pI915XvMC->corrdata.size = tmpComm->corrdata.size;
1614fa225cbcSrjs
1615fa225cbcSrjs    /* Must free the private data we were passed from X */
1616fa225cbcSrjs    XFree(priv_data);
1617fa225cbcSrjs    priv_data = NULL;
1618fa225cbcSrjs
1619fa225cbcSrjs    if (i915_xvmc_map_buffers(pI915XvMC)) {
1620fa225cbcSrjs        i915_xvmc_unmap_buffers(pI915XvMC);
1621fa225cbcSrjs        free(pI915XvMC);
1622fa225cbcSrjs        context->privData = NULL;
1623fa225cbcSrjs        return BadAlloc;
1624fa225cbcSrjs    }
1625fa225cbcSrjs
1626fa225cbcSrjs    /* Initialize private context values */
1627fa225cbcSrjs    pI915XvMC->yStride = STRIDE(context->width);
1628fa225cbcSrjs    pI915XvMC->uvStride = STRIDE(context->width >> 1);
1629fa225cbcSrjs    pI915XvMC->haveXv = 0;
1630fa225cbcSrjs    pI915XvMC->dual_prime = 0;
1631fa225cbcSrjs    pI915XvMC->last_flip = 0;
1632fa225cbcSrjs    pI915XvMC->port = context->port;
1633fa225cbcSrjs    pI915XvMC->ref = 1;
1634fa225cbcSrjs
1635fa225cbcSrjs    /* pre-init state buffers */
1636fa225cbcSrjs    i915_mc_one_time_context_init(context);
1637fa225cbcSrjs    i915_mc_one_time_state_init(context);
1638fa225cbcSrjs
1639fa225cbcSrjs    i915_mc_static_indirect_state_init(context);
1640fa225cbcSrjs
1641fa225cbcSrjs    i915_mc_map_state_init(context);
1642fa225cbcSrjs
1643fa225cbcSrjs    i915_mc_load_indirect_render_init(context);
1644fa225cbcSrjs    return Success;
1645fa225cbcSrjs}
1646fa225cbcSrjs
1647fa225cbcSrjsstatic int i915_xvmc_mc_destroy_context(Display *display, XvMCContext *context)
1648fa225cbcSrjs{
1649fa225cbcSrjs    i915XvMCContext *pI915XvMC;
1650fa225cbcSrjs
1651fa225cbcSrjs    if (!(pI915XvMC = context->privData))
1652fa225cbcSrjs        return XvMCBadContext;
1653fa225cbcSrjs
1654fa225cbcSrjs    /* Pass Control to the X server to destroy the drm_context_t */
1655fa225cbcSrjs    i915_release_resource(display,context);
1656fa225cbcSrjs
1657fa225cbcSrjs    free(one_time_load_state_imm1);
1658fa225cbcSrjs    free(one_time_load_indirect);
1659fa225cbcSrjs    free(mc_render_load_indirect);
1660fa225cbcSrjs    return Success;
1661fa225cbcSrjs}
1662fa225cbcSrjs
1663fa225cbcSrjsstatic Status i915_xvmc_mc_create_surface(Display *display,
1664fa225cbcSrjs	XvMCContext *context, XvMCSurface *surface, int priv_count,
1665fa225cbcSrjs	CARD32 *priv_data)
1666fa225cbcSrjs{
1667fa225cbcSrjs    i915XvMCContext *pI915XvMC;
1668fa225cbcSrjs    i915XvMCSurface *pI915Surface;
1669fa225cbcSrjs    I915XvMCCreateSurfaceRec *tmpComm = NULL;
1670fa225cbcSrjs
1671fa225cbcSrjs    if (!(pI915XvMC = context->privData))
1672fa225cbcSrjs        return XvMCBadContext;
1673fa225cbcSrjs
1674fa225cbcSrjs    XVMC_DBG("%s\n", __FUNCTION__);
1675fa225cbcSrjs
1676fa225cbcSrjs    if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
1677fa225cbcSrjs        XVMC_ERR("_xvmc_create_surface() returned incorrect data size!");
1678fa225cbcSrjs        XVMC_INFO("\tExpected %d, got %d",
1679fa225cbcSrjs               (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2), priv_count);
1680fa225cbcSrjs        _xvmc_destroy_surface(display, surface);
1681fa225cbcSrjs        XFree(priv_data);
1682fa225cbcSrjs        return BadAlloc;
1683fa225cbcSrjs    }
1684fa225cbcSrjs
1685fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
1686fa225cbcSrjs    surface->privData = (i915XvMCSurface *)malloc(sizeof(i915XvMCSurface));
1687fa225cbcSrjs
1688fa225cbcSrjs    if (!(pI915Surface = surface->privData)) {
1689fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
1690fa225cbcSrjs        return BadAlloc;
1691fa225cbcSrjs    }
1692fa225cbcSrjs
1693fa225cbcSrjs    /* Initialize private values */
1694fa225cbcSrjs    pI915Surface->last_render = 0;
1695fa225cbcSrjs    pI915Surface->last_flip = 0;
1696fa225cbcSrjs    pI915Surface->yStride = pI915XvMC->yStride;
1697fa225cbcSrjs    pI915Surface->uvStride = pI915XvMC->uvStride;
1698fa225cbcSrjs    pI915Surface->width = context->width;
1699fa225cbcSrjs    pI915Surface->height = context->height;
1700fa225cbcSrjs    pI915Surface->privContext = pI915XvMC;
1701fa225cbcSrjs    pI915Surface->privSubPic = NULL;
1702fa225cbcSrjs    pI915Surface->srf.map = NULL;
1703fa225cbcSrjs
1704fa225cbcSrjs    tmpComm = (I915XvMCCreateSurfaceRec *)priv_data;
1705fa225cbcSrjs
1706fa225cbcSrjs    pI915Surface->srfNo = tmpComm->srfno;
1707fa225cbcSrjs    pI915Surface->srf.handle = tmpComm->srf.handle;
1708fa225cbcSrjs    pI915Surface->srf.offset = tmpComm->srf.offset;
1709fa225cbcSrjs    pI915Surface->srf.size = tmpComm->srf.size;
1710fa225cbcSrjs
1711fa225cbcSrjs    XFree(priv_data);
1712fa225cbcSrjs
1713fa225cbcSrjs    if (drmMap(xvmc_driver->fd,
1714fa225cbcSrjs               pI915Surface->srf.handle,
1715fa225cbcSrjs               pI915Surface->srf.size,
1716fa225cbcSrjs               (drmAddress *)&pI915Surface->srf.map) != 0) {
1717fa225cbcSrjs	XVMC_ERR("mapping surface memory failed!\n");
1718fa225cbcSrjs        _xvmc_destroy_surface(display, surface);
1719fa225cbcSrjs        free(pI915Surface);
1720fa225cbcSrjs        surface->privData = NULL;
1721fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
1722fa225cbcSrjs        return BadAlloc;
1723fa225cbcSrjs    }
1724fa225cbcSrjs
1725fa225cbcSrjs    pI915XvMC->ref++;
1726fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
1727fa225cbcSrjs    return 0;
1728fa225cbcSrjs}
1729fa225cbcSrjs
1730fa225cbcSrjs
1731fa225cbcSrjsstatic int i915_xvmc_mc_destroy_surface(Display *display, XvMCSurface *surface)
1732fa225cbcSrjs{
1733fa225cbcSrjs    i915XvMCSurface *pI915Surface;
1734fa225cbcSrjs    i915XvMCContext *pI915XvMC;
1735fa225cbcSrjs
1736fa225cbcSrjs    if (!display || !surface)
1737fa225cbcSrjs        return BadValue;
1738fa225cbcSrjs
1739fa225cbcSrjs    if (!(pI915Surface = surface->privData))
1740fa225cbcSrjs        return XvMCBadSurface;
1741fa225cbcSrjs
1742fa225cbcSrjs    if (!(pI915XvMC = pI915Surface->privContext))
1743fa225cbcSrjs        return XvMCBadSurface;
1744fa225cbcSrjs
1745fa225cbcSrjs    if (pI915Surface->last_flip)
1746fa225cbcSrjs        XvMCSyncSurface(display,surface);
1747fa225cbcSrjs
1748fa225cbcSrjs    if (pI915Surface->srf.map)
1749fa225cbcSrjs        drmUnmap(pI915Surface->srf.map, pI915Surface->srf.size);
1750fa225cbcSrjs
1751fa225cbcSrjs    free(pI915Surface);
1752fa225cbcSrjs    surface->privData = NULL;
1753fa225cbcSrjs    pI915XvMC->ref--;
1754fa225cbcSrjs
1755fa225cbcSrjs    return Success;
1756fa225cbcSrjs}
1757fa225cbcSrjs
1758fa225cbcSrjs
1759fa225cbcSrjsstatic int i915_xvmc_mc_render_surface(Display *display, XvMCContext *context,
1760fa225cbcSrjs                         unsigned int picture_structure,
1761fa225cbcSrjs                         XvMCSurface *target_surface,
1762fa225cbcSrjs                         XvMCSurface *past_surface,
1763fa225cbcSrjs                         XvMCSurface *future_surface,
1764fa225cbcSrjs                         unsigned int flags,
1765fa225cbcSrjs                         unsigned int num_macroblocks,
1766fa225cbcSrjs                         unsigned int first_macroblock,
1767fa225cbcSrjs                         XvMCMacroBlockArray *macroblock_array,
1768fa225cbcSrjs                         XvMCBlockArray *blocks)
1769fa225cbcSrjs{
1770fa225cbcSrjs    int i;
1771fa225cbcSrjs    int picture_coding_type = MPEG_I_PICTURE;
1772fa225cbcSrjs    /* correction data buffer */
1773fa225cbcSrjs    char *corrdata_ptr;
1774fa225cbcSrjs    int corrdata_size = 0;
1775fa225cbcSrjs
1776fa225cbcSrjs    /* Block Pointer */
1777fa225cbcSrjs    short *block_ptr;
1778fa225cbcSrjs    /* Current Macroblock Pointer */
1779fa225cbcSrjs    XvMCMacroBlock *mb;
1780fa225cbcSrjs
1781fa225cbcSrjs    intel_xvmc_context_ptr intel_ctx;
1782fa225cbcSrjs
1783fa225cbcSrjs    i915XvMCSurface *privTarget = NULL;
1784fa225cbcSrjs    i915XvMCSurface *privFuture = NULL;
1785fa225cbcSrjs    i915XvMCSurface *privPast = NULL;
1786fa225cbcSrjs    i915XvMCContext *pI915XvMC = NULL;
1787fa225cbcSrjs
1788fa225cbcSrjs    XVMC_DBG("%s\n", __FUNCTION__);
1789fa225cbcSrjs
1790fa225cbcSrjs    /* Check Parameters for validity */
1791fa225cbcSrjs    if (!display || !context || !target_surface) {
1792fa225cbcSrjs        XVMC_ERR("Invalid Display, Context or Target!");
1793fa225cbcSrjs        return BadValue;
1794fa225cbcSrjs    }
1795fa225cbcSrjs
1796fa225cbcSrjs    if (!num_macroblocks)
1797fa225cbcSrjs        return Success;
1798fa225cbcSrjs
1799fa225cbcSrjs    if (!macroblock_array || !blocks) {
1800fa225cbcSrjs        XVMC_ERR("Invalid block data!");
1801fa225cbcSrjs        return BadValue;
1802fa225cbcSrjs    }
1803fa225cbcSrjs
1804fa225cbcSrjs    if (macroblock_array->num_blocks < (num_macroblocks + first_macroblock)) {
1805fa225cbcSrjs        XVMC_ERR("Too many macroblocks requested for MB array size.");
1806fa225cbcSrjs        return BadValue;
1807fa225cbcSrjs    }
1808fa225cbcSrjs
1809fa225cbcSrjs    if (!(pI915XvMC = context->privData))
1810fa225cbcSrjs        return XvMCBadContext;
1811fa225cbcSrjs
1812fa225cbcSrjs    if (!(privTarget = target_surface->privData))
1813fa225cbcSrjs        return XvMCBadSurface;
1814fa225cbcSrjs
1815fa225cbcSrjs    if (context->surface_type_id >= SURFACE_TYPE_MAX) {
1816fa225cbcSrjs        XVMC_ERR("Unsupprted surface_type_id %d.", context->surface_type_id);
1817fa225cbcSrjs        return BadValue;
1818fa225cbcSrjs    }
1819fa225cbcSrjs
1820fa225cbcSrjs    intel_ctx = intel_xvmc_find_context(context->context_id);
1821fa225cbcSrjs    if (!intel_ctx) {
1822fa225cbcSrjs	XVMC_ERR("Can't find intel xvmc context\n");
1823fa225cbcSrjs	return BadValue;
1824fa225cbcSrjs    }
1825fa225cbcSrjs
1826fa225cbcSrjs    /* P Frame Test */
1827fa225cbcSrjs    if (!past_surface) {
1828fa225cbcSrjs        /* Just to avoid some ifs later. */
1829fa225cbcSrjs        privPast = privTarget;
1830fa225cbcSrjs    } else {
1831fa225cbcSrjs        if (!(privPast = past_surface->privData)) {
1832fa225cbcSrjs            XVMC_ERR("Invalid Past Surface!");
1833fa225cbcSrjs            return XvMCBadSurface;
1834fa225cbcSrjs        }
1835fa225cbcSrjs        picture_coding_type = MPEG_P_PICTURE;
1836fa225cbcSrjs    }
1837fa225cbcSrjs
1838fa225cbcSrjs    /* B Frame Test */
1839fa225cbcSrjs    if (!future_surface) {
1840fa225cbcSrjs        privFuture = privPast; // privTarget;
1841fa225cbcSrjs    } else {
1842fa225cbcSrjs        if (!past_surface) {
1843fa225cbcSrjs            XVMC_ERR("No Past Surface!");
1844fa225cbcSrjs            return BadValue;
1845fa225cbcSrjs        }
1846fa225cbcSrjs
1847fa225cbcSrjs        if (!(privFuture = future_surface->privData)) {
1848fa225cbcSrjs            XVMC_ERR("Invalid Future Surface!");
1849fa225cbcSrjs            return XvMCBadSurface;
1850fa225cbcSrjs        }
1851fa225cbcSrjs
1852fa225cbcSrjs        picture_coding_type = MPEG_B_PICTURE;
1853fa225cbcSrjs    }
1854fa225cbcSrjs
1855fa225cbcSrjs    LOCK_HARDWARE(intel_ctx->hw_context);
1856fa225cbcSrjs    corrdata_ptr = pI915XvMC->corrdata.map;
1857fa225cbcSrjs    corrdata_size = 0;
1858fa225cbcSrjs
1859fa225cbcSrjs    for (i = first_macroblock; i < (num_macroblocks + first_macroblock); i++) {
1860fa225cbcSrjs        int bspm = 0;
1861fa225cbcSrjs        mb = &macroblock_array->macro_blocks[i];
1862fa225cbcSrjs        block_ptr = &(blocks->blocks[mb->index << 6]);
1863fa225cbcSrjs
1864fa225cbcSrjs        /* Lockup can happen if the coordinates are too far out of range */
1865fa225cbcSrjs        if (mb->x > (target_surface->width >> 4)) {
1866fa225cbcSrjs            mb->x = 0;
1867fa225cbcSrjs            XVMC_INFO("reset x");
1868fa225cbcSrjs        }
1869fa225cbcSrjs
1870fa225cbcSrjs        if (mb->y > (target_surface->height >> 4)) {
1871fa225cbcSrjs            mb->y = 0;
1872fa225cbcSrjs            XVMC_INFO("reset y");
1873fa225cbcSrjs        }
1874fa225cbcSrjs
1875fa225cbcSrjs        /* Catch no pattern case */
1876fa225cbcSrjs        if (!(mb->macroblock_type & XVMC_MB_TYPE_PATTERN) &&
1877fa225cbcSrjs            !(mb->macroblock_type & XVMC_MB_TYPE_INTRA) &&
1878fa225cbcSrjs            mb->coded_block_pattern) {
1879fa225cbcSrjs            mb->coded_block_pattern = 0;
1880fa225cbcSrjs            XVMC_INFO("no coded blocks present!");
1881fa225cbcSrjs        }
1882fa225cbcSrjs
1883fa225cbcSrjs        bspm = mb_bytes_420[mb->coded_block_pattern];
1884fa225cbcSrjs
1885fa225cbcSrjs        if (!bspm)
1886fa225cbcSrjs            continue;
1887fa225cbcSrjs
1888fa225cbcSrjs        corrdata_size += bspm;
1889fa225cbcSrjs
1890fa225cbcSrjs        if (corrdata_size > pI915XvMC->corrdata.size) {
1891fa225cbcSrjs            XVMC_ERR("correction data buffer overflow.");
1892fa225cbcSrjs            break;
1893fa225cbcSrjs        }
1894fa225cbcSrjs        memcpy(corrdata_ptr, block_ptr, bspm);
1895fa225cbcSrjs        corrdata_ptr += bspm;
1896fa225cbcSrjs    }
1897fa225cbcSrjs
1898fa225cbcSrjs    i915_flush(1, 0);
1899fa225cbcSrjs    // i915_mc_invalidate_subcontext_buffers(context, BLOCK_SIS | BLOCK_DIS | BLOCK_SSB
1900fa225cbcSrjs    // | BLOCK_MSB | BLOCK_PSP | BLOCK_PSC);
1901fa225cbcSrjs
1902fa225cbcSrjs    i915_mc_one_time_state_emit();
1903fa225cbcSrjs
1904fa225cbcSrjs    i915_mc_static_indirect_state_set(context, target_surface, picture_structure,
1905fa225cbcSrjs	    flags, picture_coding_type);
1906fa225cbcSrjs    /* setup reference surfaces */
1907fa225cbcSrjs    i915_mc_map_state_set(context, privPast, privFuture);
1908fa225cbcSrjs
1909fa225cbcSrjs    i915_mc_load_indirect_render_emit();
1910fa225cbcSrjs
1911fa225cbcSrjs    i915_mc_mpeg_set_origin(context, &macroblock_array->macro_blocks[first_macroblock]);
1912fa225cbcSrjs
1913fa225cbcSrjs    for (i = first_macroblock; i < (num_macroblocks + first_macroblock); i++) {
1914fa225cbcSrjs        mb = &macroblock_array->macro_blocks[i];
1915fa225cbcSrjs
1916fa225cbcSrjs        /* Intra Blocks */
1917fa225cbcSrjs        if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
1918fa225cbcSrjs            i915_mc_mpeg_macroblock_ipicture(context, mb);
1919fa225cbcSrjs        } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
1920fa225cbcSrjs	    /* Frame Picture */
1921fa225cbcSrjs            switch (mb->motion_type & 3) {
1922fa225cbcSrjs            case XVMC_PREDICTION_FIELD: /* Field Based */
1923fa225cbcSrjs                i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
1924fa225cbcSrjs                break;
1925fa225cbcSrjs
1926fa225cbcSrjs            case XVMC_PREDICTION_FRAME: /* Frame Based */
1927fa225cbcSrjs                i915_mc_mpeg_macroblock_1fbmv(context, mb);
1928fa225cbcSrjs                break;
1929fa225cbcSrjs
1930fa225cbcSrjs            case XVMC_PREDICTION_DUAL_PRIME:    /* Dual Prime */
1931fa225cbcSrjs                i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
1932fa225cbcSrjs                break;
1933fa225cbcSrjs
1934fa225cbcSrjs            default:    /* No Motion Type */
1935fa225cbcSrjs		XVMC_ERR("Invalid Macroblock Parameters found.");
1936fa225cbcSrjs                break;
1937fa225cbcSrjs            }
1938fa225cbcSrjs        } else {        /* Field Picture */
1939fa225cbcSrjs            switch (mb->motion_type & 3) {
1940fa225cbcSrjs            case XVMC_PREDICTION_FIELD: /* Field Based */
1941fa225cbcSrjs                i915_mc_mpeg_macroblock_1fbmv(context, mb);
1942fa225cbcSrjs                break;
1943fa225cbcSrjs
1944fa225cbcSrjs            case XVMC_PREDICTION_16x8:  /* 16x8 MC */
1945fa225cbcSrjs                i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
1946fa225cbcSrjs                break;
1947fa225cbcSrjs
1948fa225cbcSrjs            case XVMC_PREDICTION_DUAL_PRIME:    /* Dual Prime */
1949fa225cbcSrjs                i915_mc_mpeg_macroblock_1fbmv(context, mb);
1950fa225cbcSrjs                break;
1951fa225cbcSrjs
1952fa225cbcSrjs            default:    /* No Motion Type */
1953fa225cbcSrjs		XVMC_ERR("Invalid Macroblock Parameters found.");
1954fa225cbcSrjs                break;
1955fa225cbcSrjs            }
1956fa225cbcSrjs        }
1957fa225cbcSrjs    }
1958fa225cbcSrjs
1959fa225cbcSrjs    intelFlushBatch(TRUE);
1960fa225cbcSrjs    xvmc_driver->last_render = xvmc_driver->alloc.irq_emitted;
1961fa225cbcSrjs    privTarget->last_render = xvmc_driver->last_render;
1962fa225cbcSrjs
1963fa225cbcSrjs    UNLOCK_HARDWARE(intel_ctx->hw_context);
1964fa225cbcSrjs    return 0;
1965fa225cbcSrjs}
1966fa225cbcSrjs
1967fa225cbcSrjsstatic int i915_xvmc_mc_put_surface(Display *display,XvMCSurface *surface,
1968fa225cbcSrjs                      Drawable draw, short srcx, short srcy,
1969fa225cbcSrjs                      unsigned short srcw, unsigned short srch,
1970fa225cbcSrjs                      short destx, short desty,
1971fa225cbcSrjs                      unsigned short destw, unsigned short desth,
1972fa225cbcSrjs                      int flags, struct intel_xvmc_command *data)
1973fa225cbcSrjs{
1974fa225cbcSrjs    i915XvMCContext *pI915XvMC;
1975fa225cbcSrjs    i915XvMCSurface *pI915Surface;
1976fa225cbcSrjs    i915XvMCSubpicture *pI915SubPic;
1977fa225cbcSrjs
1978fa225cbcSrjs    if (!(pI915Surface = surface->privData))
1979fa225cbcSrjs        return XvMCBadSurface;
1980fa225cbcSrjs
1981fa225cbcSrjs    if (!(pI915XvMC = pI915Surface->privContext))
1982fa225cbcSrjs        return XvMCBadSurface;
1983fa225cbcSrjs
1984fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
1985fa225cbcSrjs
1986fa225cbcSrjs    data->command = INTEL_XVMC_COMMAND_DISPLAY;
1987fa225cbcSrjs    data->ctxNo = pI915XvMC->ctxno;
1988fa225cbcSrjs    data->srfNo = pI915Surface->srfNo;
1989fa225cbcSrjs    pI915SubPic = pI915Surface->privSubPic;
1990fa225cbcSrjs    data->subPicNo = (!pI915SubPic ? 0 : pI915SubPic->srfNo);
1991fa225cbcSrjs    data->real_id = FOURCC_YV12;
1992fa225cbcSrjs    data->flags = flags;
1993fa225cbcSrjs
1994fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
1995fa225cbcSrjs
1996fa225cbcSrjs    return 0;
1997fa225cbcSrjs}
1998fa225cbcSrjs
1999fa225cbcSrjsstatic int i915_xvmc_mc_get_surface_status(Display *display,
2000fa225cbcSrjs	XvMCSurface *surface, int *stat)
2001fa225cbcSrjs{
2002fa225cbcSrjs    i915XvMCSurface *pI915Surface;
2003fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2004fa225cbcSrjs
2005fa225cbcSrjs    if (!display || !surface || !stat)
2006fa225cbcSrjs        return BadValue;
2007fa225cbcSrjs
2008fa225cbcSrjs    *stat = 0;
2009fa225cbcSrjs
2010fa225cbcSrjs    if (!(pI915Surface = surface->privData))
2011fa225cbcSrjs        return XvMCBadSurface;
2012fa225cbcSrjs
2013fa225cbcSrjs    if (!(pI915XvMC = pI915Surface->privContext))
2014fa225cbcSrjs        return XvMCBadSurface;
2015fa225cbcSrjs
2016fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
2017fa225cbcSrjs    if (pI915Surface->last_flip) {
2018fa225cbcSrjs        /* This can not happen */
2019fa225cbcSrjs        if (pI915XvMC->last_flip < pI915Surface->last_flip) {
2020fa225cbcSrjs            XVMC_ERR("Context last flip is less than surface last flip.");
2021fa225cbcSrjs            PPTHREAD_MUTEX_UNLOCK();
2022fa225cbcSrjs            return BadValue;
2023fa225cbcSrjs        }
2024fa225cbcSrjs
2025fa225cbcSrjs        /*
2026fa225cbcSrjs          If the context has 2 or more flips after this surface it
2027fa225cbcSrjs          cannot be displaying. Don't bother to check.
2028fa225cbcSrjs        */
2029fa225cbcSrjs        if (!(pI915XvMC->last_flip > (pI915Surface->last_flip + 1))) {
2030fa225cbcSrjs            /*
2031fa225cbcSrjs              If this surface was the last flipped it is either displaying
2032fa225cbcSrjs              or about to be so don't bother checking.
2033fa225cbcSrjs            */
2034fa225cbcSrjs            if (pI915XvMC->last_flip == pI915Surface->last_flip) {
2035fa225cbcSrjs                *stat |= XVMC_DISPLAYING;
2036fa225cbcSrjs            }
2037fa225cbcSrjs        }
2038fa225cbcSrjs    }
2039fa225cbcSrjs
2040fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
2041fa225cbcSrjs    return 0;
2042fa225cbcSrjs}
2043fa225cbcSrjs
2044fa225cbcSrjs/* XXX WIP code */
2045fa225cbcSrjs#if 0
2046fa225cbcSrjsStatus XvMCHideSurface(Display *display, XvMCSurface *surface)
2047fa225cbcSrjs{
2048fa225cbcSrjs    i915XvMCSurface *pI915Surface;
2049fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2050fa225cbcSrjs    int stat = 0, ret;
2051fa225cbcSrjs
2052fa225cbcSrjs    if (!display || !surface)
2053fa225cbcSrjs        return BadValue;
2054fa225cbcSrjs
2055fa225cbcSrjs    if (!(pI915Surface = surface->privData))
2056fa225cbcSrjs        return XvMCBadSurface;
2057fa225cbcSrjs
2058fa225cbcSrjs    /* Get the associated context pointer */
2059fa225cbcSrjs    if (!(pI915XvMC = pI915Surface->privContext))
2060fa225cbcSrjs        return XvMCBadSurface;
2061fa225cbcSrjs
2062fa225cbcSrjs    XvMCSyncSurface(display, surface);
2063fa225cbcSrjs
2064fa225cbcSrjs    /*
2065fa225cbcSrjs      Get the status of the surface, if it is not currently displayed
2066fa225cbcSrjs      we don't need to worry about it.
2067fa225cbcSrjs    */
2068fa225cbcSrjs    if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
2069fa225cbcSrjs        return ret;
2070fa225cbcSrjs
2071fa225cbcSrjs    if (!(stat & XVMC_DISPLAYING))
2072fa225cbcSrjs        return Success;
2073fa225cbcSrjs
2074fa225cbcSrjs    /* FIXME: */
2075fa225cbcSrjs    return Success;
2076fa225cbcSrjs}
2077fa225cbcSrjs
2078fa225cbcSrjsStatus i915_xvmc_create_subpict(Display *display, XvMCContext *context,
2079fa225cbcSrjs                            XvMCSubpicture *subpicture,
2080fa225cbcSrjs                            unsigned short width, unsigned short height,
2081fa225cbcSrjs                            int xvimage_id)
2082fa225cbcSrjs{
2083fa225cbcSrjs    Status ret;
2084fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2085fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2086fa225cbcSrjs    I915XvMCCreateSurfaceRec *tmpComm = NULL;
2087fa225cbcSrjs    int priv_count;
2088fa225cbcSrjs    uint *priv_data;
2089fa225cbcSrjs
2090fa225cbcSrjs    if (!subpicture || !context || !display)
2091fa225cbcSrjs        return BadValue;
2092fa225cbcSrjs
2093fa225cbcSrjs    pI915XvMC = (i915XvMCContext *)context->privData;
2094fa225cbcSrjs
2095fa225cbcSrjs    if (!pI915XvMC)
2096fa225cbcSrjs        return XvMCBadContext;
2097fa225cbcSrjs
2098fa225cbcSrjs    subpicture->privData =
2099fa225cbcSrjs        (i915XvMCSubpicture *)malloc(sizeof(i915XvMCSubpicture));
2100fa225cbcSrjs
2101fa225cbcSrjs    if (!subpicture->privData)
2102fa225cbcSrjs        return BadAlloc;
2103fa225cbcSrjs
2104fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
2105fa225cbcSrjs    subpicture->context_id = context->context_id;
2106fa225cbcSrjs    subpicture->xvimage_id = xvimage_id;
2107fa225cbcSrjs    subpicture->width = width;
2108fa225cbcSrjs    subpicture->height = height;
2109fa225cbcSrjs    pI915Subpicture = (i915XvMCSubpicture *)subpicture->privData;
2110fa225cbcSrjs
2111fa225cbcSrjs    XLockDisplay(display);
2112fa225cbcSrjs    if ((ret = _xvmc_create_subpicture(display, context, subpicture,
2113fa225cbcSrjs                                       &priv_count, &priv_data))) {
2114fa225cbcSrjs        XUnlockDisplay(display);
2115fa225cbcSrjs        XVMC_ERR("Unable to create XvMCSubpicture.");
2116fa225cbcSrjs        free(pI915Subpicture);
2117fa225cbcSrjs        subpicture->privData = NULL;
2118fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
2119fa225cbcSrjs        return ret;
2120fa225cbcSrjs    }
2121fa225cbcSrjs    XUnlockDisplay(display);
2122fa225cbcSrjs
2123fa225cbcSrjs    if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
2124fa225cbcSrjs        XVMC_ERR("_xvmc_create_subpicture() returned incorrect data size!");
2125fa225cbcSrjs        XVMC_INFO("\tExpected %d, got %d",
2126fa225cbcSrjs               (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2), priv_count);
2127fa225cbcSrjs        XLockDisplay(display);
2128fa225cbcSrjs        _xvmc_destroy_subpicture(display, subpicture);
2129fa225cbcSrjs        XUnlockDisplay(display);
2130fa225cbcSrjs        XFree(priv_data);
2131fa225cbcSrjs        free(pI915Subpicture);
2132fa225cbcSrjs        subpicture->privData = NULL;
2133fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
2134fa225cbcSrjs        return BadAlloc;
2135fa225cbcSrjs    }
2136fa225cbcSrjs
2137fa225cbcSrjs    tmpComm = (I915XvMCCreateSurfaceRec *)priv_data;
2138fa225cbcSrjs    pI915Subpicture->srfNo = tmpComm->srfno;
2139fa225cbcSrjs    pI915Subpicture->srf.handle = tmpComm->srf.handle;
2140fa225cbcSrjs    pI915Subpicture->srf.offset = tmpComm->srf.offset;
2141fa225cbcSrjs    pI915Subpicture->srf.size = tmpComm->srf.size;
2142fa225cbcSrjs    XFree(priv_data);
2143fa225cbcSrjs
2144fa225cbcSrjs    if (drmMap(pI915XvMC->fd,
2145fa225cbcSrjs               pI915Subpicture->srf.handle,
2146fa225cbcSrjs               pI915Subpicture->srf.size,
2147fa225cbcSrjs               (drmAddress *)&pI915Subpicture->srf.map) != 0) {
2148fa225cbcSrjs        XLockDisplay(display);
2149fa225cbcSrjs        _xvmc_destroy_subpicture(display, subpicture);
2150fa225cbcSrjs        XUnlockDisplay(display);
2151fa225cbcSrjs        free(pI915Subpicture);
2152fa225cbcSrjs        subpicture->privData = NULL;
2153fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
2154fa225cbcSrjs        return BadAlloc;
2155fa225cbcSrjs    }
2156fa225cbcSrjs
2157fa225cbcSrjs    /* subpicture */
2158fa225cbcSrjs    subpicture->num_palette_entries = I915_SUBPIC_PALETTE_SIZE;
2159fa225cbcSrjs    subpicture->entry_bytes = 3;
2160fa225cbcSrjs    strncpy(subpicture->component_order, "YUV", 4);
2161fa225cbcSrjs
2162fa225cbcSrjs    /* Initialize private values */
2163fa225cbcSrjs    pI915Subpicture->privContext = pI915XvMC;
2164fa225cbcSrjs    pI915Subpicture->last_render= 0;
2165fa225cbcSrjs    pI915Subpicture->last_flip = 0;
2166fa225cbcSrjs    pI915Subpicture->pitch = ((subpicture->width + 3) & ~3);
2167fa225cbcSrjs
2168fa225cbcSrjs    switch(subpicture->xvimage_id) {
2169fa225cbcSrjs    case FOURCC_IA44:
2170fa225cbcSrjs    case FOURCC_AI44:
2171fa225cbcSrjs        break;
2172fa225cbcSrjs
2173fa225cbcSrjs    default:
2174fa225cbcSrjs        drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
2175fa225cbcSrjs        XLockDisplay(display);
2176fa225cbcSrjs        _xvmc_destroy_subpicture(display, subpicture);
2177fa225cbcSrjs        XUnlockDisplay(display);
2178fa225cbcSrjs        free(pI915Subpicture);
2179fa225cbcSrjs        subpicture->privData = NULL;
2180fa225cbcSrjs        PPTHREAD_MUTEX_UNLOCK();
2181fa225cbcSrjs        return BadMatch;
2182fa225cbcSrjs    }
2183fa225cbcSrjs
2184fa225cbcSrjs    pI915XvMC->ref++;
2185fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
2186fa225cbcSrjs    return Success;
2187fa225cbcSrjs}
2188fa225cbcSrjs
2189fa225cbcSrjsStatus i915_xvmc_clear_subpict(Display *display, XvMCSubpicture *subpicture,
2190fa225cbcSrjs                           short x, short y,
2191fa225cbcSrjs                           unsigned short width, unsigned short height,
2192fa225cbcSrjs                           unsigned int color)
2193fa225cbcSrjs{
2194fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2195fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2196fa225cbcSrjs
2197fa225cbcSrjs    if (!display || !subpicture)
2198fa225cbcSrjs        return BadValue;
2199fa225cbcSrjs
2200fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2201fa225cbcSrjs        return XvMCBadSubpicture;
2202fa225cbcSrjs
2203fa225cbcSrjs    if (!(pI915XvMC = pI915Subpicture->privContext))
2204fa225cbcSrjs        return XvMCBadSubpicture;
2205fa225cbcSrjs
2206fa225cbcSrjs    if ((x < 0) || (x + width) > subpicture->width)
2207fa225cbcSrjs        return BadValue;
2208fa225cbcSrjs
2209fa225cbcSrjs    if ((y < 0) || (y + height) > subpicture->height)
2210fa225cbcSrjs        return BadValue;
2211fa225cbcSrjs
2212fa225cbcSrjs    /* FIXME: clear the area */
2213fa225cbcSrjs
2214fa225cbcSrjs    return Success;
2215fa225cbcSrjs}
2216fa225cbcSrjs
2217fa225cbcSrjsStatus i915_xvmc_composite_subpict(Display *display, XvMCSubpicture *subpicture,
2218fa225cbcSrjs                               XvImage *image,
2219fa225cbcSrjs                               short srcx, short srcy,
2220fa225cbcSrjs                               unsigned short width, unsigned short height,
2221fa225cbcSrjs                               short dstx, short dsty)
2222fa225cbcSrjs{
2223fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2224fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2225fa225cbcSrjs
2226fa225cbcSrjs    if (!display || !subpicture)
2227fa225cbcSrjs        return BadValue;
2228fa225cbcSrjs
2229fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2230fa225cbcSrjs        return XvMCBadSubpicture;
2231fa225cbcSrjs
2232fa225cbcSrjs    if (!(pI915XvMC = pI915Subpicture->privContext))
2233fa225cbcSrjs        return XvMCBadSubpicture;
2234fa225cbcSrjs
2235fa225cbcSrjs    if ((srcx < 0) || (srcx + width) > subpicture->width)
2236fa225cbcSrjs        return BadValue;
2237fa225cbcSrjs
2238fa225cbcSrjs    if ((srcy < 0) || (srcy + height) > subpicture->height)
2239fa225cbcSrjs        return BadValue;
2240fa225cbcSrjs
2241fa225cbcSrjs    if ((dstx < 0) || (dstx + width) > subpicture->width)
2242fa225cbcSrjs        return BadValue;
2243fa225cbcSrjs
2244fa225cbcSrjs    if ((dsty < 0) || (dsty + width) > subpicture->height)
2245fa225cbcSrjs        return BadValue;
2246fa225cbcSrjs
2247fa225cbcSrjs    if (image->id != subpicture->xvimage_id)
2248fa225cbcSrjs        return BadMatch;
2249fa225cbcSrjs
2250fa225cbcSrjs    /* FIXME */
2251fa225cbcSrjs    return Success;
2252fa225cbcSrjs}
2253fa225cbcSrjs
2254fa225cbcSrjs
2255fa225cbcSrjsStatus i915_xvmc_destroy_subpict(Display *display, XvMCSubpicture *subpicture)
2256fa225cbcSrjs{
2257fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2258fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2259fa225cbcSrjs
2260fa225cbcSrjs    if (!display || !subpicture)
2261fa225cbcSrjs        return BadValue;
2262fa225cbcSrjs
2263fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2264fa225cbcSrjs        return XvMCBadSubpicture;
2265fa225cbcSrjs
2266fa225cbcSrjs    if (!(pI915XvMC = pI915Subpicture->privContext))
2267fa225cbcSrjs        return XvMCBadSubpicture;
2268fa225cbcSrjs
2269fa225cbcSrjs    if (pI915Subpicture->last_render)
2270fa225cbcSrjs        XvMCSyncSubpicture(display, subpicture);
2271fa225cbcSrjs
2272fa225cbcSrjs    if (pI915Subpicture->srf.map)
2273fa225cbcSrjs        drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
2274fa225cbcSrjs
2275fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
2276fa225cbcSrjs    XLockDisplay(display);
2277fa225cbcSrjs    _xvmc_destroy_subpicture(display,subpicture);
2278fa225cbcSrjs    XUnlockDisplay(display);
2279fa225cbcSrjs
2280fa225cbcSrjs    free(pI915Subpicture);
2281fa225cbcSrjs    subpicture->privData = NULL;
2282fa225cbcSrjs    pI915XvMC->ref--;
2283fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
2284fa225cbcSrjs
2285fa225cbcSrjs    return Success;
2286fa225cbcSrjs}
2287fa225cbcSrjs
2288fa225cbcSrjs
2289fa225cbcSrjsStatus i915_xvmc_set_subpict_palette(Display *display,
2290fa225cbcSrjs	XvMCSubpicture *subpicture,
2291fa225cbcSrjs	unsigned char *palette)
2292fa225cbcSrjs{
2293fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2294fa225cbcSrjs    int i, j;
2295fa225cbcSrjs
2296fa225cbcSrjs    if (!display || !subpicture)
2297fa225cbcSrjs        return BadValue;
2298fa225cbcSrjs
2299fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2300fa225cbcSrjs        return XvMCBadSubpicture;
2301fa225cbcSrjs
2302fa225cbcSrjs    j = 0;
2303fa225cbcSrjs    for (i = 0; i < 16; i++) {
2304fa225cbcSrjs        pI915Subpicture->palette[0][i] = palette[j++];
2305fa225cbcSrjs        pI915Subpicture->palette[1][i] = palette[j++];
2306fa225cbcSrjs        pI915Subpicture->palette[2][i] = palette[j++];
2307fa225cbcSrjs    }
2308fa225cbcSrjs
2309fa225cbcSrjs    /* FIXME: Update the subpicture with the new palette */
2310fa225cbcSrjs    return Success;
2311fa225cbcSrjs}
2312fa225cbcSrjs
2313fa225cbcSrjsStatus i915_xvmc_blend_subpict(Display *display, XvMCSurface *target_surface,
2314fa225cbcSrjs                           XvMCSubpicture *subpicture,
2315fa225cbcSrjs                           short subx, short suby,
2316fa225cbcSrjs                           unsigned short subw, unsigned short subh,
2317fa225cbcSrjs                           short surfx, short surfy,
2318fa225cbcSrjs                           unsigned short surfw, unsigned short surfh)
2319fa225cbcSrjs{
2320fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2321fa225cbcSrjs    i915XvMCSurface *privTargetSurface;
2322fa225cbcSrjs
2323fa225cbcSrjs    if (!display || !target_surface)
2324fa225cbcSrjs        return BadValue;
2325fa225cbcSrjs
2326fa225cbcSrjs    if (!(privTargetSurface = target_surface->privData))
2327fa225cbcSrjs        return XvMCBadSurface;
2328fa225cbcSrjs
2329fa225cbcSrjs    if (subpicture) {
2330fa225cbcSrjs        if (!(pI915Subpicture = subpicture->privData))
2331fa225cbcSrjs            return XvMCBadSubpicture;
2332fa225cbcSrjs
2333fa225cbcSrjs        if ((FOURCC_AI44 != subpicture->xvimage_id) &&
2334fa225cbcSrjs            (FOURCC_IA44 != subpicture->xvimage_id))
2335fa225cbcSrjs            return XvMCBadSubpicture;
2336fa225cbcSrjs
2337fa225cbcSrjs        privTargetSurface->privSubPic = pI915Subpicture;
2338fa225cbcSrjs    } else {
2339fa225cbcSrjs        privTargetSurface->privSubPic = NULL;
2340fa225cbcSrjs    }
2341fa225cbcSrjs
2342fa225cbcSrjs    return Success;
2343fa225cbcSrjs}
2344fa225cbcSrjs
2345fa225cbcSrjsStatus i915_xvmc_blend_subpict2(Display *display,
2346fa225cbcSrjs                            XvMCSurface *source_surface,
2347fa225cbcSrjs                            XvMCSurface *target_surface,
2348fa225cbcSrjs                            XvMCSubpicture *subpicture,
2349fa225cbcSrjs                            short subx, short suby,
2350fa225cbcSrjs                            unsigned short subw, unsigned short subh,
2351fa225cbcSrjs                            short surfx, short surfy,
2352fa225cbcSrjs                            unsigned short surfw, unsigned short surfh)
2353fa225cbcSrjs{
2354fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2355fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2356fa225cbcSrjs    i915XvMCSurface *privSourceSurface;
2357fa225cbcSrjs    i915XvMCSurface *privTargetSurface;
2358fa225cbcSrjs
2359fa225cbcSrjs    if (!display || !source_surface || !target_surface)
2360fa225cbcSrjs        return BadValue;
2361fa225cbcSrjs
2362fa225cbcSrjs    if (!(privSourceSurface = source_surface->privData))
2363fa225cbcSrjs        return XvMCBadSurface;
2364fa225cbcSrjs
2365fa225cbcSrjs    if (!(privTargetSurface = target_surface->privData))
2366fa225cbcSrjs        return XvMCBadSurface;
2367fa225cbcSrjs
2368fa225cbcSrjs    if (!(pI915XvMC = privTargetSurface->privContext))
2369fa225cbcSrjs        return XvMCBadSurface;
2370fa225cbcSrjs
2371fa225cbcSrjs    if (((surfx + surfw) > privTargetSurface->width) ||
2372fa225cbcSrjs        ((surfy + surfh) > privTargetSurface->height))
2373fa225cbcSrjs        return BadValue;
2374fa225cbcSrjs
2375fa225cbcSrjs    if ((privSourceSurface->width != privTargetSurface->width) ||
2376fa225cbcSrjs        (privTargetSurface->height != privTargetSurface->height))
2377fa225cbcSrjs        return BadValue;
2378fa225cbcSrjs
2379fa225cbcSrjs    if (XvMCSyncSurface(display, source_surface))
2380fa225cbcSrjs        return BadValue;
2381fa225cbcSrjs
2382fa225cbcSrjs    /* FIXME: update Target Surface */
2383fa225cbcSrjs
2384fa225cbcSrjs    if (subpicture) {
2385fa225cbcSrjs        if (((subx + subw) > subpicture->width) ||
2386fa225cbcSrjs            ((suby + subh) > subpicture->height))
2387fa225cbcSrjs            return BadValue;
2388fa225cbcSrjs
2389fa225cbcSrjs        if (!(pI915Subpicture = subpicture->privData))
2390fa225cbcSrjs            return XvMCBadSubpicture;
2391fa225cbcSrjs
2392fa225cbcSrjs        if ((FOURCC_AI44 != subpicture->xvimage_id) &&
2393fa225cbcSrjs            (FOURCC_IA44 != subpicture->xvimage_id))
2394fa225cbcSrjs            return XvMCBadSubpicture;
2395fa225cbcSrjs
2396fa225cbcSrjs        privTargetSurface->privSubPic = pI915Subpicture;
2397fa225cbcSrjs    } else {
2398fa225cbcSrjs        privTargetSurface->privSubPic = NULL;
2399fa225cbcSrjs    }
2400fa225cbcSrjs
2401fa225cbcSrjs    return Success;
2402fa225cbcSrjs}
2403fa225cbcSrjs
2404fa225cbcSrjsStatus i915_xvmc_sync_subpict(Display *display, XvMCSubpicture *subpicture)
2405fa225cbcSrjs{
2406fa225cbcSrjs    Status ret;
2407fa225cbcSrjs    int stat = 0;
2408fa225cbcSrjs
2409fa225cbcSrjs    if (!display || !subpicture)
2410fa225cbcSrjs        return BadValue;
2411fa225cbcSrjs
2412fa225cbcSrjs    do {
2413fa225cbcSrjs        ret = XvMCGetSubpictureStatus(display, subpicture, &stat);
2414fa225cbcSrjs    } while(!ret && (stat & XVMC_RENDERING));
2415fa225cbcSrjs
2416fa225cbcSrjs    return ret;
2417fa225cbcSrjs}
2418fa225cbcSrjs
2419fa225cbcSrjsStatus i915_xvmc_flush_subpict(Display *display, XvMCSubpicture *subpicture)
2420fa225cbcSrjs{
2421fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2422fa225cbcSrjs
2423fa225cbcSrjs    if (!display || !subpicture)
2424fa225cbcSrjs        return BadValue;
2425fa225cbcSrjs
2426fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2427fa225cbcSrjs        return XvMCBadSubpicture;
2428fa225cbcSrjs
2429fa225cbcSrjs    return Success;
2430fa225cbcSrjs}
2431fa225cbcSrjs
2432fa225cbcSrjsStatus i915_xvmc_get_subpict_status(Display *display, XvMCSubpicture *subpicture,
2433fa225cbcSrjs                               int *stat)
2434fa225cbcSrjs{
2435fa225cbcSrjs    i915XvMCSubpicture *pI915Subpicture;
2436fa225cbcSrjs    i915XvMCContext *pI915XvMC;
2437fa225cbcSrjs
2438fa225cbcSrjs    if (!display || !subpicture || stat)
2439fa225cbcSrjs        return BadValue;
2440fa225cbcSrjs
2441fa225cbcSrjs    *stat = 0;
2442fa225cbcSrjs
2443fa225cbcSrjs    if (!(pI915Subpicture = subpicture->privData))
2444fa225cbcSrjs        return XvMCBadSubpicture;
2445fa225cbcSrjs
2446fa225cbcSrjs    if (!(pI915XvMC = pI915Subpicture->privContext))
2447fa225cbcSrjs        return XvMCBadSubpicture;
2448fa225cbcSrjs
2449fa225cbcSrjs    PPTHREAD_MUTEX_LOCK();
2450fa225cbcSrjs
2451fa225cbcSrjs    PPTHREAD_MUTEX_UNLOCK();
2452fa225cbcSrjs    return Success;
2453fa225cbcSrjs}
2454fa225cbcSrjs
2455fa225cbcSrjs#endif
2456fa225cbcSrjs
2457fa225cbcSrjsstruct _intel_xvmc_driver i915_xvmc_mc_driver = {
2458fa225cbcSrjs    .type		= XVMC_I915_MPEG2_MC,
2459fa225cbcSrjs    .num_ctx		= 0,
2460fa225cbcSrjs    .ctx_list		= NULL,
2461fa225cbcSrjs    .create_context	= i915_xvmc_mc_create_context,
2462fa225cbcSrjs    .destroy_context	= i915_xvmc_mc_destroy_context,
2463fa225cbcSrjs    .create_surface	= i915_xvmc_mc_create_surface,
2464fa225cbcSrjs    .destroy_surface	= i915_xvmc_mc_destroy_surface,
2465fa225cbcSrjs    .render_surface	= i915_xvmc_mc_render_surface,
2466fa225cbcSrjs    .put_surface	= i915_xvmc_mc_put_surface,
2467fa225cbcSrjs    .get_surface_status	= i915_xvmc_mc_get_surface_status,
2468fa225cbcSrjs};
2469