forked from KolibriOS/kolibrios
301 lines
8.3 KiB
C
301 lines
8.3 KiB
C
|
/**************************************************************************
|
|||
|
|
|||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
|||
|
Copyright <EFBFBD> 2002 David Dawes
|
|||
|
|
|||
|
All Rights Reserved.
|
|||
|
|
|||
|
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, sub license, 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 NON-INFRINGEMENT.
|
|||
|
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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:
|
|||
|
* Keith Whitwell <keith@tungstengraphics.com>
|
|||
|
* David Dawes <dawes@xfree86.org>
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef _SNA_H_
|
|||
|
#define _SNA_H_
|
|||
|
|
|||
|
#ifdef HAVE_CONFIG_H
|
|||
|
#include "config.h"
|
|||
|
#endif
|
|||
|
|
|||
|
#include <stdint.h>
|
|||
|
#include <memory.h>
|
|||
|
#include <malloc.h>
|
|||
|
|
|||
|
|
|||
|
#include "intel_driver.h"
|
|||
|
#include "pciaccess.h"
|
|||
|
|
|||
|
#include "compiler.h"
|
|||
|
|
|||
|
//#define DBG(x)
|
|||
|
//#define DBG(x) ErrorF x
|
|||
|
|
|||
|
#define assert(x)
|
|||
|
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
unsigned handle;
|
|||
|
unsigned io_code;
|
|||
|
void *input;
|
|||
|
int inp_size;
|
|||
|
void *output;
|
|||
|
int out_size;
|
|||
|
}ioctl_t;
|
|||
|
|
|||
|
#define SRV_GET_INFO 20
|
|||
|
#define SRV_GET_PARAM 21
|
|||
|
|
|||
|
static int call_service(ioctl_t *io)
|
|||
|
{
|
|||
|
int retval;
|
|||
|
|
|||
|
asm volatile("int $0x40"
|
|||
|
:"=a"(retval)
|
|||
|
:"a"(68),"b"(17),"c"(io)
|
|||
|
:"memory","cc");
|
|||
|
|
|||
|
return retval;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
#define PIXMAN_FORMAT(bpp,type,a,r,g,b) (((bpp) << 24) | \
|
|||
|
((type) << 16) | \
|
|||
|
((a) << 12) | \
|
|||
|
((r) << 8) | \
|
|||
|
((g) << 4) | \
|
|||
|
((b)))
|
|||
|
#define PIXMAN_TYPE_OTHER 0
|
|||
|
#define PIXMAN_TYPE_A 1
|
|||
|
#define PIXMAN_TYPE_ARGB 2
|
|||
|
#define PIXMAN_TYPE_ABGR 3
|
|||
|
#define PIXMAN_TYPE_COLOR 4
|
|||
|
#define PIXMAN_TYPE_GRAY 5
|
|||
|
#define PIXMAN_TYPE_YUY2 6
|
|||
|
#define PIXMAN_TYPE_YV12 7
|
|||
|
#define PIXMAN_TYPE_BGRA 8
|
|||
|
#define PIXMAN_TYPE_RGBA 9
|
|||
|
#define PIXMAN_TYPE_ARGB_SRGB 10
|
|||
|
|
|||
|
/* 32bpp formats */
|
|||
|
typedef enum {
|
|||
|
PIXMAN_a8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
|
|||
|
PIXMAN_x8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
|
|||
|
PIXMAN_a8b8g8r8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
|
|||
|
PIXMAN_x8b8g8r8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
|
|||
|
PIXMAN_b8g8r8a8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
|
|||
|
PIXMAN_b8g8r8x8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
|
|||
|
PIXMAN_r8g8b8a8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,8,8,8,8),
|
|||
|
PIXMAN_r8g8b8x8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,0,8,8,8),
|
|||
|
PIXMAN_x14r6g6b6 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,6,6,6),
|
|||
|
PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10),
|
|||
|
PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10),
|
|||
|
PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
|
|||
|
PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10)
|
|||
|
|
|||
|
} pixman_format_code_t;
|
|||
|
|
|||
|
|
|||
|
typedef unsigned long Picture;
|
|||
|
typedef unsigned long PictFormat;
|
|||
|
|
|||
|
typedef struct _Pixmap *PixmapPtr;
|
|||
|
typedef struct _Picture *PicturePtr;
|
|||
|
|
|||
|
typedef struct _Drawable {
|
|||
|
unsigned char type; /* DRAWABLE_<type> */
|
|||
|
unsigned char class; /* specific to type */
|
|||
|
unsigned char depth;
|
|||
|
unsigned char bitsPerPixel;
|
|||
|
unsigned int id; /* resource id */
|
|||
|
short x; /* window: screen absolute, pixmap: 0 */
|
|||
|
short y; /* window: screen absolute, pixmap: 0 */
|
|||
|
unsigned short width;
|
|||
|
unsigned short height;
|
|||
|
} DrawableRec;
|
|||
|
|
|||
|
/*
|
|||
|
* PIXMAP -- device dependent
|
|||
|
*/
|
|||
|
|
|||
|
typedef struct _Pixmap {
|
|||
|
DrawableRec drawable;
|
|||
|
// PrivateRec *devPrivates;
|
|||
|
int refcnt;
|
|||
|
int devKind; /* This is the pitch of the pixmap, typically width*bpp/8. */
|
|||
|
// DevUnion devPrivate; /* When !NULL, devPrivate.ptr points to the raw pixel data. */
|
|||
|
#ifdef COMPOSITE
|
|||
|
short screen_x;
|
|||
|
short screen_y;
|
|||
|
#endif
|
|||
|
unsigned usage_hint; /* see CREATE_PIXMAP_USAGE_* */
|
|||
|
|
|||
|
PixmapPtr master_pixmap; /* pointer to master copy of pixmap for pixmap sharing */
|
|||
|
} PixmapRec;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
struct pixman_box16
|
|||
|
{
|
|||
|
int16_t x1, y1, x2, y2;
|
|||
|
};
|
|||
|
|
|||
|
typedef struct pixman_box16 BoxRec;
|
|||
|
typedef unsigned int CARD32;
|
|||
|
typedef unsigned short CARD16;
|
|||
|
|
|||
|
#include "sna_render.h"
|
|||
|
#include "kgem.h"
|
|||
|
|
|||
|
#define GXclear 0x0
|
|||
|
#define GXcopy 0x3
|
|||
|
|
|||
|
#define PictOpClear 0
|
|||
|
#define PictOpSrc 1
|
|||
|
#define PictOpDst 2
|
|||
|
#define PictOpOver 3
|
|||
|
#define PictOpOverReverse 4
|
|||
|
#define PictOpIn 5
|
|||
|
#define PictOpInReverse 6
|
|||
|
#define PictOpOut 7
|
|||
|
#define PictOpOutReverse 8
|
|||
|
#define PictOpAtop 9
|
|||
|
#define PictOpAtopReverse 10
|
|||
|
#define PictOpXor 11
|
|||
|
#define PictOpAdd 12
|
|||
|
#define PictOpSaturate 13
|
|||
|
#define PictOpMaximum 13
|
|||
|
|
|||
|
|
|||
|
|
|||
|
struct sna {
|
|||
|
unsigned flags;
|
|||
|
#define SNA_NO_WAIT 0x1
|
|||
|
#define SNA_NO_FLIP 0x2
|
|||
|
#define SNA_TRIPLE_BUFFER 0x4
|
|||
|
#define SNA_TEAR_FREE 0x10
|
|||
|
#define SNA_FORCE_SHADOW 0x20
|
|||
|
|
|||
|
struct list flush_pixmaps;
|
|||
|
struct list active_pixmaps;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// int vblank_interval;
|
|||
|
|
|||
|
// struct list deferred_free;
|
|||
|
// struct list dirty_pixmaps;
|
|||
|
// struct list active_pixmaps;
|
|||
|
// struct list inactive_clock[2];
|
|||
|
|
|||
|
unsigned int tiling;
|
|||
|
#define SNA_TILING_DISABLE 0x0
|
|||
|
#define SNA_TILING_FB 0x1
|
|||
|
#define SNA_TILING_2D 0x2
|
|||
|
#define SNA_TILING_ALL (~0)
|
|||
|
|
|||
|
struct pci_device *PciInfo;
|
|||
|
const struct intel_device_info *info;
|
|||
|
|
|||
|
// PicturePtr clear;
|
|||
|
struct {
|
|||
|
uint32_t fill_bo;
|
|||
|
uint32_t fill_pixel;
|
|||
|
uint32_t fill_alu;
|
|||
|
} blt_state;
|
|||
|
union {
|
|||
|
// struct gen2_render_state gen2;
|
|||
|
// struct gen3_render_state gen3;
|
|||
|
// struct gen4_render_state gen4;
|
|||
|
// struct gen5_render_state gen5;
|
|||
|
struct gen6_render_state gen6;
|
|||
|
struct gen7_render_state gen7;
|
|||
|
} render_state;
|
|||
|
|
|||
|
|
|||
|
/* Broken-out options. */
|
|||
|
// OptionInfoPtr Options;
|
|||
|
|
|||
|
/* Driver phase/state information */
|
|||
|
// Bool suspended;
|
|||
|
|
|||
|
struct kgem kgem;
|
|||
|
struct sna_render render;
|
|||
|
|
|||
|
#if DEBUG_MEMORY
|
|||
|
struct {
|
|||
|
int shadow_pixels_allocs;
|
|||
|
int cpu_bo_allocs;
|
|||
|
size_t shadow_pixels_bytes;
|
|||
|
size_t cpu_bo_bytes;
|
|||
|
} debug_memory;
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
static inline int vertex_space(struct sna *sna)
|
|||
|
{
|
|||
|
return sna->render.vertex_size - sna->render.vertex_used;
|
|||
|
}
|
|||
|
|
|||
|
static inline void vertex_emit(struct sna *sna, float v)
|
|||
|
{
|
|||
|
assert(sna->render.vertex_used < sna->render.vertex_size);
|
|||
|
sna->render.vertices[sna->render.vertex_used++] = v;
|
|||
|
}
|
|||
|
|
|||
|
static inline void vertex_emit_2s(struct sna *sna, int16_t x, int16_t y)
|
|||
|
{
|
|||
|
int16_t *v = (int16_t *)&sna->render.vertices[sna->render.vertex_used++];
|
|||
|
assert(sna->render.vertex_used <= sna->render.vertex_size);
|
|||
|
v[0] = x;
|
|||
|
v[1] = y;
|
|||
|
}
|
|||
|
|
|||
|
static inline void batch_emit(struct sna *sna, uint32_t dword)
|
|||
|
{
|
|||
|
assert(sna->kgem.mode != KGEM_NONE);
|
|||
|
assert(sna->kgem.nbatch + KGEM_BATCH_RESERVED < sna->kgem.surface);
|
|||
|
sna->kgem.batch[sna->kgem.nbatch++] = dword;
|
|||
|
}
|
|||
|
|
|||
|
#ifndef ARRAY_SIZE
|
|||
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef ALIGN
|
|||
|
#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef MIN
|
|||
|
#define MIN(a,b) ((a) <= (b) ? (a) : (b))
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef MAX
|
|||
|
#define MAX(a,b) ((a) >= (b) ? (a) : (b))
|
|||
|
#endif
|
|||
|
#endif /* _SNA_H */
|