/*
 * Thread safe wrappers around xf86dga2 calls.
 * This file was generated automatically by tools/make_X11wrappers
 * DO NOT EDIT!
 */

#include "config.h"

#ifndef X_DISPLAY_MISSING

#ifdef HAVE_LIBXXF86DGA2

#include <X11/Xlib.h>
#include <X11/extensions/xf86dga.h>

#include "debugtools.h"
#include "ts_xf86dga2.h"
#include "x11drv.h"

DEFAULT_DEBUG_CHANNEL(x11)

Bool TSXDGAQueryVersion(Display* a0, int* a1, int* a2)
{
  Bool r;
  TRACE("Call XDGAQueryVersion\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGAQueryVersion( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAQueryVersion\n");
  return r;
}

Bool TSXDGAQueryExtension(Display* a0, int* a1, int* a2)
{
  Bool r;
  TRACE("Call XDGAQueryExtension\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGAQueryExtension( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAQueryExtension\n");
  return r;
}

XDGAMode* TSXDGAQueryModes(Display* a0, int a1, int* a2)
{
  XDGAMode* r;
  TRACE("Call XDGAQueryModes\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGAQueryModes( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAQueryModes\n");
  return r;
}

XDGADevice* TSXDGASetMode(Display* a0, int a1, int a2)
{
  XDGADevice* r;
  TRACE("Call XDGASetMode\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGASetMode( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGASetMode\n");
  return r;
}

Bool TSXDGAOpenFramebuffer(Display* a0, int a1)
{
  Bool r;
  TRACE("Call XDGAOpenFramebuffer\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGAOpenFramebuffer( a0,  a1);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAOpenFramebuffer\n");
  return r;
}

void TSXDGACloseFramebuffer(Display* a0, int a1)
{
  TRACE("Call XDGACloseFramebuffer\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGACloseFramebuffer( a0,  a1);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGACloseFramebuffer\n");
}

void TSXDGASetViewport(Display* a0, int a1, int a2, int a3, int a4)
{
  TRACE("Call XDGASetViewport\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGASetViewport( a0,  a1,  a2,  a3,  a4);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGASetViewport\n");
}

void TSXDGAInstallColormap(Display* a0, int a1, Colormap a2)
{
  TRACE("Call XDGAInstallColormap\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGAInstallColormap( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAInstallColormap\n");
}

Colormap TSXDGACreateColormap(Display* a0, int a1, XDGADevice* a2, int a3)
{
  Colormap r;
  TRACE("Call XDGACreateColormap\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGACreateColormap( a0,  a1,  a2,  a3);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGACreateColormap\n");
  return r;
}

void TSXDGASelectInput(Display* a0, int a1, long a2)
{
  TRACE("Call XDGASelectInput\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGASelectInput( a0,  a1,  a2);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGASelectInput\n");
}

void TSXDGAFillRectangle(Display* a0, int a1, int a2, int a3, unsigned int a4, unsigned int a5, unsigned long a6)
{
  TRACE("Call XDGAFillRectangle\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGAFillRectangle( a0,  a1,  a2,  a3,  a4,  a5,  a6);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAFillRectangle\n");
}

void TSXDGACopyArea(Display* a0, int a1, int a2, int a3, unsigned int a4, unsigned int a5, int a6, int a7)
{
  TRACE("Call XDGACopyArea\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGACopyArea( a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGACopyArea\n");
}

void TSXDGACopyTransparentArea(Display* a0, int a1, int a2, int a3, unsigned int a4, unsigned int a5, int a6, int a7, unsigned long a8)
{
  TRACE("Call XDGACopyTransparentArea\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGACopyTransparentArea( a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGACopyTransparentArea\n");
}

int TSXDGAGetViewportStatus(Display* a0, int a1)
{
  int r;
  TRACE("Call XDGAGetViewportStatus\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGAGetViewportStatus( a0,  a1);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAGetViewportStatus\n");
  return r;
}

void TSXDGASync(Display* a0, int a1)
{
  TRACE("Call XDGASync\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGASync( a0,  a1);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGASync\n");
}

Bool TSXDGASetClientVersion(Display* a0)
{
  Bool r;
  TRACE("Call XDGASetClientVersion\n");
  EnterCriticalSection( &X11DRV_CritSection );
  r = XDGASetClientVersion( a0);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGASetClientVersion\n");
  return r;
}

void TSXDGAChangePixmapMode(Display* a0, int a1, int* a2, int* a3, int a4)
{
  TRACE("Call XDGAChangePixmapMode\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGAChangePixmapMode( a0,  a1,  a2,  a3,  a4);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAChangePixmapMode\n");
}

void TSXDGAKeyEventToXKeyEvent(XDGAKeyEvent* a0, XKeyEvent* a1)
{
  TRACE("Call XDGAKeyEventToXKeyEvent\n");
  EnterCriticalSection( &X11DRV_CritSection );
  XDGAKeyEventToXKeyEvent( a0,  a1);
  LeaveCriticalSection( &X11DRV_CritSection );
  TRACE("Ret XDGAKeyEventToXKeyEvent\n");
}

#endif /* defined(HAVE_LIBXXF86DGA2) */

#endif /* !defined(X_DISPLAY_MISSING) */
