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(¯oblock_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(¯oblock_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(¯oblock_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(¯oblock_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(¯oblock_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(¯oblock_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(¯oblock_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(¯oblock_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 = ¯oblock_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, ¯oblock_array->macro_blocks[first_macroblock]); 1912fa225cbcSrjs 1913fa225cbcSrjs for (i = first_macroblock; i < (num_macroblocks + first_macroblock); i++) { 1914fa225cbcSrjs mb = ¯oblock_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