/*
 * Author: Max Lingua <sunmax@libero.it>
 */

#ifndef _S3V_DRI
#define _S3V_DRI

#include "s3v_common.h"

#define S3V_MAX_DRAWABLES (S3V_DMA_BUF_NR/2) /* 32 */ /* 256 */ /* FIXME */

typedef struct
{
   int deviceID;
   int width;
   int height;
   int mem;
   int cpp;
   int bitsPerPixel;

   int fbOffset;
   int fbStride;

   int logTextureGranularity;
   int textureOffset; 

   drm_handle_t regs;
   drmSize regsSize;

   unsigned int sarea_priv_offset;
/*
   drmAddress regsMap;

   drmSize textureSize;
   drm_handle_t textures;
*/

#if 0
   drm_handle_t agp_buffers;
   drmSize agp_buf_size;
#endif

/*
   drmBufMapPtr drmBufs;
   int irq;
   unsigned int sarea_priv_offset;
*/

/* FIXME: cleanup ! */

   drmSize            registerSize; /* == S3V_MMIO_REGSIZE */
   drm_handle_t       registerHandle;

   drmSize            pciSize;
   drm_handle_t       pciMemHandle;

   drmSize            frontSize;    /* == videoRambytes */
/* drm_handle_t       frontHandle; */
   unsigned long      frontOffset;  /* == fbOffset */
   int                frontPitch;
/* unsigned char      *front; */

   unsigned int       bufferSize; /* size of depth/back buffer */

   drmSize            backSize;
/* drm_handle_t       backHandle; */
   unsigned long      backOffset;
   int                backPitch;
/* unsigned char      *back; */

   drmSize            depthSize;
/* drm_handle_t       depthHandle; */
   unsigned long      depthOffset;
   int                depthPitch;
/* unsigned char      *depth; */

   drmSize            texSize;
/* drm_handle_t       texHandle; */
   unsigned long      texOffset;
   int                texPitch;
/* unsigned char      *tex; */

   drmSize            dmaBufSize;       /* Size of buffers (in bytes) */
   drm_handle_t       dmaBufHandle;     /* Handle from drmAddMap */
   unsigned long      dmaBufOffset;     /* Offset/Start */
   int                dmaBufPitch;      /* Pitch */
   unsigned char      *dmaBuf;          /* Map */
   int                bufNumBufs;       /* Number of buffers */
   drmBufMapPtr       buffers;          /* Buffer map */

} S3VDRIRec, *S3VDRIPtr;

/* WARNING: Do not change the SAREA structure without changing the kernel
 * as well */

typedef struct {
   unsigned char next, prev; /* indices to form a circular LRU  */
   unsigned char in_use;   /* owned by a client, or free? */
   int age;                /* tracked by clients to update local LRU's */
} S3VTexRegionRec, *S3VTexRegionPtr;

typedef struct {
   unsigned int nbox;
   drm_clip_rect_t boxes[S3V_NR_SAREA_CLIPRECTS];
   
   /* Maintain an LRU of contiguous regions of texture space.  If
    * you think you own a region of texture memory, and it has an
    * age different to the one you set, then you are mistaken and
    * it has been stolen by another client.  If global texAge
    * hasn't changed, there is no need to walk the list.
    *
    * These regions can be used as a proxy for the fine-grained
    * texture information of other clients - by maintaining them
    * in the same lru which is used to age their own textures,
    * clients have an approximate lru for the whole of global
    * texture space, and can make informed decisions as to which
    * areas to kick out.  There is no need to choose whether to
    * kick out your own texture or someone else's - simply eject
    * them all in LRU order.  
    */
   S3VTexRegionRec texList[S3V_NR_TEX_REGIONS+1]; /* Last elt is sentinal */
   
   int texAge;             /* last time texture was uploaded */
   
   int last_enqueue;       /* last time a buffer was enqueued */
   int last_dispatch;      /* age of the most recently dispatched buffer */
   int last_quiescent;     /*  */
   
   int ctxOwner;           /* last context to upload state */
} S3VSAREARec, *S3VSAREAPtr;

typedef struct {
  /* Nothing here yet */
  int dummy;
} S3VConfigPrivRec, *S3VConfigPrivPtr;

typedef struct {
  /* Nothing here yet */
  int dummy;
} S3VDRIContextRec, *S3VDRIContextPtr;


#endif