190b17f1bSmrg/***************************************************************************** 290b17f1bSmrg * VIA Unichrome XvMC extension client lib. 390b17f1bSmrg * 490b17f1bSmrg * Copyright (c) 2004 Thomas Hellstr�m. All rights reserved. 590b17f1bSmrg * 690b17f1bSmrg * Permission is hereby granted, free of charge, to any person obtaining a 790b17f1bSmrg * copy of this software and associated documentation files (the "Software"), 890b17f1bSmrg * to deal in the Software without restriction, including without limitation 990b17f1bSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1090b17f1bSmrg * and/or sell copies of the Software, and to permit persons to whom the 1190b17f1bSmrg * Software is furnished to do so, subject to the following conditions: 1290b17f1bSmrg * 1390b17f1bSmrg * The above copyright notice and this permission notice shall be included in 1490b17f1bSmrg * all copies or substantial portions of the Software. 1590b17f1bSmrg * 1690b17f1bSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1790b17f1bSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1890b17f1bSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1990b17f1bSmrg * AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2090b17f1bSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2190b17f1bSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2290b17f1bSmrg * DEALINGS IN THE SOFTWARE. 2390b17f1bSmrg */ 2490b17f1bSmrg 2590b17f1bSmrg#ifndef _VIAXVMCPRIV_H 2690b17f1bSmrg#define _VIAXVMCPRIV_H 1 2790b17f1bSmrg 2890b17f1bSmrg#include <X11/Xlibint.h> 2990b17f1bSmrg#include <X11/extensions/XvMC.h> 3090b17f1bSmrg#include <X11/extensions/XvMClib.h> 3190b17f1bSmrg#include <stdlib.h> 3290b17f1bSmrg#include <X11/Xutil.h> 3390b17f1bSmrg#include "vldXvMC.h" 3490b17f1bSmrg#include "via_xvmc.h" 3590b17f1bSmrg 3690b17f1bSmrgtypedef struct 3790b17f1bSmrg{ 3890b17f1bSmrg int x; 3990b17f1bSmrg int y; 4090b17f1bSmrg int w; 4190b17f1bSmrg int h; 4290b17f1bSmrg} XvMCRegion; 4390b17f1bSmrg 4490b17f1bSmrgextern Status _xvmc_create_context(Display * dpy, XvMCContext * context, 4590b17f1bSmrg int *priv_count, uint ** priv_data); 4690b17f1bSmrgextern Status _xvmc_destroy_context(Display * dpy, XvMCContext * context); 4790b17f1bSmrgextern Status _xvmc_create_surface(Display * dpy, XvMCContext * context, 4890b17f1bSmrg XvMCSurface * surface, int *priv_count, uint ** priv_data); 4990b17f1bSmrgextern Status _xvmc_destroy_surface(Display * dpy, XvMCSurface * surface); 5090b17f1bSmrgextern Status _xvmc_create_subpicture(Display * dpy, XvMCContext * context, 5190b17f1bSmrg XvMCSubpicture * subpicture, int *priv_count, uint ** priv_data); 5290b17f1bSmrgextern Status _xvmc_destroy_subpicture(Display * dpy, 5390b17f1bSmrg XvMCSubpicture * subpicture); 5490b17f1bSmrg 5590b17f1bSmrg#define VIA_SUBPIC_PALETTE_SIZE 16 /*Number of colors in subpicture palette */ 5690b17f1bSmrg#define VIA_CBUFFERSIZE 4096 /*Hardware command buffer size */ 5790b17f1bSmrg#define VIA_MAX_BUFS 2 /*Number of YUV buffers per surface */ 5890b17f1bSmrg#define VIA_MAX_RENDSURF 3 /*Maximum numbers of surfaces per context 5990b17f1bSmrg * that can answer RENDERING to a rendering 6090b17f1bSmrg * query */ 6190b17f1bSmrg 6290b17f1bSmrgtypedef enum 6390b17f1bSmrg{ 6490b17f1bSmrg context_drawHash, 6590b17f1bSmrg context_lowLevel, 6690b17f1bSmrg context_mutex, 6790b17f1bSmrg context_sAreaMap, 6890b17f1bSmrg context_fbMap, 6990b17f1bSmrg context_mmioMap, 7090b17f1bSmrg context_drmContext, 7190b17f1bSmrg context_fd, 7290b17f1bSmrg context_driConnection, 7390b17f1bSmrg context_context, 7490b17f1bSmrg context_none 7590b17f1bSmrg} ContextRes; 7690b17f1bSmrg 7790b17f1bSmrgtypedef struct 7890b17f1bSmrg{ 7990b17f1bSmrg unsigned ctxNo; /* XvMC private context reference number */ 8090b17f1bSmrg pthread_mutex_t ctxMutex; /* Mutex for multi-threading. Not used */ 8190b17f1bSmrg drm_context_t drmcontext; /* The drm context */ 8290b17f1bSmrg drm_handle_t fbOffset; /* Handle to drm frame-buffer area */ 8390b17f1bSmrg drm_handle_t mmioOffset; /* Handle to drm mmio area */ 8490b17f1bSmrg drm_handle_t sAreaOffset; /* Handle to drm shared memory area */ 8590b17f1bSmrg unsigned fbSize; /* Size of drm frame-buffer area */ 8690b17f1bSmrg unsigned mmioSize; /* Size of drm mmio area */ 8790b17f1bSmrg unsigned sAreaSize; /* Size of drm shared memory area */ 8890b17f1bSmrg unsigned sAreaPrivOffset; /* Offset in sarea to private part */ 8990b17f1bSmrg drmAddress fbAddress; /* Virtual address of frame buffer area */ 9090b17f1bSmrg drmAddress mmioAddress; /* Virtual address of mmio area */ 9190b17f1bSmrg drmAddress sAreaAddress; /* Virtual address of shared memory area */ 9290b17f1bSmrg char busIdString[21]; /* Busid of video card */ 9390b17f1bSmrg unsigned yStride; /* Y stride of surfaces in this context */ 9490b17f1bSmrg int fd; /* FD for connection to drm module */ 9590b17f1bSmrg unsigned char intra_quantiser_matrix[64]; 9690b17f1bSmrg unsigned char non_intra_quantiser_matrix[64]; 9790b17f1bSmrg unsigned char chroma_intra_quantiser_matrix[64]; 9890b17f1bSmrg unsigned char chroma_non_intra_quantiser_matrix[64]; 9990b17f1bSmrg unsigned rendSurf[VIA_MAX_RENDSURF]; /* Which surfaces answer rendering to 10090b17f1bSmrg * a rendering query */ 10190b17f1bSmrg int decoderOn; /* Decoder switched on ? */ 10290b17f1bSmrg int intraLoaded; /* Intra quantiser matrix loaded in 10390b17f1bSmrg * decoder? */ 10490b17f1bSmrg int nonIntraLoaded; /* Non-Intra quantiser matrix loaded 10590b17f1bSmrg * in decoder */ 10690b17f1bSmrg int chromaIntraLoaded; 10790b17f1bSmrg int chromaNonIntraLoaded; 10890b17f1bSmrg int haveDecoder; /* Does this context own decoder? */ 10990b17f1bSmrg int attribChanged; /* Attributes have changed and need to 11090b17f1bSmrg * be uploaded to Xv at next frame 11190b17f1bSmrg * display */ 11290b17f1bSmrg drmLockPtr hwLock; /* Virtual address Pointer to the 11390b17f1bSmrg * heavyweight drm hardware lock */ 11490b17f1bSmrg unsigned xvMCPort; /* XvMC private port. Corresponds to 11590b17f1bSmrg * an Xv port, but not by number */ 11690b17f1bSmrg ViaXvMCAttrHolder attrib; /* This contexts attributes and their 11790b17f1bSmrg * values */ 11890b17f1bSmrg XvAttribute attribDesc[VIA_NUM_XVMC_ATTRIBUTES]; /* Attribute decriptions */ 11990b17f1bSmrg int useAGP; /* Use the AGP ringbuffer to upload data to the chip */ 12090b17f1bSmrg void *xl; /* Lowlevel context. Opaque to us. */ 12190b17f1bSmrg int haveXv; /* Have I initialized the Xv 12290b17f1bSmrg * connection for this surface? */ 12390b17f1bSmrg XvImage *xvImage; /* Fake Xv Image used for command 12490b17f1bSmrg * buffer transport to the X server */ 12590b17f1bSmrg GC gc; /* X GC needed for displaying */ 12690b17f1bSmrg Drawable draw; /* Drawable to undisplay from */ 12790b17f1bSmrg XvPortID port; /* Xv Port ID when displaying */ 12890b17f1bSmrg int lastSrfDisplaying; 12990b17f1bSmrg ContextRes resources; 13090b17f1bSmrg CARD32 timeStamp; 13190b17f1bSmrg CARD32 videoTimeStamp; 13290b17f1bSmrg XID id; 13390b17f1bSmrg unsigned screen; 13490b17f1bSmrg unsigned depth; 13590b17f1bSmrg unsigned stride; 13690b17f1bSmrg XVisualInfo visualInfo; 13790b17f1bSmrg void *drawHash; 13890b17f1bSmrg CARD32 chipId; 13990b17f1bSmrg XvMCRegion sRegion; 14090b17f1bSmrg XvMCRegion dRegion; 14190b17f1bSmrg} ViaXvMCContext; 14290b17f1bSmrg 14390b17f1bSmrgtypedef struct 14490b17f1bSmrg{ 14590b17f1bSmrg pthread_mutex_t subMutex; /* Currently not used. */ 14690b17f1bSmrg unsigned srfNo; /* XvMC private surface number */ 14790b17f1bSmrg unsigned offset; /* Offset into frame-buffer area */ 14890b17f1bSmrg unsigned stride; /* Storage stride */ 14990b17f1bSmrg unsigned width; /* Width */ 15090b17f1bSmrg unsigned height; /* Height */ 15190b17f1bSmrg CARD32 palette[VIA_SUBPIC_PALETTE_SIZE]; /* YUV Palette */ 15290b17f1bSmrg ViaXvMCContext *privContext; /* Pointer to context private data */ 15390b17f1bSmrg int ia44; /* IA44 or AI44 format */ 15490b17f1bSmrg int needsSync; 15590b17f1bSmrg CARD32 timeStamp; 15690b17f1bSmrg} ViaXvMCSubPicture; 15790b17f1bSmrg 15890b17f1bSmrgtypedef struct 15990b17f1bSmrg{ 16090b17f1bSmrg pthread_mutex_t srfMutex; /* For multithreading. Not used. */ 16190b17f1bSmrg pthread_cond_t bufferAvailable; /* For multithreading. Not used. */ 16290b17f1bSmrg unsigned srfNo; /* XvMC private surface numbers */ 16390b17f1bSmrg unsigned numBuffers; /* Number of picture buffers */ 16490b17f1bSmrg unsigned curBuf; /* Which is the current buffer? */ 16590b17f1bSmrg unsigned offsets[VIA_MAX_BUFS]; /* Offsets of picture buffers 16690b17f1bSmrg * into the frame-buffer area */ 16790b17f1bSmrg unsigned yStride; /* Stride of YUV420 Y component. */ 16890b17f1bSmrg unsigned width; /* Dimensions */ 16990b17f1bSmrg unsigned height; 17090b17f1bSmrg int progressiveSequence; /* Mpeg progressive picture? Hmm? */ 17190b17f1bSmrg ViaXvMCContext *privContext; /* XvMC context private part. */ 17290b17f1bSmrg ViaXvMCSubPicture *privSubPic; /* Subpicture to be blended when 17390b17f1bSmrg * displaying. NULL if none. */ 17490b17f1bSmrg int needsSync; 17590b17f1bSmrg int syncMode; 17690b17f1bSmrg CARD32 timeStamp; 17790b17f1bSmrg int topFieldFirst; 17890b17f1bSmrg} ViaXvMCSurface; 17990b17f1bSmrg 18090b17f1bSmrg/* 18190b17f1bSmrg * Take and release the global drm hardware lock. 18290b17f1bSmrg */ 18390b17f1bSmrg 18490b17f1bSmrg#define HW_LOCK(ctx) \ 18590b17f1bSmrg DRM_LOCK((ctx)->fd,(ctx)->hwLock,(ctx)->drmcontext,0) 18690b17f1bSmrg#define HW_UNLOCK(ctx) \ 18790b17f1bSmrg DRM_UNLOCK((ctx)->fd,(ctx->hwLock),(ctx)->drmcontext) 18890b17f1bSmrg 18990b17f1bSmrg/* 19090b17f1bSmrg * Low-level Mpeg functions in viaLowLevel.c 19190b17f1bSmrg */ 19290b17f1bSmrg 19390b17f1bSmrg#define VIABLIT_TRANSCOPY 0 19490b17f1bSmrg#define VIABLIT_COPY 1 19590b17f1bSmrg#define VIABLIT_FILL 2 19690b17f1bSmrg 19790b17f1bSmrg#endif 198