103b705cfSriastradh/* 203b705cfSriastradh * Copyright © 2007 Intel Corporation 303b705cfSriastradh * 403b705cfSriastradh * Permission is hereby granted, free of charge, to any person obtaining a 503b705cfSriastradh * copy of this software and associated documentation files (the "Software"), 603b705cfSriastradh * to deal in the Software without restriction, including without limitation 703b705cfSriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense, 803b705cfSriastradh * and/or sell copies of the Software, and to permit persons to whom the 903b705cfSriastradh * Software is furnished to do so, subject to the following conditions: 1003b705cfSriastradh * 1103b705cfSriastradh * The above copyright notice and this permission notice (including the next 1203b705cfSriastradh * paragraph) shall be included in all copies or substantial portions of the 1303b705cfSriastradh * Software. 1403b705cfSriastradh * 1503b705cfSriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1603b705cfSriastradh * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1703b705cfSriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1803b705cfSriastradh * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1903b705cfSriastradh * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2003b705cfSriastradh * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 2103b705cfSriastradh * SOFTWARE. 2203b705cfSriastradh * 2303b705cfSriastradh * Authors: 2403b705cfSriastradh * Zhenyu Wang <zhenyu.z.wang@intel.com> 2503b705cfSriastradh * 2603b705cfSriastradh */ 2703b705cfSriastradh#ifndef INTEL_XVMC_H 2803b705cfSriastradh#define INTEL_XVMC_H 2903b705cfSriastradh 3003b705cfSriastradh#include <pthread.h> 3103b705cfSriastradh#include <stdio.h> 3203b705cfSriastradh#include <stdlib.h> 3303b705cfSriastradh#include <unistd.h> 3403b705cfSriastradh#include <errno.h> 3503b705cfSriastradh#include <signal.h> 3603b705cfSriastradh#include <fcntl.h> 3703b705cfSriastradh#include <dirent.h> 3803b705cfSriastradh#include <string.h> 3903b705cfSriastradh#include <assert.h> 4003b705cfSriastradh#include <signal.h> 4103b705cfSriastradh#include <stdint.h> 4203b705cfSriastradh 4303b705cfSriastradh#include <xf86drm.h> 4403b705cfSriastradh#include <X11/X.h> 4503b705cfSriastradh#include <X11/Xlibint.h> 4603b705cfSriastradh#include <X11/Xutil.h> 4703b705cfSriastradh#include <fourcc.h> 4803b705cfSriastradh#include <X11/extensions/Xv.h> 4903b705cfSriastradh#include <X11/extensions/Xvlib.h> 5003b705cfSriastradh#include <X11/extensions/XvMC.h> 5103b705cfSriastradh#include <X11/extensions/XvMClib.h> 5203b705cfSriastradh#include <X11/extensions/vldXvMC.h> 5303b705cfSriastradh#include <drm_sarea.h> 5403b705cfSriastradh 5503b705cfSriastradh#include "i915_drm.h" 5603b705cfSriastradh#include "intel_bufmgr.h" 5703b705cfSriastradh 5803b705cfSriastradh#include "intel_xvmc.h" 5903b705cfSriastradh#include "intel_batchbuffer.h" 6003b705cfSriastradh 6103b705cfSriastradh#define GTT_PAGE_SIZE 4*1024 6203b705cfSriastradh 6303b705cfSriastradh#define XVMC_ERR(s, arg...) \ 6403b705cfSriastradh do { \ 6503b705cfSriastradh fprintf(stderr, "[intel_xvmc] err: " s "\n", ##arg); \ 6603b705cfSriastradh } while (0) 6703b705cfSriastradh 6803b705cfSriastradh#define XVMC_INFO(s, arg...) \ 6903b705cfSriastradh do { \ 7003b705cfSriastradh fprintf(stderr, "[intel_xvmc] info: " s "\n", ##arg); \ 7103b705cfSriastradh } while (0) 7203b705cfSriastradh 7303b705cfSriastradh/* Subpicture fourcc */ 7403b705cfSriastradh#define FOURCC_IA44 0x34344149 7503b705cfSriastradh 7603b705cfSriastradh/* 7703b705cfSriastradh Definitions for temporary wire protocol hooks to be replaced 7803b705cfSriastradh when a HW independent libXvMC is created. 7903b705cfSriastradh*/ 8003b705cfSriastradhextern Status _xvmc_create_context(Display * dpy, XvMCContext * context, 8103b705cfSriastradh int *priv_count, CARD32 ** priv_data); 8203b705cfSriastradh 8303b705cfSriastradhextern Status _xvmc_destroy_context(Display * dpy, XvMCContext * context); 8403b705cfSriastradh 8503b705cfSriastradhextern Status _xvmc_create_surface(Display * dpy, XvMCContext * context, 8603b705cfSriastradh XvMCSurface * surface, int *priv_count, 8703b705cfSriastradh CARD32 ** priv_data); 8803b705cfSriastradh 8903b705cfSriastradhextern Status _xvmc_destroy_surface(Display * dpy, XvMCSurface * surface); 9003b705cfSriastradh 9103b705cfSriastradhextern Status _xvmc_create_subpicture(Display * dpy, XvMCContext * context, 9203b705cfSriastradh XvMCSubpicture * subpicture, 9303b705cfSriastradh int *priv_count, uint ** priv_data); 9403b705cfSriastradh 9503b705cfSriastradhextern Status _xvmc_destroy_subpicture(Display * dpy, 9603b705cfSriastradh XvMCSubpicture * subpicture); 9703b705cfSriastradh 9803b705cfSriastradhstruct intel_xvmc_context { 9903b705cfSriastradh struct intel_xvmc_hw_context *hw; 10003b705cfSriastradh uint32_t surface_bo_size; 10103b705cfSriastradh drm_context_t hw_context; /* context id to kernel drm */ 10203b705cfSriastradh}; 10303b705cfSriastradhtypedef struct intel_xvmc_context *intel_xvmc_context_ptr; 10403b705cfSriastradh 10503b705cfSriastradhstruct intel_xvmc_surface { 10603b705cfSriastradh XvMCContext *context; 10703b705cfSriastradh XvImage *image; 10803b705cfSriastradh GC gc; 10903b705cfSriastradh Bool gc_init; 11003b705cfSriastradh Drawable last_draw; 11103b705cfSriastradh drm_intel_bo *bo; 11203b705cfSriastradh uint32_t gem_handle; 11303b705cfSriastradh}; 11403b705cfSriastradhtypedef struct intel_xvmc_surface *intel_xvmc_surface_ptr; 11503b705cfSriastradh 11603b705cfSriastradhtypedef struct _intel_xvmc_drm_map { 11703b705cfSriastradh drm_handle_t handle; 11803b705cfSriastradh unsigned long offset; 11903b705cfSriastradh unsigned long size; 12003b705cfSriastradh unsigned long bus_addr; 12103b705cfSriastradh drmAddress map; 12203b705cfSriastradh} intel_xvmc_drm_map_t, *intel_xvmc_drm_map_ptr; 12303b705cfSriastradh 12403b705cfSriastradhtypedef struct _intel_xvmc_driver { 12503b705cfSriastradh int type; /* hw xvmc type - i830_hwmc.h */ 12603b705cfSriastradh int screen; /* current screen num */ 12703b705cfSriastradh 12803b705cfSriastradh int fd; /* drm file handler */ 12903b705cfSriastradh 13003b705cfSriastradh dri_bufmgr *bufmgr; 13103b705cfSriastradh 13203b705cfSriastradh struct { 13303b705cfSriastradh unsigned int init_offset; 13403b705cfSriastradh unsigned int size; 13503b705cfSriastradh unsigned int space; 13603b705cfSriastradh unsigned char *ptr; 13703b705cfSriastradh unsigned char *init_ptr; 13803b705cfSriastradh dri_bo *buf; 13903b705cfSriastradh } batch; 14003b705cfSriastradh 14103b705cfSriastradh struct { 14203b705cfSriastradh void *ptr; 14303b705cfSriastradh unsigned int size; 14403b705cfSriastradh unsigned int offset; 14503b705cfSriastradh unsigned int active_buf; 14603b705cfSriastradh unsigned int irq_emitted; 14703b705cfSriastradh } alloc; 14803b705cfSriastradh intel_xvmc_drm_map_t batchbuffer; 14903b705cfSriastradh 15042542f5fSchristos sigset_t sa_mask, old_mask; 15103b705cfSriastradh pthread_mutex_t ctxmutex; 15203b705cfSriastradh 15303b705cfSriastradh int num_ctx; 15403b705cfSriastradh intel_xvmc_context_ptr ctx_list; 15503b705cfSriastradh int num_surf; 15603b705cfSriastradh struct intel_xvmc_surface * surf_list; 15703b705cfSriastradh 15803b705cfSriastradh void *private; 15903b705cfSriastradh 16003b705cfSriastradh /* driver specific xvmc callbacks */ 16103b705cfSriastradh Status(*create_context) (Display * display, XvMCContext * context, 16203b705cfSriastradh int priv_count, CARD32 * priv_data); 16303b705cfSriastradh 16403b705cfSriastradh Status(*destroy_context) (Display * display, XvMCContext * context); 16503b705cfSriastradh 16603b705cfSriastradh Status(*render_surface) (Display * display, XvMCContext * context, 16703b705cfSriastradh unsigned int picture_structure, 16803b705cfSriastradh XvMCSurface * target_surface, 16903b705cfSriastradh XvMCSurface * past_surface, 17003b705cfSriastradh XvMCSurface * future_surface, 17103b705cfSriastradh unsigned int flags, 17203b705cfSriastradh unsigned int num_macroblocks, 17303b705cfSriastradh unsigned int first_macroblock, 17403b705cfSriastradh XvMCMacroBlockArray * macroblock_array, 17503b705cfSriastradh XvMCBlockArray * blocks); 17603b705cfSriastradh 17703b705cfSriastradh Status(*begin_surface) (Display * display, XvMCContext * context, 17803b705cfSriastradh XvMCSurface * target_surface, 17903b705cfSriastradh XvMCSurface * past_surface, 18003b705cfSriastradh XvMCSurface * future_surface, 18103b705cfSriastradh const XvMCMpegControl * control); 18203b705cfSriastradh Status(*load_qmatrix) (Display * display, XvMCContext * context, 18303b705cfSriastradh const XvMCQMatrix * qmx); 18403b705cfSriastradh Status(*put_slice) (Display * display, XvMCContext * context, 18503b705cfSriastradh unsigned char *slice, int bytes); 18603b705cfSriastradh Status(*put_slice2) (Display * display, XvMCContext * context, 18703b705cfSriastradh unsigned char *slice, int bytes, int slice_code); 18803b705cfSriastradh 18903b705cfSriastradh} intel_xvmc_driver_t, *intel_xvmc_driver_ptr; 19003b705cfSriastradh 19103b705cfSriastradhextern struct _intel_xvmc_driver i915_xvmc_mc_driver; 19203b705cfSriastradhextern struct _intel_xvmc_driver i965_xvmc_mc_driver; 19303b705cfSriastradhextern struct _intel_xvmc_driver xvmc_vld_driver; 19403b705cfSriastradhextern struct _intel_xvmc_driver *xvmc_driver; 19503b705cfSriastradh 19642542f5fSchristosstatic inline void LOCK_HARDWARE(drm_context_t ctx) 19742542f5fSchristos{ 19842542f5fSchristos pthread_mutex_lock(&xvmc_driver->ctxmutex); 19942542f5fSchristos pthread_sigmask(SIG_SETMASK, &xvmc_driver->sa_mask, &xvmc_driver->old_mask); 20042542f5fSchristos} 20142542f5fSchristos 20242542f5fSchristosstatic inline void UNLOCK_HARDWARE(drm_context_t ctx) 20342542f5fSchristos{ 20442542f5fSchristos pthread_sigmask(SIG_SETMASK, &xvmc_driver->old_mask, NULL); 20542542f5fSchristos pthread_mutex_unlock(&xvmc_driver->ctxmutex); 20642542f5fSchristos} 20703b705cfSriastradh 20803b705cfSriastradhstatic inline const char *intel_xvmc_decoder_string(int flag) 20903b705cfSriastradh{ 21003b705cfSriastradh switch (flag) { 21103b705cfSriastradh case XVMC_I915_MPEG2_MC: 21203b705cfSriastradh return "i915/945 MPEG2 MC decoder"; 21303b705cfSriastradh case XVMC_I965_MPEG2_MC: 21403b705cfSriastradh return "i965 MPEG2 MC decoder"; 21503b705cfSriastradh case XVMC_I945_MPEG2_VLD: 21603b705cfSriastradh return "i945 MPEG2 VLD decoder"; 21703b705cfSriastradh case XVMC_I965_MPEG2_VLD: 21803b705cfSriastradh return "i965 MPEG2 VLD decoder"; 21903b705cfSriastradh default: 22003b705cfSriastradh return "Unknown decoder"; 22103b705cfSriastradh } 22203b705cfSriastradh} 22303b705cfSriastradh 22403b705cfSriastradhextern unsigned int mb_bytes_420[64]; 22503b705cfSriastradh 22603b705cfSriastradh/* dump function */ 22703b705cfSriastradhextern void intel_xvmc_dump_open(void); 22803b705cfSriastradhextern void intel_xvmc_dump_close(void); 22903b705cfSriastradhextern void intel_xvmc_dump_render(XvMCContext * context, 23003b705cfSriastradh unsigned int picture_structure, 23103b705cfSriastradh XvMCSurface * target_surface, 23203b705cfSriastradh XvMCSurface * past_surface, 23303b705cfSriastradh XvMCSurface * future_surface, 23403b705cfSriastradh unsigned int flags, 23503b705cfSriastradh unsigned int num_macroblocks, 23603b705cfSriastradh unsigned int first_macroblock, 23703b705cfSriastradh XvMCMacroBlockArray * macroblock_array, 23803b705cfSriastradh XvMCBlockArray * blocks); 23903b705cfSriastradh 24003b705cfSriastradh#define VFE_GENERIC_MODE 0x0 24103b705cfSriastradh#define VFE_VLD_MODE 0x1 24203b705cfSriastradh#define VFE_IS_MODE 0x2 24303b705cfSriastradh#define VFE_AVC_MC_MODE 0x4 24403b705cfSriastradh#define VFE_AVC_IT_MODE 0x7 24503b705cfSriastradh#define VFE_VC1_IT_MODE 0x7 24603b705cfSriastradh 24703b705cfSriastradh#endif 248