/******************************Module*Header*******************************\
* Module Name: devlock.h
*
* Created: 12-Apr-1994 19:45:42
* Author: Gilman Wong [gilmanw]
*
* Copyright (c) 1994 Microsoft Corporation
\**************************************************************************/

// Engine helper functions to grab/release display semaphore and to
// teardown/restore the cursor.

extern BOOL APIENTRY glsrvGrabLock(__GLGENcontext *gengc);
extern VOID APIENTRY glsrvReleaseLock(__GLGENcontext *gengc);

extern BOOL APIENTRY glsrvGrabSurfaces(__GLGENcontext *gengc,
                                       GLGENwindow *pwnd,
                                       FSHORT surfBits);
extern VOID APIENTRY glsrvReleaseSurfaces(__GLGENcontext *gengc,
                                          GLGENwindow *pwnd,
                                          FSHORT surfBits);
extern void APIENTRY glsrvSynchronizeWithGdi(__GLGENcontext *gengc,
                                             GLGENwindow *pwnd,
                                             FSHORT surfBits);
extern void APIENTRY glsrvDecoupleFromGdi(__GLGENcontext *gengc,
                                          GLGENwindow *pwnd,
                                          FSHORT surfBits);

/******************************Public*Routine******************************\
*
* glsrvLazyGrabSurfaces
*
* Indicates a need for all surfaces whose bits are set in the flags
* word.  If the locking code determined that a lock was needed for
* that surface and the lock isn't currently held, the lock is taken.
*
* History:
*  Fri May 30 18:17:27 1997	-by-	Gilman Wong [gilmanw]
*   Created
*
\**************************************************************************/

__inline BOOL glsrvLazyGrabSurfaces(__GLGENcontext *gengc,
                                    FSHORT surfBits)
{
    BOOL bRet = TRUE;

    if (((gengc->fsGenLocks ^ gengc->fsLocks) & surfBits) != 0)
    {
        bRet = glsrvGrabSurfaces(gengc, gengc->pwndLocked, surfBits);
    }

    return bRet;
}

//
// Provide wrappers for DirectDraw surface locking and unlocking so
// that lock tracking can be done on debug builds.
//
// #define VERBOSE_DDSLOCK

#if !defined(DBG) || !defined(VERBOSE_DDSLOCK)
#define DDSLOCK(pdds, pddsd, flags, prect) \
    ((pdds)->lpVtbl->Lock((pdds), (prect), (pddsd), (flags), NULL))
#define DDSUNLOCK(pdds, ptr) \
    ((pdds)->lpVtbl->Unlock((pdds), (ptr)))
#else
HRESULT dbgDdsLock(LPDIRECTDRAWSURFACE pdds, DDSURFACEDESC *pddsd,
                   DWORD flags, char *file, int line);
HRESULT dbgDdsUnlock(LPDIRECTDRAWSURFACE pdds, void *ptr,
                     char *file, int line);
#define DDSLOCK(pdds, pddsd, flags, prect) \
    dbgDdsLock(pdds, pddsd, flags, __FILE__, __LINE__)
#define DDSUNLOCK(pdds, ptr) \
    dbgDdsUnlock(pdds, ptr, __FILE__, __LINE__)
#endif

extern DWORD gcmsOpenGLTimer;

//#define BATCH_LOCK_TICKMAX  99
//#define TICK_RANGE_LO       60
//#define TICK_RANGE_HI       100
extern DWORD BATCH_LOCK_TICKMAX;
extern DWORD TICK_RANGE_LO;
extern DWORD TICK_RANGE_HI;

#define GENERIC_BACKBUFFER_ONLY(gc) \
      ( ((gc)->state.raster.drawBuffer == GL_BACK ) &&\
        ((gc)->state.pixel.readBuffer == GL_BACK ) )