Blob Blame History Raw
#ifndef _NT_BLITTER_H_
#define _NT_BLITTER_H_

#include "nt_abi.h"
#include "nt_object.h"

/* blt_alloc flag bits */
#define NT_BLITTER_ENABLE_BLOCK_ARRAY		0x01
#define NT_BLITTER_ENABLE_BLOCK_SECTIONS	0x02
#define NT_BLITTER_ENABLE_CACHE			0x04
#define NT_BLITTER_PRESERVE_BITS		0x08

/* blitter query type bits */
#define	NT_BLITTER_QUERY_INFO			0x01
#define	NT_BLITTER_QUERY_PARAMS			0x02

/* blitter context (opaque) */
typedef struct nt_blitter_context nt_blitter;

typedef struct _nt_blitter_params {
	size_t		params_size;
	size_t		block_size;
	intptr_t	block_count;
	intptr_t	cache_blocks_min;	__optional
	intptr_t	cache_blocks_max;	__optional
	size_t		zero_bits;		__optional
	uint32_t	srvtid;			__optional
	uint32_t	flags;			__optional
	int32_t		lock_tries;		__optional
	uint32_t	round_trips;		__optional
	void *		hsignal_blt;		__optional
	void *		hsignal_app;		__optional
	void *		bitmap;			__optional
	void *		region;			__optional
} nt_blitter_params;


typedef struct _nt_blitter_info {
	size_t		info_size;
	void *		region_addr;
	size_t		region_size;
	size_t		block_size;
	intptr_t	block_count;
	intptr_t	blocks_used;
	intptr_t	blocks_avail;
	intptr_t	blocks_cached;
	intptr_t	lock_tries;
	intptr_t	busy;
} nt_blitter_info;


typedef struct _nt_blitter_query {
	size_t			size;
	int32_t			type;
	uint32_t		flags;
	nt_blitter_params *	params;
	nt_blitter_info *	info;
} nt_blitter_query;


typedef struct _nt_blitter_config {
	size_t			size;
	int32_t			type;
	uint32_t		flags;
	nt_blitter_params *	params;
} nt_blitter_config;


/* blitter functions */
typedef int32_t __fastcall	ntapi_blt_alloc(
	__out	nt_blitter **		blitter,
	__in	nt_blitter_params *	params);


typedef int32_t __fastcall	ntapi_blt_free(
	__in	nt_blitter *		blitter);


typedef int32_t __fastcall	ntapi_blt_query(
	__in	nt_blitter *		blitter,
	__in	nt_blitter_query *	blt_query);


typedef int32_t __fastcall	ntapi_blt_config(
	__in	nt_blitter *		blitter,
	__in	nt_blitter_config *	blt_config);


typedef int32_t __fastcall	ntapi_blt_acquire(
	__in	nt_blitter *		blitter,
	__out	intptr_t *		block_id);


typedef int32_t __fastcall	ntapi_blt_obtain(
	__in	nt_blitter *		blitter,
	__out	intptr_t *		block_id);


typedef int32_t __fastcall	ntapi_blt_possess(
	__in	nt_blitter *		blitter,
	__out	intptr_t *		block_id);


typedef int32_t __fastcall	ntapi_blt_release(
	__in	nt_blitter *		blitter,
	__in	intptr_t		block_id);


typedef void * __fastcall	ntapi_blt_region(
	__in	const nt_blitter *	blitter);


/**
 *  blt_get,blt_set:
 *  clients might prefr to write inlined
 *  alternatives that use a cached blt_region.
**/
typedef void * __fastcall	ntapi_blt_get(
	__in	const nt_blitter *	blitter,
	__in	intptr_t		block_id);


typedef void __fastcall		ntapi_blt_set(
	__in	const nt_blitter *	blitter,
	__in	intptr_t		block_id,
	__in	void *			val);


#endif