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