windows-nt/Source/XPSP1/NT/multimedia/opengl/server/inc/namesint.h
2020-09-26 16:20:57 +08:00

219 lines
7.4 KiB
C

#ifndef __glnamesint_h
#define __glnamesint_h
/*
** Copyright 1991, 1922, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
**
** Display list internal structure description.
**
** $Revision: 1.2 $
** $Date: 1995/01/25 18:05:43 $
*/
/************************************************************************/
/*
** Names Manager Interface
**
** This file contains the Name Space Management types and structures.
**
** The Name Space Management code is used to store and retreive named
** data structures. The data being stored is referred to with void
** pointers to allow for the storage of any type of structure.
**
** The Name Space is implemented as a 2-3 tree. For a detailed
** description of its implementation, see lib/opengl/soft/so_names.c.
**
** __GLnamesArray is declared in types.h.
*/
/************************************************************************/
/*
** A tree can be used to hold different types of data,
** e.g. display lists or texture objects. This is the structure
** that contains information needed for each tree type. For
** example, this structure contains a pointer to a dummy empty
** structure and a callback for freeing memory associated with
** the structure.
*/
struct __GLnamesArrayTypeInfoRec {
void *empty; /* ptr to empty info structure */
GLuint dataSize; /* sizeof data structure in bytes */
void (WINAPIV *free)(__GLcontext *gc, void *memory);
/* callback for freeing data */
GLboolean (WINAPIV *alloc)(__GLcontext *gc, size_t size);
/* callback for allocating data */
};
typedef struct __GLnamesArrayTypeInfoRec __GLnamesArrayTypeInfo;
/*
** The number of spare branches and leaves that we keep about in case
** we run out of memory. At that point, we complete the current operation
** by using the extra leaves and branches, and we report an OUT_OF_MEMORY
** error when a new operation is requested (unless we can fill our extras
** again!)
**
** These constants were not chosen terribly carefully. As best as I can
** figure, we only need one spare branch per level in the tree (so 16
** supports a tree with 65536 leaves). And even then, the user would have
** to be extremely devious to actually force 16 new branches to appear in
** the tree at just the same moment that the system runs out of memory.
**
** The number of spare leaves required, I believe, is one. Three is chosen
** to allow for some slop.
*/
#define __GL_DL_EXTRA_BRANCHES 16
#define __GL_DL_EXTRA_LEAVES 3
/*
** This is the structure that contains information that is needed
** for each instance of a names tree. It needs to be public
** so the refcount can be managed.
*/
typedef struct __GLnamesArrayTypeInfoRec __GLnamesArrayTypeInfo;
typedef struct __GLnamesBranchRec __GLnamesBranch;
typedef struct __GLnamesLeafRec __GLnamesLeaf;
struct __GLnamesArrayRec {
__GLnamesBranch *tree; /* points to the top of the names tree */
GLuint depth; /* depth of tree */
GLint refcount; /*# ctxs using this array: create with 1, delete at 0*/
__GLnamesArrayTypeInfo *dataInfo; /* ptr to data type info */
GLuint nbranches, nleaves; /* should basically always be at max */
__GLnamesBranch *branches[__GL_DL_EXTRA_BRANCHES];
__GLnamesLeaf *leaves[__GL_DL_EXTRA_LEAVES];
#ifdef NT
CRITICAL_SECTION critsec;
#endif
};
#ifdef NT
// Locking macros to enable or disable locking
#define __GL_NAMES_LOCK(array) EnterCriticalSection(&(array)->critsec)
#define __GL_NAMES_UNLOCK(array) LeaveCriticalSection(&(array)->critsec)
#if DBG
typedef struct _RTL_CRITICAL_SECTION *LPCRITICAL_SECTION;
extern void APIENTRY CheckCritSectionIn(LPCRITICAL_SECTION pcs);
#define __GL_NAMES_ASSERT_LOCKED(array) CheckCritSectionIn(&(array)->critsec)
#else
#define __GL_NAMES_ASSERT_LOCKED(array)
#endif
#endif
/*
** Clean up an item whose refcount has fallen to zero due to unlocking
*/
typedef void (FASTCALL *__GLnamesCleanupFunc)(__GLcontext *gc, void *data);
/*
** Allocate and initialize a new array structure.
*/
extern __GLnamesArray * FASTCALL __glNamesNewArray(__GLcontext *gc,
__GLnamesArrayTypeInfo *dataInfo);
/*
** Free the array structure.
*/
extern void FASTCALL __glNamesFreeArray(__GLcontext *gc, __GLnamesArray *array);
/*
** Save a new display list in the array. A return value of GL_FALSE
** indicates and OUT_OF_MEMORY error, indicating that the list was
** not stored.
*/
extern GLboolean FASTCALL __glNamesNewData(__GLcontext *gc, __GLnamesArray *array,
GLuint name, void *data);
/*
** Find and lock the list specified with "listnum". A return value of NULL
** indicates that there was no such list. __glNamesUnlockList() needs to
** be called to unlock the list otherwise.
*/
extern void * FASTCALL __glNamesLockData(__GLcontext *gc, __GLnamesArray *array,
GLuint name);
/*
** Unlock a list locked with __glNamesLockList(). If this is not called, then
** any memory associated with the list will never be freed when the list
** is deleted.
*/
extern void FASTCALL __glNamesUnlockData(__GLcontext *gc, void *data,
__GLnamesCleanupFunc cleanup);
/*
** Same as __glNamesLockList() except that a bunch of lists are locked and
** returned simultaneously. Any listbase previously specified is used as
** an offset to the entries in the array.
*/
extern void FASTCALL __glNamesLockDataList(__GLcontext *gc, __GLnamesArray *array,
GLsizei n, GLenum type, GLuint base,
const GLvoid *names, void *dataList[]);
/*
** Same as __glNamesUnlockList() except that the entire array of names
** is unlocked at once.
*/
extern void FASTCALL __glNamesUnlockDataList(__GLcontext *gc, GLsizei n,
void *dataList[],
__GLnamesCleanupFunc cleanup);
#ifdef NT
/*
** Locks entire array
*/
#define __glNamesLockArray(gc, array) __GL_NAMES_LOCK(array)
/*
** Unlocks array
*/
#define __glNamesUnlockArray(gc, array) __GL_NAMES_UNLOCK(array)
#endif
/*
** Generates a list of names.
*/
extern GLuint FASTCALL __glNamesGenRange(__GLcontext *gc, __GLnamesArray *array,
GLsizei range);
/*
** Returns GL_TRUE if name has been generated for this array.
*/
extern GLboolean FASTCALL __glNamesIsName(__GLcontext *gc, __GLnamesArray *array,
GLuint name);
/*
** Deletes a range of names.
*/
extern void FASTCALL __glNamesDeleteRange(__GLcontext *gc, __GLnamesArray *array,
GLuint name, GLsizei range);
/*
** Generates a list of (not necessarily contiguous) names.
*/
extern void FASTCALL __glNamesGenNames(__GLcontext *gc, __GLnamesArray *array,
GLsizei n, GLuint* names);
/*
** Deletes a list of (not necessarily contiguous) names.
*/
extern void FASTCALL __glNamesDeleteNames(__GLcontext *gc, __GLnamesArray *array,
GLsizei n, const GLuint* names);
#endif /* __glnamesint_h */