/* * Copyright © 2007 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Authors: * Zhenyu Wang * */ #ifndef INTEL_XVMC_H #define INTEL_XVMC_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "i830_common.h" #include "i830_hwmc.h" #include #include #include #include #include #include #include #include #include #include "xf86dri.h" #include "intel_batchbuffer.h" extern int DEBUG; #define XVMC_ERR(s, arg...) \ do { \ fprintf(stderr, "[intel_xvmc] err: " s "\n", ##arg); \ } while (0) #define XVMC_INFO(s, arg...) \ do { \ fprintf(stderr, "[intel_xvmc] info: " s "\n", ##arg); \ } while (0) #define XVMC_DBG(s, arg...) \ do { \ if (DEBUG) \ fprintf(stderr, "[intel_xvmc] debug: " s "\n", ##arg); \ } while (0) /* Subpicture fourcc */ #define FOURCC_IA44 0x34344149 /* Definitions for temporary wire protocol hooks to be replaced when a HW independent libXvMC is created. */ extern Status _xvmc_create_context(Display *dpy, XvMCContext *context, int *priv_count, CARD32 **priv_data); extern Status _xvmc_destroy_context(Display *dpy, XvMCContext *context); extern Status _xvmc_create_surface(Display *dpy, XvMCContext *context, XvMCSurface *surface, int *priv_count, CARD32 **priv_data); extern Status _xvmc_destroy_surface(Display *dpy, XvMCSurface *surface); extern Status _xvmc_create_subpicture(Display *dpy, XvMCContext *context, XvMCSubpicture *subpicture, int *priv_count, uint **priv_data); extern Status _xvmc_destroy_subpicture(Display *dpy, XvMCSubpicture *subpicture); typedef struct _intel_xvmc_context { XvMCContext *context; drm_context_t hw_context; /* context id to kernel drm */ struct _intel_xvmc_context *next; } intel_xvmc_context_t, *intel_xvmc_context_ptr; typedef struct _intel_xvmc_surface { XvMCSurface *surface; XvImage *image; GC gc; Bool gc_init; Drawable last_draw; struct intel_xvmc_command data; struct _intel_xvmc_surface *next; } intel_xvmc_surface_t, *intel_xvmc_surface_ptr; typedef struct _intel_xvmc_drm_map { drm_handle_t handle; unsigned long offset; unsigned long size; unsigned long bus_addr; drmAddress map; } intel_xvmc_drm_map_t, *intel_xvmc_drm_map_ptr; typedef struct _intel_xvmc_driver { int type; /* hw xvmc type - i830_hwmc.h */ int screen; /* current screen num*/ int fd; /* drm file handler */ drm_handle_t hsarea; /* DRI open connect */ char busID[32]; unsigned int sarea_size; drmAddress sarea_address; struct { unsigned int start_offset; unsigned int size; unsigned int space; unsigned char *ptr; } batch; struct { void *ptr; unsigned int size; unsigned int offset; unsigned int active_buf; unsigned int irq_emitted; } alloc; intel_xvmc_drm_map_t batchbuffer; unsigned int last_render; sigset_t sa_mask; pthread_mutex_t ctxmutex; int lock; /* Lightweight lock to avoid locking twice */ int locked; drmLock *driHwLock; int num_ctx; intel_xvmc_context_ptr ctx_list; int num_surf; intel_xvmc_surface_ptr surf_list; void *private; /* driver specific xvmc callbacks */ Status (*create_context)(Display* display, XvMCContext *context, int priv_count, CARD32 *priv_data); Status (*destroy_context)(Display* display, XvMCContext *context); Status (*create_surface)(Display* display, XvMCContext *context, XvMCSurface *surface, int priv_count, CARD32 *priv_data); Status (*destroy_surface)(Display* display, XvMCSurface *surface); Status (*render_surface)(Display *display, XvMCContext *context, unsigned int picture_structure, XvMCSurface *target_surface, XvMCSurface *past_surface, XvMCSurface *future_surface, unsigned int flags, unsigned int num_macroblocks, unsigned int first_macroblock, XvMCMacroBlockArray *macroblock_array, XvMCBlockArray *blocks); Status (*put_surface)(Display *display, XvMCSurface *surface, Drawable draw, short srcx, short srcy, unsigned short srcw, unsigned short srch, short destx, short desty, unsigned short destw, unsigned short desth, int flags, struct intel_xvmc_command *data); Status (*get_surface_status)(Display *display, XvMCSurface *surface, int *stat); /* XXX more for vld */ } intel_xvmc_driver_t, *intel_xvmc_driver_ptr; extern struct _intel_xvmc_driver i915_xvmc_mc_driver; extern struct _intel_xvmc_driver *xvmc_driver; #define SET_BLOCKED_SIGSET() do { \ sigset_t bl_mask; \ sigfillset(&bl_mask); \ sigdelset(&bl_mask, SIGFPE); \ sigdelset(&bl_mask, SIGILL); \ sigdelset(&bl_mask, SIGSEGV); \ sigdelset(&bl_mask, SIGBUS); \ sigdelset(&bl_mask, SIGKILL); \ pthread_sigmask(SIG_SETMASK, &bl_mask, &xvmc_driver->sa_mask); \ } while (0) #define RESTORE_BLOCKED_SIGSET() do { \ pthread_sigmask(SIG_SETMASK, &xvmc_driver->sa_mask, NULL); \ } while (0) #define PPTHREAD_MUTEX_LOCK() do { \ SET_BLOCKED_SIGSET(); \ pthread_mutex_lock(&xvmc_driver->ctxmutex); \ } while (0) #define PPTHREAD_MUTEX_UNLOCK() do { \ pthread_mutex_unlock(&xvmc_driver->ctxmutex); \ RESTORE_BLOCKED_SIGSET(); \ } while (0) extern void LOCK_HARDWARE(drm_context_t); extern void UNLOCK_HARDWARE(drm_context_t); static inline const char* intel_xvmc_decoder_string(int flag) { switch (flag) { case XVMC_I915_MPEG2_MC: return "i915/945 MPEG2 MC decoder"; case XVMC_I965_MPEG2_MC: return "i965 MPEG2 MC decoder"; case XVMC_I945_MPEG2_VLD: return "i945 MPEG2 VLD decoder"; case XVMC_I965_MPEG2_VLD: return "i965 MPEG2 VLD decoder"; default: return "Unknown decoder"; } } extern intel_xvmc_context_ptr intel_xvmc_find_context(XID id); extern intel_xvmc_surface_ptr intel_xvmc_find_surface(XID id); extern unsigned int mb_bytes_420[64]; /* dump function */ extern void intel_xvmc_dump_open(void); extern void intel_xvmc_dump_close(void); extern void intel_xvmc_dump_render(XvMCContext *context, unsigned int picture_structure, XvMCSurface *target_surface, XvMCSurface *past_surface, XvMCSurface *future_surface, unsigned int flags, unsigned int num_macroblocks, unsigned int first_macroblock, XvMCMacroBlockArray *macroblock_array, XvMCBlockArray *blocks); #endif