consolidate intel directories.
authorAlan Hourihane <alanh@tungstengraphics.com>
Sun, 17 Aug 2008 19:17:18 +0000 (20:17 +0100)
committerAlan Hourihane <alanh@tungstengraphics.com>
Sun, 17 Aug 2008 19:17:18 +0000 (20:17 +0100)
we now have

src/gallium/winsys/drm/intel/{common,dri,egl}

100 files changed:
configs/default
configs/linux-dri
src/gallium/winsys/SConscript
src/gallium/winsys/common/Makefile [deleted file]
src/gallium/winsys/common/Makefile.template [deleted file]
src/gallium/winsys/common/intel_drm/Makefile [deleted file]
src/gallium/winsys/common/intel_drm/glthread.h [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.c [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.h [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_context.c [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_context.h [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_device.c [deleted file]
src/gallium/winsys/common/intel_drm/intel_be_device.h [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.c [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.h [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_bufpool.h [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_drmpool.c [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.c [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.h [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_mallocpool.c [deleted file]
src/gallium/winsys/common/intel_drm/ws_dri_slabpool.c [deleted file]
src/gallium/winsys/dri/Makefile [deleted file]
src/gallium/winsys/dri/Makefile.template [deleted file]
src/gallium/winsys/dri/SConscript [deleted file]
src/gallium/winsys/dri/intel/Makefile [deleted file]
src/gallium/winsys/dri/intel/SConscript [deleted file]
src/gallium/winsys/dri/intel/intel_batchbuffer.h [deleted file]
src/gallium/winsys/dri/intel/intel_context.c [deleted file]
src/gallium/winsys/dri/intel/intel_context.h [deleted file]
src/gallium/winsys/dri/intel/intel_lock.c [deleted file]
src/gallium/winsys/dri/intel/intel_reg.h [deleted file]
src/gallium/winsys/dri/intel/intel_screen.c [deleted file]
src/gallium/winsys/dri/intel/intel_screen.h [deleted file]
src/gallium/winsys/dri/intel/intel_swapbuffers.c [deleted file]
src/gallium/winsys/dri/intel/intel_swapbuffers.h [deleted file]
src/gallium/winsys/dri/intel/intel_winsys_softpipe.c [deleted file]
src/gallium/winsys/dri/intel/intel_winsys_softpipe.h [deleted file]
src/gallium/winsys/dri/intel/server/i830_common.h [deleted file]
src/gallium/winsys/dri/intel/server/i830_dri.h [deleted file]
src/gallium/winsys/drm/Makefile [new file with mode: 0644]
src/gallium/winsys/drm/Makefile.template [new file with mode: 0644]
src/gallium/winsys/drm/SConscript [new file with mode: 0644]
src/gallium/winsys/drm/intel/Makefile [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/Makefile [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/Makefile.template [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/glthread.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_context.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_context.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_device.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/intel_be_device.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_bufpool.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_drmpool.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_mallocpool.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/common/ws_dri_slabpool.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/Makefile [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/SConscript [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_batchbuffer.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_context.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_context.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_lock.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_reg.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_screen.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_screen.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_swapbuffers.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_swapbuffers.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/server/i830_common.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/server/i830_dri.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/Makefile [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/SConscript [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_batchbuffer.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_context.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_context.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_device.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_device.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_egl.c [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_egl.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_reg.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/egl/intel_swapbuffers.c [new file with mode: 0644]
src/gallium/winsys/egl_drm/Makefile [deleted file]
src/gallium/winsys/egl_drm/Makefile.template [deleted file]
src/gallium/winsys/egl_drm/intel/Makefile [deleted file]
src/gallium/winsys/egl_drm/intel/SConscript [deleted file]
src/gallium/winsys/egl_drm/intel/intel_batchbuffer.h [deleted file]
src/gallium/winsys/egl_drm/intel/intel_context.c [deleted file]
src/gallium/winsys/egl_drm/intel/intel_context.h [deleted file]
src/gallium/winsys/egl_drm/intel/intel_device.c [deleted file]
src/gallium/winsys/egl_drm/intel/intel_device.h [deleted file]
src/gallium/winsys/egl_drm/intel/intel_egl.c [deleted file]
src/gallium/winsys/egl_drm/intel/intel_egl.h [deleted file]
src/gallium/winsys/egl_drm/intel/intel_reg.h [deleted file]
src/gallium/winsys/egl_drm/intel/intel_swapbuffers.c [deleted file]
src/gallium/winsys/gdi/wmesa.c

index 2d14b8aef7417f3ae16b307e981c4969edea907e..cd2c39c3650f3f87005191264c0f68024809c185 100644 (file)
@@ -73,7 +73,6 @@ EGL_DRIVERS_DIRS = demo
 GALLIUM_AUXILIARY_DIRS = draw translate cso_cache pipebuffer tgsi sct rtasm util
 GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a)
 GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple failover
-GALLIUM_WINSYS_COMMON_DIRS =
 GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVER_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a)
 GALLIUM_WINSYS_DIRS = xlib egl_xlib
 
index 7613d41ea19fc26b3e93d2dae458ae584169676e..d441194b08c98978aa454a05178006e252e6a0da 100644 (file)
@@ -55,8 +55,7 @@ EGL_DRIVERS_DIRS = demo dri xdri
 
 DRIVER_DIRS =
 WINDOW_SYSTEM = dri
-GALLIUM_WINSYS_DIRS = dri egl_xlib
-GALLIUM_WINSYS_COMMON_DIRS = intel_drm
+GALLIUM_WINSYS_DIRS = drm egl_xlib
 
 # gamma are missing because they have not been converted to use the new
 # interface.
index bf1718e7a5702461143e28b9c6c69a0e9d526e91..ddab9efc86eac61a8d42c4c5c01a3894c4a4b65f 100644 (file)
@@ -1,8 +1,8 @@
 Import('*')
 
-if env['dri']:
+if env['drm']:
        SConscript([
-               'dri/SConscript',
+               'drm/SConscript',
        ])
        
 if 'xlib' in env['winsys']:
diff --git a/src/gallium/winsys/common/Makefile b/src/gallium/winsys/common/Makefile
deleted file mode 100644 (file)
index 4c0f354..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-TOP = ../../../..
-include $(TOP)/configs/current
-
-
-SUBDIRS = $(GALLIUM_WINSYS_COMMON_DIRS)
-
-
-default: subdirs
-
-
-subdirs:
-       @for dir in $(SUBDIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE)) || exit 1 ; \
-               fi \
-       done
-
-
-clean:
-       rm -f `find . -name \*.[oa]`
diff --git a/src/gallium/winsys/common/Makefile.template b/src/gallium/winsys/common/Makefile.template
deleted file mode 100644 (file)
index 67af778..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# -*-makefile-*-
-
-
-# We still have a dependency on the "dri" buffer manager.  Most likely
-# the interface can be reused in non-dri environments, and also as a
-# frontend to simpler memory managers.
-#
-COMMON_SOURCES = 
-
-OBJECTS = $(C_SOURCES:.c=.o) \
-          $(CPP_SOURCES:.cpp=.o) \
-         $(ASM_SOURCES:.S=.o) 
-
-
-### Include directories
-INCLUDES = \
-       -I. \
-       -I$(TOP)/src/gallium/include \
-       -I$(TOP)/src/gallium/auxiliary \
-       -I$(TOP)/src/gallium/drivers \
-       -I$(TOP)/include \
-        $(DRIVER_INCLUDES)
-
-
-##### RULES #####
-
-.c.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@
-
-.cpp.o:
-       $(CXX) -c $(INCLUDES) $(CXXFLAGS) $(DRIVER_DEFINES) $< -o $@
-
-.S.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES)  $< -o $@
-
-
-##### TARGETS #####
-
-default: depend symlinks $(LIBNAME)
-
-
-$(LIBNAME): $(OBJECTS) Makefile $(TOP)/src/gallium/winsys/common/Makefile.template
-       $(TOP)/bin/mklib -o $@ -static $(OBJECTS) $(DRIVER_LIBS)
-
-
-depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
-       rm -f depend
-       touch depend
-       $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) $(CPP_SOURCES) \
-               $(ASM_SOURCES) 2> /dev/null
-
-
-# Emacs tags
-tags:
-       etags `find . -name \*.[ch]` `find ../include`
-
-
-# Remove .o and backup files
-clean::
-       -rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
-       -rm -f depend depend.bak
-
-
-include depend
diff --git a/src/gallium/winsys/common/intel_drm/Makefile b/src/gallium/winsys/common/intel_drm/Makefile
deleted file mode 100644 (file)
index 913dbef..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-TOP = ../../../../..
-include $(TOP)/configs/current
-
-LIBNAME = inteldrm
-
-C_SOURCES = \
-       intel_be_batchbuffer.c \
-       intel_be_context.c \
-       intel_be_device.c \
-       ws_dri_bufmgr.c \
-       ws_dri_drmpool.c \
-       ws_dri_fencemgr.c \
-       ws_dri_mallocpool.c \
-       ws_dri_slabpool.c
-
-
-include ../Makefile.template
-
-DRIVER_DEFINES = $(shell pkg-config libdrm --cflags \
-                && pkg-config libdrm --atleast-version=2.3.1 \
-                && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
-symlinks:
-
diff --git a/src/gallium/winsys/common/intel_drm/glthread.h b/src/gallium/winsys/common/intel_drm/glthread.h
deleted file mode 100644 (file)
index b8e9d5f..0000000
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  6.5.2
- *
- * Copyright (C) 1999-2006  Brian Paul   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, sublicense,
- * 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 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 NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL 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.
- */
-
-
-/*
- * Thread support for gl dispatch.
- *
- * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
- *                and Christoph Poliwoda (poliwoda@volumegraphics.com)
- * Revised by Keith Whitwell
- * Adapted for new gl dispatcher by Brian Paul
- *
- *
- *
- * DOCUMENTATION
- *
- * This thread module exports the following types:
- *   _glthread_TSD     Thread-specific data area
- *   _glthread_Thread  Thread datatype
- *   _glthread_Mutex   Mutual exclusion lock
- *
- * Macros:
- *   _glthread_DECLARE_STATIC_MUTEX(name)   Declare a non-local mutex
- *   _glthread_INIT_MUTEX(name)             Initialize a mutex
- *   _glthread_LOCK_MUTEX(name)             Lock a mutex
- *   _glthread_UNLOCK_MUTEX(name)           Unlock a mutex
- *
- * Functions:
- *   _glthread_GetID(v)      Get integer thread ID
- *   _glthread_InitTSD()     Initialize thread-specific data
- *   _glthread_GetTSD()      Get thread-specific data
- *   _glthread_SetTSD()      Set thread-specific data
- *
- */
-
-/*
- * If this file is accidentally included by a non-threaded build,
- * it should not cause the build to fail, or otherwise cause problems.
- * In general, it should only be included when needed however.
- */
-
-#ifndef GLTHREAD_H
-#define GLTHREAD_H
-
-
-#if defined(USE_MGL_NAMESPACE)
-#define _glapi_Dispatch _mglapi_Dispatch
-#endif
-
-
-
-#if (defined(PTHREADS) || defined(SOLARIS_THREADS) ||\
-     defined(WIN32_THREADS) || defined(USE_XTHREADS) || defined(BEOS_THREADS)) \
-    && !defined(THREADS)
-# define THREADS
-#endif
-
-#ifdef VMS
-#include <GL/vms_x_fix.h>
-#endif
-
-/*
- * POSIX threads. This should be your choice in the Unix world
- * whenever possible.  When building with POSIX threads, be sure
- * to enable any compiler flags which will cause the MT-safe
- * libc (if one exists) to be used when linking, as well as any
- * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
- * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
- * proper compiling for MT-safe libc etc.
- */
-#if defined(PTHREADS)
-#include <pthread.h> /* POSIX threads headers */
-
-typedef struct {
-   pthread_key_t  key;
-   int initMagic;
-} _glthread_TSD;
-
-typedef pthread_t _glthread_Thread;
-
-typedef pthread_mutex_t _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
-   static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
-
-#define _glthread_INIT_MUTEX(name) \
-   pthread_mutex_init(&(name), NULL)
-
-#define _glthread_DESTROY_MUTEX(name) \
-   pthread_mutex_destroy(&(name))
-
-#define _glthread_LOCK_MUTEX(name) \
-   (void) pthread_mutex_lock(&(name))
-
-#define _glthread_UNLOCK_MUTEX(name) \
-   (void) pthread_mutex_unlock(&(name))
-
-typedef pthread_cond_t _glthread_Cond;
-
-#define _glthread_DECLARE_STATIC_COND(name) \
-   static _glthread_Cond name = PTHREAD_COND_INITIALIZER
-
-#define _glthread_INIT_COND(cond)                      \
-   pthread_cond_init(&(cond), NULL)
-
-#define _glthread_DESTROY_COND(name) \
-   pthread_cond_destroy(&(name))
-
-#define _glthread_COND_WAIT(cond, mutex) \
-  pthread_cond_wait(&(cond), &(mutex))
-
-#define _glthread_COND_SIGNAL(cond) \
-  pthread_cond_signal(&(cond))
-
-#define _glthread_COND_BROADCAST(cond) \
-  pthread_cond_broadcast(&(cond))
-
-
-#else /* PTHREADS */
-
-typedef unsigned int _glthread_Cond;
-#define _glthread_DECLARE_STATIC_COND(name) \
-//  #warning Condition variables not implemented.
-
-#define _glthread_INIT_COND(cond)          \
-  abort();
-
-#define _glthread_DESTROY_COND(name) \
-  abort();
-
-#define _glthread_COND_WAIT(cond, mutex) \
-  abort();
-
-#define _glthread_COND_SIGNAL(cond) \
-  abort();
-
-#define _glthread_COND_BROADCAST(cond) \
-  abort();
-
-#endif
-
-
-/*
- * Solaris threads. Use only up to Solaris 2.4.
- * Solaris 2.5 and higher provide POSIX threads.
- * Be sure to compile with -mt on the Solaris compilers, or
- * use -D_REENTRANT if using gcc.
- */
-#ifdef SOLARIS_THREADS
-#include <thread.h>
-
-typedef struct {
-   thread_key_t key;
-   mutex_t      keylock;
-   int          initMagic;
-} _glthread_TSD;
-
-typedef thread_t _glthread_Thread;
-
-typedef mutex_t _glthread_Mutex;
-
-/* XXX need to really implement mutex-related macros */
-#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
-#define _glthread_INIT_MUTEX(name)  (void) name
-#define _glthread_DESTROY_MUTEX(name) (void) name
-#define _glthread_LOCK_MUTEX(name)  (void) name
-#define _glthread_UNLOCK_MUTEX(name)  (void) name
-
-#endif /* SOLARIS_THREADS */
-
-
-
-
-/*
- * Windows threads. Should work with Windows NT and 95.
- * IMPORTANT: Link with multithreaded runtime library when THREADS are
- * used!
- */
-#ifdef WIN32_THREADS
-#include <windows.h>
-
-typedef struct {
-   DWORD key;
-   int   initMagic;
-} _glthread_TSD;
-
-typedef HANDLE _glthread_Thread;
-
-typedef CRITICAL_SECTION _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name)  /*static*/ _glthread_Mutex name = {0,0,0,0,0,0}
-#define _glthread_INIT_MUTEX(name)  InitializeCriticalSection(&name)
-#define _glthread_DESTROY_MUTEX(name)  DeleteCriticalSection(&name)
-#define _glthread_LOCK_MUTEX(name)  EnterCriticalSection(&name)
-#define _glthread_UNLOCK_MUTEX(name)  LeaveCriticalSection(&name)
-
-#endif /* WIN32_THREADS */
-
-
-
-
-/*
- * XFree86 has its own thread wrapper, Xthreads.h
- * We wrap it again for GL.
- */
-#ifdef USE_XTHREADS
-#include <X11/Xthreads.h>
-
-typedef struct {
-   xthread_key_t key;
-   int initMagic;
-} _glthread_TSD;
-
-typedef xthread_t _glthread_Thread;
-
-typedef xmutex_rec _glthread_Mutex;
-
-#ifdef XMUTEX_INITIALIZER
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
-   static _glthread_Mutex name = XMUTEX_INITIALIZER
-#else
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
-   static _glthread_Mutex name
-#endif
-
-#define _glthread_INIT_MUTEX(name) \
-   xmutex_init(&(name))
-
-#define _glthread_DESTROY_MUTEX(name) \
-   xmutex_clear(&(name))
-
-#define _glthread_LOCK_MUTEX(name) \
-   (void) xmutex_lock(&(name))
-
-#define _glthread_UNLOCK_MUTEX(name) \
-   (void) xmutex_unlock(&(name))
-
-#endif /* USE_XTHREADS */
-
-
-
-/*
- * BeOS threads. R5.x required.
- */
-#ifdef BEOS_THREADS
-
-#include <kernel/OS.h>
-#include <support/TLS.h>
-
-typedef struct {
-   int32        key;
-   int          initMagic;
-} _glthread_TSD;
-
-typedef thread_id _glthread_Thread;
-
-/* Use Benaphore, aka speeder semaphore */
-typedef struct {
-    int32   lock;
-    sem_id  sem;
-} benaphore;
-typedef benaphore _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = { 0, 0 }
-#define _glthread_INIT_MUTEX(name)     name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
-#define _glthread_DESTROY_MUTEX(name)  delete_sem(name.sem), name.lock = 0
-#define _glthread_LOCK_MUTEX(name)     if (name.sem == 0) _glthread_INIT_MUTEX(name); \
-                                                                               if (atomic_add(&(name.lock), 1) >= 1) acquire_sem(name.sem)
-#define _glthread_UNLOCK_MUTEX(name)   if (atomic_add(&(name.lock), -1) > 1) release_sem(name.sem)
-
-#endif /* BEOS_THREADS */
-
-
-
-#ifndef THREADS
-
-/*
- * THREADS not defined
- */
-
-typedef GLuint _glthread_TSD;
-
-typedef GLuint _glthread_Thread;
-
-typedef GLuint _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
-
-#define _glthread_INIT_MUTEX(name)  (void) name
-
-#define _glthread_DESTROY_MUTEX(name)  (void) name
-
-#define _glthread_LOCK_MUTEX(name)  (void) name
-
-#define _glthread_UNLOCK_MUTEX(name)  (void) name
-
-#endif /* THREADS */
-
-
-
-/*
- * Platform independent thread specific data API.
- */
-
-extern unsigned long
-_glthread_GetID(void);
-
-
-extern void
-_glthread_InitTSD(_glthread_TSD *);
-
-
-extern void *
-_glthread_GetTSD(_glthread_TSD *);
-
-
-extern void
-_glthread_SetTSD(_glthread_TSD *, void *);
-
-#if defined(GLX_USE_TLS)
-
-extern __thread struct _glapi_table * _glapi_tls_Dispatch
-    __attribute__((tls_model("initial-exec")));
-
-#define GET_DISPATCH() _glapi_tls_Dispatch
-
-#elif !defined(GL_CALL)
-# if defined(THREADS)
-#  define GET_DISPATCH() \
-   ((__builtin_expect( _glapi_Dispatch != NULL, 1 )) \
-       ? _glapi_Dispatch : _glapi_get_dispatch())
-# else
-#  define GET_DISPATCH() _glapi_Dispatch
-# endif /* defined(THREADS) */
-#endif  /* ndef GL_CALL */
-
-
-#endif /* THREADS_H */
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.c b/src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.c
deleted file mode 100644 (file)
index bc13a57..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-
-#include "intel_be_batchbuffer.h"
-#include "intel_be_context.h"
-#include "intel_be_device.h"
-#include <errno.h>
-
-#include "xf86drm.h"
-
-static void
-intel_realloc_relocs(struct intel_be_batchbuffer *batch, int num_relocs)
-{
-    unsigned long size = num_relocs * I915_RELOC0_STRIDE + I915_RELOC_HEADER;
-
-    size *= sizeof(uint32_t);
-    batch->reloc = realloc(batch->reloc, size);
-    batch->reloc_size = num_relocs;
-}
-
-
-void
-intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch)
-{
-   /*
-    * Get a new, free batchbuffer.
-    */
-    drmBO *bo;
-    struct drm_bo_info_req *req;
-
-   driBOUnrefUserList(batch->list);
-   driBOResetList(batch->list);
-
-   /* base.size is the size available to the i915simple driver */
-   batch->base.size = batch->device->max_batch_size - BATCH_RESERVED;
-   batch->base.actual_size = batch->device->max_batch_size;
-   driBOData(batch->buffer, batch->base.actual_size, NULL, NULL, 0);
-
-   /*
-    * Add the batchbuffer to the validate list.
-    */
-
-   driBOAddListItem(batch->list, batch->buffer,
-                   DRM_BO_FLAG_EXE | DRM_BO_FLAG_MEM_TT,
-                   DRM_BO_FLAG_EXE | DRM_BO_MASK_MEM,
-                   &batch->dest_location, &batch->node);
-
-   req = &batch->node->bo_arg.d.req.bo_req;
-
-   /*
-    * Set up information needed for us to make relocations
-    * relative to the underlying drm buffer objects.
-    */
-
-   driReadLockKernelBO();
-   bo = driBOKernel(batch->buffer);
-   req->presumed_offset = (uint64_t) bo->offset;
-   req->hint = DRM_BO_HINT_PRESUMED_OFFSET;
-   batch->drmBOVirtual = (uint8_t *) bo->virtual;
-   driReadUnlockKernelBO();
-
-   /*
-    * Adjust the relocation buffer size.
-    */
-
-   if (batch->reloc_size > INTEL_MAX_RELOCS ||
-       batch->reloc == NULL)
-     intel_realloc_relocs(batch, INTEL_DEFAULT_RELOCS);
-
-   assert(batch->reloc != NULL);
-   batch->reloc[0] = 0; /* No relocs yet. */
-   batch->reloc[1] = 1; /* Reloc type 1 */
-   batch->reloc[2] = 0; /* Only a single relocation list. */
-   batch->reloc[3] = 0; /* Only a single relocation list. */
-
-   batch->base.map = driBOMap(batch->buffer, DRM_BO_FLAG_WRITE, 0);
-   batch->poolOffset = driBOPoolOffset(batch->buffer);
-   batch->base.ptr = batch->base.map;
-   batch->dirty_state = ~0;
-   batch->nr_relocs = 0;
-   batch->flags = 0;
-   batch->id = 0;//batch->intel->intelScreen->batch_id++;
-}
-
-/*======================================================================
- * Public functions
- */
-struct intel_be_batchbuffer *
-intel_be_batchbuffer_alloc(struct intel_be_context *intel)
-{
-   struct intel_be_batchbuffer *batch = calloc(sizeof(*batch), 1);
-
-   batch->intel = intel;
-   batch->device = intel->device;
-
-   driGenBuffers(intel->device->batchPool, "batchbuffer", 1,
-                 &batch->buffer, 4096,
-                 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_EXE, 0);
-   batch->last_fence = NULL;
-   batch->list = driBOCreateList(20);
-   batch->reloc = NULL;
-   intel_be_batchbuffer_reset(batch);
-   return batch;
-}
-
-void
-intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch)
-{
-   if (batch->last_fence) {
-      driFenceFinish(batch->last_fence,
-                    DRM_FENCE_TYPE_EXE, FALSE);
-      driFenceUnReference(&batch->last_fence);
-   }
-   if (batch->base.map) {
-      driBOUnmap(batch->buffer);
-      batch->base.map = NULL;
-   }
-   driBOUnReference(batch->buffer);
-   driBOFreeList(batch->list);
-   if (batch->reloc)
-       free(batch->reloc);
-   batch->buffer = NULL;
-   free(batch);
-}
-
-void
-intel_be_offset_relocation(struct intel_be_batchbuffer *batch,
-                       unsigned pre_add,
-                       struct _DriBufferObject *driBO,
-                       uint64_t val_flags,
-                       uint64_t val_mask)
-{
-    int itemLoc;
-    struct _drmBONode *node;
-    uint32_t *reloc;
-    struct drm_bo_info_req *req;
-
-    driBOAddListItem(batch->list, driBO, val_flags, val_mask,
-                    &itemLoc, &node);
-    req = &node->bo_arg.d.req.bo_req;
-
-    if (!(req->hint &  DRM_BO_HINT_PRESUMED_OFFSET)) {
-
-       /*
-        * Stop other threads from tampering with the underlying
-        * drmBO while we're reading its offset.
-        */
-
-       driReadLockKernelBO();
-       req->presumed_offset = (uint64_t) driBOKernel(driBO)->offset;
-       driReadUnlockKernelBO();
-       req->hint = DRM_BO_HINT_PRESUMED_OFFSET;
-    }
-
-    pre_add += driBOPoolOffset(driBO);
-
-    if (batch->nr_relocs == batch->reloc_size)
-       intel_realloc_relocs(batch, batch->reloc_size * 2);
-
-    reloc = batch->reloc +
-       (I915_RELOC_HEADER + batch->nr_relocs * I915_RELOC0_STRIDE);
-
-    reloc[0] = ((uint8_t *)batch->base.ptr - batch->drmBOVirtual);
-    i915_batchbuffer_dword(&batch->base, req->presumed_offset + pre_add);
-    reloc[1] = pre_add;
-    reloc[2] = itemLoc;
-    reloc[3] = batch->dest_location;
-    batch->nr_relocs++;
-}
-
-static void
-i915_drm_copy_reply(const struct drm_bo_info_rep * rep, drmBO * buf)
-{
-    buf->handle = rep->handle;
-    buf->flags = rep->flags;
-    buf->size = rep->size;
-    buf->offset = rep->offset;
-    buf->mapHandle = rep->arg_handle;
-    buf->proposedFlags = rep->proposed_flags;
-    buf->start = rep->buffer_start;
-    buf->fenceFlags = rep->fence_flags;
-    buf->replyFlags = rep->rep_flags;
-    buf->pageAlignment = rep->page_alignment;
-}
-
-static int
-i915_execbuf(struct intel_be_batchbuffer *batch,
-            unsigned int used,
-            boolean ignore_cliprects,
-            drmBOList *list,
-            struct drm_i915_execbuffer *ea)
-{
-// struct intel_be_context *intel = batch->intel;
-   drmBONode *node;
-   drmMMListHead *l;
-   struct drm_i915_op_arg *arg, *first;
-   struct drm_bo_op_req *req;
-   struct drm_bo_info_rep *rep;
-   uint64_t *prevNext = NULL;
-   drmBO *buf;
-   int ret = 0;
-   uint32_t count = 0;
-
-   first = NULL;
-   for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-
-      arg = &node->bo_arg;
-      req = &arg->d.req;
-
-      if (!first)
-        first = arg;
-
-      if (prevNext)
-        *prevNext = (unsigned long)arg;
-
-      prevNext = &arg->next;
-      req->bo_req.handle = node->buf->handle;
-      req->op = drm_bo_validate;
-      req->bo_req.flags = node->arg0;
-      req->bo_req.mask = node->arg1;
-      req->bo_req.hint |= 0;
-      count++;
-   }
-
-   memset(ea, 0, sizeof(*ea));
-   ea->num_buffers = count;
-   ea->batch.start = batch->poolOffset;
-   ea->batch.used = used;
-#if 0 /* ZZZ JB: no cliprects used */
-   ea->batch.cliprects = intel->pClipRects;
-   ea->batch.num_cliprects = ignore_cliprects ? 0 : intel->numClipRects;
-   ea->batch.DR1 = 0;
-   ea->batch.DR4 = 0;((((GLuint) intel->drawX) & 0xffff) |
-                  (((GLuint) intel->drawY) << 16));
-#else
-   ea->batch.cliprects = NULL;
-   ea->batch.num_cliprects = 0;
-   ea->batch.DR1 = 0;
-   ea->batch.DR4 = 0;
-#endif
-   ea->fence_arg.flags = DRM_I915_FENCE_FLAG_FLUSHED;
-   ea->ops_list = (unsigned long) first;
-   first->reloc_ptr = (unsigned long) batch->reloc;
-   batch->reloc[0] = batch->nr_relocs;
-
-   //return -EFAULT;
-   do {
-      ret = drmCommandWriteRead(batch->device->fd, DRM_I915_EXECBUFFER, ea,
-                               sizeof(*ea));
-   } while (ret == -EAGAIN);
-
-   if (ret != 0)
-      return ret;
-
-   for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-      arg = &node->bo_arg;
-      rep = &arg->d.rep.bo_info;
-
-      if (!arg->handled) {
-        return -EFAULT;
-      }
-      if (arg->d.rep.ret)
-        return arg->d.rep.ret;
-
-      buf = node->buf;
-      i915_drm_copy_reply(rep, buf);
-   }
-   return 0;
-}
-
-/* TODO: Push this whole function into bufmgr.
- */
-static struct _DriFenceObject *
-do_flush_locked(struct intel_be_batchbuffer *batch,
-                unsigned int used,
-                boolean ignore_cliprects, boolean allow_unlock)
-{
-   struct intel_be_context *intel = batch->intel;
-   struct _DriFenceObject *fo;
-   drmFence fence;
-   drmBOList *boList;
-   struct drm_i915_execbuffer ea;
-   int ret = 0;
-
-   driBOValidateUserList(batch->list);
-   boList = driGetdrmBOList(batch->list);
-
-#if 0 /* ZZZ JB Allways run */
-   if (!(intel->numClipRects == 0 && !ignore_cliprects)) {
-#else
-   if (1) {
-#endif
-      ret = i915_execbuf(batch, used, ignore_cliprects, boList, &ea);
-   } else {
-     driPutdrmBOList(batch->list);
-     fo = NULL;
-     goto out;
-   }
-   driPutdrmBOList(batch->list);
-   if (ret)
-      abort();
-
-   if (ea.fence_arg.error != 0) {
-
-     /*
-      * The hardware has been idled by the kernel.
-      * Don't fence the driBOs.
-      */
-
-       if (batch->last_fence)
-          driFenceUnReference(&batch->last_fence);
-#if 0 /* ZZZ JB: no _mesa_* funcs in gallium */
-       _mesa_printf("fence error\n");
-#endif
-       batch->last_fence = NULL;
-       fo = NULL;
-       goto out;
-   }
-
-   fence.handle = ea.fence_arg.handle;
-   fence.fence_class = ea.fence_arg.fence_class;
-   fence.type = ea.fence_arg.type;
-   fence.flags = ea.fence_arg.flags;
-   fence.signaled = ea.fence_arg.signaled;
-
-   fo = driBOFenceUserList(batch->device->fenceMgr, batch->list,
-                          "SuperFence", &fence);
-
-   if (driFenceType(fo) & DRM_I915_FENCE_TYPE_RW) {
-       if (batch->last_fence)
-          driFenceUnReference(&batch->last_fence);
-   /*
-       * FIXME: Context last fence??
-       */
-       batch->last_fence = fo;
-       driFenceReference(fo);
-   }
- out:
-#if 0 /* ZZZ JB: fix this */
-   intel->vtbl.lost_hardware(intel);
-#else
-   (void)intel;
-#endif
-   return fo;
-}
-
-
-struct _DriFenceObject *
-intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch)
-{
-   struct intel_be_context *intel = batch->intel;
-   unsigned int used = batch->base.ptr - batch->base.map;
-   boolean was_locked = batch->intel->hardware_locked(intel);
-   struct _DriFenceObject *fence;
-
-   if (used == 0) {
-      driFenceReference(batch->last_fence);
-      return batch->last_fence;
-   }
-
-   /* Add the MI_BATCH_BUFFER_END.  Always add an MI_FLUSH - this is a
-    * performance drain that we would like to avoid.
-    */
-#if 0 /* ZZZ JB: what should we do here? */
-   if (used & 4) {
-      ((int *) batch->base.ptr)[0] = intel->vtbl.flush_cmd();
-      ((int *) batch->base.ptr)[1] = 0;
-      ((int *) batch->base.ptr)[2] = MI_BATCH_BUFFER_END;
-      used += 12;
-   }
-   else {
-      ((int *) batch->base.ptr)[0] = intel->vtbl.flush_cmd();
-      ((int *) batch->base.ptr)[1] = MI_BATCH_BUFFER_END;
-      used += 8;
-   }
-#else
-   if (used & 4) {
-      ((int *) batch->base.ptr)[0] = ((0<<29)|(4<<23)); // MI_FLUSH;
-      ((int *) batch->base.ptr)[1] = 0;
-      ((int *) batch->base.ptr)[2] = (0xA<<23); // MI_BATCH_BUFFER_END;
-      used += 12;
-   }
-   else {
-      ((int *) batch->base.ptr)[0] = ((0<<29)|(4<<23)); // MI_FLUSH;
-      ((int *) batch->base.ptr)[1] = (0xA<<23); // MI_BATCH_BUFFER_END;
-      used += 8;
-   }
-#endif
-   driBOUnmap(batch->buffer);
-   batch->base.ptr = NULL;
-   batch->base.map = NULL;
-
-   /* TODO: Just pass the relocation list and dma buffer up to the
-    * kernel.
-    */
-   if (!was_locked)
-      intel->hardware_lock(intel);
-
-   fence = do_flush_locked(batch, used, !(batch->flags & INTEL_BATCH_CLIPRECTS),
-                          FALSE);
-
-   if (!was_locked)
-      intel->hardware_unlock(intel);
-
-   /* Reset the buffer:
-    */
-   intel_be_batchbuffer_reset(batch);
-   return fence;
-}
-
-void
-intel_be_batchbuffer_finish(struct intel_be_batchbuffer *batch)
-{
-   struct _DriFenceObject *fence = intel_be_batchbuffer_flush(batch);
-   driFenceFinish(fence, driFenceType(fence), FALSE);
-   driFenceUnReference(&fence);
-}
-
-#if 0
-void
-intel_be_batchbuffer_data(struct intel_be_batchbuffer *batch,
-                       const void *data, unsigned int bytes, unsigned int flags)
-{
-   assert((bytes & 3) == 0);
-   intel_batchbuffer_require_space(batch, bytes, flags);
-   memcpy(batch->base.ptr, data, bytes);
-   batch->base.ptr += bytes;
-}
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.h b/src/gallium/winsys/common/intel_drm/intel_be_batchbuffer.h
deleted file mode 100644 (file)
index f150e3a..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-
-#ifndef INTEL_BE_BATCHBUFFER_H
-#define INTEL_BE_BATCHBUFFER_H
-
-#include "i915simple/i915_batch.h"
-
-#include "ws_dri_bufmgr.h"
-
-#define BATCH_RESERVED 16
-
-#define INTEL_DEFAULT_RELOCS 100
-#define INTEL_MAX_RELOCS 400
-
-#define INTEL_BATCH_NO_CLIPRECTS 0x1
-#define INTEL_BATCH_CLIPRECTS    0x2
-
-struct intel_be_context;
-struct intel_be_device;
-
-struct intel_be_batchbuffer
-{
-       struct i915_batchbuffer base;
-
-       struct intel_be_context *intel;
-       struct intel_be_device *device;
-
-       struct _DriBufferObject *buffer;
-       struct _DriFenceObject *last_fence;
-       uint32_t flags;
-
-       struct _DriBufferList *list;
-       size_t list_count;
-
-       uint32_t *reloc;
-       size_t reloc_size;
-       size_t nr_relocs;
-
-       uint32_t dirty_state;
-       uint32_t id;
-
-       uint32_t poolOffset;
-       uint8_t *drmBOVirtual;
-       struct _drmBONode *node; /* Validation list node for this buffer */
-       int dest_location;     /* Validation list sequence for this buffer */
-};
-
-struct intel_be_batchbuffer *
-intel_be_batchbuffer_alloc(struct intel_be_context *intel);
-
-void
-intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch);
-
-void
-intel_be_batchbuffer_finish(struct intel_be_batchbuffer *batch);
-
-struct _DriFenceObject *
-intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch);
-
-void
-intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch);
-
-void
-intel_be_offset_relocation(struct intel_be_batchbuffer *batch,
-                       unsigned pre_add,
-                       struct _DriBufferObject *driBO,
-                       uint64_t val_flags,
-                       uint64_t val_mask);
-
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_context.c b/src/gallium/winsys/common/intel_drm/intel_be_context.c
deleted file mode 100644 (file)
index 1af3967..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-
-/*
- * Authors: Jakob Bornecrantz <jakob-at-tungstengraphics.com>
- */
-
-#include "ws_dri_fencemgr.h"
-#include "intel_be_device.h"
-#include "intel_be_context.h"
-#include "intel_be_batchbuffer.h"
-
-static INLINE struct intel_be_context *
-intel_be_context(struct i915_winsys *sws)
-{
-       return (struct intel_be_context *)sws;
-}
-
-/* Simple batchbuffer interface:
- */
-
-static struct i915_batchbuffer*
-intel_i915_batch_get(struct i915_winsys *sws)
-{
-       struct intel_be_context *intel = intel_be_context(sws);
-       return &intel->batch->base;
-}
-
-static void intel_i915_batch_reloc(struct i915_winsys *sws,
-                                  struct pipe_buffer *buf,
-                                  unsigned access_flags,
-                                  unsigned delta)
-{
-       struct intel_be_context *intel = intel_be_context(sws);
-
-       unsigned flags = DRM_BO_FLAG_MEM_TT;
-       unsigned mask = DRM_BO_MASK_MEM;
-
-       if (access_flags & I915_BUFFER_ACCESS_WRITE) {
-               flags |= DRM_BO_FLAG_WRITE;
-               mask |= DRM_BO_FLAG_WRITE;
-       }
-
-       if (access_flags & I915_BUFFER_ACCESS_READ) {
-               flags |= DRM_BO_FLAG_READ;
-               mask |= DRM_BO_FLAG_READ;
-       }
-
-       intel_be_offset_relocation(intel->batch,
-                               delta,
-                               dri_bo(buf),
-                               flags,
-                               mask);
-}
-
-static void intel_i915_batch_flush(struct i915_winsys *sws,
-                                  struct pipe_fence_handle **fence)
-{
-       struct intel_be_context *intel = intel_be_context(sws);
-
-       union {
-               struct _DriFenceObject *dri;
-               struct pipe_fence_handle *pipe;
-       } fu;
-
-       if (fence)
-               assert(!*fence);
-
-       fu.dri = intel_be_batchbuffer_flush(intel->batch);
-
-       if (!fu.dri) {
-               assert(0);
-               *fence = NULL;
-               return;
-       }
-
-       if (fu.dri) {
-               if (fence)
-                       *fence = fu.pipe;
-               else
-                       driFenceUnReference(&fu.dri);
-       }
-
-}
-
-boolean
-intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device)
-{
-       assert(intel);
-       assert(device);
-
-       intel->device = device;
-
-       /* TODO move framebuffer createion to the driver */
-
-       intel->base.batch_get = intel_i915_batch_get;
-       intel->base.batch_reloc = intel_i915_batch_reloc;
-       intel->base.batch_flush = intel_i915_batch_flush;
-
-       intel->batch = intel_be_batchbuffer_alloc(intel);
-
-       return true;
-}
-
-void
-intel_be_destroy_context(struct intel_be_context *intel)
-{
-       intel_be_batchbuffer_free(intel->batch);
-}
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_context.h b/src/gallium/winsys/common/intel_drm/intel_be_context.h
deleted file mode 100644 (file)
index d5cbc93..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* These need to be diffrent from the intel winsys */
-#ifndef INTEL_BE_CONTEXT_H
-#define INTEL_BE_CONTEXT_H
-
-#include "i915simple/i915_winsys.h"
-
-struct intel_be_context
-{
-       /** Interface to i915simple driver */
-       struct i915_winsys base;
-
-       struct intel_be_device *device;
-       struct intel_be_batchbuffer *batch;
-
-       /*
-     * Hardware lock functions.
-     *
-     * Needs to be filled in by the winsys.
-     */
-       void (*hardware_lock)(struct intel_be_context *context);
-       void (*hardware_unlock)(struct intel_be_context *context);
-       boolean (*hardware_locked)(struct intel_be_context *context);
-};
-
-/**
- * Intialize a allocated intel_be_context struct.
- *
- * Remember to set the hardware_* functions.
- */
-boolean
-intel_be_init_context(struct intel_be_context *intel,
-                     struct intel_be_device *device);
-
-/**
- * Destroy a intel_be_context.
- * Does not free the struct that is up to the winsys.
- */
-void
-intel_be_destroy_context(struct intel_be_context *intel);
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_device.c b/src/gallium/winsys/common/intel_drm/intel_be_device.c
deleted file mode 100644 (file)
index 8db0329..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-
-
-/*
- * Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
- *                      Jakob Bornecrantz <jakob-at-tungstengraphics-dot-com>
- */
-
-#include "intel_be_device.h"
-#include "ws_dri_bufmgr.h"
-#include "ws_dri_bufpool.h"
-#include "ws_dri_fencemgr.h"
-
-#include "pipe/p_winsys.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_state.h"
-#include "pipe/p_util.h"
-#include "pipe/p_inlines.h"
-
-#include "i915simple/i915_screen.h"
-
-/* Turn a pipe winsys into an intel/pipe winsys:
- */
-static INLINE struct intel_be_device *
-intel_be_device( struct pipe_winsys *winsys )
-{
-       return (struct intel_be_device *)winsys;
-}
-
-
-/*
- * Buffer functions.
- *
- * Most callbacks map direcly onto dri_bufmgr operations:
- */
-
-static void *intel_be_buffer_map(struct pipe_winsys *winsys,
-                                       struct pipe_buffer *buf,
-                                       unsigned flags )
-{
-       unsigned drm_flags = 0;
-       
-       if (flags & PIPE_BUFFER_USAGE_CPU_WRITE)
-               drm_flags |= DRM_BO_FLAG_WRITE;
-
-       if (flags & PIPE_BUFFER_USAGE_CPU_READ)
-               drm_flags |= DRM_BO_FLAG_READ;
-
-       return driBOMap( dri_bo(buf), drm_flags, 0 );
-}
-
-static void intel_be_buffer_unmap(struct pipe_winsys *winsys,
-                                        struct pipe_buffer *buf)
-{
-       driBOUnmap( dri_bo(buf) );
-}
-
-static void
-intel_be_buffer_destroy(struct pipe_winsys *winsys,
-                         struct pipe_buffer *buf)
-{
-       driBOUnReference( dri_bo(buf) );
-       FREE(buf);
-}
-
-static struct pipe_buffer *
-intel_be_buffer_create(struct pipe_winsys *winsys,
-                                                 unsigned alignment,
-                                                 unsigned usage,
-                                                 unsigned size )
-{
-       struct intel_be_buffer *buffer = CALLOC_STRUCT( intel_be_buffer );
-       struct intel_be_device *iws = intel_be_device(winsys);
-       unsigned flags = 0;
-       struct _DriBufferPool *pool;
-
-       buffer->base.refcount = 1;
-       buffer->base.alignment = alignment;
-       buffer->base.usage = usage;
-       buffer->base.size = size;
-
-       if (usage & (PIPE_BUFFER_USAGE_VERTEX | PIPE_BUFFER_USAGE_CONSTANT)) {
-               flags |= DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED;
-               pool = iws->mallocPool;
-       } else if (usage & PIPE_BUFFER_USAGE_CUSTOM) {
-               /* For vertex buffers */
-               flags |= DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_TT;
-               pool = iws->vertexPool;
-       } else {
-               flags |= DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_TT;
-               pool = iws->regionPool;
-       }
-
-       if (usage & PIPE_BUFFER_USAGE_GPU_READ)
-               flags |= DRM_BO_FLAG_READ;
-
-       if (usage & PIPE_BUFFER_USAGE_GPU_WRITE)
-               flags |= DRM_BO_FLAG_WRITE;
-
-       /* drm complains if we don't set any read/write flags.
-        */
-       if ((flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE)) == 0)
-               flags |= DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE;
-
-       buffer->pool = pool;
-       driGenBuffers( buffer->pool,
-               "pipe buffer", 1, &buffer->driBO, alignment, flags, 0 );
-
-       driBOData( buffer->driBO, size, NULL, buffer->pool, 0 );
-
-       return &buffer->base;
-}
-
-
-static struct pipe_buffer *
-intel_be_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned bytes)
-{
-       struct intel_be_buffer *buffer = CALLOC_STRUCT( intel_be_buffer );
-       struct intel_be_device *iws = intel_be_device(winsys);
-
-       driGenUserBuffer( iws->regionPool,
-                         "pipe user buffer", &buffer->driBO, ptr, bytes );
-
-       buffer->base.refcount = 1;
-
-       return &buffer->base;
-}
-
-struct pipe_buffer *
-intel_be_buffer_from_handle(struct intel_be_device *device,
-                            const char* name, unsigned handle)
-{
-       struct intel_be_buffer *be_buf = malloc(sizeof(*be_buf));
-       struct pipe_buffer *buffer;
-
-       if (!be_buf)
-               goto err;
-
-       memset(be_buf, 0, sizeof(*be_buf));
-
-       driGenBuffers(device->staticPool, name, 1, &be_buf->driBO, 0, 0, 0);
-    driBOSetReferenced(be_buf->driBO, handle);
-
-       if (0) /** XXX TODO check error */
-               goto err_bo;
-       
-       buffer = &be_buf->base;
-       buffer->refcount = 1;
-       buffer->alignment = 0;
-       buffer->usage = 0;
-       buffer->size = driBOSize(be_buf->driBO);
-
-       return buffer;
-err_bo:
-       free(be_buf);
-err:
-       return NULL;
-}
-
-
-/*
- * Surface functions.
- *
- * Deprecated!
- */
-
-static struct pipe_surface *
-intel_i915_surface_alloc(struct pipe_winsys *winsys)
-{
-       assert((size_t)"intel_i915_surface_alloc is deprecated" & 0);
-       return NULL;
-}
-
-static int
-intel_i915_surface_alloc_storage(struct pipe_winsys *winsys,
-                                struct pipe_surface *surf,
-                                unsigned width, unsigned height,
-                                enum pipe_format format,
-                                unsigned flags,
-                                unsigned tex_usage)
-{
-       assert((size_t)"intel_i915_surface_alloc_storage is deprecated" & 0);
-       return -1;
-}
-
-static void
-intel_i915_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
-{
-       assert((size_t)"intel_i915_surface_release is deprecated" & 0);
-}
-
-
-/*
- * Fence functions
- */
-
-static void
-intel_be_fence_reference( struct pipe_winsys *sws,
-                      struct pipe_fence_handle **ptr,
-                      struct pipe_fence_handle *fence )
-{
-       if (*ptr)
-               driFenceUnReference((struct _DriFenceObject **)ptr);
-
-       if (fence)
-               *ptr = (struct pipe_fence_handle *)driFenceReference((struct _DriFenceObject *)fence);
-}
-
-static int
-intel_be_fence_signalled( struct pipe_winsys *sws,
-                      struct pipe_fence_handle *fence,
-                      unsigned flag )
-{
-       return driFenceSignaled((struct _DriFenceObject *)fence, flag);
-}
-
-static int
-intel_be_fence_finish( struct pipe_winsys *sws,
-                   struct pipe_fence_handle *fence,
-                   unsigned flag )
-{
-       return driFenceFinish((struct _DriFenceObject *)fence, flag, 0);
-}
-
-
-/*
- * Misc functions
- */
-
-boolean
-intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
-{
-       dev->fd = fd;
-       dev->max_batch_size = 16 * 4096;
-       dev->max_vertex_size = 128 * 4096;
-
-       dev->base.buffer_create = intel_be_buffer_create;
-       dev->base.user_buffer_create = intel_be_user_buffer_create;
-       dev->base.buffer_map = intel_be_buffer_map;
-       dev->base.buffer_unmap = intel_be_buffer_unmap;
-       dev->base.buffer_destroy = intel_be_buffer_destroy;
-       dev->base.surface_alloc = intel_i915_surface_alloc;
-       dev->base.surface_alloc_storage = intel_i915_surface_alloc_storage;
-       dev->base.surface_release = intel_i915_surface_release;
-       dev->base.fence_reference = intel_be_fence_reference;
-       dev->base.fence_signalled = intel_be_fence_signalled;
-       dev->base.fence_finish = intel_be_fence_finish;
-
-#if 0 /* Set by the winsys */
-       dev->base.flush_frontbuffer = intel_flush_frontbuffer;
-       dev->base.get_name = intel_get_name;
-#endif
-
-       dev->fMan = driInitFreeSlabManager(10, 10);
-       dev->fenceMgr = driFenceMgrTTMInit(dev->fd);
-
-       dev->mallocPool = driMallocPoolInit();
-       dev->staticPool = driDRMPoolInit(dev->fd);
-       /* Sizes: 64 128 256 512 1024 2048 4096 8192 16384 32768 */
-       dev->regionPool = driSlabPoolInit(dev->fd,
-                                         DRM_BO_FLAG_READ |
-                                         DRM_BO_FLAG_WRITE |
-                                         DRM_BO_FLAG_MEM_TT,
-                                         DRM_BO_FLAG_READ |
-                                         DRM_BO_FLAG_WRITE |
-                                         DRM_BO_FLAG_MEM_TT,
-                                         64,
-                                         10, 120, 4096 * 64, 0,
-                                         dev->fMan);
-
-       dev->vertexPool = driSlabPoolInit(dev->fd,
-                                         DRM_BO_FLAG_READ |
-                                         DRM_BO_FLAG_WRITE |
-                                         DRM_BO_FLAG_MEM_TT,
-                                         DRM_BO_FLAG_READ |
-                                         DRM_BO_FLAG_WRITE |
-                                         DRM_BO_FLAG_MEM_TT,
-                                         dev->max_vertex_size,
-                                         1, 120, dev->max_vertex_size * 4, 0,
-                                         dev->fMan);
-
-       dev->batchPool = driSlabPoolInit(dev->fd,
-                                        DRM_BO_FLAG_EXE |
-                                        DRM_BO_FLAG_MEM_TT,
-                                        DRM_BO_FLAG_EXE |
-                                        DRM_BO_FLAG_MEM_TT,
-                                        dev->max_batch_size,
-                                        1, 40, dev->max_batch_size * 16, 0,
-                                        dev->fMan);
-
-       /* Fill in this struct with callbacks that i915simple will need to
-        * communicate with the window system, buffer manager, etc.
-        */
-       dev->screen = i915_create_screen(&dev->base, id);
-
-       return true;
-}
-
-void
-intel_be_destroy_device(struct intel_be_device *dev)
-{
-       driPoolTakeDown(dev->mallocPool);
-       driPoolTakeDown(dev->staticPool);
-       driPoolTakeDown(dev->regionPool);
-       driPoolTakeDown(dev->vertexPool);
-       driPoolTakeDown(dev->batchPool);
-
-       /** TODO takedown fenceMgr and fMan */
-}
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_device.h b/src/gallium/winsys/common/intel_drm/intel_be_device.h
deleted file mode 100644 (file)
index 3f8b3f5..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef INTEL_DRM_DEVICE_H
-#define INTEL_DRM_DEVICE_H
-
-#include "pipe/p_winsys.h"
-#include "pipe/p_context.h"
-
-/*
- * Device
- */
-
-struct intel_be_device
-{
-       struct pipe_winsys base;
-
-       /**
-        * Hw level screen
-        */
-       struct pipe_screen *screen;
-
-       int fd; /**< Drm file discriptor */
-
-       size_t max_batch_size;
-       size_t max_vertex_size;
-
-       struct _DriFenceMgr *fenceMgr;
-
-       struct _DriBufferPool *batchPool;
-       struct _DriBufferPool *regionPool;
-       struct _DriBufferPool *mallocPool;
-       struct _DriBufferPool *vertexPool;
-       struct _DriBufferPool *staticPool;
-       struct _DriFreeSlabManager *fMan;
-};
-
-boolean
-intel_be_init_device(struct intel_be_device *device, int fd, unsigned id);
-
-void
-intel_be_destroy_device(struct intel_be_device *dev);
-
-/*
- * Buffer
- */
-
-struct intel_be_buffer {
-       struct pipe_buffer base;
-       struct _DriBufferPool *pool;
-       struct _DriBufferObject *driBO;
-};
-
-/**
- * Create a be buffer from a drm bo handle
- *
- * Takes a reference
- */
-struct pipe_buffer *
-intel_be_buffer_from_handle(struct intel_be_device *device,
-                            const char* name, unsigned handle);
-
-static INLINE struct intel_be_buffer *
-intel_be_buffer(struct pipe_buffer *buf)
-{
-       return (struct intel_be_buffer *)buf;
-}
-
-static INLINE struct _DriBufferObject *
-dri_bo(struct pipe_buffer *buf)
-{
-       return intel_be_buffer(buf)->driBO;
-}
-
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.c b/src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.c
deleted file mode 100644 (file)
index b6d901f..0000000
+++ /dev/null
@@ -1,949 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
- */
-
-#include <xf86drm.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "glthread.h"
-#include "errno.h"
-#include "ws_dri_bufmgr.h"
-#include "string.h"
-#include "pipe/p_debug.h"
-#include "ws_dri_bufpool.h"
-#include "ws_dri_fencemgr.h"
-
-
-/*
- * This lock is here to protect drmBO structs changing underneath us during a
- * validate list call, since validatelist cannot take individiual locks for
- * each drmBO. Validatelist takes this lock in write mode. Any access to an
- * individual drmBO should take this lock in read mode, since in that case, the
- * driBufferObject mutex will protect the access. Locking order is
- * driBufferObject mutex - > this rw lock.
- */
-
-_glthread_DECLARE_STATIC_MUTEX(bmMutex);
-_glthread_DECLARE_STATIC_COND(bmCond);
-
-static int kernelReaders = 0;
-static int num_buffers = 0;
-static int num_user_buffers = 0;
-
-static drmBO *drmBOListBuf(void *iterator)
-{
-    drmBONode *node;
-    drmMMListHead *l = (drmMMListHead *) iterator;
-    node = DRMLISTENTRY(drmBONode, l, head);
-    return node->buf;
-}
-
-static void *drmBOListIterator(drmBOList *list)
-{
-    void *ret = list->list.next;
-
-    if (ret == &list->list)
-       return NULL;
-    return ret;
-}
-
-static void *drmBOListNext(drmBOList *list, void *iterator)
-{
-    void *ret;
-
-    drmMMListHead *l = (drmMMListHead *) iterator;
-    ret = l->next;
-    if (ret == &list->list)
-       return NULL;
-    return ret;
-}
-
-static drmBONode *drmAddListItem(drmBOList *list, drmBO *item,
-                                uint64_t arg0,
-                                uint64_t arg1)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-
-    l = list->free.next;
-    if (l == &list->free) {
-       node = (drmBONode *) malloc(sizeof(*node));
-       if (!node) {
-           return NULL;
-       }
-       list->numCurrent++;
-    }
-    else {
-       DRMLISTDEL(l);
-       node = DRMLISTENTRY(drmBONode, l, head);
-    }
-    node->buf = item;
-    node->arg0 = arg0;
-    node->arg1 = arg1;
-    DRMLISTADD(&node->head, &list->list);
-    list->numOnList++;
-    return node;
-}
-
-static int drmAddValidateItem(drmBOList *list, drmBO *buf, uint64_t flags,
-                             uint64_t mask, int *newItem)
-{
-    drmBONode *node, *cur;
-    drmMMListHead *l;
-
-    *newItem = 0;
-    cur = NULL;
-
-    for (l = list->list.next; l != &list->list; l = l->next) {
-       node = DRMLISTENTRY(drmBONode, l, head);
-       if (node->buf == buf) {
-           cur = node;
-           break;
-       }
-    }
-    if (!cur) {
-       cur = drmAddListItem(list, buf, flags, mask);
-       if (!cur) {
-           return -ENOMEM;
-       }
-       *newItem = 1;
-       cur->arg0 = flags;
-       cur->arg1 = mask;
-    }
-    else {
-        uint64_t memFlags = cur->arg0 & flags & DRM_BO_MASK_MEM;
-       uint64_t accFlags = (cur->arg0 | flags) & ~DRM_BO_MASK_MEM;
-
-       if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
-           return -EINVAL;
-       }
-
-       cur->arg1 |= mask;
-       cur->arg0 = (cur->arg0 & ~mask) | ((memFlags | accFlags) & mask);
-
-       if (((cur->arg1 & DRM_BO_MASK_MEM) != 0) &&
-           (cur->arg0 & DRM_BO_MASK_MEM) == 0) {
-           return -EINVAL;
-       }
-    }
-    return 0;
-}
-
-static void drmBOFreeList(drmBOList *list)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-
-    l = list->list.next;
-    while(l != &list->list) {
-       DRMLISTDEL(l);
-       node = DRMLISTENTRY(drmBONode, l, head);
-       free(node);
-       l = list->list.next;
-       list->numCurrent--;
-       list->numOnList--;
-    }
-
-    l = list->free.next;
-    while(l != &list->free) {
-       DRMLISTDEL(l);
-       node = DRMLISTENTRY(drmBONode, l, head);
-       free(node);
-       l = list->free.next;
-       list->numCurrent--;
-    }
-}
-
-static int drmAdjustListNodes(drmBOList *list)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-    int ret = 0;
-
-    while(list->numCurrent < list->numTarget) {
-       node = (drmBONode *) malloc(sizeof(*node));
-       if (!node) {
-           ret = -ENOMEM;
-           break;
-       }
-       list->numCurrent++;
-       DRMLISTADD(&node->head, &list->free);
-    }
-
-    while(list->numCurrent > list->numTarget) {
-       l = list->free.next;
-       if (l == &list->free)
-           break;
-       DRMLISTDEL(l);
-       node = DRMLISTENTRY(drmBONode, l, head);
-       free(node);
-       list->numCurrent--;
-    }
-    return ret;
-}
-
-static int drmBOCreateList(int numTarget, drmBOList *list)
-{
-    DRMINITLISTHEAD(&list->list);
-    DRMINITLISTHEAD(&list->free);
-    list->numTarget = numTarget;
-    list->numCurrent = 0;
-    list->numOnList = 0;
-    return drmAdjustListNodes(list);
-}
-
-static int drmBOResetList(drmBOList *list)
-{
-    drmMMListHead *l;
-    int ret;
-
-    ret = drmAdjustListNodes(list);
-    if (ret)
-       return ret;
-
-    l = list->list.next;
-    while (l != &list->list) {
-       DRMLISTDEL(l);
-       DRMLISTADD(l, &list->free);
-       list->numOnList--;
-       l = list->list.next;
-    }
-    return drmAdjustListNodes(list);
-}
-
-void driWriteLockKernelBO(void)
-{
-    _glthread_LOCK_MUTEX(bmMutex);
-    while(kernelReaders != 0)
-       _glthread_COND_WAIT(bmCond, bmMutex);
-}
-
-void driWriteUnlockKernelBO(void)
-{
-    _glthread_UNLOCK_MUTEX(bmMutex);
-}
-
-void driReadLockKernelBO(void)
-{
-    _glthread_LOCK_MUTEX(bmMutex);
-    kernelReaders++;
-    _glthread_UNLOCK_MUTEX(bmMutex);
-}
-
-void driReadUnlockKernelBO(void)
-{
-    _glthread_LOCK_MUTEX(bmMutex);
-    if (--kernelReaders == 0)
-        _glthread_COND_BROADCAST(bmCond);
-    _glthread_UNLOCK_MUTEX(bmMutex);
-}
-
-
-
-
-/*
- * TODO: Introduce fence pools in the same way as
- * buffer object pools.
- */
-
-typedef struct _DriBufferObject
-{
-   DriBufferPool *pool;
-   _glthread_Mutex mutex;
-   int refCount;
-   const char *name;
-   uint64_t flags;
-   unsigned hint;
-   unsigned alignment;
-   unsigned createdByReference;
-   void *private;
-   /* user-space buffer: */
-   unsigned userBuffer;
-   void *userData;
-   unsigned userSize;
-} DriBufferObject;
-
-typedef struct _DriBufferList {
-    drmBOList drmBuffers;  /* List of kernel buffers needing validation */
-    drmBOList driBuffers;  /* List of user-space buffers needing validation */
-} DriBufferList;
-
-
-void
-bmError(int val, const char *file, const char *function, int line)
-{
-   printf("Fatal video memory manager error \"%s\".\n"
-          "Check kernel logs or set the LIBGL_DEBUG\n"
-          "environment variable to \"verbose\" for more info.\n"
-          "Detected in file %s, line %d, function %s.\n",
-          strerror(-val), file, line, function);
-#ifndef NDEBUG
-   abort();
-#else
-   abort();
-#endif
-}
-
-extern drmBO *
-driBOKernel(struct _DriBufferObject *buf)
-{
-   drmBO *ret;
-
-   driReadLockKernelBO();
-   _glthread_LOCK_MUTEX(buf->mutex);
-   assert(buf->private != NULL);
-   ret = buf->pool->kernel(buf->pool, buf->private);
-   if (!ret)
-      BM_CKFATAL(-EINVAL);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-   driReadUnlockKernelBO();
-
-   return ret;
-}
-
-void
-driBOWaitIdle(struct _DriBufferObject *buf, int lazy)
-{
-
-  /*
-   * This function may block. Is it sane to keep the mutex held during
-   * that time??
-   */
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   BM_CKFATAL(buf->pool->waitIdle(buf->pool, buf->private, &buf->mutex, lazy));
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-void *
-driBOMap(struct _DriBufferObject *buf, unsigned flags, unsigned hint)
-{
-   void *virtual;
-   int retval;
-
-   if (buf->userBuffer) {
-      return buf->userData;
-   }
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   assert(buf->private != NULL);
-   retval = buf->pool->map(buf->pool, buf->private, flags, hint,
-                          &buf->mutex, &virtual);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-
-   return retval == 0 ? virtual : NULL;
-}
-
-void
-driBOUnmap(struct _DriBufferObject *buf)
-{
-   if (buf->userBuffer)
-      return;
-
-   assert(buf->private != NULL);
-   _glthread_LOCK_MUTEX(buf->mutex);
-   BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-unsigned long
-driBOOffset(struct _DriBufferObject *buf)
-{
-   unsigned long ret;
-
-   assert(buf->private != NULL);
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   ret = buf->pool->offset(buf->pool, buf->private);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-   return ret;
-}
-
-unsigned long
-driBOPoolOffset(struct _DriBufferObject *buf)
-{
-   unsigned long ret;
-
-   assert(buf->private != NULL);
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   ret = buf->pool->poolOffset(buf->pool, buf->private);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-   return ret;
-}
-
-uint64_t
-driBOFlags(struct _DriBufferObject *buf)
-{
-   uint64_t ret;
-
-   assert(buf->private != NULL);
-
-   driReadLockKernelBO();
-   _glthread_LOCK_MUTEX(buf->mutex);
-   ret = buf->pool->flags(buf->pool, buf->private);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-   driReadUnlockKernelBO();
-   return ret;
-}
-
-struct _DriBufferObject *
-driBOReference(struct _DriBufferObject *buf)
-{
-   _glthread_LOCK_MUTEX(buf->mutex);
-   if (++buf->refCount == 1) {
-      _glthread_UNLOCK_MUTEX(buf->mutex);
-      BM_CKFATAL(-EINVAL);
-   }
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-   return buf;
-}
-
-void
-driBOUnReference(struct _DriBufferObject *buf)
-{
-   int tmp;
-
-   if (!buf)
-      return;
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   tmp = --buf->refCount;
-   if (!tmp) {
-      _glthread_UNLOCK_MUTEX(buf->mutex);
-      if (buf->private) {
-        if (buf->createdByReference)
-           buf->pool->unreference(buf->pool, buf->private);
-        else
-           buf->pool->destroy(buf->pool, buf->private);
-      }
-      if (buf->userBuffer)
-        num_user_buffers--;
-      else
-        num_buffers--;
-      free(buf);
-   } else
-     _glthread_UNLOCK_MUTEX(buf->mutex);
-
-}
-
-
-int
-driBOData(struct _DriBufferObject *buf,
-          unsigned size, const void *data,
-         DriBufferPool *newPool,
-         uint64_t flags)
-{
-   void *virtual = NULL;
-   int newBuffer;
-   int retval = 0;
-   struct _DriBufferPool *pool;
-
-   assert(!buf->userBuffer); /* XXX just do a memcpy? */
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   pool = buf->pool;
-
-   if (pool == NULL && newPool != NULL) {
-       buf->pool = newPool;
-       pool = newPool;
-   }
-   if (newPool == NULL)
-       newPool = pool;
-
-   if (!pool->create) {
-      assert((size_t)"driBOData called on invalid buffer\n" & 0);
-      BM_CKFATAL(-EINVAL);
-   }
-
-   newBuffer = (!buf->private || pool != newPool ||
-               pool->size(pool, buf->private) < size);
-
-   if (!flags)
-       flags = buf->flags;
-
-   if (newBuffer) {
-
-       if (buf->createdByReference) {
-         assert((size_t)"driBOData requiring resizing called on shared buffer.\n" & 0);
-         BM_CKFATAL(-EINVAL);
-       }
-
-       if (buf->private)
-          buf->pool->destroy(buf->pool, buf->private);
-
-       pool = newPool;
-       buf->pool = newPool;
-       buf->private = pool->create(pool, size, flags, DRM_BO_HINT_DONT_FENCE,
-                                 buf->alignment);
-      if (!buf->private)
-         retval = -ENOMEM;
-
-      if (retval == 0)
-         retval = pool->map(pool, buf->private,
-                            DRM_BO_FLAG_WRITE,
-                            DRM_BO_HINT_DONT_BLOCK, &buf->mutex, &virtual);
-   } else if (pool->map(pool, buf->private, DRM_BO_FLAG_WRITE,
-                       DRM_BO_HINT_DONT_BLOCK, &buf->mutex, &virtual)) {
-       /*
-       * Buffer is busy. need to create a new one.
-       */
-
-       void *newBuf;
-
-       newBuf = pool->create(pool, size, flags, DRM_BO_HINT_DONT_FENCE,
-                            buf->alignment);
-       if (newBuf) {
-          buf->pool->destroy(buf->pool, buf->private);
-          buf->private = newBuf;
-       }
-
-       retval = pool->map(pool, buf->private,
-                         DRM_BO_FLAG_WRITE, 0, &buf->mutex, &virtual);
-   } else {
-       uint64_t flag_diff = flags ^ buf->flags;
-
-       /*
-       * We might need to change buffer flags.
-       */
-
-       if (flag_diff){
-          assert(pool->setStatus != NULL);
-          BM_CKFATAL(pool->unmap(pool, buf->private));
-          BM_CKFATAL(pool->setStatus(pool, buf->private, flag_diff,
-                                     buf->flags));
-          if (!data)
-            goto out;
-
-          retval = pool->map(pool, buf->private,
-                             DRM_BO_FLAG_WRITE, 0, &buf->mutex, &virtual);
-       }
-   }
-
-   if (retval == 0) {
-      if (data)
-        memcpy(virtual, data, size);
-
-      BM_CKFATAL(pool->unmap(pool, buf->private));
-   }
-
- out:
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-
-   return retval;
-}
-
-void
-driBOSubData(struct _DriBufferObject *buf,
-             unsigned long offset, unsigned long size, const void *data)
-{
-   void *virtual;
-
-   assert(!buf->userBuffer); /* XXX just do a memcpy? */
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   if (size && data) {
-      BM_CKFATAL(buf->pool->map(buf->pool, buf->private,
-                                DRM_BO_FLAG_WRITE, 0, &buf->mutex,
-                               &virtual));
-      memcpy((unsigned char *) virtual + offset, data, size);
-      BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
-   }
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-void
-driBOGetSubData(struct _DriBufferObject *buf,
-                unsigned long offset, unsigned long size, void *data)
-{
-   void *virtual;
-
-   assert(!buf->userBuffer); /* XXX just do a memcpy? */
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   if (size && data) {
-      BM_CKFATAL(buf->pool->map(buf->pool, buf->private,
-                                DRM_BO_FLAG_READ, 0, &buf->mutex, &virtual));
-      memcpy(data, (unsigned char *) virtual + offset, size);
-      BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
-   }
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-void
-driBOSetReferenced(struct _DriBufferObject *buf,
-                  unsigned long handle)
-{
-   _glthread_LOCK_MUTEX(buf->mutex);
-   if (buf->private != NULL) {
-      assert((size_t)"Invalid buffer for setReferenced\n" & 0);
-      BM_CKFATAL(-EINVAL);
-
-   }
-   if (buf->pool->reference == NULL) {
-      assert((size_t)"Invalid buffer pool for setReferenced\n" & 0);
-      BM_CKFATAL(-EINVAL);
-   }
-   buf->private = buf->pool->reference(buf->pool, handle);
-   if (!buf->private) {
-      assert((size_t)"Invalid buffer pool for setStatic\n" & 0);
-      BM_CKFATAL(-ENOMEM);
-   }
-   buf->createdByReference = TRUE;
-   buf->flags = buf->pool->kernel(buf->pool, buf->private)->flags;
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-int
-driGenBuffers(struct _DriBufferPool *pool,
-              const char *name,
-              unsigned n,
-              struct _DriBufferObject *buffers[],
-              unsigned alignment, uint64_t flags, unsigned hint)
-{
-   struct _DriBufferObject *buf;
-   int i;
-
-   flags = (flags) ? flags : DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_MEM_VRAM |
-      DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE;
-
-   ++num_buffers;
-
-   assert(pool);
-
-   for (i = 0; i < n; ++i) {
-      buf = (struct _DriBufferObject *) calloc(1, sizeof(*buf));
-      if (!buf)
-        return -ENOMEM;
-
-      _glthread_INIT_MUTEX(buf->mutex);
-      _glthread_LOCK_MUTEX(buf->mutex);
-      buf->refCount = 1;
-      buf->flags = flags;
-      buf->hint = hint;
-      buf->name = name;
-      buf->alignment = alignment;
-      buf->pool = pool;
-      buf->createdByReference = 0;
-      _glthread_UNLOCK_MUTEX(buf->mutex);
-      buffers[i] = buf;
-   }
-   return 0;
-}
-
-void
-driGenUserBuffer(struct _DriBufferPool *pool,
-                 const char *name,
-                 struct _DriBufferObject **buffers,
-                 void *ptr, unsigned bytes)
-{
-   const unsigned alignment = 1, flags = 0, hint = 0;
-
-   --num_buffers; /* JB: is inced in GenBuffes */
-   driGenBuffers(pool, name, 1, buffers, alignment, flags, hint);
-   ++num_user_buffers;
-
-   (*buffers)->userBuffer = 1;
-   (*buffers)->userData = ptr;
-   (*buffers)->userSize = bytes;
-}
-
-void
-driDeleteBuffers(unsigned n, struct _DriBufferObject *buffers[])
-{
-   int i;
-
-   for (i = 0; i < n; ++i) {
-      driBOUnReference(buffers[i]);
-   }
-}
-
-
-void
-driInitBufMgr(int fd)
-{
-   ;
-}
-
-/*
- * Note that lists are per-context and don't need mutex protection.
- */
-
-struct _DriBufferList *
-driBOCreateList(int target)
-{
-    struct _DriBufferList *list = calloc(sizeof(*list), 1);
-
-    BM_CKFATAL(drmBOCreateList(target, &list->drmBuffers));
-    BM_CKFATAL(drmBOCreateList(target, &list->driBuffers));
-    return list;
-}
-
-int
-driBOResetList(struct _DriBufferList * list)
-{
-    int ret;
-    ret = drmBOResetList(&list->drmBuffers);
-    if (ret)
-       return ret;
-    ret = drmBOResetList(&list->driBuffers);
-    return ret;
-}
-
-void
-driBOFreeList(struct _DriBufferList * list)
-{
-   drmBOFreeList(&list->drmBuffers);
-   drmBOFreeList(&list->driBuffers);
-   free(list);
-}
-
-
-/*
- * Copied from libdrm, because it is needed by driAddValidateItem.
- */
-
-static drmBONode *
-driAddListItem(drmBOList * list, drmBO * item,
-              uint64_t arg0, uint64_t arg1)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-
-    l = list->free.next;
-    if (l == &list->free) {
-       node = (drmBONode *) malloc(sizeof(*node));
-       if (!node) {
-           return NULL;
-       }
-       list->numCurrent++;
-    } else {
-       DRMLISTDEL(l);
-       node = DRMLISTENTRY(drmBONode, l, head);
-    }
-    memset(&node->bo_arg, 0, sizeof(node->bo_arg));
-    node->buf = item;
-    node->arg0 = arg0;
-    node->arg1 = arg1;
-    DRMLISTADDTAIL(&node->head, &list->list);
-    list->numOnList++;
-    return node;
-}
-
-/*
- * Slightly modified version compared to the libdrm version.
- * This one returns the list index of the buffer put on the list.
- */
-
-static int
-driAddValidateItem(drmBOList * list, drmBO * buf, uint64_t flags,
-                  uint64_t mask, int *itemLoc,
-                  struct _drmBONode **pnode)
-{
-    drmBONode *node, *cur;
-    drmMMListHead *l;
-    int count = 0;
-
-    cur = NULL;
-
-    for (l = list->list.next; l != &list->list; l = l->next) {
-       node = DRMLISTENTRY(drmBONode, l, head);
-       if (node->buf == buf) {
-           cur = node;
-           break;
-       }
-       count++;
-    }
-    if (!cur) {
-       cur = driAddListItem(list, buf, flags, mask);
-       if (!cur)
-           return -ENOMEM;
-
-       cur->arg0 = flags;
-       cur->arg1 = mask;
-    } else {
-        uint64_t memFlags = cur->arg0 & flags & DRM_BO_MASK_MEM;
-       uint64_t accFlags = (cur->arg0 | flags) & ~DRM_BO_MASK_MEM;
-
-       if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
-           return -EINVAL;
-       }
-
-       cur->arg1 |= mask;
-       cur->arg0 = (cur->arg0 & ~mask) | ((memFlags | accFlags) & mask);
-
-       if (((cur->arg1 & DRM_BO_MASK_MEM) != 0) &&
-           (cur->arg0 & DRM_BO_MASK_MEM) == 0) {
-           return -EINVAL;
-       }
-    }
-    *itemLoc = count;
-    *pnode = cur;
-    return 0;
-}
-
-
-void
-driBOAddListItem(struct _DriBufferList * list, struct _DriBufferObject *buf,
-                 uint64_t flags, uint64_t mask, int *itemLoc,
-                struct _drmBONode **node)
-{
-   int newItem;
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   BM_CKFATAL(driAddValidateItem(&list->drmBuffers,
-                                buf->pool->kernel(buf->pool, buf->private),
-                                 flags, mask, itemLoc, node));
-   BM_CKFATAL(drmAddValidateItem(&list->driBuffers, (drmBO *) buf,
-                                flags, mask, &newItem));
-   if (newItem)
-     buf->refCount++;
-
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-}
-
-drmBOList *driGetdrmBOList(struct _DriBufferList *list)
-{
-       driWriteLockKernelBO();
-       return &list->drmBuffers;
-}
-
-void driPutdrmBOList(struct _DriBufferList *list)
-{
-       driWriteUnlockKernelBO();
-}
-
-
-void
-driBOFence(struct _DriBufferObject *buf, struct _DriFenceObject *fence)
-{
-   _glthread_LOCK_MUTEX(buf->mutex);
-   if (buf->pool->fence)
-       BM_CKFATAL(buf->pool->fence(buf->pool, buf->private, fence));
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-
-}
-
-void
-driBOUnrefUserList(struct _DriBufferList *list)
-{
-    struct _DriBufferObject *buf;
-    void *curBuf;
-
-    curBuf = drmBOListIterator(&list->driBuffers);
-    while (curBuf) {
-       buf = (struct _DriBufferObject *)drmBOListBuf(curBuf);
-       driBOUnReference(buf);
-       curBuf = drmBOListNext(&list->driBuffers, curBuf);
-    }
-}
-
-struct _DriFenceObject *
-driBOFenceUserList(struct _DriFenceMgr *mgr,
-                  struct _DriBufferList *list, const char *name,
-                  drmFence *kFence)
-{
-    struct _DriFenceObject *fence;
-    struct _DriBufferObject *buf;
-    void *curBuf;
-
-    fence = driFenceCreate(mgr, kFence->fence_class, kFence->type,
-                          kFence, sizeof(*kFence));
-    curBuf = drmBOListIterator(&list->driBuffers);
-
-   /*
-    * User-space fencing callbacks.
-    */
-
-   while (curBuf) {
-        buf = (struct _DriBufferObject *) drmBOListBuf(curBuf);
-       driBOFence(buf, fence);
-       driBOUnReference(buf);
-       curBuf = drmBOListNext(&list->driBuffers, curBuf);
-   }
-
-   driBOResetList(list);
-   return fence;
-}
-
-void
-driBOValidateUserList(struct _DriBufferList * list)
-{
-    void *curBuf;
-    struct _DriBufferObject *buf;
-
-    curBuf = drmBOListIterator(&list->driBuffers);
-
-    /*
-     * User-space validation callbacks.
-     */
-
-    while (curBuf) {
-       buf = (struct _DriBufferObject *) drmBOListBuf(curBuf);
-       _glthread_LOCK_MUTEX(buf->mutex);
-       if (buf->pool->validate)
-           BM_CKFATAL(buf->pool->validate(buf->pool, buf->private, &buf->mutex));
-       _glthread_UNLOCK_MUTEX(buf->mutex);
-       curBuf = drmBOListNext(&list->driBuffers, curBuf);
-    }
-}
-
-
-void
-driPoolTakeDown(struct _DriBufferPool *pool)
-{
-   pool->takeDown(pool);
-
-}
-
-unsigned long
-driBOSize(struct _DriBufferObject *buf)
-{
-  unsigned long size;
-
-   _glthread_LOCK_MUTEX(buf->mutex);
-   size = buf->pool->size(buf->pool, buf->private);
-   _glthread_UNLOCK_MUTEX(buf->mutex);
-
-  return size;
-
-}
-
-drmBOList *driBOGetDRMBuffers(struct _DriBufferList *list)
-{
-    return &list->drmBuffers;
-}
-
-drmBOList *driBOGetDRIBuffers(struct _DriBufferList *list)
-{
-    return &list->driBuffers;
-}
-
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.h b/src/gallium/winsys/common/intel_drm/ws_dri_bufmgr.h
deleted file mode 100644 (file)
index e6c0cff..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
- */
-
-#ifndef _PSB_BUFMGR_H_
-#define _PSB_BUFMGR_H_
-#include <xf86mm.h>
-#include "i915_drm.h"
-#include "ws_dri_fencemgr.h"
-
-typedef struct _drmBONode
-{
-    drmMMListHead head;
-    drmBO *buf;
-    struct drm_i915_op_arg bo_arg;
-    uint64_t arg0;
-    uint64_t arg1;
-} drmBONode;
-
-typedef struct _drmBOList {
-    unsigned numTarget;
-    unsigned numCurrent;
-    unsigned numOnList;
-    drmMMListHead list;
-    drmMMListHead free;
-} drmBOList;
-
-
-struct _DriFenceObject;
-struct _DriBufferObject;
-struct _DriBufferPool;
-struct _DriBufferList;
-
-/*
- * Return a pointer to the libdrm buffer object this DriBufferObject
- * uses.
- */
-
-extern drmBO *driBOKernel(struct _DriBufferObject *buf);
-extern void *driBOMap(struct _DriBufferObject *buf, unsigned flags,
-                      unsigned hint);
-extern void driBOUnmap(struct _DriBufferObject *buf);
-extern unsigned long driBOOffset(struct _DriBufferObject *buf);
-extern unsigned long driBOPoolOffset(struct _DriBufferObject *buf);
-
-extern uint64_t driBOFlags(struct _DriBufferObject *buf);
-extern struct _DriBufferObject *driBOReference(struct _DriBufferObject *buf);
-extern void driBOUnReference(struct _DriBufferObject *buf);
-
-extern int driBOData(struct _DriBufferObject *r_buf,
-                    unsigned size, const void *data,
-                    struct _DriBufferPool *pool, uint64_t flags);
-
-extern void driBOSubData(struct _DriBufferObject *buf,
-                         unsigned long offset, unsigned long size,
-                         const void *data);
-extern void driBOGetSubData(struct _DriBufferObject *buf,
-                            unsigned long offset, unsigned long size,
-                            void *data);
-extern int driGenBuffers(struct _DriBufferPool *pool,
-                        const char *name,
-                        unsigned n,
-                        struct _DriBufferObject *buffers[],
-                        unsigned alignment, uint64_t flags, unsigned hint);
-extern void driGenUserBuffer(struct _DriBufferPool *pool,
-                             const char *name,
-                             struct _DriBufferObject *buffers[],
-                             void *ptr, unsigned bytes);
-extern void driDeleteBuffers(unsigned n, struct _DriBufferObject *buffers[]);
-extern void driInitBufMgr(int fd);
-extern struct _DriBufferList *driBOCreateList(int target);
-extern int driBOResetList(struct _DriBufferList * list);
-extern void driBOAddListItem(struct _DriBufferList * list,
-                            struct _DriBufferObject *buf,
-                             uint64_t flags, uint64_t mask, int *itemLoc,
-                            struct _drmBONode **node);
-
-extern void driBOValidateList(int fd, struct _DriBufferList * list);
-extern void driBOFreeList(struct _DriBufferList * list);
-extern struct _DriFenceObject *driBOFenceUserList(struct _DriFenceMgr *mgr,
-                                                 struct _DriBufferList *list,
-                                                 const char *name,
-                                                 drmFence *kFence);
-extern void driBOUnrefUserList(struct _DriBufferList *list);
-extern void driBOValidateUserList(struct _DriBufferList * list);
-extern drmBOList *driGetdrmBOList(struct _DriBufferList *list);
-extern void driPutdrmBOList(struct _DriBufferList *list);
-
-extern void driBOFence(struct _DriBufferObject *buf,
-                       struct _DriFenceObject *fence);
-
-extern void driPoolTakeDown(struct _DriBufferPool *pool);
-extern void driBOSetReferenced(struct _DriBufferObject *buf,
-                              unsigned long handle);
-unsigned long driBOSize(struct _DriBufferObject *buf);
-extern void driBOWaitIdle(struct _DriBufferObject *buf, int lazy);
-extern void driPoolTakeDown(struct _DriBufferPool *pool);
-
-extern void driReadLockKernelBO(void);
-extern void driReadUnlockKernelBO(void);
-extern void driWriteLockKernelBO(void);
-extern void driWriteUnlockKernelBO(void);
-
-/*
- * For debugging purposes.
- */
-
-extern drmBOList *driBOGetDRMBuffers(struct _DriBufferList *list);
-extern drmBOList *driBOGetDRIBuffers(struct _DriBufferList *list);
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_bufpool.h b/src/gallium/winsys/common/intel_drm/ws_dri_bufpool.h
deleted file mode 100644 (file)
index bf60798..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- */
-
-#ifndef _PSB_BUFPOOL_H_
-#define _PSB_BUFPOOL_H_
-
-#include <xf86drm.h>
-#include <glthread.h>
-struct _DriFenceObject;
-
-typedef struct _DriBufferPool
-{
-   int fd;
-   int (*map) (struct _DriBufferPool * pool, void *private,
-               unsigned flags, int hint, _glthread_Mutex *mutex,
-              void **virtual);
-   int (*unmap) (struct _DriBufferPool * pool, void *private);
-   int (*destroy) (struct _DriBufferPool * pool, void *private);
-   unsigned long (*offset) (struct _DriBufferPool * pool, void *private);
-   unsigned long (*poolOffset) (struct _DriBufferPool * pool, void *private);
-   uint64_t (*flags) (struct _DriBufferPool * pool, void *private);
-   unsigned long (*size) (struct _DriBufferPool * pool, void *private);
-   void *(*create) (struct _DriBufferPool * pool, unsigned long size,
-                    uint64_t flags, unsigned hint, unsigned alignment);
-   void *(*reference) (struct _DriBufferPool * pool, unsigned handle);
-   int (*unreference) (struct _DriBufferPool * pool, void *private);
-   int (*fence) (struct _DriBufferPool * pool, void *private,
-                 struct _DriFenceObject * fence);
-   drmBO *(*kernel) (struct _DriBufferPool * pool, void *private);
-   int (*validate) (struct _DriBufferPool * pool, void *private, _glthread_Mutex *mutex);
-   int (*waitIdle) (struct _DriBufferPool *pool, void *private, _glthread_Mutex *mutex,
-                   int lazy);
-   int (*setStatus)  (struct _DriBufferPool *pool, void *private,
-                     uint64_t flag_diff, uint64_t old_flags);
-   void (*takeDown) (struct _DriBufferPool * pool);
-   void *data;
-} DriBufferPool;
-
-extern void bmError(int val, const char *file, const char *function,
-                    int line);
-#define BM_CKFATAL(val)                                               \
-  do{                                                         \
-    int tstVal = (val);                                               \
-    if (tstVal)                                               \
-      bmError(tstVal, __FILE__, __FUNCTION__, __LINE__);       \
-  } while(0);
-
-
-/*
- * Builtin pools.
- */
-
-/*
- * Kernel buffer objects. Size in multiples of page size. Page size aligned.
- */
-
-extern struct _DriBufferPool *driDRMPoolInit(int fd);
-extern struct _DriBufferPool *driMallocPoolInit(void);
-
-struct _DriFreeSlabManager;
-extern struct _DriBufferPool * driSlabPoolInit(int fd, uint64_t flags,
-                                              uint64_t validMask,
-                                              uint32_t smallestSize,
-                                              uint32_t numSizes,
-                                              uint32_t desiredNumBuffers,
-                                              uint32_t maxSlabSize,
-                                              uint32_t pageAlignment,
-                                              struct _DriFreeSlabManager *fMan);
-extern void driFinishFreeSlabManager(struct _DriFreeSlabManager *fMan);
-extern struct _DriFreeSlabManager *
-driInitFreeSlabManager(uint32_t checkIntervalMsec, uint32_t slabTimeoutMsec);
-
-
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_drmpool.c b/src/gallium/winsys/common/intel_drm/ws_dri_drmpool.c
deleted file mode 100644 (file)
index 40929ef..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- */
-
-#include <xf86drm.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "ws_dri_bufpool.h"
-#include "ws_dri_bufmgr.h"
-#include "assert.h"
-
-/*
- * Buffer pool implementation using DRM buffer objects as DRI buffer objects.
- */
-
-static void *
-pool_create(struct _DriBufferPool *pool,
-            unsigned long size, uint64_t flags, unsigned hint,
-            unsigned alignment)
-{
-   drmBO *buf = (drmBO *) malloc(sizeof(*buf));
-   int ret;
-   unsigned pageSize = getpagesize();
-
-   if (!buf)
-      return NULL;
-
-   if ((alignment > pageSize) && (alignment % pageSize)) {
-      free(buf);
-      return NULL;
-   }
-
-   ret = drmBOCreate(pool->fd, size, alignment / pageSize,
-                    NULL,
-                     flags, hint, buf);
-   if (ret) {
-      free(buf);
-      return NULL;
-   }
-
-   return (void *) buf;
-}
-
-static void *
-pool_reference(struct _DriBufferPool *pool, unsigned handle)
-{
-   drmBO *buf = (drmBO *) malloc(sizeof(*buf));
-   int ret;
-
-   if (!buf)
-      return NULL;
-
-   ret = drmBOReference(pool->fd, handle, buf);
-
-   if (ret) {
-      free(buf);
-      return NULL;
-   }
-
-   return (void *) buf;
-}
-
-static int
-pool_destroy(struct _DriBufferPool *pool, void *private)
-{
-   int ret;
-   drmBO *buf = (drmBO *) private;
-   driReadLockKernelBO();
-   ret = drmBOUnreference(pool->fd, buf);
-   free(buf);
-   driReadUnlockKernelBO();
-   return ret;
-}
-
-static int
-pool_unreference(struct _DriBufferPool *pool, void *private)
-{
-   int ret;
-   drmBO *buf = (drmBO *) private;
-   driReadLockKernelBO();
-   ret = drmBOUnreference(pool->fd, buf);
-   free(buf);
-   driReadUnlockKernelBO();
-   return ret;
-}
-
-static int
-pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
-         int hint, _glthread_Mutex *mutex, void **virtual)
-{
-   drmBO *buf = (drmBO *) private;
-   int ret;
-
-   driReadLockKernelBO();
-   ret = drmBOMap(pool->fd, buf, flags, hint, virtual);
-   driReadUnlockKernelBO();
-   return ret;
-}
-
-static int
-pool_unmap(struct _DriBufferPool *pool, void *private)
-{
-   drmBO *buf = (drmBO *) private;
-   int ret;
-
-   driReadLockKernelBO();
-   ret = drmBOUnmap(pool->fd, buf);
-   driReadUnlockKernelBO();
-
-   return ret;
-}
-
-static unsigned long
-pool_offset(struct _DriBufferPool *pool, void *private)
-{
-   drmBO *buf = (drmBO *) private;
-   unsigned long offset;
-
-   driReadLockKernelBO();
-   assert(buf->flags & DRM_BO_FLAG_NO_MOVE);
-   offset = buf->offset;
-   driReadUnlockKernelBO();
-
-   return buf->offset;
-}
-
-static unsigned long
-pool_poolOffset(struct _DriBufferPool *pool, void *private)
-{
-   return 0;
-}
-
-static uint64_t
-pool_flags(struct _DriBufferPool *pool, void *private)
-{
-   drmBO *buf = (drmBO *) private;
-   uint64_t flags;
-
-   driReadLockKernelBO();
-   flags = buf->flags;
-   driReadUnlockKernelBO();
-
-   return flags;
-}
-
-
-static unsigned long
-pool_size(struct _DriBufferPool *pool, void *private)
-{
-   drmBO *buf = (drmBO *) private;
-   unsigned long size;
-
-   driReadLockKernelBO();
-   size = buf->size;
-   driReadUnlockKernelBO();
-
-   return buf->size;
-}
-
-static int
-pool_fence(struct _DriBufferPool *pool, void *private,
-           struct _DriFenceObject *fence)
-{
-   /*
-    * Noop. The kernel handles all fencing.
-    */
-
-   return 0;
-}
-
-static drmBO *
-pool_kernel(struct _DriBufferPool *pool, void *private)
-{
-   return (drmBO *) private;
-}
-
-static int
-pool_waitIdle(struct _DriBufferPool *pool, void *private, _glthread_Mutex *mutex,
-             int lazy)
-{
-   drmBO *buf = (drmBO *) private;
-   int ret;
-
-   driReadLockKernelBO();
-   ret = drmBOWaitIdle(pool->fd, buf, (lazy) ? DRM_BO_HINT_WAIT_LAZY:0);
-   driReadUnlockKernelBO();
-
-   return ret;
-}
-
-
-static void
-pool_takedown(struct _DriBufferPool *pool)
-{
-   free(pool);
-}
-
-/*static int
-pool_setStatus(struct _DriBufferPool *pool, void *private,
-              uint64_t flag_diff, uint64_t old_flags)
-{
-   drmBO *buf = (drmBO *) private;
-   uint64_t new_flags = old_flags ^ flag_diff;
-   int ret;
-
-   driReadLockKernelBO();
-   ret = drmBOSetStatus(pool->fd, buf, new_flags, flag_diff,
-                       0, 0, 0);
-   driReadUnlockKernelBO();
-   return ret;
-}*/
-
-struct _DriBufferPool *
-driDRMPoolInit(int fd)
-{
-   struct _DriBufferPool *pool;
-
-   pool = (struct _DriBufferPool *) malloc(sizeof(*pool));
-
-   if (!pool)
-      return NULL;
-
-   pool->fd = fd;
-   pool->map = &pool_map;
-   pool->unmap = &pool_unmap;
-   pool->destroy = &pool_destroy;
-   pool->offset = &pool_offset;
-   pool->poolOffset = &pool_poolOffset;
-   pool->flags = &pool_flags;
-   pool->size = &pool_size;
-   pool->create = &pool_create;
-   pool->fence = &pool_fence;
-   pool->kernel = &pool_kernel;
-   pool->validate = NULL;
-   pool->waitIdle = &pool_waitIdle;
-   pool->takeDown = &pool_takedown;
-   pool->reference = &pool_reference;
-   pool->unreference = &pool_unreference;
-   pool->data = NULL;
-   return pool;
-}
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.c b/src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.c
deleted file mode 100644 (file)
index b56bc26..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-#include "ws_dri_fencemgr.h"
-#include "glthread.h"
-#include <xf86mm.h>
-#include <string.h>
-#include <unistd.h>
-
-/*
- * Note: Locking order is
- * _DriFenceObject::mutex
- * _DriFenceMgr::mutex
- */
-
-struct _DriFenceMgr {
-    /*
-     * Constant members. Need no mutex protection.
-     */
-    struct _DriFenceMgrCreateInfo info;
-    void *private;
-
-    /*
-     * These members are protected by this->mutex
-     */
-    _glthread_Mutex mutex;
-    int refCount;
-    drmMMListHead *heads;
-    int num_fences;
-};
-
-struct _DriFenceObject {
-
-    /*
-     * These members are constant and need no mutex protection.
-     */
-    struct _DriFenceMgr *mgr;
-    uint32_t fence_class;
-    uint32_t fence_type;
-
-    /*
-     * These members are protected by mgr->mutex.
-     */
-    drmMMListHead head;
-    int refCount;
-
-    /*
-     * These members are protected by this->mutex.
-     */
-    _glthread_Mutex mutex;
-    uint32_t signaled_type;
-    void *private;
-};
-
-uint32_t
-driFenceType(struct _DriFenceObject *fence)
-{
-  return fence->fence_type;
-}
-
-struct _DriFenceMgr *
-driFenceMgrCreate(const struct _DriFenceMgrCreateInfo *info)
-{
-  struct _DriFenceMgr *tmp;
-  uint32_t i;
-
-  tmp = calloc(1, sizeof(*tmp));
-  if (!tmp)
-      return NULL;
-
-  _glthread_INIT_MUTEX(tmp->mutex);
-  _glthread_LOCK_MUTEX(tmp->mutex);
-  tmp->refCount = 1;
-  tmp->info = *info;
-  tmp->num_fences = 0;
-  tmp->heads = calloc(tmp->info.num_classes, sizeof(*tmp->heads));
-  if (!tmp->heads)
-      goto out_err;
-
-  for (i=0; i<tmp->info.num_classes; ++i) {
-      DRMINITLISTHEAD(&tmp->heads[i]);
-  }
-  _glthread_UNLOCK_MUTEX(tmp->mutex);
-  return tmp;
-
-  out_err:
-  if (tmp)
-      free(tmp);
-  return NULL;
-}
-
-static void
-driFenceMgrUnrefUnlock(struct _DriFenceMgr **pMgr)
-{
-    struct _DriFenceMgr *mgr = *pMgr;
-
-    *pMgr = NULL;
-    if (--mgr->refCount == 0)
-       free(mgr);
-    else
-       _glthread_UNLOCK_MUTEX(mgr->mutex);
-}
-
-void
-driFenceMgrUnReference(struct _DriFenceMgr **pMgr)
-{
-    _glthread_LOCK_MUTEX((*pMgr)->mutex);
-    driFenceMgrUnrefUnlock(pMgr);
-}
-
-static void
-driFenceUnReferenceLocked(struct _DriFenceObject **pFence)
-{
-    struct _DriFenceObject *fence = *pFence;
-    struct _DriFenceMgr *mgr = fence->mgr;
-
-    *pFence = NULL;
-    if (--fence->refCount == 0) {
-       DRMLISTDELINIT(&fence->head);
-       if (fence->private)
-           mgr->info.unreference(mgr, &fence->private);
-    --mgr->num_fences;
-       fence->mgr = NULL;
-       --mgr->refCount;
-       free(fence);
-
-    }
-}
-
-
-static void
-driSignalPreviousFencesLocked(struct _DriFenceMgr *mgr,
-                             drmMMListHead *list,
-                             uint32_t fence_class,
-                             uint32_t fence_type)
-{
-    struct _DriFenceObject *entry;
-    drmMMListHead *prev;
-
-    while(list != &mgr->heads[fence_class]) {
-       entry = DRMLISTENTRY(struct _DriFenceObject, list, head);
-
-       /*
-        * Up refcount so that entry doesn't disappear from under us
-        * when we unlock-relock mgr to get the correct locking order.
-        */
-
-       ++entry->refCount;
-       _glthread_UNLOCK_MUTEX(mgr->mutex);
-       _glthread_LOCK_MUTEX(entry->mutex);
-       _glthread_LOCK_MUTEX(mgr->mutex);
-
-       prev = list->prev;
-
-
-
-       if (list->prev == list) {
-
-               /*
-                * Somebody else removed the entry from the list.
-                */
-
-               _glthread_UNLOCK_MUTEX(entry->mutex);
-               driFenceUnReferenceLocked(&entry);
-               return;
-       }
-
-       entry->signaled_type |= (fence_type & entry->fence_type);
-       if (entry->signaled_type == entry->fence_type) {
-           DRMLISTDELINIT(list);
-           mgr->info.unreference(mgr, &entry->private);
-       }
-       _glthread_UNLOCK_MUTEX(entry->mutex);
-       driFenceUnReferenceLocked(&entry);
-       list = prev;
-    }
-}
-
-
-int
-driFenceFinish(struct _DriFenceObject *fence, uint32_t fence_type,
-              int lazy_hint)
-{
-    struct _DriFenceMgr *mgr = fence->mgr;
-    int ret = 0;
-
-    _glthread_LOCK_MUTEX(fence->mutex);
-
-    if ((fence->signaled_type & fence_type) == fence_type)
-       goto out0;
-
-    ret = mgr->info.finish(mgr, fence->private, fence_type, lazy_hint);
-    if (ret)
-       goto out0;
-
-    _glthread_LOCK_MUTEX(mgr->mutex);
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-
-    driSignalPreviousFencesLocked(mgr, &fence->head, fence->fence_class,
-                                 fence_type);
-    _glthread_UNLOCK_MUTEX(mgr->mutex);
-    return 0;
-
-  out0:
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-    return ret;
-}
-
-uint32_t driFenceSignaledTypeCached(struct _DriFenceObject *fence)
-{
-    uint32_t ret;
-
-    _glthread_LOCK_MUTEX(fence->mutex);
-    ret = fence->signaled_type;
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-
-    return ret;
-}
-
-int
-driFenceSignaledType(struct _DriFenceObject *fence, uint32_t flush_type,
-                uint32_t *signaled)
-{
-    int ret = 0;
-    struct _DriFenceMgr *mgr;
-
-    _glthread_LOCK_MUTEX(fence->mutex);
-    mgr = fence->mgr;
-    *signaled = fence->signaled_type;
-    if ((fence->signaled_type & flush_type) == flush_type)
-       goto out0;
-
-    ret = mgr->info.signaled(mgr, fence->private, flush_type, signaled);
-    if (ret) {
-       *signaled = fence->signaled_type;
-       goto out0;
-    }
-
-    if ((fence->signaled_type | *signaled) == fence->signaled_type)
-       goto out0;
-
-    _glthread_LOCK_MUTEX(mgr->mutex);
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-
-    driSignalPreviousFencesLocked(mgr, &fence->head, fence->fence_class,
-                                 *signaled);
-
-    _glthread_UNLOCK_MUTEX(mgr->mutex);
-    return 0;
-  out0:
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-    return ret;
-}
-
-struct _DriFenceObject *
-driFenceReference(struct _DriFenceObject *fence)
-{
-    _glthread_LOCK_MUTEX(fence->mgr->mutex);
-    ++fence->refCount;
-    _glthread_UNLOCK_MUTEX(fence->mgr->mutex);
-    return fence;
-}
-
-void
-driFenceUnReference(struct _DriFenceObject **pFence)
-{
-    struct _DriFenceMgr *mgr;
-
-    if (*pFence == NULL)
-       return;
-
-    mgr = (*pFence)->mgr;
-    _glthread_LOCK_MUTEX(mgr->mutex);
-    ++mgr->refCount;
-    driFenceUnReferenceLocked(pFence);
-    driFenceMgrUnrefUnlock(&mgr);
-}
-
-struct _DriFenceObject
-*driFenceCreate(struct _DriFenceMgr *mgr, uint32_t fence_class,
-               uint32_t fence_type, void *private, size_t private_size)
-{
-    struct _DriFenceObject *fence;
-    size_t fence_size = sizeof(*fence);
-
-    if (private_size)
-       fence_size = ((fence_size + 15) & ~15);
-
-    fence = calloc(1, fence_size + private_size);
-
-    if (!fence) {
-       int ret = mgr->info.finish(mgr, private, fence_type, 0);
-
-       if (ret)
-           usleep(10000000);
-
-       return NULL;
-    }
-
-    _glthread_INIT_MUTEX(fence->mutex);
-    _glthread_LOCK_MUTEX(fence->mutex);
-    _glthread_LOCK_MUTEX(mgr->mutex);
-    fence->refCount = 1;
-    DRMLISTADDTAIL(&fence->head, &mgr->heads[fence_class]);
-    fence->mgr = mgr;
-    ++mgr->refCount;
-    ++mgr->num_fences;
-    _glthread_UNLOCK_MUTEX(mgr->mutex);
-    fence->fence_class = fence_class;
-    fence->fence_type = fence_type;
-    fence->signaled_type = 0;
-    fence->private = private;
-    if (private_size) {
-        fence->private = (void *)(((uint8_t *) fence) + fence_size);
-       memcpy(fence->private, private, private_size);
-    }
-
-    _glthread_UNLOCK_MUTEX(fence->mutex);
-    return fence;
-}
-
-
-static int
-tSignaled(struct _DriFenceMgr *mgr, void *private, uint32_t flush_type,
-         uint32_t *signaled_type)
-{
-  long fd = (long) mgr->private;
-  int dummy;
-  drmFence *fence = (drmFence *) private;
-  int ret;
-
-  *signaled_type = 0;
-  ret = drmFenceSignaled((int) fd, fence, flush_type, &dummy);
-  if (ret)
-    return ret;
-
-  *signaled_type = fence->signaled;
-
-  return 0;
-}
-
-static int
-tFinish(struct _DriFenceMgr *mgr, void *private, uint32_t fence_type,
-       int lazy_hint)
-{
-  long fd = (long) mgr->private;
-  unsigned flags = lazy_hint ? DRM_FENCE_FLAG_WAIT_LAZY : 0;
-
-  return drmFenceWait((int)fd, flags, (drmFence *) private, fence_type);
-}
-
-static int
-tUnref(struct _DriFenceMgr *mgr, void **private)
-{
-  long fd = (long) mgr->private;
-  drmFence *fence = (drmFence *) *private;
-  *private = NULL;
-
-  return drmFenceUnreference(fd, fence);
-}
-
-struct _DriFenceMgr *driFenceMgrTTMInit(int fd)
-{
-  struct _DriFenceMgrCreateInfo info;
-  struct _DriFenceMgr *mgr;
-
-  info.flags = DRI_FENCE_CLASS_ORDERED;
-  info.num_classes = 4;
-  info.signaled = tSignaled;
-  info.finish = tFinish;
-  info.unreference = tUnref;
-
-  mgr = driFenceMgrCreate(&info);
-  if (mgr == NULL)
-    return NULL;
-
-  mgr->private = (void *) (long) fd;
-  return mgr;
-}
-
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.h b/src/gallium/winsys/common/intel_drm/ws_dri_fencemgr.h
deleted file mode 100644 (file)
index 4ea58df..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef DRI_FENCEMGR_H
-#define DRI_FENCEMGR_H
-
-#include <stdint.h>
-#include <stdlib.h>
-
-struct _DriFenceObject;
-struct _DriFenceMgr;
-
-/*
- * Do a quick check to see if the fence manager has registered the fence
- * object as signaled. Note that this function may return a false negative
- * answer.
- */
-extern uint32_t driFenceSignaledTypeCached(struct _DriFenceObject *fence);
-
-/*
- * Check if the fence object is signaled. This function can be substantially
- * more expensive to call than the above function, but will not return a false
- * negative answer. The argument "flush_type" sets the types that the
- * underlying mechanism must make sure will eventually signal.
- */
-extern int driFenceSignaledType(struct _DriFenceObject *fence,
-                               uint32_t flush_type, uint32_t *signaled);
-
-/*
- * Convenience functions.
- */
-
-static inline int driFenceSignaled(struct _DriFenceObject *fence,
-                                  uint32_t flush_type)
-{
-    uint32_t signaled_types;
-    int ret = driFenceSignaledType(fence, flush_type, &signaled_types);
-    if (ret)
-       return 0;
-    return ((signaled_types & flush_type) == flush_type);
-}
-
-static inline int driFenceSignaledCached(struct _DriFenceObject *fence,
-                                        uint32_t flush_type)
-{
-    uint32_t signaled_types =
-       driFenceSignaledTypeCached(fence);
-
-    return ((signaled_types & flush_type) == flush_type);
-}
-
-/*
- * Reference a fence object.
- */
-extern struct _DriFenceObject *driFenceReference(struct _DriFenceObject *fence);
-
-/*
- * Unreference a fence object. The fence object pointer will be reset to NULL.
- */
-
-extern void driFenceUnReference(struct _DriFenceObject **pFence);
-
-
-/*
- * Wait for a fence to signal the indicated fence_type.
- * If "lazy_hint" is true, it indicates that the wait may sleep to avoid
- * busy-wait polling.
- */
-extern int driFenceFinish(struct _DriFenceObject *fence, uint32_t fence_type,
-                         int lazy_hint);
-
-/*
- * Create a DriFenceObject for manager "mgr".
- *
- * "private" is a pointer that should be used for the callbacks in
- * struct _DriFenceMgrCreateInfo.
- *
- * if private_size is nonzero, then the info stored at *private, with size
- * private size will be copied and the fence manager will instead use a
- * pointer to the copied data for the callbacks in
- * struct _DriFenceMgrCreateInfo. In that case, the object pointed to by
- * "private" may be destroyed after the call to driFenceCreate.
- */
-extern struct _DriFenceObject *driFenceCreate(struct _DriFenceMgr *mgr,
-                                             uint32_t fence_class,
-                                             uint32_t fence_type,
-                                             void *private,
-                                             size_t private_size);
-
-extern uint32_t driFenceType(struct _DriFenceObject *fence);
-
-/*
- * Fence creations are ordered. If a fence signals a fence_type,
- * it is safe to assume that all fences of the same class that was
- * created before that fence has signaled the same type.
- */
-
-#define DRI_FENCE_CLASS_ORDERED (1 << 0)
-
-struct _DriFenceMgrCreateInfo {
-    uint32_t flags;
-    uint32_t num_classes;
-    int (*signaled) (struct _DriFenceMgr *mgr, void *private, uint32_t flush_type,
-                    uint32_t *signaled_type);
-    int (*finish) (struct _DriFenceMgr *mgr, void *private, uint32_t fence_type, int lazy_hint);
-    int (*unreference) (struct _DriFenceMgr *mgr, void **private);
-};
-
-extern struct _DriFenceMgr *
-driFenceMgrCreate(const struct _DriFenceMgrCreateInfo *info);
-
-void
-driFenceMgrUnReference(struct _DriFenceMgr **pMgr);
-
-extern struct _DriFenceMgr *
-driFenceMgrTTMInit(int fd);
-
-#endif
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_mallocpool.c b/src/gallium/winsys/common/intel_drm/ws_dri_mallocpool.c
deleted file mode 100644 (file)
index a80555c..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- */
-
-#include <xf86drm.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "pipe/p_debug.h"
-#include "glthread.h"
-#include "ws_dri_bufpool.h"
-#include "ws_dri_bufmgr.h"
-
-static void *
-pool_create(struct _DriBufferPool *pool,
-            unsigned long size, uint64_t flags, unsigned hint,
-            unsigned alignment)
-{
-    unsigned long *private = malloc(size + 2*sizeof(unsigned long));
-    if ((flags & DRM_BO_MASK_MEM) != DRM_BO_FLAG_MEM_LOCAL)
-      abort();
-
-    *private = size;
-    return (void *)private;
-}
-
-
-static int
-pool_destroy(struct _DriBufferPool *pool, void *private)
-{
-    free(private);
-    return 0;
-}
-
-static int
-pool_waitIdle(struct _DriBufferPool *pool, void *private,
-             _glthread_Mutex *mutex, int lazy)
-{
-    return 0;
-}
-
-static int
-pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
-         int hint, _glthread_Mutex *mutex, void **virtual)
-{
-    *virtual = (void *)((unsigned long *)private + 2);
-    return 0;
-}
-
-static int
-pool_unmap(struct _DriBufferPool *pool, void *private)
-{
-    return 0;
-}
-
-static unsigned long
-pool_offset(struct _DriBufferPool *pool, void *private)
-{
-    /*
-     * BUG
-     */
-    abort();
-    return 0UL;
-}
-
-static unsigned long
-pool_poolOffset(struct _DriBufferPool *pool, void *private)
-{
-    /*
-     * BUG
-     */
-    abort();
-}
-
-static uint64_t
-pool_flags(struct _DriBufferPool *pool, void *private)
-{
-    return DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED;
-}
-
-static unsigned long
-pool_size(struct _DriBufferPool *pool, void *private)
-{
-    return *(unsigned long *) private;
-}
-
-
-static int
-pool_fence(struct _DriBufferPool *pool, void *private,
-           struct _DriFenceObject *fence)
-{
-    abort();
-    return 0UL;
-}
-
-static drmBO *
-pool_kernel(struct _DriBufferPool *pool, void *private)
-{
-    abort();
-    return NULL;
-}
-
-static void
-pool_takedown(struct _DriBufferPool *pool)
-{
-    free(pool);
-}
-
-
-struct _DriBufferPool *
-driMallocPoolInit(void)
-{
-   struct _DriBufferPool *pool;
-
-   pool = (struct _DriBufferPool *) malloc(sizeof(*pool));
-   if (!pool)
-       return NULL;
-
-   pool->data = NULL;
-   pool->fd = -1;
-   pool->map = &pool_map;
-   pool->unmap = &pool_unmap;
-   pool->destroy = &pool_destroy;
-   pool->offset = &pool_offset;
-   pool->poolOffset = &pool_poolOffset;
-   pool->flags = &pool_flags;
-   pool->size = &pool_size;
-   pool->create = &pool_create;
-   pool->fence = &pool_fence;
-   pool->kernel = &pool_kernel;
-   pool->validate = NULL;
-   pool->waitIdle = &pool_waitIdle;
-   pool->takeDown = &pool_takedown;
-   return pool;
-}
diff --git a/src/gallium/winsys/common/intel_drm/ws_dri_slabpool.c b/src/gallium/winsys/common/intel_drm/ws_dri_slabpool.c
deleted file mode 100644 (file)
index dfcf6d6..0000000
+++ /dev/null
@@ -1,968 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
- */
-
-#include <stdint.h>
-#include <sys/time.h>
-#include <errno.h>
-#include <unistd.h>
-#include <assert.h>
-#include "ws_dri_bufpool.h"
-#include "ws_dri_fencemgr.h"
-#include "ws_dri_bufmgr.h"
-#include "glthread.h"
-
-#define DRI_SLABPOOL_ALLOC_RETRIES 100
-
-struct _DriSlab;
-
-struct _DriSlabBuffer {
-    int isSlabBuffer;
-    drmBO *bo;
-    struct _DriFenceObject *fence;
-    struct _DriSlab *parent;
-    drmMMListHead head;
-    uint32_t mapCount;
-    uint32_t start;
-    uint32_t fenceType;
-    int unFenced;
-    _glthread_Cond event;
-};
-
-struct _DriKernelBO {
-    int fd;
-    drmBO bo;
-    drmMMListHead timeoutHead;
-    drmMMListHead head;
-    struct timeval timeFreed;
-    uint32_t pageAlignment;
-    void *virtual;
-};
-
-struct _DriSlab{
-    drmMMListHead head;
-    drmMMListHead freeBuffers;
-    uint32_t numBuffers;
-    uint32_t numFree;
-    struct _DriSlabBuffer *buffers;
-    struct _DriSlabSizeHeader *header;
-    struct _DriKernelBO *kbo;
-};
-
-
-struct _DriSlabSizeHeader {
-    drmMMListHead slabs;
-    drmMMListHead freeSlabs;
-    drmMMListHead delayedBuffers;
-    uint32_t numDelayed;
-    struct _DriSlabPool *slabPool;
-    uint32_t bufSize;
-    _glthread_Mutex mutex;
-};
-
-struct _DriFreeSlabManager {
-    struct timeval slabTimeout;
-    struct timeval checkInterval;
-    struct timeval nextCheck;
-    drmMMListHead timeoutList;
-    drmMMListHead unCached;
-    drmMMListHead cached;
-    _glthread_Mutex mutex;
-};
-
-
-struct _DriSlabPool {
-
-    /*
-     * The data of this structure remains constant after
-     * initialization and thus needs no mutex protection.
-     */
-
-    struct _DriFreeSlabManager *fMan;
-    uint64_t proposedFlags;
-    uint64_t validMask;
-    uint32_t *bucketSizes;
-    uint32_t numBuckets;
-    uint32_t pageSize;
-    int fd;
-    int pageAlignment;
-    int maxSlabSize;
-    int desiredNumBuffers;
-    struct _DriSlabSizeHeader *headers;
-};
-
-/*
- * FIXME: Perhaps arrange timeout slabs in size buckets for fast
- * retreival??
- */
-
-
-static inline int
-driTimeAfterEq(struct timeval *arg1, struct timeval *arg2)
-{
-    return ((arg1->tv_sec > arg2->tv_sec) ||
-           ((arg1->tv_sec == arg2->tv_sec) &&
-            (arg1->tv_usec > arg2->tv_usec)));
-}
-
-static inline void
-driTimeAdd(struct timeval *arg, struct timeval *add)
-{
-    unsigned int sec;
-
-    arg->tv_sec += add->tv_sec;
-    arg->tv_usec += add->tv_usec;
-    sec = arg->tv_usec / 1000000;
-    arg->tv_sec += sec;
-    arg->tv_usec -= sec*1000000;
-}
-
-static void
-driFreeKernelBO(struct _DriKernelBO *kbo)
-{
-    if (!kbo)
-       return;
-
-    (void) drmBOUnreference(kbo->fd, &kbo->bo);
-    free(kbo);
-}
-
-
-static void
-driFreeTimeoutKBOsLocked(struct _DriFreeSlabManager *fMan,
-                        struct timeval *time)
-{
-    drmMMListHead *list, *next;
-    struct _DriKernelBO *kbo;
-
-    if (!driTimeAfterEq(time, &fMan->nextCheck))
-       return;
-
-    for (list = fMan->timeoutList.next, next = list->next;
-        list != &fMan->timeoutList;
-        list = next, next = list->next) {
-
-       kbo = DRMLISTENTRY(struct _DriKernelBO, list, timeoutHead);
-
-       if (!driTimeAfterEq(time, &kbo->timeFreed))
-           break;
-
-       DRMLISTDELINIT(&kbo->timeoutHead);
-       DRMLISTDELINIT(&kbo->head);
-       driFreeKernelBO(kbo);
-    }
-
-    fMan->nextCheck = *time;
-    driTimeAdd(&fMan->nextCheck, &fMan->checkInterval);
-}
-
-
-/*
- * Add a _DriKernelBO to the free slab manager.
- * This means that it is available for reuse, but if it's not
- * reused in a while, it will be freed.
- */
-
-static void
-driSetKernelBOFree(struct _DriFreeSlabManager *fMan,
-                  struct _DriKernelBO *kbo)
-{
-    struct timeval time;
-
-    _glthread_LOCK_MUTEX(fMan->mutex);
-    gettimeofday(&time, NULL);
-    driTimeAdd(&time, &fMan->slabTimeout);
-
-    kbo->timeFreed = time;
-
-    if (kbo->bo.flags & DRM_BO_FLAG_CACHED)
-       DRMLISTADD(&kbo->head, &fMan->cached);
-    else
-       DRMLISTADD(&kbo->head, &fMan->unCached);
-
-    DRMLISTADDTAIL(&kbo->timeoutHead, &fMan->timeoutList);
-    driFreeTimeoutKBOsLocked(fMan, &time);
-
-    _glthread_UNLOCK_MUTEX(fMan->mutex);
-}
-
-/*
- * Get a _DriKernelBO for us to use as storage for a slab.
- *
- */
-
-static struct _DriKernelBO *
-driAllocKernelBO(struct _DriSlabSizeHeader *header)
-
-{
-    struct _DriSlabPool *slabPool = header->slabPool;
-    struct _DriFreeSlabManager *fMan = slabPool->fMan;
-    drmMMListHead *list, *next, *head;
-    uint32_t size = header->bufSize * slabPool->desiredNumBuffers;
-    struct _DriKernelBO *kbo;
-    struct _DriKernelBO *kboTmp;
-    int ret;
-
-    /*
-     * FIXME: We should perhaps allow some variation in slabsize in order
-     * to efficiently reuse slabs.
-     */
-
-    size = (size <= slabPool->maxSlabSize) ? size : slabPool->maxSlabSize;
-    size = (size + slabPool->pageSize - 1) & ~(slabPool->pageSize - 1);
-    _glthread_LOCK_MUTEX(fMan->mutex);
-
-    kbo = NULL;
-
-  retry:
-    head = (slabPool->proposedFlags & DRM_BO_FLAG_CACHED) ?
-       &fMan->cached : &fMan->unCached;
-
-    for (list = head->next, next = list->next;
-        list != head;
-        list = next, next = list->next) {
-
-       kboTmp = DRMLISTENTRY(struct _DriKernelBO, list, head);
-
-       if ((kboTmp->bo.size == size) &&
-           (slabPool->pageAlignment == 0 ||
-            (kboTmp->pageAlignment % slabPool->pageAlignment) == 0)) {
-
-           if (!kbo)
-               kbo = kboTmp;
-
-           if ((kbo->bo.proposedFlags ^ slabPool->proposedFlags) == 0)
-               break;
-
-       }
-    }
-
-    if (kbo) {
-       DRMLISTDELINIT(&kbo->head);
-       DRMLISTDELINIT(&kbo->timeoutHead);
-    }
-
-    _glthread_UNLOCK_MUTEX(fMan->mutex);
-
-    if (kbo) {
-        uint64_t new_mask = kbo->bo.proposedFlags ^ slabPool->proposedFlags;
-
-       ret = 0;
-       if (new_mask) {
-           ret = drmBOSetStatus(kbo->fd, &kbo->bo, slabPool->proposedFlags,
-                                new_mask, DRM_BO_HINT_DONT_FENCE, 0, 0);
-       }
-       if (ret == 0)
-           return kbo;
-
-       driFreeKernelBO(kbo);
-       kbo = NULL;
-       goto retry;
-    }
-
-    kbo = calloc(1, sizeof(struct _DriKernelBO));
-    if (!kbo)
-       return NULL;
-
-    kbo->fd = slabPool->fd;
-    DRMINITLISTHEAD(&kbo->head);
-    DRMINITLISTHEAD(&kbo->timeoutHead);
-    ret = drmBOCreate(kbo->fd, size, slabPool->pageAlignment, NULL,
-                     slabPool->proposedFlags,
-                     DRM_BO_HINT_DONT_FENCE, &kbo->bo);
-    if (ret)
-       goto out_err0;
-
-    ret = drmBOMap(kbo->fd, &kbo->bo,
-                  DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE,
-                  0, &kbo->virtual);
-
-    if (ret)
-       goto out_err1;
-
-    ret = drmBOUnmap(kbo->fd, &kbo->bo);
-    if (ret)
-       goto out_err1;
-
-    return kbo;
-
-  out_err1:
-    drmBOUnreference(kbo->fd, &kbo->bo);
-  out_err0:
-    free(kbo);
-    return NULL;
-}
-
-
-static int
-driAllocSlab(struct _DriSlabSizeHeader *header)
-{
-    struct _DriSlab *slab;
-    struct _DriSlabBuffer *buf;
-    uint32_t numBuffers;
-    int ret;
-    int i;
-
-    slab = calloc(1, sizeof(*slab));
-    if (!slab)
-       return -ENOMEM;
-
-    slab->kbo = driAllocKernelBO(header);
-    if (!slab->kbo) {
-       ret = -ENOMEM;
-       goto out_err0;
-    }
-
-    numBuffers = slab->kbo->bo.size / header->bufSize;
-
-    slab->buffers = calloc(numBuffers, sizeof(*slab->buffers));
-    if (!slab->buffers) {
-       ret = -ENOMEM;
-       goto out_err1;
-    }
-
-    DRMINITLISTHEAD(&slab->head);
-    DRMINITLISTHEAD(&slab->freeBuffers);
-    slab->numBuffers = numBuffers;
-    slab->numFree = 0;
-    slab->header = header;
-
-    buf = slab->buffers;
-    for (i=0; i < numBuffers; ++i) {
-       buf->parent = slab;
-       buf->start = i* header->bufSize;
-       buf->mapCount = 0;
-       buf->isSlabBuffer = 1;
-       _glthread_INIT_COND(buf->event);
-       DRMLISTADDTAIL(&buf->head, &slab->freeBuffers);
-       slab->numFree++;
-       buf++;
-    }
-
-    DRMLISTADDTAIL(&slab->head, &header->slabs);
-
-    return 0;
-
-  out_err1:
-    driSetKernelBOFree(header->slabPool->fMan, slab->kbo);
-    free(slab->buffers);
-  out_err0:
-    free(slab);
-    return ret;
-}
-
-/*
- * Delete a buffer from the slab header delayed list and put
- * it on the slab free list.
- */
-
-static void
-driSlabFreeBufferLocked(struct _DriSlabBuffer *buf)
-{
-    struct _DriSlab *slab = buf->parent;
-    struct _DriSlabSizeHeader *header = slab->header;
-    drmMMListHead *list = &buf->head;
-
-    DRMLISTDEL(list);
-    DRMLISTADDTAIL(list, &slab->freeBuffers);
-    slab->numFree++;
-
-    if (slab->head.next == &slab->head)
-       DRMLISTADDTAIL(&slab->head, &header->slabs);
-
-    if (slab->numFree == slab->numBuffers) {
-       list = &slab->head;
-       DRMLISTDEL(list);
-       DRMLISTADDTAIL(list, &header->freeSlabs);
-    }
-
-    if (header->slabs.next == &header->slabs ||
-       slab->numFree != slab->numBuffers) {
-
-       drmMMListHead *next;
-       struct _DriFreeSlabManager *fMan = header->slabPool->fMan;
-
-       for (list = header->freeSlabs.next, next = list->next;
-            list != &header->freeSlabs;
-            list = next, next = list->next) {
-
-           slab = DRMLISTENTRY(struct _DriSlab, list, head);
-
-           DRMLISTDELINIT(list);
-           driSetKernelBOFree(fMan, slab->kbo);
-           free(slab->buffers);
-           free(slab);
-       }
-    }
-}
-
-static void
-driSlabCheckFreeLocked(struct _DriSlabSizeHeader *header, int wait)
-{
-  drmMMListHead *list, *prev, *first;
-   struct _DriSlabBuffer *buf;
-   struct _DriSlab *slab;
-   int firstWasSignaled = 1;
-   int signaled;
-   int i;
-   int ret;
-
-   /*
-    * Rerun the freeing test if the youngest tested buffer
-    * was signaled, since there might be more idle buffers
-    * in the delay list.
-    */
-
-   while (firstWasSignaled) {
-       firstWasSignaled = 0;
-       signaled = 0;
-       first = header->delayedBuffers.next;
-
-       /* Only examine the oldest 1/3 of delayed buffers:
-       */
-       if (header->numDelayed > 3) {
-          for (i = 0; i < header->numDelayed; i += 3) {
-              first = first->next;
-          }
-       }
-
-       for (list = first, prev = list->prev;
-           list != &header->delayedBuffers;
-           list = prev, prev = list->prev) {
-          buf = DRMLISTENTRY(struct _DriSlabBuffer, list, head);
-          slab = buf->parent;
-
-          if (!signaled) {
-              if (wait) {
-                  ret = driFenceFinish(buf->fence, buf->fenceType, 0);
-                  if (ret)
-                      break;
-                  signaled = 1;
-                  wait = 0;
-              } else {
-                  signaled = driFenceSignaled(buf->fence, buf->fenceType);
-              }
-              if (signaled) {
-                  if (list == first)
-                      firstWasSignaled = 1;
-                  driFenceUnReference(&buf->fence);
-                  header->numDelayed--;
-                  driSlabFreeBufferLocked(buf);
-              }
-          } else if (driFenceSignaledCached(buf->fence, buf->fenceType)) {
-              driFenceUnReference(&buf->fence);
-              header->numDelayed--;
-              driSlabFreeBufferLocked(buf);
-          }
-       }
-   }
-}
-
-
-static struct _DriSlabBuffer *
-driSlabAllocBuffer(struct _DriSlabSizeHeader *header)
-{
-    static struct _DriSlabBuffer *buf;
-    struct _DriSlab *slab;
-    drmMMListHead *list;
-    int count = DRI_SLABPOOL_ALLOC_RETRIES;
-
-    _glthread_LOCK_MUTEX(header->mutex);
-    while(header->slabs.next == &header->slabs && count > 0) {
-        driSlabCheckFreeLocked(header, 0);
-       if (header->slabs.next != &header->slabs)
-         break;
-
-       _glthread_UNLOCK_MUTEX(header->mutex);
-       if (count != DRI_SLABPOOL_ALLOC_RETRIES)
-           usleep(1);
-       _glthread_LOCK_MUTEX(header->mutex);
-       (void) driAllocSlab(header);
-       count--;
-    }
-
-    list = header->slabs.next;
-    if (list == &header->slabs) {
-       _glthread_UNLOCK_MUTEX(header->mutex);
-       return NULL;
-    }
-    slab = DRMLISTENTRY(struct _DriSlab, list, head);
-    if (--slab->numFree == 0)
-       DRMLISTDELINIT(list);
-
-    list = slab->freeBuffers.next;
-    DRMLISTDELINIT(list);
-
-    _glthread_UNLOCK_MUTEX(header->mutex);
-    buf = DRMLISTENTRY(struct _DriSlabBuffer, list, head);
-    return buf;
-}
-
-static void *
-pool_create(struct _DriBufferPool *driPool, unsigned long size,
-           uint64_t flags, unsigned hint, unsigned alignment)
-{
-    struct _DriSlabPool *pool = (struct _DriSlabPool *) driPool->data;
-    struct _DriSlabSizeHeader *header;
-    struct _DriSlabBuffer *buf;
-    void *dummy;
-    int i;
-    int ret;
-
-    /*
-     * FIXME: Check for compatibility.
-     */
-
-    header = pool->headers;
-    for (i=0; i<pool->numBuckets; ++i) {
-      if (header->bufSize >= size)
-       break;
-      header++;
-    }
-
-    if (i < pool->numBuckets)
-       return driSlabAllocBuffer(header);
-
-
-    /*
-     * Fall back to allocate a buffer object directly from DRM.
-     * and wrap it in a driBO structure.
-     */
-
-
-    buf = calloc(1, sizeof(*buf));
-
-    if (!buf)
-       return NULL;
-
-    buf->bo = calloc(1, sizeof(*buf->bo));
-    if (!buf->bo)
-       goto out_err0;
-
-    if (alignment) {
-       if ((alignment < pool->pageSize) && (pool->pageSize % alignment))
-           goto out_err1;
-       if ((alignment > pool->pageSize) && (alignment % pool->pageSize))
-           goto out_err1;
-    }
-
-    ret = drmBOCreate(pool->fd, size, alignment / pool->pageSize, NULL,
-                       flags, hint, buf->bo);
-    if (ret)
-       goto out_err1;
-
-    ret  = drmBOMap(pool->fd, buf->bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE,
-                   0, &dummy);
-    if (ret)
-       goto out_err2;
-
-    ret = drmBOUnmap(pool->fd, buf->bo);
-    if (ret)
-       goto out_err2;
-
-    return buf;
-  out_err2:
-    drmBOUnreference(pool->fd, buf->bo);
-  out_err1:
-    free(buf->bo);
-  out_err0:
-    free(buf);
-    return NULL;
-}
-
-static int
-pool_destroy(struct _DriBufferPool *driPool, void *private)
-{
-    struct _DriSlabBuffer *buf =
-       (struct _DriSlabBuffer *) private;
-    struct _DriSlab *slab;
-    struct _DriSlabSizeHeader *header;
-
-    if (!buf->isSlabBuffer) {
-       struct _DriSlabPool *pool = (struct _DriSlabPool *) driPool->data;
-       int ret;
-
-       ret = drmBOUnreference(pool->fd, buf->bo);
-       free(buf->bo);
-       free(buf);
-       return ret;
-    }
-
-    slab = buf->parent;
-    header = slab->header;
-
-    _glthread_LOCK_MUTEX(header->mutex);
-    buf->unFenced = 0;
-    buf->mapCount = 0;
-
-    if (buf->fence && !driFenceSignaledCached(buf->fence, buf->fenceType)) {
-       DRMLISTADDTAIL(&buf->head, &header->delayedBuffers);
-       header->numDelayed++;
-    } else {
-       if (buf->fence)
-           driFenceUnReference(&buf->fence);
-       driSlabFreeBufferLocked(buf);
-    }
-
-    _glthread_UNLOCK_MUTEX(header->mutex);
-    return 0;
-}
-
-static int
-pool_waitIdle(struct _DriBufferPool *driPool, void *private,
-             _glthread_Mutex *mutex, int lazy)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   while(buf->unFenced)
-       _glthread_COND_WAIT(buf->event, *mutex);
-
-   if (!buf->fence)
-     return 0;
-
-   driFenceFinish(buf->fence, buf->fenceType, lazy);
-   driFenceUnReference(&buf->fence);
-
-   return 0;
-}
-
-static int
-pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
-         int hint, _glthread_Mutex *mutex, void **virtual)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-   int busy;
-
-   if (buf->isSlabBuffer)
-       busy = buf->unFenced || (buf->fence && !driFenceSignaledCached(buf->fence, buf->fenceType));
-   else
-       busy = buf->fence && !driFenceSignaled(buf->fence, buf->fenceType);
-
-
-   if (busy) {
-       if (hint & DRM_BO_HINT_DONT_BLOCK)
-          return -EBUSY;
-       else {
-          (void) pool_waitIdle(pool, private, mutex, 0);
-       }
-   }
-
-   ++buf->mapCount;
-   *virtual = (buf->isSlabBuffer) ?
-       (void *) ((uint8_t *) buf->parent->kbo->virtual + buf->start) :
-       (void *) buf->bo->virtual;
-
-   return 0;
-}
-
-static int
-pool_unmap(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   --buf->mapCount;
-   if (buf->mapCount == 0 && buf->isSlabBuffer)
-       _glthread_COND_BROADCAST(buf->event);
-
-   return 0;
-}
-
-static unsigned long
-pool_offset(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-   struct _DriSlab *slab;
-   struct _DriSlabSizeHeader *header;
-
-   if (!buf->isSlabBuffer) {
-       assert(buf->bo->proposedFlags & DRM_BO_FLAG_NO_MOVE);
-       return buf->bo->offset;
-   }
-
-   slab = buf->parent;
-   header = slab->header;
-
-   (void) header;
-   assert(header->slabPool->proposedFlags & DRM_BO_FLAG_NO_MOVE);
-   return slab->kbo->bo.offset + buf->start;
-}
-
-static unsigned long
-pool_poolOffset(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   return buf->start;
-}
-
-static uint64_t
-pool_flags(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   if (!buf->isSlabBuffer)
-       return buf->bo->flags;
-
-   return buf->parent->kbo->bo.flags;
-}
-
-static unsigned long
-pool_size(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-   if (!buf->isSlabBuffer)
-       return buf->bo->size;
-
-   return buf->parent->header->bufSize;
-}
-
-static int
-pool_fence(struct _DriBufferPool *pool, void *private,
-           struct _DriFenceObject *fence)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-   drmBO *bo;
-
-   if (buf->fence)
-      driFenceUnReference(&buf->fence);
-
-   buf->fence = driFenceReference(fence);
-   bo = (buf->isSlabBuffer) ?
-     &buf->parent->kbo->bo:
-     buf->bo;
-   buf->fenceType = bo->fenceFlags;
-
-   buf->unFenced = 0;
-   _glthread_COND_BROADCAST(buf->event);
-
-   return 0;
-}
-
-static drmBO *
-pool_kernel(struct _DriBufferPool *pool, void *private)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   return (buf->isSlabBuffer) ? &buf->parent->kbo->bo : buf->bo;
-}
-
-static int
-pool_validate(struct _DriBufferPool *pool, void *private,
-             _glthread_Mutex *mutex)
-{
-   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
-
-   if (!buf->isSlabBuffer)
-       return 0;
-
-   while(buf->mapCount != 0)
-       _glthread_COND_WAIT(buf->event, *mutex);
-
-   buf->unFenced = 1;
-   return 0;
-}
-
-
-struct _DriFreeSlabManager *
-driInitFreeSlabManager(uint32_t checkIntervalMsec, uint32_t slabTimeoutMsec)
-{
-    struct _DriFreeSlabManager *tmp;
-
-    tmp = calloc(1, sizeof(*tmp));
-    if (!tmp)
-       return NULL;
-
-    _glthread_INIT_MUTEX(tmp->mutex);
-    _glthread_LOCK_MUTEX(tmp->mutex);
-    tmp->slabTimeout.tv_usec = slabTimeoutMsec*1000;
-    tmp->slabTimeout.tv_sec = tmp->slabTimeout.tv_usec / 1000000;
-    tmp->slabTimeout.tv_usec -=  tmp->slabTimeout.tv_sec*1000000;
-
-    tmp->checkInterval.tv_usec = checkIntervalMsec*1000;
-    tmp->checkInterval.tv_sec = tmp->checkInterval.tv_usec / 1000000;
-    tmp->checkInterval.tv_usec -=  tmp->checkInterval.tv_sec*1000000;
-
-    gettimeofday(&tmp->nextCheck, NULL);
-    driTimeAdd(&tmp->nextCheck, &tmp->checkInterval);
-    DRMINITLISTHEAD(&tmp->timeoutList);
-    DRMINITLISTHEAD(&tmp->unCached);
-    DRMINITLISTHEAD(&tmp->cached);
-    _glthread_UNLOCK_MUTEX(tmp->mutex);
-
-    return tmp;
-}
-
-void
-driFinishFreeSlabManager(struct _DriFreeSlabManager *fMan)
-{
-    struct timeval time;
-
-    time = fMan->nextCheck;
-    driTimeAdd(&time, &fMan->checkInterval);
-
-    _glthread_LOCK_MUTEX(fMan->mutex);
-    driFreeTimeoutKBOsLocked(fMan, &time);
-    _glthread_UNLOCK_MUTEX(fMan->mutex);
-
-    assert(fMan->timeoutList.next == &fMan->timeoutList);
-    assert(fMan->unCached.next == &fMan->unCached);
-    assert(fMan->cached.next == &fMan->cached);
-
-    free(fMan);
-}
-
-static void
-driInitSizeHeader(struct _DriSlabPool *pool, uint32_t size,
-                 struct _DriSlabSizeHeader *header)
-{
-    _glthread_INIT_MUTEX(header->mutex);
-    _glthread_LOCK_MUTEX(header->mutex);
-
-    DRMINITLISTHEAD(&header->slabs);
-    DRMINITLISTHEAD(&header->freeSlabs);
-    DRMINITLISTHEAD(&header->delayedBuffers);
-
-    header->numDelayed = 0;
-    header->slabPool = pool;
-    header->bufSize = size;
-
-    _glthread_UNLOCK_MUTEX(header->mutex);
-}
-
-static void
-driFinishSizeHeader(struct _DriSlabSizeHeader *header)
-{
-    drmMMListHead *list, *next;
-    struct _DriSlabBuffer *buf;
-
-    _glthread_LOCK_MUTEX(header->mutex);
-    for (list = header->delayedBuffers.next, next = list->next;
-        list != &header->delayedBuffers;
-        list = next, next = list->next) {
-
-       buf = DRMLISTENTRY(struct _DriSlabBuffer, list , head);
-       if (buf->fence) {
-           (void) driFenceFinish(buf->fence, buf->fenceType, 0);
-           driFenceUnReference(&buf->fence);
-       }
-       header->numDelayed--;
-       driSlabFreeBufferLocked(buf);
-    }
-    _glthread_UNLOCK_MUTEX(header->mutex);
-}
-
-static void
-pool_takedown(struct _DriBufferPool *driPool)
-{
-   struct _DriSlabPool *pool = driPool->data;
-   int i;
-
-   for (i=0; i<pool->numBuckets; ++i) {
-     driFinishSizeHeader(&pool->headers[i]);
-   }
-
-   free(pool->headers);
-   free(pool->bucketSizes);
-   free(pool);
-   free(driPool);
-}
-
-struct _DriBufferPool *
-driSlabPoolInit(int fd, uint64_t flags,
-               uint64_t validMask,
-               uint32_t smallestSize,
-               uint32_t numSizes,
-               uint32_t desiredNumBuffers,
-               uint32_t maxSlabSize,
-               uint32_t pageAlignment,
-               struct _DriFreeSlabManager *fMan)
-{
-    struct _DriBufferPool *driPool;
-    struct _DriSlabPool *pool;
-    uint32_t i;
-
-    driPool = calloc(1, sizeof(*driPool));
-    if (!driPool)
-       return NULL;
-
-    pool = calloc(1, sizeof(*pool));
-    if (!pool)
-       goto out_err0;
-
-    pool->bucketSizes = calloc(numSizes, sizeof(*pool->bucketSizes));
-    if (!pool->bucketSizes)
-       goto out_err1;
-
-    pool->headers = calloc(numSizes, sizeof(*pool->headers));
-    if (!pool->headers)
-       goto out_err2;
-
-    pool->fMan = fMan;
-    pool->proposedFlags = flags;
-    pool->validMask = validMask;
-    pool->numBuckets = numSizes;
-    pool->pageSize = getpagesize();
-    pool->fd = fd;
-    pool->pageAlignment = pageAlignment;
-    pool->maxSlabSize = maxSlabSize;
-    pool->desiredNumBuffers = desiredNumBuffers;
-
-    for (i=0; i<pool->numBuckets; ++i) {
-       pool->bucketSizes[i] = (smallestSize << i);
-       driInitSizeHeader(pool, pool->bucketSizes[i],
-                         &pool->headers[i]);
-    }
-
-    driPool->data = (void *) pool;
-    driPool->map = &pool_map;
-    driPool->unmap = &pool_unmap;
-    driPool->destroy = &pool_destroy;
-    driPool->offset = &pool_offset;
-    driPool->poolOffset = &pool_poolOffset;
-    driPool->flags = &pool_flags;
-    driPool->size = &pool_size;
-    driPool->create = &pool_create;
-    driPool->fence = &pool_fence;
-    driPool->kernel = &pool_kernel;
-    driPool->validate = &pool_validate;
-    driPool->waitIdle = &pool_waitIdle;
-    driPool->takeDown = &pool_takedown;
-
-    return driPool;
-
-  out_err2:
-    free(pool->bucketSizes);
-  out_err1:
-    free(pool);
-  out_err0:
-    free(driPool);
-
-    return NULL;
-}
diff --git a/src/gallium/winsys/dri/Makefile b/src/gallium/winsys/dri/Makefile
deleted file mode 100644 (file)
index f466ce6..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-# src/mesa/drivers/dri/Makefile
-
-TOP = ../../../..
-
-include $(TOP)/configs/current
-
-
-
-default: $(TOP)/$(LIB_DIR) subdirs
-
-
-$(TOP)/$(LIB_DIR):
-       -mkdir $(TOP)/$(LIB_DIR)
-
-
-subdirs:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE)) || exit 1 ; \
-               fi \
-       done
-
-
-install:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE) install) || exit 1 ; \
-               fi \
-       done
-
-
-clean:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE) clean) ; \
-               fi \
-       done
-       -rm -f common/*.o
diff --git a/src/gallium/winsys/dri/Makefile.template b/src/gallium/winsys/dri/Makefile.template
deleted file mode 100644 (file)
index 80e817b..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-# -*-makefile-*-
-
-MESA_MODULES = \
-       $(TOP)/src/mesa/libmesa.a \
-       $(GALLIUM_AUXILIARIES)
-       
-COMMON_GALLIUM_SOURCES = \
-        $(TOP)/src/mesa/drivers/dri/common/utils.c \
-        $(TOP)/src/mesa/drivers/dri/common/vblank.c \
-        $(TOP)/src/mesa/drivers/dri/common/dri_util.c \
-        $(TOP)/src/mesa/drivers/dri/common/xmlconfig.c
-
-COMMON_SOURCES = $(COMMON_GALLIUM_SOURCES) \
-        $(TOP)/src/mesa/drivers/common/driverfuncs.c \
-        $(TOP)/src/mesa/drivers/dri/common/texmem.c \
-        $(TOP)/src/mesa/drivers/dri/common/drirenderbuffer.c
-
-COMMON_BM_SOURCES = \
-       $(TOP)/src/mesa/drivers/dri/common/dri_bufmgr.c \
-       $(TOP)/src/mesa/drivers/dri/common/dri_drmpool.c
-
-
-ifeq ($(WINDOW_SYSTEM),dri)
-WINOBJ=
-WINLIB=
-INCLUDES = $(SHARED_INCLUDES) $(EXPAT_INCLUDES)
-
-OBJECTS = \
-       $(C_SOURCES:.c=.o) \
-       $(ASM_SOURCES:.S=.o) 
-
-else
-# miniglx
-WINOBJ=
-WINLIB=-L$(MESA)/src/glx/mini
-MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini
-INCLUDES = $(MINIGLX_INCLUDES) \
-          $(SHARED_INCLUDES) \
-          $(PCIACCESS_CFLAGS)
-
-OBJECTS = $(C_SOURCES:.c=.o) \
-         $(MINIGLX_SOURCES:.c=.o) \
-         $(ASM_SOURCES:.S=.o) 
-endif
-
-
-### Include directories
-SHARED_INCLUDES = \
-       -I. \
-       -I$(TOP)/src/mesa/drivers/dri/common \
-       -Iserver \
-       -I$(TOP)/include \
-       -I$(TOP)/include/GL/internal \
-       -I$(TOP)/src/gallium/include \
-       -I$(TOP)/src/gallium/auxiliary \
-       -I$(TOP)/src/gallium/drivers \
-       -I$(TOP)/src/gallium/winsys/common \
-       -I$(TOP)/src/mesa \
-       -I$(TOP)/src/mesa/main \
-       -I$(TOP)/src/mesa/glapi \
-       -I$(TOP)/src/mesa/math \
-       -I$(TOP)/src/mesa/transform \
-       -I$(TOP)/src/mesa/shader \
-       -I$(TOP)/src/mesa/swrast \
-       -I$(TOP)/src/mesa/swrast_setup \
-       -I$(TOP)/src/egl/main \
-       -I$(TOP)/src/egl/drivers/dri \
-       $(LIBDRM_CFLAGS)
-
-
-##### RULES #####
-
-.c.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@
-
-.S.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES)  $< -o $@
-
-
-##### TARGETS #####
-
-default: depend symlinks $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME) $(LIBNAME_EGL) $(TOP)/$(LIB_DIR)/$(LIBNAME_EGL)
-
-
-$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template
-       $(TOP)/bin/mklib -noprefix -o $@ \
-               $(OBJECTS) $(PIPE_DRIVERS) $(MESA_MODULES)  $(WINOBJ) $(DRI_LIB_DEPS)
-
-$(LIBNAME_EGL): $(WINSYS_OBJECTS) $(LIBS)
-       $(TOP)/bin/mklib -o $(LIBNAME_EGL) \
-               -linker "$(CC)" \
-               -noprefix \
-               $(OBJECTS) $(MKLIB_OPTIONS) $(WINSYS_OBJECTS) $(PIPE_DRIVERS) $(WINOBJ) $(DRI_LIB_DEPS) \
-               --whole-archive $(LIBS) $(GALLIUM_AUXILIARIES) --no-whole-archive
-
-$(TOP)/$(LIB_DIR)/$(LIBNAME): $(LIBNAME)
-       $(INSTALL) $(LIBNAME) $(TOP)/$(LIB_DIR) 
-
-$(TOP)/$(LIB_DIR)/$(LIBNAME_EGL): $(LIBNAME_EGL)
-       $(INSTALL) $(LIBNAME_EGL) $(TOP)/$(LIB_DIR) 
-
-depend: $(C_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
-       rm -f depend
-       touch depend
-       $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) \
-               $(ASM_SOURCES) 2> /dev/null
-
-
-# Emacs tags
-tags:
-       etags `find . -name \*.[ch]` `find ../include`
-
-
-# Remove .o and backup files
-clean:
-       -rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
-       -rm -f depend depend.bak
-
-
-install: $(LIBNAME)
-       $(INSTALL) -d $(DRI_DRIVER_INSTALL_DIR)
-       $(INSTALL) -m 755 $(LIBNAME) $(DRI_DRIVER_INSTALL_DIR)
-
-
-include depend
diff --git a/src/gallium/winsys/dri/SConscript b/src/gallium/winsys/dri/SConscript
deleted file mode 100644 (file)
index aef5210..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-Import('*')
-
-if env['dri']:
-
-       drienv = env.Clone()
-
-       drienv.Replace(CPPPATH = [
-               '#src/mesa/drivers/dri/common',
-               '#include',
-               '#include/GL/internal',
-               '#src/gallium/include',
-               '#src/gallium/auxiliary',
-               '#src/gallium/drivers',
-               '#src/mesa',
-               '#src/mesa/main',
-               '#src/mesa/glapi',
-               '#src/mesa/math',
-               '#src/mesa/transform',
-               '#src/mesa/shader',
-               '#src/mesa/swrast',
-               '#src/mesa/swrast_setup',
-               '#src/egl/main',
-               '#src/egl/drivers/dri',
-       ])
-
-       drienv.ParseConfig('pkg-config --cflags --libs libdrm')
-
-       COMMON_GALLIUM_SOURCES = [
-               '#src/mesa/drivers/dri/common/utils.c',
-               '#src/mesa/drivers/dri/common/vblank.c',
-               '#src/mesa/drivers/dri/common/dri_util.c',
-               '#src/mesa/drivers/dri/common/xmlconfig.c',
-       ]
-
-       COMMON_BM_SOURCES = [
-               '#src/mesa/drivers/dri/common/dri_bufmgr.c',
-               '#src/mesa/drivers/dri/common/dri_drmpool.c',
-       ]
-
-       Export([
-               'drienv',
-               'COMMON_GALLIUM_SOURCES',
-               'COMMON_BM_SOURCES',
-       ])
-
-       # TODO: Installation
-       #install: $(LIBNAME)
-       #       $(INSTALL) -d $(DRI_DRIVER_INSTALL_DIR)
-       #       $(INSTALL) -m 755 $(LIBNAME) $(DRI_DRIVER_INSTALL_DIR)
-
-       if 'intel' in env['winsys']:
-               SConscript([
-                       'intel/SConscript',
-               ])
diff --git a/src/gallium/winsys/dri/intel/Makefile b/src/gallium/winsys/dri/intel/Makefile
deleted file mode 100644 (file)
index e0716ea..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-
-TOP = ../../../../..
-include $(TOP)/configs/current
-
-LIBNAME = i915_dri.so
-LIBNAME_EGL = egl_i915_dri.so
-
-PIPE_DRIVERS = \
-       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
-       $(TOP)/src/gallium/winsys/common/intel_drm/libinteldrm.a \
-       $(TOP)/src/gallium/drivers/i915simple/libi915simple.a
-
-
-DRIVER_SOURCES = \
-       intel_winsys_softpipe.c \
-       intel_swapbuffers.c \
-       intel_context.c \
-       intel_lock.c \
-       intel_screen.c
-
-C_SOURCES = \
-       $(COMMON_GALLIUM_SOURCES) \
-       $(DRIVER_SOURCES)
-
-ASM_SOURCES = 
-
-DRIVER_DEFINES = -I$(TOP)/src/mesa/drivers/dri/intel $(shell pkg-config libdrm --atleast-version=2.3.1 \
-                               && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
-
-include ../Makefile.template
-
-#intel_tex_layout.o: $(TOP)/src/mesa/drivers/dri/intel/intel_tex_layout.c
-
-symlinks:
diff --git a/src/gallium/winsys/dri/intel/SConscript b/src/gallium/winsys/dri/intel/SConscript
deleted file mode 100644 (file)
index 6a4f50a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-Import('*')
-
-if 'mesa' in env['statetrackers']:
-
-       env = drienv.Clone()
-
-       env.Append(CPPPATH = [
-               '../intel',
-               'server'
-       ])
-
-       #MINIGLX_SOURCES = server/intel_dri.c
-
-       DRIVER_SOURCES = [
-               'intel_winsys_pipe.c',
-               'intel_winsys_softpipe.c',
-               'intel_winsys_i915.c',
-               'intel_batchbuffer.c',
-               'intel_swapbuffers.c',
-               'intel_context.c',
-               'intel_lock.c',
-               'intel_screen.c',
-               'intel_batchpool.c',
-       ]
-
-       sources = \
-               COMMON_GALLIUM_SOURCES + \
-               COMMON_BM_SOURCES + \
-               DRIVER_SOURCES
-
-       drivers = [
-               softpipe,
-               i915simple
-       ]
-
-       # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
-       env.SharedLibrary(
-               target ='i915tex_dri.so',
-               source = sources,
-               LIBS = drivers + mesa + auxiliaries + env['LIBS'],
-       )
diff --git a/src/gallium/winsys/dri/intel/intel_batchbuffer.h b/src/gallium/winsys/dri/intel/intel_batchbuffer.h
deleted file mode 100644 (file)
index 1fa2719..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef INTEL_BATCHBUFFER_H
-#define INTEL_BATCHBUFFER_H
-
-#include "intel_drm/intel_be_batchbuffer.h"
-
-/*
- * Need to redefine the BATCH defines
- */
-
-#undef BEGIN_BATCH
-#define BEGIN_BATCH(dwords, relocs) \
-   (i915_batchbuffer_check(&intel->base.batch->base, dwords, relocs))
-
-#undef OUT_BATCH
-#define OUT_BATCH(d) \
-   i915_batchbuffer_dword(&intel->base.batch->base, d)
-
-#undef OUT_RELOC
-#define OUT_RELOC(buf,flags,mask,delta) do {                                   \
-   assert((delta) >= 0);                                                       \
-   intel_be_offset_relocation(intel->base.batch, delta, buf, flags, mask);     \
-} while (0)
-
-#endif
diff --git a/src/gallium/winsys/dri/intel/intel_context.c b/src/gallium/winsys/dri/intel/intel_context.c
deleted file mode 100644 (file)
index 97ef731..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-
-#include "i830_dri.h"
-
-#include "intel_screen.h"
-#include "intel_context.h"
-#include "intel_swapbuffers.h"
-#include "intel_batchbuffer.h"
-#include "intel_winsys_softpipe.h"
-
-#include "i915simple/i915_screen.h"
-
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_context.h"
-
-#include "utils.h"
-
-
-#ifdef DEBUG
-int __intel_debug = 0;
-#endif
-
-
-#define need_GL_ARB_multisample
-#define need_GL_ARB_point_parameters
-#define need_GL_ARB_texture_compression
-#define need_GL_ARB_vertex_buffer_object
-#define need_GL_ARB_vertex_program
-#define need_GL_ARB_window_pos
-#define need_GL_EXT_blend_color
-#define need_GL_EXT_blend_equation_separate
-#define need_GL_EXT_blend_func_separate
-#define need_GL_EXT_blend_minmax
-#define need_GL_EXT_cull_vertex
-#define need_GL_EXT_fog_coord
-#define need_GL_EXT_framebuffer_object
-#define need_GL_EXT_multi_draw_arrays
-#define need_GL_EXT_secondary_color
-#define need_GL_NV_vertex_program
-#include "extension_helper.h"
-
-
-/**
- * Extension strings exported by the intel driver.
- *
- * \note
- * It appears that ARB_texture_env_crossbar has "disappeared" compared to the
- * old i830-specific driver.
- */
-const struct dri_extension card_extensions[] = {
-   {"GL_ARB_multisample", GL_ARB_multisample_functions},
-   {"GL_ARB_multitexture", NULL},
-   {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
-   {"GL_ARB_texture_border_clamp", NULL},
-   {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
-   {"GL_ARB_texture_cube_map", NULL},
-   {"GL_ARB_texture_env_add", NULL},
-   {"GL_ARB_texture_env_combine", NULL},
-   {"GL_ARB_texture_env_dot3", NULL},
-   {"GL_ARB_texture_mirrored_repeat", NULL},
-   {"GL_ARB_texture_rectangle", NULL},
-   {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
-   {"GL_ARB_pixel_buffer_object", NULL},
-   {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
-   {"GL_ARB_window_pos", GL_ARB_window_pos_functions},
-   {"GL_EXT_blend_color", GL_EXT_blend_color_functions},
-   {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
-   {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
-   {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
-   {"GL_EXT_blend_subtract", NULL},
-   {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
-   {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions},
-   {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},
-   {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
-   {"GL_EXT_packed_depth_stencil", NULL},
-   {"GL_EXT_pixel_buffer_object", NULL},
-   {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
-   {"GL_EXT_stencil_wrap", NULL},
-   {"GL_EXT_texture_edge_clamp", NULL},
-   {"GL_EXT_texture_env_combine", NULL},
-   {"GL_EXT_texture_env_dot3", NULL},
-   {"GL_EXT_texture_filter_anisotropic", NULL},
-   {"GL_EXT_texture_lod_bias", NULL},
-   {"GL_3DFX_texture_compression_FXT1", NULL},
-   {"GL_APPLE_client_storage", NULL},
-   {"GL_MESA_pack_invert", NULL},
-   {"GL_MESA_ycbcr_texture", NULL},
-   {"GL_NV_blend_square", NULL},
-   {"GL_NV_vertex_program", GL_NV_vertex_program_functions},
-   {"GL_NV_vertex_program1_1", NULL},
-   {"GL_SGIS_generate_mipmap", NULL },
-   {NULL, NULL}
-};
-
-
-
-#ifdef DEBUG
-static const struct dri_debug_control debug_control[] = {
-   {"ioctl", DEBUG_IOCTL},
-   {"bat", DEBUG_BATCH},
-   {"lock", DEBUG_LOCK},
-   {"swap", DEBUG_SWAP},
-   {NULL, 0}
-};
-#endif
-
-
-
-static void
-intel_lock_hardware(struct intel_be_context *context)
-{
-   struct intel_context *intel = (struct intel_context *)context;
-   LOCK_HARDWARE(intel);
-}
-
-static void
-intel_unlock_hardware(struct intel_be_context *context)
-{
-   struct intel_context *intel = (struct intel_context *)context;
-   UNLOCK_HARDWARE(intel);
-}
-
-static boolean
-intel_locked_hardware(struct intel_be_context *context)
-{
-   struct intel_context *intel = (struct intel_context *)context;
-   return intel->locked ? TRUE : FALSE;
-}
-
-GLboolean
-intelCreateContext(const __GLcontextModes * visual,
-                   __DRIcontextPrivate * driContextPriv,
-                   void *sharedContextPrivate)
-{
-   struct intel_context *intel = CALLOC_STRUCT(intel_context);
-   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-   struct intel_screen *intelScreen = intel_screen(sPriv);
-   drmI830Sarea *saPriv = intelScreen->sarea;
-   int fthrottle_mode;
-   GLboolean havePools;
-   struct pipe_context *pipe;
-   struct st_context *st_share = NULL;
-
-   if (sharedContextPrivate) {
-      st_share = ((struct intel_context *) sharedContextPrivate)->st;
-   }
-
-   driContextPriv->driverPrivate = intel;
-   intel->intelScreen = intelScreen;
-   intel->driScreen = sPriv;
-   intel->sarea = saPriv;
-
-   driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache,
-                       intel->driScreen->myNum, "i915");
-
-
-   /*
-    * memory pools
-    */
-   DRM_LIGHT_LOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
-   // ZZZ JB should be per screen and not be done per context
-   havePools = intelCreatePools(sPriv);
-   DRM_UNLOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
-   if (!havePools)
-      return GL_FALSE;
-
-
-   /* Dri stuff */
-   intel->hHWContext = driContextPriv->hHWContext;
-   intel->driFd = sPriv->fd;
-   intel->driHwLock = (drmLock *) & sPriv->pSAREA->lock;
-
-   fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode");
-   intel->iw.irq_seq = -1;
-   intel->irqsEmitted = 0;
-
-   intel->last_swap_fence = NULL;
-   intel->first_swap_fence = NULL;
-
-#ifdef DEBUG
-   __intel_debug = driParseDebugString(getenv("INTEL_DEBUG"), debug_control);
-#endif
-   intel->base.hardware_lock = intel_lock_hardware;
-   intel->base.hardware_unlock = intel_unlock_hardware;
-   intel->base.hardware_locked = intel_locked_hardware;
-
-   intel_be_init_context(&intel->base, &intelScreen->base);
-
-   /*
-    * Pipe-related setup
-    */
-   if (getenv("INTEL_SP")) {
-      /* use softpipe driver instead of hw */
-      pipe = intel_create_softpipe( intel, &intelScreen->base.base );
-   }
-   else {
-      switch (intel->intelScreen->deviceID) {
-      case PCI_CHIP_I945_G:
-      case PCI_CHIP_I945_GM:
-      case PCI_CHIP_I945_GME:
-      case PCI_CHIP_G33_G:
-      case PCI_CHIP_Q33_G:
-      case PCI_CHIP_Q35_G:
-      case PCI_CHIP_I915_G:
-      case PCI_CHIP_I915_GM:
-        pipe = i915_create_context(intelScreen->base.screen,
-                                   &intelScreen->base.base,
-                                   &intel->base.base);
-        break;
-      default:
-        fprintf(stderr, "Unknown PCIID %x in %s, using software driver\n",
-                 intel->intelScreen->deviceID, __FUNCTION__);
-
-        pipe = intel_create_softpipe( intel, &intelScreen->base.base );
-        break;
-      }
-   }
-
-   pipe->priv = intel;
-
-   intel->st = st_create_context(pipe, visual, st_share);
-
-   driInitExtensions( intel->st->ctx, card_extensions, GL_TRUE );
-
-   return GL_TRUE;
-}
-
-
-void
-intelDestroyContext(__DRIcontextPrivate * driContextPriv)
-{
-   struct intel_context *intel = intel_context(driContextPriv);
-
-   assert(intel);               /* should never be null */
-   if (intel) {
-      st_finish(intel->st);
-
-      if (intel->last_swap_fence) {
-        driFenceFinish(intel->last_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE);
-        driFenceUnReference(&intel->last_swap_fence);
-        intel->last_swap_fence = NULL;
-      }
-      if (intel->first_swap_fence) {
-        driFenceFinish(intel->first_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE);
-        driFenceUnReference(&intel->first_swap_fence);
-        intel->first_swap_fence = NULL;
-      }
-
-      if (intel->intelScreen->dummyContext == intel)
-         intel->intelScreen->dummyContext = NULL;
-
-      st_destroy_context(intel->st);
-      intel_be_destroy_context(&intel->base);
-      free(intel);
-   }
-}
-
-
-GLboolean
-intelUnbindContext(__DRIcontextPrivate * driContextPriv)
-{
-   struct intel_context *intel = intel_context(driContextPriv);
-   st_flush(intel->st, PIPE_FLUSH_RENDER_CACHE, NULL);
-   /* XXX make_current(NULL)? */
-   return GL_TRUE;
-}
-
-
-GLboolean
-intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
-                 __DRIdrawablePrivate * driDrawPriv,
-                 __DRIdrawablePrivate * driReadPriv)
-{
-   if (driContextPriv) {
-      struct intel_context *intel = intel_context(driContextPriv);
-      struct intel_framebuffer *draw_fb = intel_framebuffer(driDrawPriv);
-      struct intel_framebuffer *read_fb = intel_framebuffer(driReadPriv);
-
-      assert(draw_fb->stfb);
-      assert(read_fb->stfb);
-
-      /* This is for situations in which we need a rendering context but
-       * there may not be any currently bound.
-       */
-      intel->intelScreen->dummyContext = intel;
-
-      st_make_current(intel->st, draw_fb->stfb, read_fb->stfb);
-
-      if ((intel->driDrawable != driDrawPriv) ||
-         (intel->lastStamp != driDrawPriv->lastStamp)) {
-         intel->driDrawable = driDrawPriv;
-         intelUpdateWindowSize(driDrawPriv);
-         intel->lastStamp = driDrawPriv->lastStamp;
-      }
-
-      /* The size of the draw buffer will have been updated above.
-       * If the readbuffer is a different window, check/update its size now.
-       */
-      if (driReadPriv != driDrawPriv) {
-         intelUpdateWindowSize(driReadPriv);
-      }
-
-   }
-   else {
-      st_make_current(NULL, NULL, NULL);
-   }
-
-   return GL_TRUE;
-}
diff --git a/src/gallium/winsys/dri/intel/intel_context.h b/src/gallium/winsys/dri/intel/intel_context.h
deleted file mode 100644 (file)
index ced18da..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef INTEL_CONTEXT_H
-#define INTEL_CONTEXT_H
-
-#include <stdint.h>
-#include "drm.h"
-
-#include "pipe/p_debug.h"
-
-#include "intel_screen.h"
-#include "i915_drm.h"
-
-#include "intel_drm/intel_be_context.h"
-
-
-struct pipe_context;
-struct intel_context;
-struct _DriBufferObject;
-struct st_context;
-
-
-#define INTEL_MAX_FIXUP 64
-
-/**
- * Intel rendering context, contains a state tracker and intel-specific info.
- */
-struct intel_context
-{
-   struct intel_be_context base;
-   struct st_context *st;
-
-   struct _DriFenceObject *last_swap_fence;
-   struct _DriFenceObject *first_swap_fence;
-
-//   struct intel_batchbuffer *batch;
-
-   boolean locked;
-   char *prevLockFile;
-   int prevLockLine;
-
-   uint irqsEmitted;
-   drm_i915_irq_wait_t iw;
-
-   drm_context_t hHWContext;
-   drmLock *driHwLock;
-   int driFd;
-
-   __DRIdrawablePrivate *driDrawable;
-   __DRIscreenPrivate *driScreen;
-   struct intel_screen *intelScreen;
-   drmI830Sarea *sarea;
-
-   uint lastStamp;
-
-   /**
-    * Configuration cache
-    */
-   driOptionCache optionCache;
-};
-
-
-
-/**
- * Intel framebuffer.
- */
-struct intel_framebuffer
-{
-   struct st_framebuffer *stfb;
-
-   /* other fields TBD */
-   int other;
-};
-
-
-
-
-/* These are functions now:
- */
-void LOCK_HARDWARE( struct intel_context *intel );
-void UNLOCK_HARDWARE( struct intel_context *intel );
-
-extern char *__progname;
-
-
-
-/* ================================================================
- * Debugging:
- */
-#ifdef DEBUG
-extern int __intel_debug;
-
-#define DEBUG_SWAP     0x1
-#define DEBUG_LOCK      0x2
-#define DEBUG_IOCTL    0x4
-#define DEBUG_BATCH     0x8
-
-#define DBG(flag, ...)  do {                   \
-   if (__intel_debug & (DEBUG_##flag))                 \
-      printf(__VA_ARGS__);             \
-} while(0)
-
-#else
-#define DBG(flag, ...)
-#endif
-
-
-
-#define PCI_CHIP_845_G                 0x2562
-#define PCI_CHIP_I830_M                        0x3577
-#define PCI_CHIP_I855_GM               0x3582
-#define PCI_CHIP_I865_G                        0x2572
-#define PCI_CHIP_I915_G                        0x2582
-#define PCI_CHIP_I915_GM               0x2592
-#define PCI_CHIP_I945_G                        0x2772
-#define PCI_CHIP_I945_GM               0x27A2
-#define PCI_CHIP_I945_GME              0x27AE
-#define PCI_CHIP_G33_G                 0x29C2
-#define PCI_CHIP_Q35_G                 0x29B2
-#define PCI_CHIP_Q33_G                 0x29D2
-
-
-/** Cast wrapper */
-static INLINE struct intel_context *
-intel_context(__DRIcontextPrivate *driContextPriv)
-{
-   return (struct intel_context *) driContextPriv->driverPrivate;
-}
-
-
-/** Cast wrapper */
-static INLINE struct intel_framebuffer *
-intel_framebuffer(__DRIdrawablePrivate * driDrawPriv)
-{
-   return (struct intel_framebuffer *) driDrawPriv->driverPrivate;
-}
-
-
-#endif
diff --git a/src/gallium/winsys/dri/intel/intel_lock.c b/src/gallium/winsys/dri/intel/intel_lock.c
deleted file mode 100644 (file)
index 406284c..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-
-#include "main/glheader.h"
-#include "glapi/glthread.h"
-#include <GL/internal/glcore.h>
-#include "state_tracker/st_public.h"
-#include "intel_context.h"
-#include "i830_dri.h"
-
-
-
-_glthread_DECLARE_STATIC_MUTEX( lockMutex );
-
-
-static void
-intelContendedLock(struct intel_context *intel, uint flags)
-{
-   __DRIdrawablePrivate *dPriv = intel->driDrawable;
-   __DRIscreenPrivate *sPriv = intel->driScreen;
-   struct intel_screen *intelScreen = intel_screen(sPriv);
-   drmI830Sarea *sarea = intel->sarea;
-
-   drmGetLock(intel->driFd, intel->hHWContext, flags);
-
-   DBG(LOCK, "%s - got contended lock\n", __progname);
-
-   /* If the window moved, may need to set a new cliprect now.
-    *
-    * NOTE: This releases and regains the hw lock, so all state
-    * checking must be done *after* this call:
-    */
-   if (dPriv)
-      DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
-
-   if (sarea->width != intelScreen->front.width ||
-       sarea->height != intelScreen->front.height) {
-
-      intelUpdateScreenRotation(sPriv, sarea);
-   }
-}
-
-
-/* Lock the hardware and validate our state.
- */
-void LOCK_HARDWARE( struct intel_context *intel )
-{
-    char __ret = 0;
-
-    _glthread_LOCK_MUTEX(lockMutex);
-    assert(!intel->locked);
-
-    DRM_CAS(intel->driHwLock, intel->hHWContext,
-            (DRM_LOCK_HELD|intel->hHWContext), __ret);
-
-    if (__ret)
-       intelContendedLock( intel, 0 );
-
-    DBG(LOCK, "%s - locked\n", __progname);
-
-    intel->locked = 1;
-}
-
-
-/* Unlock the hardware using the global current context
- */
-void UNLOCK_HARDWARE( struct intel_context *intel )
-{
-   assert(intel->locked);
-   intel->locked = 0;
-
-   DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext);
-
-   _glthread_UNLOCK_MUTEX(lockMutex);
-
-   DBG(LOCK, "%s - unlocked\n", __progname);
-}
diff --git a/src/gallium/winsys/dri/intel/intel_reg.h b/src/gallium/winsys/dri/intel/intel_reg.h
deleted file mode 100644 (file)
index 4f33bee..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-
-#ifndef _INTEL_REG_H_
-#define _INTEL_REG_H_
-
-
-#define BR00_BITBLT_CLIENT   0x40000000
-#define BR00_OP_COLOR_BLT    0x10000000
-#define BR00_OP_SRC_COPY_BLT 0x10C00000
-#define BR13_SOLID_PATTERN   0x80000000
-
-#define XY_COLOR_BLT_CMD               ((2<<29)|(0x50<<22)|0x4)
-#define XY_COLOR_BLT_WRITE_ALPHA       (1<<21)
-#define XY_COLOR_BLT_WRITE_RGB         (1<<20)
-
-#define XY_SRC_COPY_BLT_CMD             ((2<<29)|(0x53<<22)|6)
-#define XY_SRC_COPY_BLT_WRITE_ALPHA     (1<<21)
-#define XY_SRC_COPY_BLT_WRITE_RGB       (1<<20)
-
-#define MI_WAIT_FOR_EVENT               ((0x3<<23))
-#define MI_WAIT_FOR_PLANE_B_FLIP        (1<<6)
-#define MI_WAIT_FOR_PLANE_A_FLIP        (1<<2)
-
-#define MI_BATCH_BUFFER_END            (0xA<<23)
-
-
-#endif
diff --git a/src/gallium/winsys/dri/intel/intel_screen.c b/src/gallium/winsys/dri/intel/intel_screen.c
deleted file mode 100644 (file)
index b3022fd..0000000
+++ /dev/null
@@ -1,607 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#include "utils.h"
-#include "vblank.h"
-#include "xmlpool.h"
-
-#include "intel_context.h"
-#include "intel_screen.h"
-#include "intel_batchbuffer.h"
-#include "intel_swapbuffers.h"
-
-#include "i830_dri.h"
-#include "intel_drm/ws_dri_bufpool.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "pipe/p_inlines.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_cb_fbo.h"
-
-static void
-intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle);
-
-static void
-intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle)
-{
-   struct pipe_screen *screen = intelScreen->base.screen;
-   struct pipe_texture *texture;
-   struct pipe_texture templat;
-   struct pipe_surface *surface;
-   struct pipe_buffer *buffer;
-   unsigned pitch;
-
-   assert(intelScreen->front.cpp == 4);
-
-   buffer = intel_be_buffer_from_handle(&intelScreen->base,
-                                        "front", handle);
-
-   if (!buffer)
-      return;
-
-   intelScreen->front.buffer = dri_bo(buffer);
-
-   memset(&templat, 0, sizeof(templat));
-   templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
-   templat.target = PIPE_TEXTURE_2D;
-   templat.last_level = 0;
-   templat.depth[0] = 1;
-   templat.format = PIPE_FORMAT_A8R8G8B8_UNORM;
-   templat.width[0] = intelScreen->front.width;
-   templat.height[0] = intelScreen->front.height;
-   pf_get_block(templat.format, &templat.block);
-   pitch = intelScreen->front.pitch;
-
-   texture = screen->texture_blanket(screen,
-                                     &templat,
-                                     &pitch,
-                                     buffer);
-
-   /* Unref the buffer we don't need it anyways */
-   pipe_buffer_reference(screen->winsys, &buffer, NULL);
-
-   surface = screen->get_tex_surface(screen,
-                                     texture,
-                                     0,
-                                     0,
-                                     0,
-                                     PIPE_BUFFER_USAGE_GPU_WRITE);
-
-   intelScreen->front.texture = texture;
-   intelScreen->front.surface = surface;
-}
-
-PUBLIC const char __driConfigOptions[] =
-   DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE
-   DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
-   DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
-   DRI_CONF_SECTION_END DRI_CONF_SECTION_QUALITY
-//   DRI_CONF_FORCE_S3TC_ENABLE(false)
-   DRI_CONF_ALLOW_LARGE_TEXTURES(1)
-   DRI_CONF_SECTION_END DRI_CONF_END;
-
-const uint __driNConfigOptions = 3;
-
-#ifdef USE_NEW_INTERFACE
-static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
-#endif /*USE_NEW_INTERFACE */
-
-extern const struct dri_extension card_extensions[];
-
-
-
-
-static void
-intelPrintDRIInfo(struct intel_screen * intelScreen,
-                  __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv)
-{
-   fprintf(stderr, "*** Front size:   0x%x  offset: 0x%x  pitch: %d\n",
-           intelScreen->front.size, intelScreen->front.offset,
-           intelScreen->front.pitch);
-   fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem);
-}
-
-
-#if 0
-static void
-intelPrintSAREA(const drmI830Sarea * sarea)
-{
-   fprintf(stderr, "SAREA: sarea width %d  height %d\n", sarea->width,
-           sarea->height);
-   fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch);
-   fprintf(stderr,
-           "SAREA: front offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
-           sarea->front_offset, sarea->front_size,
-           (unsigned) sarea->front_handle);
-   fprintf(stderr,
-           "SAREA: back  offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
-           sarea->back_offset, sarea->back_size,
-           (unsigned) sarea->back_handle);
-   fprintf(stderr, "SAREA: depth offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
-           sarea->depth_offset, sarea->depth_size,
-           (unsigned) sarea->depth_handle);
-   fprintf(stderr, "SAREA: tex   offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
-           sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle);
-   fprintf(stderr, "SAREA: rotation: %d\n", sarea->rotation);
-   fprintf(stderr,
-           "SAREA: rotated offset: 0x%08x  size: 0x%x\n",
-           sarea->rotated_offset, sarea->rotated_size);
-   fprintf(stderr, "SAREA: rotated pitch: %d\n", sarea->rotated_pitch);
-}
-#endif
-
-
-/**
- * Use the information in the sarea to update the screen parameters
- * related to screen rotation. Needs to be called locked.
- */
-void
-intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea)
-{
-   struct intel_screen *intelScreen = intel_screen(sPriv);
-
-   if (intelScreen->front.map) {
-      drmUnmap(intelScreen->front.map, intelScreen->front.size);
-      intelScreen->front.map = NULL;
-   }
-
-   if (intelScreen->front.buffer)
-      driDeleteBuffers(1, &intelScreen->front.buffer);
-
-   intelScreen->front.width = sarea->width;
-   intelScreen->front.height = sarea->height;
-   intelScreen->front.offset = sarea->front_offset;
-   intelScreen->front.pitch = sarea->pitch * intelScreen->front.cpp;
-   intelScreen->front.size = sarea->front_size;
-   intelScreen->front.handle = sarea->front_handle;
-
-   assert( sarea->front_size >=
-          intelScreen->front.pitch * intelScreen->front.height );
-
-#if 0 /* JB not important */
-   if (!sarea->front_handle)
-      return;
-
-   if (drmMap(sPriv->fd,
-             sarea->front_handle,
-             intelScreen->front.size,
-             (drmAddress *) & intelScreen->front.map) != 0) {
-      fprintf(stderr, "drmMap(frontbuffer) failed!\n");
-      return;
-   }
-#endif
-
-#if 0 /* JB */
-   if (intelScreen->staticPool) {
-      driGenBuffers(intelScreen->staticPool, "static region", 1,
-                   &intelScreen->front.buffer, 64,
-                   DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_NO_MOVE |
-                   DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0);
-
-      driBOSetStatic(intelScreen->front.buffer,
-                    intelScreen->front.offset,
-                    intelScreen->front.pitch * intelScreen->front.height,
-                    intelScreen->front.map, 0);
-   }
-#else
-   if (intelScreen->base.staticPool) {
-      if (intelScreen->front.buffer) {
-        driBOUnReference(intelScreen->front.buffer);
-        pipe_surface_reference(&intelScreen->front.surface, NULL);
-        pipe_texture_reference(&intelScreen->front.texture, NULL);
-      }
-      intelCreateSurface(intelScreen, &intelScreen->base.base, sarea->front_bo_handle);
-   }
-#endif
-}
-
-
-boolean
-intelCreatePools(__DRIscreenPrivate * sPriv)
-{
-   //unsigned batchPoolSize = 1024*1024;
-   struct intel_screen *intelScreen = intel_screen(sPriv);
-
-   if (intelScreen->havePools)
-      return GL_TRUE;
-
-   intelScreen->havePools = GL_TRUE;
-
-   intelUpdateScreenRotation(sPriv, intelScreen->sarea);
-
-   return GL_TRUE;
-}
-
-static const char *
-intel_get_name( struct pipe_winsys *winsys )
-{
-   return "Intel/DRI/ttm";
-}
-
-/*
- * The state tracker (should!) keep track of whether the fake
- * frontbuffer has been touched by any rendering since the last time
- * we copied its contents to the real frontbuffer.  Our task is easy:
- */
-static void
-intel_flush_frontbuffer( struct pipe_winsys *winsys,
-                         struct pipe_surface *surf,
-                         void *context_private)
-{
-   struct intel_context *intel = (struct intel_context *) context_private;
-   __DRIdrawablePrivate *dPriv = intel->driDrawable;
-
-   intelDisplaySurface(dPriv, surf, NULL);
-}
-
-static boolean
-intelInitDriver(__DRIscreenPrivate * sPriv)
-{
-   struct intel_screen *intelScreen;
-   I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
-
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->
-                                      getProcAddress("glxEnableExtension"));
-   void *const psc = sPriv->psc->screenConfigs;
-
-   if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
-      fprintf(stderr,
-              "\nERROR!  sizeof(I830DRIRec) does not match passed size from device driver\n");
-      return GL_FALSE;
-   }
-
-   /* Allocate the private area */
-   intelScreen = CALLOC_STRUCT(intel_screen);
-   if (!intelScreen)
-      return GL_FALSE;
-
-   /* parse information in __driConfigOptions */
-   driParseOptionInfo(&intelScreen->optionCache,
-                      __driConfigOptions, __driNConfigOptions);
-
-   sPriv->private = (void *) intelScreen;
-
-   intelScreen->sarea = (drmI830Sarea *) (((GLubyte *) sPriv->pSAREA) +
-                                         gDRIPriv->sarea_priv_offset);
-   intelScreen->deviceID = gDRIPriv->deviceID;
-   intelScreen->front.cpp = gDRIPriv->cpp;
-   intelScreen->drmMinor = sPriv->drmMinor;
-
-   assert(gDRIPriv->bitsPerPixel == 16 ||
-         gDRIPriv->bitsPerPixel == 32);
-
-   intelUpdateScreenRotation(sPriv, intelScreen->sarea);
-
-   if (0)
-      intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);
-
-   if (glx_enable_extension != NULL) {
-      (*glx_enable_extension) (psc, "GLX_SGI_swap_control");
-      (*glx_enable_extension) (psc, "GLX_SGI_video_sync");
-      (*glx_enable_extension) (psc, "GLX_MESA_swap_control");
-      (*glx_enable_extension) (psc, "GLX_MESA_swap_frame_usage");
-      (*glx_enable_extension) (psc, "GLX_SGI_make_current_read");
-   }
-
-   intelScreen->base.base.flush_frontbuffer = intel_flush_frontbuffer;
-   intelScreen->base.base.get_name = intel_get_name;
-   intel_be_init_device(&intelScreen->base, sPriv->fd, intelScreen->deviceID);
-
-   return GL_TRUE;
-}
-
-
-static void
-intelDestroyScreen(__DRIscreenPrivate * sPriv)
-{
-   struct intel_screen *intelScreen = intel_screen(sPriv);
-
-   intel_be_destroy_device(&intelScreen->base);
-   /*  intelUnmapScreenRegions(intelScreen); */
-
-   FREE(intelScreen);
-   sPriv->private = NULL;
-}
-
-
-/**
- * This is called when we need to set up GL rendering to a new X window.
- */
-static boolean
-intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
-                  __DRIdrawablePrivate * driDrawPriv,
-                  const __GLcontextModes * visual, boolean isPixmap)
-{
-   if (isPixmap) {
-      return GL_FALSE;          /* not implemented */
-   }
-   else {
-      enum pipe_format colorFormat, depthFormat, stencilFormat;
-      struct intel_framebuffer *intelfb = CALLOC_STRUCT(intel_framebuffer);
-
-      if (!intelfb)
-         return GL_FALSE;
-
-      if (visual->redBits == 5)
-         colorFormat = PIPE_FORMAT_R5G6B5_UNORM;
-      else
-         colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
-
-      if (visual->depthBits == 16)
-         depthFormat = PIPE_FORMAT_Z16_UNORM;
-      else if (visual->depthBits == 24)
-         depthFormat = PIPE_FORMAT_S8Z24_UNORM;
-      else
-         depthFormat = PIPE_FORMAT_NONE;
-
-      if (visual->stencilBits == 8)
-         stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
-      else
-         stencilFormat = PIPE_FORMAT_NONE;
-
-      intelfb->stfb = st_create_framebuffer(visual,
-                                            colorFormat,
-                                            depthFormat,
-                                            stencilFormat,
-                                            driDrawPriv->w,
-                                            driDrawPriv->h,
-                                            (void*) intelfb);
-      if (!intelfb->stfb) {
-         free(intelfb);
-         return GL_FALSE;
-      }
-
-      driDrawPriv->driverPrivate = (void *) intelfb;
-      return GL_TRUE;
-   }
-}
-
-static void
-intelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
-{
-   struct intel_framebuffer *intelfb = intel_framebuffer(driDrawPriv);
-   assert(intelfb->stfb);
-   st_unreference_framebuffer(&intelfb->stfb);
-   free(intelfb);
-}
-
-
-/**
- * Get information about previous buffer swaps.
- */
-static int
-intelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo)
-{
-   if ((dPriv == NULL) || (dPriv->driverPrivate == NULL)
-       || (sInfo == NULL)) {
-      return -1;
-   }
-
-   return 0;
-}
-
-
-static void
-intelSetTexOffset(__DRIcontext *pDRICtx, int texname,
-                 unsigned long long offset, int depth, uint pitch)
-{
-   abort();
-#if 0
-   struct intel_context *intel = (struct intel_context*)
-      ((__DRIcontextPrivate*)pDRICtx->private)->driverPrivate;
-   struct gl_texture_object *tObj = _mesa_lookup_texture(&intel->ctx, texname);
-   struct st_texture_object *stObj = st_texture_object(tObj);
-
-   if (!stObj)
-      return;
-
-   if (stObj->pt)
-      st->pipe->texture_release(intel->st->pipe, &stObj->pt);
-
-   stObj->imageOverride = GL_TRUE;
-   stObj->depthOverride = depth;
-   stObj->pitchOverride = pitch;
-
-   if (offset)
-      stObj->textureOffset = offset;
-#endif
-}
-
-
-static const struct __DriverAPIRec intelAPI = {
-   .InitDriver = intelInitDriver,
-   .DestroyScreen = intelDestroyScreen,
-   .CreateContext = intelCreateContext,
-   .DestroyContext = intelDestroyContext,
-   .CreateBuffer = intelCreateBuffer,
-   .DestroyBuffer = intelDestroyBuffer,
-   .SwapBuffers = intelSwapBuffers,
-   .MakeCurrent = intelMakeCurrent,
-   .UnbindContext = intelUnbindContext,
-   .GetSwapInfo = intelGetSwapInfo,
-   .GetMSC = driGetMSC32,
-   .WaitForMSC = driWaitForMSC32,
-   .WaitForSBC = NULL,
-   .SwapBuffersMSC = NULL,
-   .CopySubBuffer = intelCopySubBuffer,
-   .setTexOffset = intelSetTexOffset,
-};
-
-
-static __GLcontextModes *
-intelFillInModes(unsigned pixel_bits, unsigned depth_bits,
-                 unsigned stencil_bits, boolean have_back_buffer)
-{
-   __GLcontextModes *modes;
-   __GLcontextModes *m;
-   unsigned num_modes;
-   unsigned depth_buffer_factor;
-   unsigned back_buffer_factor;
-   GLenum fb_format;
-   GLenum fb_type;
-
-   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
-    * support pageflipping at all.
-    */
-   static const GLenum back_buffer_modes[] = {
-      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
-   };
-
-   uint8_t depth_bits_array[3];
-   uint8_t stencil_bits_array[3];
-   uint8_t msaa_samples_array[1];
-
-
-   depth_bits_array[0] = 0;
-   depth_bits_array[1] = depth_bits;
-   depth_bits_array[2] = depth_bits;
-   msaa_samples_array[0] = 0;
-
-   /* Just like with the accumulation buffer, always provide some modes
-    * with a stencil buffer.  It will be a sw fallback, but some apps won't
-    * care about that.
-    */
-   stencil_bits_array[0] = 0;
-   stencil_bits_array[1] = 0;
-   if (depth_bits == 24)
-      stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-   stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-   depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
-   back_buffer_factor = (have_back_buffer) ? 3 : 1;
-
-   num_modes = depth_buffer_factor * back_buffer_factor * 4;
-
-   if (pixel_bits == 16) {
-      fb_format = GL_RGB;
-      fb_type = GL_UNSIGNED_SHORT_5_6_5;
-   }
-   else {
-      fb_format = GL_BGRA;
-      fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-   }
-
-   modes =
-      (*dri_interface->createContextModes) (num_modes,
-                                            sizeof(__GLcontextModes));
-   m = modes;
-   if (!driFillInModes(&m, fb_format, fb_type,
-                       depth_bits_array, stencil_bits_array,
-                       depth_buffer_factor, back_buffer_modes,
-                       back_buffer_factor, msaa_samples_array, 1, GLX_TRUE_COLOR)) {
-      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-              __LINE__);
-      return NULL;
-   }
-   if (!driFillInModes(&m, fb_format, fb_type,
-                       depth_bits_array, stencil_bits_array,
-                       depth_buffer_factor, back_buffer_modes,
-                       back_buffer_factor, msaa_samples_array, 1, GLX_DIRECT_COLOR)) {
-      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-              __LINE__);
-      return NULL;
-   }
-
-   /* Mark the visual as slow if there are "fake" stencil bits.
-    */
-   for (m = modes; m != NULL; m = m->next) {
-      if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
-         m->visualRating = GLX_SLOW_CONFIG;
-      }
-   }
-
-   return modes;
-}
-
-
-/**
- * This is the bootstrap function for the driver.  libGL supplies all of the
- * requisite information about the system, and the driver initializes itself.
- * This routine also fills in the linked list pointed to by \c driver_modes
- * with the \c __GLcontextModes that the driver can support for windows or
- * pbuffers.
- *
- * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
- *         failure.
- */
-PUBLIC void *
-__driCreateNewScreen_20050727(__DRInativeDisplay * dpy, int scrn,
-                              __DRIscreen * psc,
-                              const __GLcontextModes * modes,
-                              const __DRIversion * ddx_version,
-                              const __DRIversion * dri_version,
-                              const __DRIversion * drm_version,
-                              const __DRIframebuffer * frame_buffer,
-                              drmAddress pSAREA, int fd,
-                              int internal_api_version,
-                              const __DRIinterfaceMethods * interface,
-                              __GLcontextModes ** driver_modes)
-{
-   __DRIscreenPrivate *psp;
-   static const __DRIversion ddx_expected = { 1, 7, 0 };
-   static const __DRIversion dri_expected = { 4, 0, 0 };
-   static const __DRIversion drm_expected = { 1, 7, 0 };
-
-   dri_interface = interface;
-
-   if (!driCheckDriDdxDrmVersions2("i915",
-                                   dri_version, &dri_expected,
-                                   ddx_version, &ddx_expected,
-                                   drm_version, &drm_expected)) {
-      return NULL;
-   }
-
-   psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
-                                  ddx_version, dri_version, drm_version,
-                                  frame_buffer, pSAREA, fd,
-                                  internal_api_version, &intelAPI);
-
-   if (psp != NULL) {
-      I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
-      *driver_modes = intelFillInModes(dri_priv->cpp * 8,
-                                       (dri_priv->cpp == 2) ? 16 : 24,
-                                       (dri_priv->cpp == 2) ? 0 : 8, 1);
-
-      /* Calling driInitExtensions here, with a NULL context pointer,
-       * does not actually enable the extensions.  It just makes sure
-       * that all the dispatch offsets for all the extensions that
-       * *might* be enables are known.  This is needed because the
-       * dispatch offsets need to be known when _mesa_context_create
-       * is called, but we can't enable the extensions until we have a
-       * context pointer.
-       *
-       * Hello chicken.  Hello egg.  How are you two today?
-       */
-      driInitExtensions(NULL, card_extensions, GL_FALSE);
-   }
-
-   return (void *) psp;
-}
-
diff --git a/src/gallium/winsys/dri/intel/intel_screen.h b/src/gallium/winsys/dri/intel/intel_screen.h
deleted file mode 100644 (file)
index e62f9e7..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef _INTEL_SCREEN_H_
-#define _INTEL_SCREEN_H_
-
-#include "dri_util.h"
-#include "i830_common.h"
-#include "xmlconfig.h"
-#include "intel_drm/ws_dri_bufpool.h"
-
-#include "pipe/p_compiler.h"
-
-#include "intel_drm/intel_be_device.h"
-
-struct intel_screen
-{
-   struct intel_be_device base;
-
-   struct {
-      drm_handle_t handle;
-
-      /* We create a static dri buffer for the frontbuffer.
-       */
-      struct _DriBufferObject *buffer;
-      struct pipe_surface *surface;
-      struct pipe_texture *texture;
-
-      char *map;                   /* memory map */
-      int offset;                  /* from start of video mem, in bytes */
-      int pitch;                   /* row stride, in bytes */
-      int width;
-      int height;
-      int size;
-      int cpp;                     /* for front and back buffers */
-   } front;
-
-   int deviceID;
-   int drmMinor;
-
-   drmI830Sarea *sarea;
-
-   /**
-   * Configuration cache with default values for all contexts
-   */
-   driOptionCache optionCache;
-
-   boolean havePools;
-
-   /**
-    * Temporary(?) context to use for SwapBuffers or other situations in
-    * which we need a rendering context, but none is currently bound.
-    */
-   struct intel_context *dummyContext;
-
-   /*
-    * New stuff form the i915tex integration
-    */
-   unsigned batch_id;
-
-
-   struct pipe_winsys *winsys;
-};
-
-
-
-/** cast wrapper */
-static INLINE struct intel_screen *
-intel_screen(__DRIscreenPrivate *sPriv)
-{
-   return (struct intel_screen *) sPriv->private;
-}
-
-
-extern void
-intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea);
-
-
-extern void intelDestroyContext(__DRIcontextPrivate * driContextPriv);
-
-extern boolean intelUnbindContext(__DRIcontextPrivate * driContextPriv);
-
-extern boolean
-intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
-                 __DRIdrawablePrivate * driDrawPriv,
-                 __DRIdrawablePrivate * driReadPriv);
-
-
-extern boolean
-intelCreatePools(__DRIscreenPrivate *sPriv);
-
-extern boolean
-intelCreateContext(const __GLcontextModes * visual,
-                   __DRIcontextPrivate * driContextPriv,
-                   void *sharedContextPrivate);
-
-
-#endif
diff --git a/src/gallium/winsys/dri/intel/intel_swapbuffers.c b/src/gallium/winsys/dri/intel/intel_swapbuffers.c
deleted file mode 100644 (file)
index f751f97..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#include "intel_screen.h"
-#include "intel_context.h"
-#include "intel_swapbuffers.h"
-
-#include "intel_reg.h"
-
-#include "pipe/p_context.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "state_tracker/st_cb_fbo.h"
-
-#include "intel_drm/ws_dri_bufmgr.h"
-#include "intel_batchbuffer.h"
-
-/**
- * Display a colorbuffer surface in an X window.
- * Used for SwapBuffers and flushing front buffer rendering.
- *
- * \param dPriv  the window/drawable to display into
- * \param surf  the surface to display
- * \param rect  optional subrect of surface to display (may be NULL).
- */
-void
-intelDisplaySurface(__DRIdrawablePrivate *dPriv,
-                    struct pipe_surface *surf,
-                    const drm_clip_rect_t *rect)
-{
-   struct intel_screen *intelScreen = intel_screen(dPriv->driScreenPriv);
-   struct intel_context *intel = intelScreen->dummyContext;
-
-   DBG(SWAP, "%s\n", __FUNCTION__);
-
-   if (!intel) {
-      /* XXX this is where some kind of extra/meta context could be useful */
-      return;
-   }
-
-   if (intel->last_swap_fence) {
-      driFenceFinish(intel->last_swap_fence, DRM_FENCE_TYPE_EXE, TRUE);
-      driFenceUnReference(&intel->last_swap_fence);
-      intel->last_swap_fence = NULL;
-   }
-   intel->last_swap_fence = intel->first_swap_fence;
-   intel->first_swap_fence = NULL;
-
-   /* The LOCK_HARDWARE is required for the cliprects.  Buffer offsets
-    * should work regardless.
-    */
-   LOCK_HARDWARE(intel);
-   /* if this drawable isn't currently bound the LOCK_HARDWARE done on the
-    * current context (which is what intelScreenContext should return) might
-    * not get a contended lock and thus cliprects not updated (tests/manywin)
-    */
-   if (intel_context(dPriv->driContextPriv) != intel)
-      DRI_VALIDATE_DRAWABLE_INFO(intel->driScreen, dPriv);
-
-
-   if (dPriv && dPriv->numClipRects) {
-      const int srcWidth = surf->width;
-      const int srcHeight = surf->height;
-      const int nbox = dPriv->numClipRects;
-      const drm_clip_rect_t *pbox = dPriv->pClipRects;
-      const int pitch = intelScreen->front.pitch / intelScreen->front.cpp;
-      const int cpp = intelScreen->front.cpp;
-      const int srcpitch = surf->stride / cpp;
-      int BR13, CMD;
-      int i;
-
-      ASSERT(surf->buffer);
-      ASSERT(surf->cpp == cpp);
-
-      DBG(SWAP, "screen pitch %d  src surface pitch %d\n",
-         pitch, surf->stride);
-
-      if (cpp == 2) {
-        BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
-        CMD = XY_SRC_COPY_BLT_CMD;
-      }
-      else {
-        BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
-        CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
-               XY_SRC_COPY_BLT_WRITE_RGB);
-      }
-
-      for (i = 0; i < nbox; i++, pbox++) {
-        drm_clip_rect_t box;
-        drm_clip_rect_t sbox;
-
-        if (pbox->x1 > pbox->x2 ||
-            pbox->y1 > pbox->y2 ||
-            pbox->x2 > intelScreen->front.width ||
-            pbox->y2 > intelScreen->front.height) {
-            /* invalid cliprect, skip it */
-           continue;
-         }
-
-        box = *pbox;
-
-        if (rect) {
-            /* intersect cliprect with user-provided src rect */
-           drm_clip_rect_t rrect;
-
-           rrect.x1 = dPriv->x + rect->x1;
-           rrect.y1 = (dPriv->h - rect->y1 - rect->y2) + dPriv->y;
-           rrect.x2 = rect->x2 + rrect.x1;
-           rrect.y2 = rect->y2 + rrect.y1;
-           if (rrect.x1 > box.x1)
-              box.x1 = rrect.x1;
-           if (rrect.y1 > box.y1)
-              box.y1 = rrect.y1;
-           if (rrect.x2 < box.x2)
-              box.x2 = rrect.x2;
-           if (rrect.y2 < box.y2)
-              box.y2 = rrect.y2;
-
-           if (box.x1 > box.x2 || box.y1 > box.y2)
-              continue;
-        }
-
-        /* restrict blit to size of actually rendered area */
-        if (box.x2 - box.x1 > srcWidth)
-           box.x2 = srcWidth + box.x1;
-        if (box.y2 - box.y1 > srcHeight)
-           box.y2 = srcHeight + box.y1;
-
-        DBG(SWAP, "box x1 x2 y1 y2 %d %d %d %d\n",
-            box.x1, box.x2, box.y1, box.y2);
-
-        sbox.x1 = box.x1 - dPriv->x;
-        sbox.y1 = box.y1 - dPriv->y;
-
-         assert(box.x1 < box.x2);
-         assert(box.y1 < box.y2);
-
-         /* XXX this could be done with pipe->surface_copy() */
-        /* XXX should have its own batch buffer */
-        if (!BEGIN_BATCH(8, 2)) {
-           /*
-            * Since we share this batch buffer with a context
-            * we can't flush it since that risks a GPU lockup
-            */
-           assert(0);
-           continue;
-        }
-
-        OUT_BATCH(CMD);
-        OUT_BATCH(BR13);
-        OUT_BATCH((box.y1 << 16) | box.x1);
-        OUT_BATCH((box.y2 << 16) | box.x2);
-
-        OUT_RELOC(intelScreen->front.buffer,
-                  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
-                  DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
-        OUT_BATCH((sbox.y1 << 16) | sbox.x1);
-        OUT_BATCH((srcpitch * cpp) & 0xffff);
-        OUT_RELOC(dri_bo(surf->buffer),
-                   DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-                  DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
-
-      }
-
-      if (intel->first_swap_fence)
-        driFenceUnReference(&intel->first_swap_fence);
-      intel->first_swap_fence = intel_be_batchbuffer_flush(intel->base.batch);
-   }
-
-   UNLOCK_HARDWARE(intel);
-
-   if (intel->lastStamp != dPriv->lastStamp) {
-      intelUpdateWindowSize(dPriv);
-      intel->lastStamp = dPriv->lastStamp;
-   }
-}
-
-
-
-/**
- * This will be called whenever the currently bound window is moved/resized.
- */
-void
-intelUpdateWindowSize(__DRIdrawablePrivate *dPriv)
-{
-   struct intel_framebuffer *intelfb = intel_framebuffer(dPriv);
-   assert(intelfb->stfb);
-   st_resize_framebuffer(intelfb->stfb, dPriv->w, dPriv->h);
-}
-
-
-
-void
-intelSwapBuffers(__DRIdrawablePrivate * dPriv)
-{
-   struct intel_framebuffer *intel_fb = intel_framebuffer(dPriv);
-   struct pipe_surface *back_surf;
-
-   assert(intel_fb);
-   assert(intel_fb->stfb);
-
-   back_surf = st_get_framebuffer_surface(intel_fb->stfb,
-                                          ST_SURFACE_BACK_LEFT);
-   if (back_surf) {
-      st_notify_swapbuffers(intel_fb->stfb);
-      intelDisplaySurface(dPriv, back_surf, NULL);
-      st_notify_swapbuffers_complete(intel_fb->stfb);
-   }
-}
-
-
-/**
- * Called via glXCopySubBufferMESA() to copy a subrect of the back
- * buffer to the front buffer/screen.
- */
-void
-intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
-{
-   struct intel_framebuffer *intel_fb = intel_framebuffer(dPriv);
-   struct pipe_surface *back_surf;
-
-   assert(intel_fb);
-   assert(intel_fb->stfb);
-
-   back_surf = st_get_framebuffer_surface(intel_fb->stfb,
-                                          ST_SURFACE_BACK_LEFT);
-   if (back_surf) {
-      drm_clip_rect_t rect;
-      rect.x1 = x;
-      rect.y1 = y;
-      rect.x2 = w;
-      rect.y2 = h;
-
-      st_notify_swapbuffers(intel_fb->stfb);
-      intelDisplaySurface(dPriv, back_surf, &rect);
-   }
-}
diff --git a/src/gallium/winsys/dri/intel/intel_swapbuffers.h b/src/gallium/winsys/dri/intel/intel_swapbuffers.h
deleted file mode 100644 (file)
index 46c9bab..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef INTEL_SWAPBUFFERS_H
-#define INTEL_SWAPBUFFERS_H
-
-
-struct pipe_surface;
-
-
-extern void intelDisplaySurface(__DRIdrawablePrivate * dPriv,
-                                struct pipe_surface *surf,
-                                const drm_clip_rect_t * rect);
-
-extern void intelSwapBuffers(__DRIdrawablePrivate * dPriv);
-
-extern void intelCopySubBuffer(__DRIdrawablePrivate * dPriv,
-                               int x, int y, int w, int h);
-
-extern void intelUpdateWindowSize(__DRIdrawablePrivate *dPriv);
-
-
-#endif /* INTEL_SWAPBUFFERS_H */
diff --git a/src/gallium/winsys/dri/intel/intel_winsys_softpipe.c b/src/gallium/winsys/dri/intel/intel_winsys_softpipe.c
deleted file mode 100644 (file)
index 0d98d16..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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
- * THE COPYRIGHT HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
- */
-
-#include "intel_context.h"
-#include "intel_winsys_softpipe.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_util.h"
-#include "pipe/p_format.h"
-#include "softpipe/sp_winsys.h"
-
-
-struct intel_softpipe_winsys {
-   struct softpipe_winsys sws;
-   struct intel_context *intel;
-};
-
-/**
- * Return list of surface formats supported by this driver.
- */
-static boolean
-intel_is_format_supported(struct softpipe_winsys *sws,
-                          enum pipe_format format)
-{
-   switch(format) {
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-   case PIPE_FORMAT_R5G6B5_UNORM:
-   case PIPE_FORMAT_S8Z24_UNORM:
-      return TRUE;
-   default:
-      return FALSE;
-   }
-}
-
-
-/**
- * Create rendering context which uses software rendering.
- */
-struct pipe_context *
-intel_create_softpipe( struct intel_context *intel,
-                       struct pipe_winsys *winsys )
-{
-   struct intel_softpipe_winsys *isws = CALLOC_STRUCT( intel_softpipe_winsys );
-   struct pipe_screen *screen = softpipe_create_screen(winsys);
-
-   /* Fill in this struct with callbacks that softpipe will need to
-    * communicate with the window system, buffer manager, etc.
-    */
-   isws->sws.is_format_supported = intel_is_format_supported;
-   isws->intel = intel;
-
-   /* Create the softpipe context:
-    */
-   return softpipe_create( screen, winsys, &isws->sws );
-}
diff --git a/src/gallium/winsys/dri/intel/intel_winsys_softpipe.h b/src/gallium/winsys/dri/intel/intel_winsys_softpipe.h
deleted file mode 100644 (file)
index 5fa14cb..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef INTEL_SOFTPIPE_H
-#define INTEL_SOFTPIPE_H
-
-struct pipe_winsys;
-struct pipe_context;
-struct intel_context;
-
-struct pipe_context *
-intel_create_softpipe( struct intel_context *intel,
-                       struct pipe_winsys *winsys );
-
-#endif
diff --git a/src/gallium/winsys/dri/intel/server/i830_common.h b/src/gallium/winsys/dri/intel/server/i830_common.h
deleted file mode 100644 (file)
index 3452ddb..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/**************************************************************************
-
-Copyright 2001 VA Linux Systems Inc., Fremont, California.
-Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
-
-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
-on 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
-ATI, VA LINUX SYSTEMS AND/OR THEIR 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.
-
-**************************************************************************/
-
-
-#ifndef _I830_COMMON_H_
-#define _I830_COMMON_H_
-
-
-#define I830_NR_TEX_REGIONS 255        /* maximum due to use of chars for next/prev */
-#define I830_LOG_MIN_TEX_REGION_SIZE 14
-
-
-/* Driver specific DRM command indices
- * NOTE: these are not OS specific, but they are driver specific
- */
-#define DRM_I830_INIT                     0x00
-#define DRM_I830_FLUSH                    0x01
-#define DRM_I830_FLIP                     0x02
-#define DRM_I830_BATCHBUFFER              0x03
-#define DRM_I830_IRQ_EMIT                 0x04
-#define DRM_I830_IRQ_WAIT                 0x05
-#define DRM_I830_GETPARAM                 0x06
-#define DRM_I830_SETPARAM                 0x07
-#define DRM_I830_ALLOC                    0x08
-#define DRM_I830_FREE                     0x09
-#define DRM_I830_INIT_HEAP                0x0a
-#define DRM_I830_CMDBUFFER                0x0b
-#define DRM_I830_DESTROY_HEAP             0x0c
-#define DRM_I830_SET_VBLANK_PIPE          0x0d
-#define DRM_I830_GET_VBLANK_PIPE          0x0e
-#define DRM_I830_MMIO                    0x10
-
-typedef struct {
-   enum {
-      I830_INIT_DMA = 0x01,
-      I830_CLEANUP_DMA = 0x02,
-      I830_RESUME_DMA = 0x03
-   } func;
-   unsigned int mmio_offset;
-   int sarea_priv_offset;
-   unsigned int ring_start;
-   unsigned int ring_end;
-   unsigned int ring_size;
-   unsigned int front_offset;
-   unsigned int back_offset;
-   unsigned int depth_offset;
-   unsigned int w;
-   unsigned int h;
-   unsigned int pitch;
-   unsigned int pitch_bits;
-   unsigned int back_pitch;
-   unsigned int depth_pitch;
-   unsigned int cpp;
-   unsigned int chipset;
-} drmI830Init;
-
-typedef struct {
-       drmTextureRegion texList[I830_NR_TEX_REGIONS+1];
-        int last_upload;       /* last time texture was uploaded */
-        int last_enqueue;      /* last time a buffer was enqueued */
-       int last_dispatch;      /* age of the most recently dispatched buffer */
-       int ctxOwner;           /* last context to upload state */
-       /** Last context that used the buffer manager. */
-       int texAge;
-        int pf_enabled;                /* is pageflipping allowed? */
-        int pf_active;
-        int pf_current_page;   /* which buffer is being displayed? */
-        int perf_boxes;                /* performance boxes to be displayed */
-       int width, height;      /* screen size in pixels */
-
-       drm_handle_t front_handle;
-       int front_offset;
-       int front_size;
-
-       drm_handle_t back_handle;
-       int back_offset;
-       int back_size;
-
-       drm_handle_t depth_handle;
-       int depth_offset;
-       int depth_size;
-
-       drm_handle_t tex_handle;
-       int tex_offset;
-       int tex_size;
-       int log_tex_granularity;
-       int pitch;
-       int rotation;           /* 0, 90, 180 or 270 */
-       int rotated_offset;
-       int rotated_size;
-       int rotated_pitch;
-       int virtualX, virtualY;
-
-       unsigned int front_tiled;
-       unsigned int back_tiled;
-       unsigned int depth_tiled;
-       unsigned int rotated_tiled;
-       unsigned int rotated2_tiled;
-
-       int planeA_x;
-       int planeA_y;
-       int planeA_w;
-       int planeA_h;
-       int planeB_x;
-       int planeB_y;
-       int planeB_w;
-       int planeB_h;
-
-       /* Triple buffering */
-       drm_handle_t third_handle;
-       int third_offset;
-       int third_size;
-       unsigned int third_tiled;
-
-       /* buffer object handles for the static buffers.  May change
-        * over the lifetime of the client, though it doesn't in our current
-        * implementation.
-        */
-       unsigned int front_bo_handle;
-       unsigned int back_bo_handle;
-       unsigned int third_bo_handle;
-       unsigned int depth_bo_handle;
-} drmI830Sarea;
-
-/* Flags for perf_boxes
- */
-#define I830_BOX_RING_EMPTY    0x1 /* populated by kernel */
-#define I830_BOX_FLIP          0x2 /* populated by kernel */
-#define I830_BOX_WAIT          0x4 /* populated by kernel & client */
-#define I830_BOX_TEXTURE_LOAD  0x8 /* populated by kernel */
-#define I830_BOX_LOST_CONTEXT  0x10 /* populated by client */
-
-
-typedef struct {
-       int start;              /* agp offset */
-       int used;               /* nr bytes in use */
-       int DR1;                /* hw flags for GFX_OP_DRAWRECT_INFO */
-        int DR4;               /* window origin for GFX_OP_DRAWRECT_INFO*/
-       int num_cliprects;      /* mulitpass with multiple cliprects? */
-        drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
-} drmI830BatchBuffer;
-
-typedef struct {
-       char *buf;              /* agp offset */
-       int sz;                 /* nr bytes in use */
-       int DR1;                /* hw flags for GFX_OP_DRAWRECT_INFO */
-        int DR4;               /* window origin for GFX_OP_DRAWRECT_INFO*/
-       int num_cliprects;      /* mulitpass with multiple cliprects? */
-        drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
-} drmI830CmdBuffer;
-
-typedef struct {
-       int *irq_seq;
-} drmI830IrqEmit;
-
-typedef struct {
-       int irq_seq;
-} drmI830IrqWait;
-
-typedef struct {
-       int param;
-       int *value;
-} drmI830GetParam;
-
-#define I830_PARAM_IRQ_ACTIVE     1
-#define I830_PARAM_ALLOW_BATCHBUFFER   2
-
-typedef struct {
-       int param;
-       int value;
-} drmI830SetParam;
-
-#define I830_SETPARAM_USE_MI_BATCHBUFFER_START  1
-#define I830_SETPARAM_TEX_LRU_LOG_GRANULARITY   2
-#define I830_SETPARAM_ALLOW_BATCHBUFFER         3
-
-
-/* A memory manager for regions of shared memory:
- */
-#define I830_MEM_REGION_AGP 1
-
-typedef struct {
-       int region;
-       int alignment;
-       int size;
-       int *region_offset;     /* offset from start of fb or agp */
-} drmI830MemAlloc;
-
-typedef struct {
-       int region;
-       int region_offset;
-} drmI830MemFree;
-
-typedef struct {
-       int region;
-       int size;
-       int start;      
-} drmI830MemInitHeap;
-
-typedef struct {
-       int region;
-} drmI830MemDestroyHeap;
-
-#define DRM_I830_VBLANK_PIPE_A  1
-#define DRM_I830_VBLANK_PIPE_B  2
-
-typedef struct {
-        int pipe;
-} drmI830VBlankPipe;
-
-#define MMIO_READ  0
-#define MMIO_WRITE 1
-
-#define MMIO_REGS_IA_PRIMATIVES_COUNT           0
-#define MMIO_REGS_IA_VERTICES_COUNT             1
-#define MMIO_REGS_VS_INVOCATION_COUNT           2
-#define MMIO_REGS_GS_PRIMITIVES_COUNT           3
-#define MMIO_REGS_GS_INVOCATION_COUNT           4
-#define MMIO_REGS_CL_PRIMITIVES_COUNT           5
-#define MMIO_REGS_CL_INVOCATION_COUNT           6
-#define MMIO_REGS_PS_INVOCATION_COUNT           7
-#define MMIO_REGS_PS_DEPTH_COUNT                8
-
-typedef struct {
-        unsigned int read_write:1;
-        unsigned int reg:31;
-        void __user *data;
-} drmI830MMIO;
-
-#endif /* _I830_DRM_H_ */
diff --git a/src/gallium/winsys/dri/intel/server/i830_dri.h b/src/gallium/winsys/dri/intel/server/i830_dri.h
deleted file mode 100644 (file)
index 0d514b6..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-
-#ifndef _I830_DRI_H
-#define _I830_DRI_H
-
-#include "xf86drm.h"
-#include "i830_common.h"
-
-#define I830_MAX_DRAWABLES 256
-
-#define I830_MAJOR_VERSION 1
-#define I830_MINOR_VERSION 7
-#define I830_PATCHLEVEL 2
-
-#define I830_REG_SIZE 0x80000
-
-typedef struct _I830DRIRec {
-   drm_handle_t regs;
-   drmSize regsSize;
-
-   drmSize unused1; /* backbufferSize */
-   drm_handle_t unused2; /* backbuffer */
-
-   drmSize unused3; /* depthbufferSize */
-   drm_handle_t unused4; /* depthbuffer */
-
-   drmSize unused5; /* rotatedSize */
-   drm_handle_t unused6; /* rotatedbuffer */
-
-   drm_handle_t unused7; /* textures */
-   int unused8; /* textureSize */
-
-   drm_handle_t unused9; /* agp_buffers */
-   drmSize unused10; /* agp_buf_size */
-
-   int deviceID;
-   int width;
-   int height;
-   int mem;
-   int cpp;
-   int bitsPerPixel;
-
-   int unused11[8]; /* was front/back/depth/rotated offset/pitch */
-
-   int unused12; /* logTextureGranularity */
-   int unused13; /* textureOffset */
-
-   int irq;
-   int sarea_priv_offset;
-} I830DRIRec, *I830DRIPtr;
-
-typedef struct {
-   /* Nothing here yet */
-   int dummy;
-} I830ConfigPrivRec, *I830ConfigPrivPtr;
-
-typedef struct {
-   /* Nothing here yet */
-   int dummy;
-} I830DRIContextRec, *I830DRIContextPtr;
-
-
-#endif
diff --git a/src/gallium/winsys/drm/Makefile b/src/gallium/winsys/drm/Makefile
new file mode 100644 (file)
index 0000000..f466ce6
--- /dev/null
@@ -0,0 +1,38 @@
+# src/mesa/drivers/dri/Makefile
+
+TOP = ../../../..
+
+include $(TOP)/configs/current
+
+
+
+default: $(TOP)/$(LIB_DIR) subdirs
+
+
+$(TOP)/$(LIB_DIR):
+       -mkdir $(TOP)/$(LIB_DIR)
+
+
+subdirs:
+       @for dir in $(DRI_DIRS) ; do \
+               if [ -d $$dir ] ; then \
+                       (cd $$dir && $(MAKE)) || exit 1 ; \
+               fi \
+       done
+
+
+install:
+       @for dir in $(DRI_DIRS) ; do \
+               if [ -d $$dir ] ; then \
+                       (cd $$dir && $(MAKE) install) || exit 1 ; \
+               fi \
+       done
+
+
+clean:
+       @for dir in $(DRI_DIRS) ; do \
+               if [ -d $$dir ] ; then \
+                       (cd $$dir && $(MAKE) clean) ; \
+               fi \
+       done
+       -rm -f common/*.o
diff --git a/src/gallium/winsys/drm/Makefile.template b/src/gallium/winsys/drm/Makefile.template
new file mode 100644 (file)
index 0000000..80e817b
--- /dev/null
@@ -0,0 +1,125 @@
+# -*-makefile-*-
+
+MESA_MODULES = \
+       $(TOP)/src/mesa/libmesa.a \
+       $(GALLIUM_AUXILIARIES)
+       
+COMMON_GALLIUM_SOURCES = \
+        $(TOP)/src/mesa/drivers/dri/common/utils.c \
+        $(TOP)/src/mesa/drivers/dri/common/vblank.c \
+        $(TOP)/src/mesa/drivers/dri/common/dri_util.c \
+        $(TOP)/src/mesa/drivers/dri/common/xmlconfig.c
+
+COMMON_SOURCES = $(COMMON_GALLIUM_SOURCES) \
+        $(TOP)/src/mesa/drivers/common/driverfuncs.c \
+        $(TOP)/src/mesa/drivers/dri/common/texmem.c \
+        $(TOP)/src/mesa/drivers/dri/common/drirenderbuffer.c
+
+COMMON_BM_SOURCES = \
+       $(TOP)/src/mesa/drivers/dri/common/dri_bufmgr.c \
+       $(TOP)/src/mesa/drivers/dri/common/dri_drmpool.c
+
+
+ifeq ($(WINDOW_SYSTEM),dri)
+WINOBJ=
+WINLIB=
+INCLUDES = $(SHARED_INCLUDES) $(EXPAT_INCLUDES)
+
+OBJECTS = \
+       $(C_SOURCES:.c=.o) \
+       $(ASM_SOURCES:.S=.o) 
+
+else
+# miniglx
+WINOBJ=
+WINLIB=-L$(MESA)/src/glx/mini
+MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini
+INCLUDES = $(MINIGLX_INCLUDES) \
+          $(SHARED_INCLUDES) \
+          $(PCIACCESS_CFLAGS)
+
+OBJECTS = $(C_SOURCES:.c=.o) \
+         $(MINIGLX_SOURCES:.c=.o) \
+         $(ASM_SOURCES:.S=.o) 
+endif
+
+
+### Include directories
+SHARED_INCLUDES = \
+       -I. \
+       -I$(TOP)/src/mesa/drivers/dri/common \
+       -Iserver \
+       -I$(TOP)/include \
+       -I$(TOP)/include/GL/internal \
+       -I$(TOP)/src/gallium/include \
+       -I$(TOP)/src/gallium/auxiliary \
+       -I$(TOP)/src/gallium/drivers \
+       -I$(TOP)/src/gallium/winsys/common \
+       -I$(TOP)/src/mesa \
+       -I$(TOP)/src/mesa/main \
+       -I$(TOP)/src/mesa/glapi \
+       -I$(TOP)/src/mesa/math \
+       -I$(TOP)/src/mesa/transform \
+       -I$(TOP)/src/mesa/shader \
+       -I$(TOP)/src/mesa/swrast \
+       -I$(TOP)/src/mesa/swrast_setup \
+       -I$(TOP)/src/egl/main \
+       -I$(TOP)/src/egl/drivers/dri \
+       $(LIBDRM_CFLAGS)
+
+
+##### RULES #####
+
+.c.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@
+
+.S.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES)  $< -o $@
+
+
+##### TARGETS #####
+
+default: depend symlinks $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME) $(LIBNAME_EGL) $(TOP)/$(LIB_DIR)/$(LIBNAME_EGL)
+
+
+$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template
+       $(TOP)/bin/mklib -noprefix -o $@ \
+               $(OBJECTS) $(PIPE_DRIVERS) $(MESA_MODULES)  $(WINOBJ) $(DRI_LIB_DEPS)
+
+$(LIBNAME_EGL): $(WINSYS_OBJECTS) $(LIBS)
+       $(TOP)/bin/mklib -o $(LIBNAME_EGL) \
+               -linker "$(CC)" \
+               -noprefix \
+               $(OBJECTS) $(MKLIB_OPTIONS) $(WINSYS_OBJECTS) $(PIPE_DRIVERS) $(WINOBJ) $(DRI_LIB_DEPS) \
+               --whole-archive $(LIBS) $(GALLIUM_AUXILIARIES) --no-whole-archive
+
+$(TOP)/$(LIB_DIR)/$(LIBNAME): $(LIBNAME)
+       $(INSTALL) $(LIBNAME) $(TOP)/$(LIB_DIR) 
+
+$(TOP)/$(LIB_DIR)/$(LIBNAME_EGL): $(LIBNAME_EGL)
+       $(INSTALL) $(LIBNAME_EGL) $(TOP)/$(LIB_DIR) 
+
+depend: $(C_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
+       rm -f depend
+       touch depend
+       $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) \
+               $(ASM_SOURCES) 2> /dev/null
+
+
+# Emacs tags
+tags:
+       etags `find . -name \*.[ch]` `find ../include`
+
+
+# Remove .o and backup files
+clean:
+       -rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
+       -rm -f depend depend.bak
+
+
+install: $(LIBNAME)
+       $(INSTALL) -d $(DRI_DRIVER_INSTALL_DIR)
+       $(INSTALL) -m 755 $(LIBNAME) $(DRI_DRIVER_INSTALL_DIR)
+
+
+include depend
diff --git a/src/gallium/winsys/drm/SConscript b/src/gallium/winsys/drm/SConscript
new file mode 100644 (file)
index 0000000..aef5210
--- /dev/null
@@ -0,0 +1,54 @@
+Import('*')
+
+if env['dri']:
+
+       drienv = env.Clone()
+
+       drienv.Replace(CPPPATH = [
+               '#src/mesa/drivers/dri/common',
+               '#include',
+               '#include/GL/internal',
+               '#src/gallium/include',
+               '#src/gallium/auxiliary',
+               '#src/gallium/drivers',
+               '#src/mesa',
+               '#src/mesa/main',
+               '#src/mesa/glapi',
+               '#src/mesa/math',
+               '#src/mesa/transform',
+               '#src/mesa/shader',
+               '#src/mesa/swrast',
+               '#src/mesa/swrast_setup',
+               '#src/egl/main',
+               '#src/egl/drivers/dri',
+       ])
+
+       drienv.ParseConfig('pkg-config --cflags --libs libdrm')
+
+       COMMON_GALLIUM_SOURCES = [
+               '#src/mesa/drivers/dri/common/utils.c',
+               '#src/mesa/drivers/dri/common/vblank.c',
+               '#src/mesa/drivers/dri/common/dri_util.c',
+               '#src/mesa/drivers/dri/common/xmlconfig.c',
+       ]
+
+       COMMON_BM_SOURCES = [
+               '#src/mesa/drivers/dri/common/dri_bufmgr.c',
+               '#src/mesa/drivers/dri/common/dri_drmpool.c',
+       ]
+
+       Export([
+               'drienv',
+               'COMMON_GALLIUM_SOURCES',
+               'COMMON_BM_SOURCES',
+       ])
+
+       # TODO: Installation
+       #install: $(LIBNAME)
+       #       $(INSTALL) -d $(DRI_DRIVER_INSTALL_DIR)
+       #       $(INSTALL) -m 755 $(LIBNAME) $(DRI_DRIVER_INSTALL_DIR)
+
+       if 'intel' in env['winsys']:
+               SConscript([
+                       'intel/SConscript',
+               ])
diff --git a/src/gallium/winsys/drm/intel/Makefile b/src/gallium/winsys/drm/intel/Makefile
new file mode 100644 (file)
index 0000000..a670ac0
--- /dev/null
@@ -0,0 +1,25 @@
+TOP = ../../../../..
+include $(TOP)/configs/current
+
+
+SUBDIRS = common dri egl
+
+
+default: subdirs
+
+
+subdirs:
+       @for dir in $(SUBDIRS) ; do \
+               if [ -d $$dir ] ; then \
+                       (cd $$dir && $(MAKE)) || exit 1 ; \
+               fi \
+       done
+
+
+clean:
+       rm -f `find . -name \*.[oa]`
+       rm -f `find . -name depend`
+
+
+# Dummy install target
+install:
diff --git a/src/gallium/winsys/drm/intel/common/Makefile b/src/gallium/winsys/drm/intel/common/Makefile
new file mode 100644 (file)
index 0000000..bf1a7d6
--- /dev/null
@@ -0,0 +1,23 @@
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = inteldrm
+
+C_SOURCES = \
+       intel_be_batchbuffer.c \
+       intel_be_context.c \
+       intel_be_device.c \
+       ws_dri_bufmgr.c \
+       ws_dri_drmpool.c \
+       ws_dri_fencemgr.c \
+       ws_dri_mallocpool.c \
+       ws_dri_slabpool.c
+
+
+include ./Makefile.template
+
+DRIVER_DEFINES = $(shell pkg-config libdrm --cflags \
+                && pkg-config libdrm --atleast-version=2.3.1 \
+                && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
+symlinks:
+
diff --git a/src/gallium/winsys/drm/intel/common/Makefile.template b/src/gallium/winsys/drm/intel/common/Makefile.template
new file mode 100644 (file)
index 0000000..02ed363
--- /dev/null
@@ -0,0 +1,64 @@
+# -*-makefile-*-
+
+
+# We still have a dependency on the "dri" buffer manager.  Most likely
+# the interface can be reused in non-dri environments, and also as a
+# frontend to simpler memory managers.
+#
+COMMON_SOURCES = 
+
+OBJECTS = $(C_SOURCES:.c=.o) \
+          $(CPP_SOURCES:.cpp=.o) \
+         $(ASM_SOURCES:.S=.o) 
+
+
+### Include directories
+INCLUDES = \
+       -I. \
+       -I$(TOP)/src/gallium/include \
+       -I$(TOP)/src/gallium/auxiliary \
+       -I$(TOP)/src/gallium/drivers \
+       -I$(TOP)/include \
+        $(DRIVER_INCLUDES)
+
+
+##### RULES #####
+
+.c.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@
+
+.cpp.o:
+       $(CXX) -c $(INCLUDES) $(CXXFLAGS) $(DRIVER_DEFINES) $< -o $@
+
+.S.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES)  $< -o $@
+
+
+##### TARGETS #####
+
+default: depend symlinks $(LIBNAME)
+
+
+$(LIBNAME): $(OBJECTS) Makefile Makefile.template
+       $(TOP)/bin/mklib -o $@ -static $(OBJECTS) $(DRIVER_LIBS)
+
+
+depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
+       rm -f depend
+       touch depend
+       $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) $(CPP_SOURCES) \
+               $(ASM_SOURCES) 2> /dev/null
+
+
+# Emacs tags
+tags:
+       etags `find . -name \*.[ch]` `find ../include`
+
+
+# Remove .o and backup files
+clean::
+       -rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
+       -rm -f depend depend.bak
+
+
+include depend
diff --git a/src/gallium/winsys/drm/intel/common/glthread.h b/src/gallium/winsys/drm/intel/common/glthread.h
new file mode 100644 (file)
index 0000000..b8e9d5f
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5.2
+ *
+ * Copyright (C) 1999-2006  Brian Paul   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, sublicense,
+ * 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 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 NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL 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.
+ */
+
+
+/*
+ * Thread support for gl dispatch.
+ *
+ * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
+ *                and Christoph Poliwoda (poliwoda@volumegraphics.com)
+ * Revised by Keith Whitwell
+ * Adapted for new gl dispatcher by Brian Paul
+ *
+ *
+ *
+ * DOCUMENTATION
+ *
+ * This thread module exports the following types:
+ *   _glthread_TSD     Thread-specific data area
+ *   _glthread_Thread  Thread datatype
+ *   _glthread_Mutex   Mutual exclusion lock
+ *
+ * Macros:
+ *   _glthread_DECLARE_STATIC_MUTEX(name)   Declare a non-local mutex
+ *   _glthread_INIT_MUTEX(name)             Initialize a mutex
+ *   _glthread_LOCK_MUTEX(name)             Lock a mutex
+ *   _glthread_UNLOCK_MUTEX(name)           Unlock a mutex
+ *
+ * Functions:
+ *   _glthread_GetID(v)      Get integer thread ID
+ *   _glthread_InitTSD()     Initialize thread-specific data
+ *   _glthread_GetTSD()      Get thread-specific data
+ *   _glthread_SetTSD()      Set thread-specific data
+ *
+ */
+
+/*
+ * If this file is accidentally included by a non-threaded build,
+ * it should not cause the build to fail, or otherwise cause problems.
+ * In general, it should only be included when needed however.
+ */
+
+#ifndef GLTHREAD_H
+#define GLTHREAD_H
+
+
+#if defined(USE_MGL_NAMESPACE)
+#define _glapi_Dispatch _mglapi_Dispatch
+#endif
+
+
+
+#if (defined(PTHREADS) || defined(SOLARIS_THREADS) ||\
+     defined(WIN32_THREADS) || defined(USE_XTHREADS) || defined(BEOS_THREADS)) \
+    && !defined(THREADS)
+# define THREADS
+#endif
+
+#ifdef VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+/*
+ * POSIX threads. This should be your choice in the Unix world
+ * whenever possible.  When building with POSIX threads, be sure
+ * to enable any compiler flags which will cause the MT-safe
+ * libc (if one exists) to be used when linking, as well as any
+ * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
+ * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
+ * proper compiling for MT-safe libc etc.
+ */
+#if defined(PTHREADS)
+#include <pthread.h> /* POSIX threads headers */
+
+typedef struct {
+   pthread_key_t  key;
+   int initMagic;
+} _glthread_TSD;
+
+typedef pthread_t _glthread_Thread;
+
+typedef pthread_mutex_t _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name) \
+   static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
+
+#define _glthread_INIT_MUTEX(name) \
+   pthread_mutex_init(&(name), NULL)
+
+#define _glthread_DESTROY_MUTEX(name) \
+   pthread_mutex_destroy(&(name))
+
+#define _glthread_LOCK_MUTEX(name) \
+   (void) pthread_mutex_lock(&(name))
+
+#define _glthread_UNLOCK_MUTEX(name) \
+   (void) pthread_mutex_unlock(&(name))
+
+typedef pthread_cond_t _glthread_Cond;
+
+#define _glthread_DECLARE_STATIC_COND(name) \
+   static _glthread_Cond name = PTHREAD_COND_INITIALIZER
+
+#define _glthread_INIT_COND(cond)                      \
+   pthread_cond_init(&(cond), NULL)
+
+#define _glthread_DESTROY_COND(name) \
+   pthread_cond_destroy(&(name))
+
+#define _glthread_COND_WAIT(cond, mutex) \
+  pthread_cond_wait(&(cond), &(mutex))
+
+#define _glthread_COND_SIGNAL(cond) \
+  pthread_cond_signal(&(cond))
+
+#define _glthread_COND_BROADCAST(cond) \
+  pthread_cond_broadcast(&(cond))
+
+
+#else /* PTHREADS */
+
+typedef unsigned int _glthread_Cond;
+#define _glthread_DECLARE_STATIC_COND(name) \
+//  #warning Condition variables not implemented.
+
+#define _glthread_INIT_COND(cond)          \
+  abort();
+
+#define _glthread_DESTROY_COND(name) \
+  abort();
+
+#define _glthread_COND_WAIT(cond, mutex) \
+  abort();
+
+#define _glthread_COND_SIGNAL(cond) \
+  abort();
+
+#define _glthread_COND_BROADCAST(cond) \
+  abort();
+
+#endif
+
+
+/*
+ * Solaris threads. Use only up to Solaris 2.4.
+ * Solaris 2.5 and higher provide POSIX threads.
+ * Be sure to compile with -mt on the Solaris compilers, or
+ * use -D_REENTRANT if using gcc.
+ */
+#ifdef SOLARIS_THREADS
+#include <thread.h>
+
+typedef struct {
+   thread_key_t key;
+   mutex_t      keylock;
+   int          initMagic;
+} _glthread_TSD;
+
+typedef thread_t _glthread_Thread;
+
+typedef mutex_t _glthread_Mutex;
+
+/* XXX need to really implement mutex-related macros */
+#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
+#define _glthread_INIT_MUTEX(name)  (void) name
+#define _glthread_DESTROY_MUTEX(name) (void) name
+#define _glthread_LOCK_MUTEX(name)  (void) name
+#define _glthread_UNLOCK_MUTEX(name)  (void) name
+
+#endif /* SOLARIS_THREADS */
+
+
+
+
+/*
+ * Windows threads. Should work with Windows NT and 95.
+ * IMPORTANT: Link with multithreaded runtime library when THREADS are
+ * used!
+ */
+#ifdef WIN32_THREADS
+#include <windows.h>
+
+typedef struct {
+   DWORD key;
+   int   initMagic;
+} _glthread_TSD;
+
+typedef HANDLE _glthread_Thread;
+
+typedef CRITICAL_SECTION _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name)  /*static*/ _glthread_Mutex name = {0,0,0,0,0,0}
+#define _glthread_INIT_MUTEX(name)  InitializeCriticalSection(&name)
+#define _glthread_DESTROY_MUTEX(name)  DeleteCriticalSection(&name)
+#define _glthread_LOCK_MUTEX(name)  EnterCriticalSection(&name)
+#define _glthread_UNLOCK_MUTEX(name)  LeaveCriticalSection(&name)
+
+#endif /* WIN32_THREADS */
+
+
+
+
+/*
+ * XFree86 has its own thread wrapper, Xthreads.h
+ * We wrap it again for GL.
+ */
+#ifdef USE_XTHREADS
+#include <X11/Xthreads.h>
+
+typedef struct {
+   xthread_key_t key;
+   int initMagic;
+} _glthread_TSD;
+
+typedef xthread_t _glthread_Thread;
+
+typedef xmutex_rec _glthread_Mutex;
+
+#ifdef XMUTEX_INITIALIZER
+#define _glthread_DECLARE_STATIC_MUTEX(name) \
+   static _glthread_Mutex name = XMUTEX_INITIALIZER
+#else
+#define _glthread_DECLARE_STATIC_MUTEX(name) \
+   static _glthread_Mutex name
+#endif
+
+#define _glthread_INIT_MUTEX(name) \
+   xmutex_init(&(name))
+
+#define _glthread_DESTROY_MUTEX(name) \
+   xmutex_clear(&(name))
+
+#define _glthread_LOCK_MUTEX(name) \
+   (void) xmutex_lock(&(name))
+
+#define _glthread_UNLOCK_MUTEX(name) \
+   (void) xmutex_unlock(&(name))
+
+#endif /* USE_XTHREADS */
+
+
+
+/*
+ * BeOS threads. R5.x required.
+ */
+#ifdef BEOS_THREADS
+
+#include <kernel/OS.h>
+#include <support/TLS.h>
+
+typedef struct {
+   int32        key;
+   int          initMagic;
+} _glthread_TSD;
+
+typedef thread_id _glthread_Thread;
+
+/* Use Benaphore, aka speeder semaphore */
+typedef struct {
+    int32   lock;
+    sem_id  sem;
+} benaphore;
+typedef benaphore _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = { 0, 0 }
+#define _glthread_INIT_MUTEX(name)     name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
+#define _glthread_DESTROY_MUTEX(name)  delete_sem(name.sem), name.lock = 0
+#define _glthread_LOCK_MUTEX(name)     if (name.sem == 0) _glthread_INIT_MUTEX(name); \
+                                                                               if (atomic_add(&(name.lock), 1) >= 1) acquire_sem(name.sem)
+#define _glthread_UNLOCK_MUTEX(name)   if (atomic_add(&(name.lock), -1) > 1) release_sem(name.sem)
+
+#endif /* BEOS_THREADS */
+
+
+
+#ifndef THREADS
+
+/*
+ * THREADS not defined
+ */
+
+typedef GLuint _glthread_TSD;
+
+typedef GLuint _glthread_Thread;
+
+typedef GLuint _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
+
+#define _glthread_INIT_MUTEX(name)  (void) name
+
+#define _glthread_DESTROY_MUTEX(name)  (void) name
+
+#define _glthread_LOCK_MUTEX(name)  (void) name
+
+#define _glthread_UNLOCK_MUTEX(name)  (void) name
+
+#endif /* THREADS */
+
+
+
+/*
+ * Platform independent thread specific data API.
+ */
+
+extern unsigned long
+_glthread_GetID(void);
+
+
+extern void
+_glthread_InitTSD(_glthread_TSD *);
+
+
+extern void *
+_glthread_GetTSD(_glthread_TSD *);
+
+
+extern void
+_glthread_SetTSD(_glthread_TSD *, void *);
+
+#if defined(GLX_USE_TLS)
+
+extern __thread struct _glapi_table * _glapi_tls_Dispatch
+    __attribute__((tls_model("initial-exec")));
+
+#define GET_DISPATCH() _glapi_tls_Dispatch
+
+#elif !defined(GL_CALL)
+# if defined(THREADS)
+#  define GET_DISPATCH() \
+   ((__builtin_expect( _glapi_Dispatch != NULL, 1 )) \
+       ? _glapi_Dispatch : _glapi_get_dispatch())
+# else
+#  define GET_DISPATCH() _glapi_Dispatch
+# endif /* defined(THREADS) */
+#endif  /* ndef GL_CALL */
+
+
+#endif /* THREADS_H */
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.c b/src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.c
new file mode 100644 (file)
index 0000000..bc13a57
--- /dev/null
@@ -0,0 +1,429 @@
+
+#include "intel_be_batchbuffer.h"
+#include "intel_be_context.h"
+#include "intel_be_device.h"
+#include <errno.h>
+
+#include "xf86drm.h"
+
+static void
+intel_realloc_relocs(struct intel_be_batchbuffer *batch, int num_relocs)
+{
+    unsigned long size = num_relocs * I915_RELOC0_STRIDE + I915_RELOC_HEADER;
+
+    size *= sizeof(uint32_t);
+    batch->reloc = realloc(batch->reloc, size);
+    batch->reloc_size = num_relocs;
+}
+
+
+void
+intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch)
+{
+   /*
+    * Get a new, free batchbuffer.
+    */
+    drmBO *bo;
+    struct drm_bo_info_req *req;
+
+   driBOUnrefUserList(batch->list);
+   driBOResetList(batch->list);
+
+   /* base.size is the size available to the i915simple driver */
+   batch->base.size = batch->device->max_batch_size - BATCH_RESERVED;
+   batch->base.actual_size = batch->device->max_batch_size;
+   driBOData(batch->buffer, batch->base.actual_size, NULL, NULL, 0);
+
+   /*
+    * Add the batchbuffer to the validate list.
+    */
+
+   driBOAddListItem(batch->list, batch->buffer,
+                   DRM_BO_FLAG_EXE | DRM_BO_FLAG_MEM_TT,
+                   DRM_BO_FLAG_EXE | DRM_BO_MASK_MEM,
+                   &batch->dest_location, &batch->node);
+
+   req = &batch->node->bo_arg.d.req.bo_req;
+
+   /*
+    * Set up information needed for us to make relocations
+    * relative to the underlying drm buffer objects.
+    */
+
+   driReadLockKernelBO();
+   bo = driBOKernel(batch->buffer);
+   req->presumed_offset = (uint64_t) bo->offset;
+   req->hint = DRM_BO_HINT_PRESUMED_OFFSET;
+   batch->drmBOVirtual = (uint8_t *) bo->virtual;
+   driReadUnlockKernelBO();
+
+   /*
+    * Adjust the relocation buffer size.
+    */
+
+   if (batch->reloc_size > INTEL_MAX_RELOCS ||
+       batch->reloc == NULL)
+     intel_realloc_relocs(batch, INTEL_DEFAULT_RELOCS);
+
+   assert(batch->reloc != NULL);
+   batch->reloc[0] = 0; /* No relocs yet. */
+   batch->reloc[1] = 1; /* Reloc type 1 */
+   batch->reloc[2] = 0; /* Only a single relocation list. */
+   batch->reloc[3] = 0; /* Only a single relocation list. */
+
+   batch->base.map = driBOMap(batch->buffer, DRM_BO_FLAG_WRITE, 0);
+   batch->poolOffset = driBOPoolOffset(batch->buffer);
+   batch->base.ptr = batch->base.map;
+   batch->dirty_state = ~0;
+   batch->nr_relocs = 0;
+   batch->flags = 0;
+   batch->id = 0;//batch->intel->intelScreen->batch_id++;
+}
+
+/*======================================================================
+ * Public functions
+ */
+struct intel_be_batchbuffer *
+intel_be_batchbuffer_alloc(struct intel_be_context *intel)
+{
+   struct intel_be_batchbuffer *batch = calloc(sizeof(*batch), 1);
+
+   batch->intel = intel;
+   batch->device = intel->device;
+
+   driGenBuffers(intel->device->batchPool, "batchbuffer", 1,
+                 &batch->buffer, 4096,
+                 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_EXE, 0);
+   batch->last_fence = NULL;
+   batch->list = driBOCreateList(20);
+   batch->reloc = NULL;
+   intel_be_batchbuffer_reset(batch);
+   return batch;
+}
+
+void
+intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch)
+{
+   if (batch->last_fence) {
+      driFenceFinish(batch->last_fence,
+                    DRM_FENCE_TYPE_EXE, FALSE);
+      driFenceUnReference(&batch->last_fence);
+   }
+   if (batch->base.map) {
+      driBOUnmap(batch->buffer);
+      batch->base.map = NULL;
+   }
+   driBOUnReference(batch->buffer);
+   driBOFreeList(batch->list);
+   if (batch->reloc)
+       free(batch->reloc);
+   batch->buffer = NULL;
+   free(batch);
+}
+
+void
+intel_be_offset_relocation(struct intel_be_batchbuffer *batch,
+                       unsigned pre_add,
+                       struct _DriBufferObject *driBO,
+                       uint64_t val_flags,
+                       uint64_t val_mask)
+{
+    int itemLoc;
+    struct _drmBONode *node;
+    uint32_t *reloc;
+    struct drm_bo_info_req *req;
+
+    driBOAddListItem(batch->list, driBO, val_flags, val_mask,
+                    &itemLoc, &node);
+    req = &node->bo_arg.d.req.bo_req;
+
+    if (!(req->hint &  DRM_BO_HINT_PRESUMED_OFFSET)) {
+
+       /*
+        * Stop other threads from tampering with the underlying
+        * drmBO while we're reading its offset.
+        */
+
+       driReadLockKernelBO();
+       req->presumed_offset = (uint64_t) driBOKernel(driBO)->offset;
+       driReadUnlockKernelBO();
+       req->hint = DRM_BO_HINT_PRESUMED_OFFSET;
+    }
+
+    pre_add += driBOPoolOffset(driBO);
+
+    if (batch->nr_relocs == batch->reloc_size)
+       intel_realloc_relocs(batch, batch->reloc_size * 2);
+
+    reloc = batch->reloc +
+       (I915_RELOC_HEADER + batch->nr_relocs * I915_RELOC0_STRIDE);
+
+    reloc[0] = ((uint8_t *)batch->base.ptr - batch->drmBOVirtual);
+    i915_batchbuffer_dword(&batch->base, req->presumed_offset + pre_add);
+    reloc[1] = pre_add;
+    reloc[2] = itemLoc;
+    reloc[3] = batch->dest_location;
+    batch->nr_relocs++;
+}
+
+static void
+i915_drm_copy_reply(const struct drm_bo_info_rep * rep, drmBO * buf)
+{
+    buf->handle = rep->handle;
+    buf->flags = rep->flags;
+    buf->size = rep->size;
+    buf->offset = rep->offset;
+    buf->mapHandle = rep->arg_handle;
+    buf->proposedFlags = rep->proposed_flags;
+    buf->start = rep->buffer_start;
+    buf->fenceFlags = rep->fence_flags;
+    buf->replyFlags = rep->rep_flags;
+    buf->pageAlignment = rep->page_alignment;
+}
+
+static int
+i915_execbuf(struct intel_be_batchbuffer *batch,
+            unsigned int used,
+            boolean ignore_cliprects,
+            drmBOList *list,
+            struct drm_i915_execbuffer *ea)
+{
+// struct intel_be_context *intel = batch->intel;
+   drmBONode *node;
+   drmMMListHead *l;
+   struct drm_i915_op_arg *arg, *first;
+   struct drm_bo_op_req *req;
+   struct drm_bo_info_rep *rep;
+   uint64_t *prevNext = NULL;
+   drmBO *buf;
+   int ret = 0;
+   uint32_t count = 0;
+
+   first = NULL;
+   for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+
+      arg = &node->bo_arg;
+      req = &arg->d.req;
+
+      if (!first)
+        first = arg;
+
+      if (prevNext)
+        *prevNext = (unsigned long)arg;
+
+      prevNext = &arg->next;
+      req->bo_req.handle = node->buf->handle;
+      req->op = drm_bo_validate;
+      req->bo_req.flags = node->arg0;
+      req->bo_req.mask = node->arg1;
+      req->bo_req.hint |= 0;
+      count++;
+   }
+
+   memset(ea, 0, sizeof(*ea));
+   ea->num_buffers = count;
+   ea->batch.start = batch->poolOffset;
+   ea->batch.used = used;
+#if 0 /* ZZZ JB: no cliprects used */
+   ea->batch.cliprects = intel->pClipRects;
+   ea->batch.num_cliprects = ignore_cliprects ? 0 : intel->numClipRects;
+   ea->batch.DR1 = 0;
+   ea->batch.DR4 = 0;((((GLuint) intel->drawX) & 0xffff) |
+                  (((GLuint) intel->drawY) << 16));
+#else
+   ea->batch.cliprects = NULL;
+   ea->batch.num_cliprects = 0;
+   ea->batch.DR1 = 0;
+   ea->batch.DR4 = 0;
+#endif
+   ea->fence_arg.flags = DRM_I915_FENCE_FLAG_FLUSHED;
+   ea->ops_list = (unsigned long) first;
+   first->reloc_ptr = (unsigned long) batch->reloc;
+   batch->reloc[0] = batch->nr_relocs;
+
+   //return -EFAULT;
+   do {
+      ret = drmCommandWriteRead(batch->device->fd, DRM_I915_EXECBUFFER, ea,
+                               sizeof(*ea));
+   } while (ret == -EAGAIN);
+
+   if (ret != 0)
+      return ret;
+
+   for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+      arg = &node->bo_arg;
+      rep = &arg->d.rep.bo_info;
+
+      if (!arg->handled) {
+        return -EFAULT;
+      }
+      if (arg->d.rep.ret)
+        return arg->d.rep.ret;
+
+      buf = node->buf;
+      i915_drm_copy_reply(rep, buf);
+   }
+   return 0;
+}
+
+/* TODO: Push this whole function into bufmgr.
+ */
+static struct _DriFenceObject *
+do_flush_locked(struct intel_be_batchbuffer *batch,
+                unsigned int used,
+                boolean ignore_cliprects, boolean allow_unlock)
+{
+   struct intel_be_context *intel = batch->intel;
+   struct _DriFenceObject *fo;
+   drmFence fence;
+   drmBOList *boList;
+   struct drm_i915_execbuffer ea;
+   int ret = 0;
+
+   driBOValidateUserList(batch->list);
+   boList = driGetdrmBOList(batch->list);
+
+#if 0 /* ZZZ JB Allways run */
+   if (!(intel->numClipRects == 0 && !ignore_cliprects)) {
+#else
+   if (1) {
+#endif
+      ret = i915_execbuf(batch, used, ignore_cliprects, boList, &ea);
+   } else {
+     driPutdrmBOList(batch->list);
+     fo = NULL;
+     goto out;
+   }
+   driPutdrmBOList(batch->list);
+   if (ret)
+      abort();
+
+   if (ea.fence_arg.error != 0) {
+
+     /*
+      * The hardware has been idled by the kernel.
+      * Don't fence the driBOs.
+      */
+
+       if (batch->last_fence)
+          driFenceUnReference(&batch->last_fence);
+#if 0 /* ZZZ JB: no _mesa_* funcs in gallium */
+       _mesa_printf("fence error\n");
+#endif
+       batch->last_fence = NULL;
+       fo = NULL;
+       goto out;
+   }
+
+   fence.handle = ea.fence_arg.handle;
+   fence.fence_class = ea.fence_arg.fence_class;
+   fence.type = ea.fence_arg.type;
+   fence.flags = ea.fence_arg.flags;
+   fence.signaled = ea.fence_arg.signaled;
+
+   fo = driBOFenceUserList(batch->device->fenceMgr, batch->list,
+                          "SuperFence", &fence);
+
+   if (driFenceType(fo) & DRM_I915_FENCE_TYPE_RW) {
+       if (batch->last_fence)
+          driFenceUnReference(&batch->last_fence);
+   /*
+       * FIXME: Context last fence??
+       */
+       batch->last_fence = fo;
+       driFenceReference(fo);
+   }
+ out:
+#if 0 /* ZZZ JB: fix this */
+   intel->vtbl.lost_hardware(intel);
+#else
+   (void)intel;
+#endif
+   return fo;
+}
+
+
+struct _DriFenceObject *
+intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch)
+{
+   struct intel_be_context *intel = batch->intel;
+   unsigned int used = batch->base.ptr - batch->base.map;
+   boolean was_locked = batch->intel->hardware_locked(intel);
+   struct _DriFenceObject *fence;
+
+   if (used == 0) {
+      driFenceReference(batch->last_fence);
+      return batch->last_fence;
+   }
+
+   /* Add the MI_BATCH_BUFFER_END.  Always add an MI_FLUSH - this is a
+    * performance drain that we would like to avoid.
+    */
+#if 0 /* ZZZ JB: what should we do here? */
+   if (used & 4) {
+      ((int *) batch->base.ptr)[0] = intel->vtbl.flush_cmd();
+      ((int *) batch->base.ptr)[1] = 0;
+      ((int *) batch->base.ptr)[2] = MI_BATCH_BUFFER_END;
+      used += 12;
+   }
+   else {
+      ((int *) batch->base.ptr)[0] = intel->vtbl.flush_cmd();
+      ((int *) batch->base.ptr)[1] = MI_BATCH_BUFFER_END;
+      used += 8;
+   }
+#else
+   if (used & 4) {
+      ((int *) batch->base.ptr)[0] = ((0<<29)|(4<<23)); // MI_FLUSH;
+      ((int *) batch->base.ptr)[1] = 0;
+      ((int *) batch->base.ptr)[2] = (0xA<<23); // MI_BATCH_BUFFER_END;
+      used += 12;
+   }
+   else {
+      ((int *) batch->base.ptr)[0] = ((0<<29)|(4<<23)); // MI_FLUSH;
+      ((int *) batch->base.ptr)[1] = (0xA<<23); // MI_BATCH_BUFFER_END;
+      used += 8;
+   }
+#endif
+   driBOUnmap(batch->buffer);
+   batch->base.ptr = NULL;
+   batch->base.map = NULL;
+
+   /* TODO: Just pass the relocation list and dma buffer up to the
+    * kernel.
+    */
+   if (!was_locked)
+      intel->hardware_lock(intel);
+
+   fence = do_flush_locked(batch, used, !(batch->flags & INTEL_BATCH_CLIPRECTS),
+                          FALSE);
+
+   if (!was_locked)
+      intel->hardware_unlock(intel);
+
+   /* Reset the buffer:
+    */
+   intel_be_batchbuffer_reset(batch);
+   return fence;
+}
+
+void
+intel_be_batchbuffer_finish(struct intel_be_batchbuffer *batch)
+{
+   struct _DriFenceObject *fence = intel_be_batchbuffer_flush(batch);
+   driFenceFinish(fence, driFenceType(fence), FALSE);
+   driFenceUnReference(&fence);
+}
+
+#if 0
+void
+intel_be_batchbuffer_data(struct intel_be_batchbuffer *batch,
+                       const void *data, unsigned int bytes, unsigned int flags)
+{
+   assert((bytes & 3) == 0);
+   intel_batchbuffer_require_space(batch, bytes, flags);
+   memcpy(batch->base.ptr, data, bytes);
+   batch->base.ptr += bytes;
+}
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.h b/src/gallium/winsys/drm/intel/common/intel_be_batchbuffer.h
new file mode 100644 (file)
index 0000000..f150e3a
--- /dev/null
@@ -0,0 +1,69 @@
+
+#ifndef INTEL_BE_BATCHBUFFER_H
+#define INTEL_BE_BATCHBUFFER_H
+
+#include "i915simple/i915_batch.h"
+
+#include "ws_dri_bufmgr.h"
+
+#define BATCH_RESERVED 16
+
+#define INTEL_DEFAULT_RELOCS 100
+#define INTEL_MAX_RELOCS 400
+
+#define INTEL_BATCH_NO_CLIPRECTS 0x1
+#define INTEL_BATCH_CLIPRECTS    0x2
+
+struct intel_be_context;
+struct intel_be_device;
+
+struct intel_be_batchbuffer
+{
+       struct i915_batchbuffer base;
+
+       struct intel_be_context *intel;
+       struct intel_be_device *device;
+
+       struct _DriBufferObject *buffer;
+       struct _DriFenceObject *last_fence;
+       uint32_t flags;
+
+       struct _DriBufferList *list;
+       size_t list_count;
+
+       uint32_t *reloc;
+       size_t reloc_size;
+       size_t nr_relocs;
+
+       uint32_t dirty_state;
+       uint32_t id;
+
+       uint32_t poolOffset;
+       uint8_t *drmBOVirtual;
+       struct _drmBONode *node; /* Validation list node for this buffer */
+       int dest_location;     /* Validation list sequence for this buffer */
+};
+
+struct intel_be_batchbuffer *
+intel_be_batchbuffer_alloc(struct intel_be_context *intel);
+
+void
+intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch);
+
+void
+intel_be_batchbuffer_finish(struct intel_be_batchbuffer *batch);
+
+struct _DriFenceObject *
+intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch);
+
+void
+intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch);
+
+void
+intel_be_offset_relocation(struct intel_be_batchbuffer *batch,
+                       unsigned pre_add,
+                       struct _DriBufferObject *driBO,
+                       uint64_t val_flags,
+                       uint64_t val_mask);
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_context.c b/src/gallium/winsys/drm/intel/common/intel_be_context.c
new file mode 100644 (file)
index 0000000..1af3967
--- /dev/null
@@ -0,0 +1,107 @@
+
+/*
+ * Authors: Jakob Bornecrantz <jakob-at-tungstengraphics.com>
+ */
+
+#include "ws_dri_fencemgr.h"
+#include "intel_be_device.h"
+#include "intel_be_context.h"
+#include "intel_be_batchbuffer.h"
+
+static INLINE struct intel_be_context *
+intel_be_context(struct i915_winsys *sws)
+{
+       return (struct intel_be_context *)sws;
+}
+
+/* Simple batchbuffer interface:
+ */
+
+static struct i915_batchbuffer*
+intel_i915_batch_get(struct i915_winsys *sws)
+{
+       struct intel_be_context *intel = intel_be_context(sws);
+       return &intel->batch->base;
+}
+
+static void intel_i915_batch_reloc(struct i915_winsys *sws,
+                                  struct pipe_buffer *buf,
+                                  unsigned access_flags,
+                                  unsigned delta)
+{
+       struct intel_be_context *intel = intel_be_context(sws);
+
+       unsigned flags = DRM_BO_FLAG_MEM_TT;
+       unsigned mask = DRM_BO_MASK_MEM;
+
+       if (access_flags & I915_BUFFER_ACCESS_WRITE) {
+               flags |= DRM_BO_FLAG_WRITE;
+               mask |= DRM_BO_FLAG_WRITE;
+       }
+
+       if (access_flags & I915_BUFFER_ACCESS_READ) {
+               flags |= DRM_BO_FLAG_READ;
+               mask |= DRM_BO_FLAG_READ;
+       }
+
+       intel_be_offset_relocation(intel->batch,
+                               delta,
+                               dri_bo(buf),
+                               flags,
+                               mask);
+}
+
+static void intel_i915_batch_flush(struct i915_winsys *sws,
+                                  struct pipe_fence_handle **fence)
+{
+       struct intel_be_context *intel = intel_be_context(sws);
+
+       union {
+               struct _DriFenceObject *dri;
+               struct pipe_fence_handle *pipe;
+       } fu;
+
+       if (fence)
+               assert(!*fence);
+
+       fu.dri = intel_be_batchbuffer_flush(intel->batch);
+
+       if (!fu.dri) {
+               assert(0);
+               *fence = NULL;
+               return;
+       }
+
+       if (fu.dri) {
+               if (fence)
+                       *fence = fu.pipe;
+               else
+                       driFenceUnReference(&fu.dri);
+       }
+
+}
+
+boolean
+intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device)
+{
+       assert(intel);
+       assert(device);
+
+       intel->device = device;
+
+       /* TODO move framebuffer createion to the driver */
+
+       intel->base.batch_get = intel_i915_batch_get;
+       intel->base.batch_reloc = intel_i915_batch_reloc;
+       intel->base.batch_flush = intel_i915_batch_flush;
+
+       intel->batch = intel_be_batchbuffer_alloc(intel);
+
+       return true;
+}
+
+void
+intel_be_destroy_context(struct intel_be_context *intel)
+{
+       intel_be_batchbuffer_free(intel->batch);
+}
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_context.h b/src/gallium/winsys/drm/intel/common/intel_be_context.h
new file mode 100644 (file)
index 0000000..d5cbc93
--- /dev/null
@@ -0,0 +1,40 @@
+/* These need to be diffrent from the intel winsys */
+#ifndef INTEL_BE_CONTEXT_H
+#define INTEL_BE_CONTEXT_H
+
+#include "i915simple/i915_winsys.h"
+
+struct intel_be_context
+{
+       /** Interface to i915simple driver */
+       struct i915_winsys base;
+
+       struct intel_be_device *device;
+       struct intel_be_batchbuffer *batch;
+
+       /*
+     * Hardware lock functions.
+     *
+     * Needs to be filled in by the winsys.
+     */
+       void (*hardware_lock)(struct intel_be_context *context);
+       void (*hardware_unlock)(struct intel_be_context *context);
+       boolean (*hardware_locked)(struct intel_be_context *context);
+};
+
+/**
+ * Intialize a allocated intel_be_context struct.
+ *
+ * Remember to set the hardware_* functions.
+ */
+boolean
+intel_be_init_context(struct intel_be_context *intel,
+                     struct intel_be_device *device);
+
+/**
+ * Destroy a intel_be_context.
+ * Does not free the struct that is up to the winsys.
+ */
+void
+intel_be_destroy_context(struct intel_be_context *intel);
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_device.c b/src/gallium/winsys/drm/intel/common/intel_be_device.c
new file mode 100644 (file)
index 0000000..8db0329
--- /dev/null
@@ -0,0 +1,308 @@
+
+
+/*
+ * Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
+ *                      Jakob Bornecrantz <jakob-at-tungstengraphics-dot-com>
+ */
+
+#include "intel_be_device.h"
+#include "ws_dri_bufmgr.h"
+#include "ws_dri_bufpool.h"
+#include "ws_dri_fencemgr.h"
+
+#include "pipe/p_winsys.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_state.h"
+#include "pipe/p_util.h"
+#include "pipe/p_inlines.h"
+
+#include "i915simple/i915_screen.h"
+
+/* Turn a pipe winsys into an intel/pipe winsys:
+ */
+static INLINE struct intel_be_device *
+intel_be_device( struct pipe_winsys *winsys )
+{
+       return (struct intel_be_device *)winsys;
+}
+
+
+/*
+ * Buffer functions.
+ *
+ * Most callbacks map direcly onto dri_bufmgr operations:
+ */
+
+static void *intel_be_buffer_map(struct pipe_winsys *winsys,
+                                       struct pipe_buffer *buf,
+                                       unsigned flags )
+{
+       unsigned drm_flags = 0;
+       
+       if (flags & PIPE_BUFFER_USAGE_CPU_WRITE)
+               drm_flags |= DRM_BO_FLAG_WRITE;
+
+       if (flags & PIPE_BUFFER_USAGE_CPU_READ)
+               drm_flags |= DRM_BO_FLAG_READ;
+
+       return driBOMap( dri_bo(buf), drm_flags, 0 );
+}
+
+static void intel_be_buffer_unmap(struct pipe_winsys *winsys,
+                                        struct pipe_buffer *buf)
+{
+       driBOUnmap( dri_bo(buf) );
+}
+
+static void
+intel_be_buffer_destroy(struct pipe_winsys *winsys,
+                         struct pipe_buffer *buf)
+{
+       driBOUnReference( dri_bo(buf) );
+       FREE(buf);
+}
+
+static struct pipe_buffer *
+intel_be_buffer_create(struct pipe_winsys *winsys,
+                                                 unsigned alignment,
+                                                 unsigned usage,
+                                                 unsigned size )
+{
+       struct intel_be_buffer *buffer = CALLOC_STRUCT( intel_be_buffer );
+       struct intel_be_device *iws = intel_be_device(winsys);
+       unsigned flags = 0;
+       struct _DriBufferPool *pool;
+
+       buffer->base.refcount = 1;
+       buffer->base.alignment = alignment;
+       buffer->base.usage = usage;
+       buffer->base.size = size;
+
+       if (usage & (PIPE_BUFFER_USAGE_VERTEX | PIPE_BUFFER_USAGE_CONSTANT)) {
+               flags |= DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED;
+               pool = iws->mallocPool;
+       } else if (usage & PIPE_BUFFER_USAGE_CUSTOM) {
+               /* For vertex buffers */
+               flags |= DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_TT;
+               pool = iws->vertexPool;
+       } else {
+               flags |= DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_TT;
+               pool = iws->regionPool;
+       }
+
+       if (usage & PIPE_BUFFER_USAGE_GPU_READ)
+               flags |= DRM_BO_FLAG_READ;
+
+       if (usage & PIPE_BUFFER_USAGE_GPU_WRITE)
+               flags |= DRM_BO_FLAG_WRITE;
+
+       /* drm complains if we don't set any read/write flags.
+        */
+       if ((flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE)) == 0)
+               flags |= DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE;
+
+       buffer->pool = pool;
+       driGenBuffers( buffer->pool,
+               "pipe buffer", 1, &buffer->driBO, alignment, flags, 0 );
+
+       driBOData( buffer->driBO, size, NULL, buffer->pool, 0 );
+
+       return &buffer->base;
+}
+
+
+static struct pipe_buffer *
+intel_be_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned bytes)
+{
+       struct intel_be_buffer *buffer = CALLOC_STRUCT( intel_be_buffer );
+       struct intel_be_device *iws = intel_be_device(winsys);
+
+       driGenUserBuffer( iws->regionPool,
+                         "pipe user buffer", &buffer->driBO, ptr, bytes );
+
+       buffer->base.refcount = 1;
+
+       return &buffer->base;
+}
+
+struct pipe_buffer *
+intel_be_buffer_from_handle(struct intel_be_device *device,
+                            const char* name, unsigned handle)
+{
+       struct intel_be_buffer *be_buf = malloc(sizeof(*be_buf));
+       struct pipe_buffer *buffer;
+
+       if (!be_buf)
+               goto err;
+
+       memset(be_buf, 0, sizeof(*be_buf));
+
+       driGenBuffers(device->staticPool, name, 1, &be_buf->driBO, 0, 0, 0);
+    driBOSetReferenced(be_buf->driBO, handle);
+
+       if (0) /** XXX TODO check error */
+               goto err_bo;
+       
+       buffer = &be_buf->base;
+       buffer->refcount = 1;
+       buffer->alignment = 0;
+       buffer->usage = 0;
+       buffer->size = driBOSize(be_buf->driBO);
+
+       return buffer;
+err_bo:
+       free(be_buf);
+err:
+       return NULL;
+}
+
+
+/*
+ * Surface functions.
+ *
+ * Deprecated!
+ */
+
+static struct pipe_surface *
+intel_i915_surface_alloc(struct pipe_winsys *winsys)
+{
+       assert((size_t)"intel_i915_surface_alloc is deprecated" & 0);
+       return NULL;
+}
+
+static int
+intel_i915_surface_alloc_storage(struct pipe_winsys *winsys,
+                                struct pipe_surface *surf,
+                                unsigned width, unsigned height,
+                                enum pipe_format format,
+                                unsigned flags,
+                                unsigned tex_usage)
+{
+       assert((size_t)"intel_i915_surface_alloc_storage is deprecated" & 0);
+       return -1;
+}
+
+static void
+intel_i915_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
+{
+       assert((size_t)"intel_i915_surface_release is deprecated" & 0);
+}
+
+
+/*
+ * Fence functions
+ */
+
+static void
+intel_be_fence_reference( struct pipe_winsys *sws,
+                      struct pipe_fence_handle **ptr,
+                      struct pipe_fence_handle *fence )
+{
+       if (*ptr)
+               driFenceUnReference((struct _DriFenceObject **)ptr);
+
+       if (fence)
+               *ptr = (struct pipe_fence_handle *)driFenceReference((struct _DriFenceObject *)fence);
+}
+
+static int
+intel_be_fence_signalled( struct pipe_winsys *sws,
+                      struct pipe_fence_handle *fence,
+                      unsigned flag )
+{
+       return driFenceSignaled((struct _DriFenceObject *)fence, flag);
+}
+
+static int
+intel_be_fence_finish( struct pipe_winsys *sws,
+                   struct pipe_fence_handle *fence,
+                   unsigned flag )
+{
+       return driFenceFinish((struct _DriFenceObject *)fence, flag, 0);
+}
+
+
+/*
+ * Misc functions
+ */
+
+boolean
+intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
+{
+       dev->fd = fd;
+       dev->max_batch_size = 16 * 4096;
+       dev->max_vertex_size = 128 * 4096;
+
+       dev->base.buffer_create = intel_be_buffer_create;
+       dev->base.user_buffer_create = intel_be_user_buffer_create;
+       dev->base.buffer_map = intel_be_buffer_map;
+       dev->base.buffer_unmap = intel_be_buffer_unmap;
+       dev->base.buffer_destroy = intel_be_buffer_destroy;
+       dev->base.surface_alloc = intel_i915_surface_alloc;
+       dev->base.surface_alloc_storage = intel_i915_surface_alloc_storage;
+       dev->base.surface_release = intel_i915_surface_release;
+       dev->base.fence_reference = intel_be_fence_reference;
+       dev->base.fence_signalled = intel_be_fence_signalled;
+       dev->base.fence_finish = intel_be_fence_finish;
+
+#if 0 /* Set by the winsys */
+       dev->base.flush_frontbuffer = intel_flush_frontbuffer;
+       dev->base.get_name = intel_get_name;
+#endif
+
+       dev->fMan = driInitFreeSlabManager(10, 10);
+       dev->fenceMgr = driFenceMgrTTMInit(dev->fd);
+
+       dev->mallocPool = driMallocPoolInit();
+       dev->staticPool = driDRMPoolInit(dev->fd);
+       /* Sizes: 64 128 256 512 1024 2048 4096 8192 16384 32768 */
+       dev->regionPool = driSlabPoolInit(dev->fd,
+                                         DRM_BO_FLAG_READ |
+                                         DRM_BO_FLAG_WRITE |
+                                         DRM_BO_FLAG_MEM_TT,
+                                         DRM_BO_FLAG_READ |
+                                         DRM_BO_FLAG_WRITE |
+                                         DRM_BO_FLAG_MEM_TT,
+                                         64,
+                                         10, 120, 4096 * 64, 0,
+                                         dev->fMan);
+
+       dev->vertexPool = driSlabPoolInit(dev->fd,
+                                         DRM_BO_FLAG_READ |
+                                         DRM_BO_FLAG_WRITE |
+                                         DRM_BO_FLAG_MEM_TT,
+                                         DRM_BO_FLAG_READ |
+                                         DRM_BO_FLAG_WRITE |
+                                         DRM_BO_FLAG_MEM_TT,
+                                         dev->max_vertex_size,
+                                         1, 120, dev->max_vertex_size * 4, 0,
+                                         dev->fMan);
+
+       dev->batchPool = driSlabPoolInit(dev->fd,
+                                        DRM_BO_FLAG_EXE |
+                                        DRM_BO_FLAG_MEM_TT,
+                                        DRM_BO_FLAG_EXE |
+                                        DRM_BO_FLAG_MEM_TT,
+                                        dev->max_batch_size,
+                                        1, 40, dev->max_batch_size * 16, 0,
+                                        dev->fMan);
+
+       /* Fill in this struct with callbacks that i915simple will need to
+        * communicate with the window system, buffer manager, etc.
+        */
+       dev->screen = i915_create_screen(&dev->base, id);
+
+       return true;
+}
+
+void
+intel_be_destroy_device(struct intel_be_device *dev)
+{
+       driPoolTakeDown(dev->mallocPool);
+       driPoolTakeDown(dev->staticPool);
+       driPoolTakeDown(dev->regionPool);
+       driPoolTakeDown(dev->vertexPool);
+       driPoolTakeDown(dev->batchPool);
+
+       /** TODO takedown fenceMgr and fMan */
+}
diff --git a/src/gallium/winsys/drm/intel/common/intel_be_device.h b/src/gallium/winsys/drm/intel/common/intel_be_device.h
new file mode 100644 (file)
index 0000000..3f8b3f5
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef INTEL_DRM_DEVICE_H
+#define INTEL_DRM_DEVICE_H
+
+#include "pipe/p_winsys.h"
+#include "pipe/p_context.h"
+
+/*
+ * Device
+ */
+
+struct intel_be_device
+{
+       struct pipe_winsys base;
+
+       /**
+        * Hw level screen
+        */
+       struct pipe_screen *screen;
+
+       int fd; /**< Drm file discriptor */
+
+       size_t max_batch_size;
+       size_t max_vertex_size;
+
+       struct _DriFenceMgr *fenceMgr;
+
+       struct _DriBufferPool *batchPool;
+       struct _DriBufferPool *regionPool;
+       struct _DriBufferPool *mallocPool;
+       struct _DriBufferPool *vertexPool;
+       struct _DriBufferPool *staticPool;
+       struct _DriFreeSlabManager *fMan;
+};
+
+boolean
+intel_be_init_device(struct intel_be_device *device, int fd, unsigned id);
+
+void
+intel_be_destroy_device(struct intel_be_device *dev);
+
+/*
+ * Buffer
+ */
+
+struct intel_be_buffer {
+       struct pipe_buffer base;
+       struct _DriBufferPool *pool;
+       struct _DriBufferObject *driBO;
+};
+
+/**
+ * Create a be buffer from a drm bo handle
+ *
+ * Takes a reference
+ */
+struct pipe_buffer *
+intel_be_buffer_from_handle(struct intel_be_device *device,
+                            const char* name, unsigned handle);
+
+static INLINE struct intel_be_buffer *
+intel_be_buffer(struct pipe_buffer *buf)
+{
+       return (struct intel_be_buffer *)buf;
+}
+
+static INLINE struct _DriBufferObject *
+dri_bo(struct pipe_buffer *buf)
+{
+       return intel_be_buffer(buf)->driBO;
+}
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.c b/src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.c
new file mode 100644 (file)
index 0000000..b6d901f
--- /dev/null
@@ -0,0 +1,949 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
+ */
+
+#include <xf86drm.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "glthread.h"
+#include "errno.h"
+#include "ws_dri_bufmgr.h"
+#include "string.h"
+#include "pipe/p_debug.h"
+#include "ws_dri_bufpool.h"
+#include "ws_dri_fencemgr.h"
+
+
+/*
+ * This lock is here to protect drmBO structs changing underneath us during a
+ * validate list call, since validatelist cannot take individiual locks for
+ * each drmBO. Validatelist takes this lock in write mode. Any access to an
+ * individual drmBO should take this lock in read mode, since in that case, the
+ * driBufferObject mutex will protect the access. Locking order is
+ * driBufferObject mutex - > this rw lock.
+ */
+
+_glthread_DECLARE_STATIC_MUTEX(bmMutex);
+_glthread_DECLARE_STATIC_COND(bmCond);
+
+static int kernelReaders = 0;
+static int num_buffers = 0;
+static int num_user_buffers = 0;
+
+static drmBO *drmBOListBuf(void *iterator)
+{
+    drmBONode *node;
+    drmMMListHead *l = (drmMMListHead *) iterator;
+    node = DRMLISTENTRY(drmBONode, l, head);
+    return node->buf;
+}
+
+static void *drmBOListIterator(drmBOList *list)
+{
+    void *ret = list->list.next;
+
+    if (ret == &list->list)
+       return NULL;
+    return ret;
+}
+
+static void *drmBOListNext(drmBOList *list, void *iterator)
+{
+    void *ret;
+
+    drmMMListHead *l = (drmMMListHead *) iterator;
+    ret = l->next;
+    if (ret == &list->list)
+       return NULL;
+    return ret;
+}
+
+static drmBONode *drmAddListItem(drmBOList *list, drmBO *item,
+                                uint64_t arg0,
+                                uint64_t arg1)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+
+    l = list->free.next;
+    if (l == &list->free) {
+       node = (drmBONode *) malloc(sizeof(*node));
+       if (!node) {
+           return NULL;
+       }
+       list->numCurrent++;
+    }
+    else {
+       DRMLISTDEL(l);
+       node = DRMLISTENTRY(drmBONode, l, head);
+    }
+    node->buf = item;
+    node->arg0 = arg0;
+    node->arg1 = arg1;
+    DRMLISTADD(&node->head, &list->list);
+    list->numOnList++;
+    return node;
+}
+
+static int drmAddValidateItem(drmBOList *list, drmBO *buf, uint64_t flags,
+                             uint64_t mask, int *newItem)
+{
+    drmBONode *node, *cur;
+    drmMMListHead *l;
+
+    *newItem = 0;
+    cur = NULL;
+
+    for (l = list->list.next; l != &list->list; l = l->next) {
+       node = DRMLISTENTRY(drmBONode, l, head);
+       if (node->buf == buf) {
+           cur = node;
+           break;
+       }
+    }
+    if (!cur) {
+       cur = drmAddListItem(list, buf, flags, mask);
+       if (!cur) {
+           return -ENOMEM;
+       }
+       *newItem = 1;
+       cur->arg0 = flags;
+       cur->arg1 = mask;
+    }
+    else {
+        uint64_t memFlags = cur->arg0 & flags & DRM_BO_MASK_MEM;
+       uint64_t accFlags = (cur->arg0 | flags) & ~DRM_BO_MASK_MEM;
+
+       if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
+           return -EINVAL;
+       }
+
+       cur->arg1 |= mask;
+       cur->arg0 = (cur->arg0 & ~mask) | ((memFlags | accFlags) & mask);
+
+       if (((cur->arg1 & DRM_BO_MASK_MEM) != 0) &&
+           (cur->arg0 & DRM_BO_MASK_MEM) == 0) {
+           return -EINVAL;
+       }
+    }
+    return 0;
+}
+
+static void drmBOFreeList(drmBOList *list)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+
+    l = list->list.next;
+    while(l != &list->list) {
+       DRMLISTDEL(l);
+       node = DRMLISTENTRY(drmBONode, l, head);
+       free(node);
+       l = list->list.next;
+       list->numCurrent--;
+       list->numOnList--;
+    }
+
+    l = list->free.next;
+    while(l != &list->free) {
+       DRMLISTDEL(l);
+       node = DRMLISTENTRY(drmBONode, l, head);
+       free(node);
+       l = list->free.next;
+       list->numCurrent--;
+    }
+}
+
+static int drmAdjustListNodes(drmBOList *list)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+    int ret = 0;
+
+    while(list->numCurrent < list->numTarget) {
+       node = (drmBONode *) malloc(sizeof(*node));
+       if (!node) {
+           ret = -ENOMEM;
+           break;
+       }
+       list->numCurrent++;
+       DRMLISTADD(&node->head, &list->free);
+    }
+
+    while(list->numCurrent > list->numTarget) {
+       l = list->free.next;
+       if (l == &list->free)
+           break;
+       DRMLISTDEL(l);
+       node = DRMLISTENTRY(drmBONode, l, head);
+       free(node);
+       list->numCurrent--;
+    }
+    return ret;
+}
+
+static int drmBOCreateList(int numTarget, drmBOList *list)
+{
+    DRMINITLISTHEAD(&list->list);
+    DRMINITLISTHEAD(&list->free);
+    list->numTarget = numTarget;
+    list->numCurrent = 0;
+    list->numOnList = 0;
+    return drmAdjustListNodes(list);
+}
+
+static int drmBOResetList(drmBOList *list)
+{
+    drmMMListHead *l;
+    int ret;
+
+    ret = drmAdjustListNodes(list);
+    if (ret)
+       return ret;
+
+    l = list->list.next;
+    while (l != &list->list) {
+       DRMLISTDEL(l);
+       DRMLISTADD(l, &list->free);
+       list->numOnList--;
+       l = list->list.next;
+    }
+    return drmAdjustListNodes(list);
+}
+
+void driWriteLockKernelBO(void)
+{
+    _glthread_LOCK_MUTEX(bmMutex);
+    while(kernelReaders != 0)
+       _glthread_COND_WAIT(bmCond, bmMutex);
+}
+
+void driWriteUnlockKernelBO(void)
+{
+    _glthread_UNLOCK_MUTEX(bmMutex);
+}
+
+void driReadLockKernelBO(void)
+{
+    _glthread_LOCK_MUTEX(bmMutex);
+    kernelReaders++;
+    _glthread_UNLOCK_MUTEX(bmMutex);
+}
+
+void driReadUnlockKernelBO(void)
+{
+    _glthread_LOCK_MUTEX(bmMutex);
+    if (--kernelReaders == 0)
+        _glthread_COND_BROADCAST(bmCond);
+    _glthread_UNLOCK_MUTEX(bmMutex);
+}
+
+
+
+
+/*
+ * TODO: Introduce fence pools in the same way as
+ * buffer object pools.
+ */
+
+typedef struct _DriBufferObject
+{
+   DriBufferPool *pool;
+   _glthread_Mutex mutex;
+   int refCount;
+   const char *name;
+   uint64_t flags;
+   unsigned hint;
+   unsigned alignment;
+   unsigned createdByReference;
+   void *private;
+   /* user-space buffer: */
+   unsigned userBuffer;
+   void *userData;
+   unsigned userSize;
+} DriBufferObject;
+
+typedef struct _DriBufferList {
+    drmBOList drmBuffers;  /* List of kernel buffers needing validation */
+    drmBOList driBuffers;  /* List of user-space buffers needing validation */
+} DriBufferList;
+
+
+void
+bmError(int val, const char *file, const char *function, int line)
+{
+   printf("Fatal video memory manager error \"%s\".\n"
+          "Check kernel logs or set the LIBGL_DEBUG\n"
+          "environment variable to \"verbose\" for more info.\n"
+          "Detected in file %s, line %d, function %s.\n",
+          strerror(-val), file, line, function);
+#ifndef NDEBUG
+   abort();
+#else
+   abort();
+#endif
+}
+
+extern drmBO *
+driBOKernel(struct _DriBufferObject *buf)
+{
+   drmBO *ret;
+
+   driReadLockKernelBO();
+   _glthread_LOCK_MUTEX(buf->mutex);
+   assert(buf->private != NULL);
+   ret = buf->pool->kernel(buf->pool, buf->private);
+   if (!ret)
+      BM_CKFATAL(-EINVAL);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+   driReadUnlockKernelBO();
+
+   return ret;
+}
+
+void
+driBOWaitIdle(struct _DriBufferObject *buf, int lazy)
+{
+
+  /*
+   * This function may block. Is it sane to keep the mutex held during
+   * that time??
+   */
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   BM_CKFATAL(buf->pool->waitIdle(buf->pool, buf->private, &buf->mutex, lazy));
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+void *
+driBOMap(struct _DriBufferObject *buf, unsigned flags, unsigned hint)
+{
+   void *virtual;
+   int retval;
+
+   if (buf->userBuffer) {
+      return buf->userData;
+   }
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   assert(buf->private != NULL);
+   retval = buf->pool->map(buf->pool, buf->private, flags, hint,
+                          &buf->mutex, &virtual);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+
+   return retval == 0 ? virtual : NULL;
+}
+
+void
+driBOUnmap(struct _DriBufferObject *buf)
+{
+   if (buf->userBuffer)
+      return;
+
+   assert(buf->private != NULL);
+   _glthread_LOCK_MUTEX(buf->mutex);
+   BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+unsigned long
+driBOOffset(struct _DriBufferObject *buf)
+{
+   unsigned long ret;
+
+   assert(buf->private != NULL);
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   ret = buf->pool->offset(buf->pool, buf->private);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+   return ret;
+}
+
+unsigned long
+driBOPoolOffset(struct _DriBufferObject *buf)
+{
+   unsigned long ret;
+
+   assert(buf->private != NULL);
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   ret = buf->pool->poolOffset(buf->pool, buf->private);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+   return ret;
+}
+
+uint64_t
+driBOFlags(struct _DriBufferObject *buf)
+{
+   uint64_t ret;
+
+   assert(buf->private != NULL);
+
+   driReadLockKernelBO();
+   _glthread_LOCK_MUTEX(buf->mutex);
+   ret = buf->pool->flags(buf->pool, buf->private);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+   driReadUnlockKernelBO();
+   return ret;
+}
+
+struct _DriBufferObject *
+driBOReference(struct _DriBufferObject *buf)
+{
+   _glthread_LOCK_MUTEX(buf->mutex);
+   if (++buf->refCount == 1) {
+      _glthread_UNLOCK_MUTEX(buf->mutex);
+      BM_CKFATAL(-EINVAL);
+   }
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+   return buf;
+}
+
+void
+driBOUnReference(struct _DriBufferObject *buf)
+{
+   int tmp;
+
+   if (!buf)
+      return;
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   tmp = --buf->refCount;
+   if (!tmp) {
+      _glthread_UNLOCK_MUTEX(buf->mutex);
+      if (buf->private) {
+        if (buf->createdByReference)
+           buf->pool->unreference(buf->pool, buf->private);
+        else
+           buf->pool->destroy(buf->pool, buf->private);
+      }
+      if (buf->userBuffer)
+        num_user_buffers--;
+      else
+        num_buffers--;
+      free(buf);
+   } else
+     _glthread_UNLOCK_MUTEX(buf->mutex);
+
+}
+
+
+int
+driBOData(struct _DriBufferObject *buf,
+          unsigned size, const void *data,
+         DriBufferPool *newPool,
+         uint64_t flags)
+{
+   void *virtual = NULL;
+   int newBuffer;
+   int retval = 0;
+   struct _DriBufferPool *pool;
+
+   assert(!buf->userBuffer); /* XXX just do a memcpy? */
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   pool = buf->pool;
+
+   if (pool == NULL && newPool != NULL) {
+       buf->pool = newPool;
+       pool = newPool;
+   }
+   if (newPool == NULL)
+       newPool = pool;
+
+   if (!pool->create) {
+      assert((size_t)"driBOData called on invalid buffer\n" & 0);
+      BM_CKFATAL(-EINVAL);
+   }
+
+   newBuffer = (!buf->private || pool != newPool ||
+               pool->size(pool, buf->private) < size);
+
+   if (!flags)
+       flags = buf->flags;
+
+   if (newBuffer) {
+
+       if (buf->createdByReference) {
+         assert((size_t)"driBOData requiring resizing called on shared buffer.\n" & 0);
+         BM_CKFATAL(-EINVAL);
+       }
+
+       if (buf->private)
+          buf->pool->destroy(buf->pool, buf->private);
+
+       pool = newPool;
+       buf->pool = newPool;
+       buf->private = pool->create(pool, size, flags, DRM_BO_HINT_DONT_FENCE,
+                                 buf->alignment);
+      if (!buf->private)
+         retval = -ENOMEM;
+
+      if (retval == 0)
+         retval = pool->map(pool, buf->private,
+                            DRM_BO_FLAG_WRITE,
+                            DRM_BO_HINT_DONT_BLOCK, &buf->mutex, &virtual);
+   } else if (pool->map(pool, buf->private, DRM_BO_FLAG_WRITE,
+                       DRM_BO_HINT_DONT_BLOCK, &buf->mutex, &virtual)) {
+       /*
+       * Buffer is busy. need to create a new one.
+       */
+
+       void *newBuf;
+
+       newBuf = pool->create(pool, size, flags, DRM_BO_HINT_DONT_FENCE,
+                            buf->alignment);
+       if (newBuf) {
+          buf->pool->destroy(buf->pool, buf->private);
+          buf->private = newBuf;
+       }
+
+       retval = pool->map(pool, buf->private,
+                         DRM_BO_FLAG_WRITE, 0, &buf->mutex, &virtual);
+   } else {
+       uint64_t flag_diff = flags ^ buf->flags;
+
+       /*
+       * We might need to change buffer flags.
+       */
+
+       if (flag_diff){
+          assert(pool->setStatus != NULL);
+          BM_CKFATAL(pool->unmap(pool, buf->private));
+          BM_CKFATAL(pool->setStatus(pool, buf->private, flag_diff,
+                                     buf->flags));
+          if (!data)
+            goto out;
+
+          retval = pool->map(pool, buf->private,
+                             DRM_BO_FLAG_WRITE, 0, &buf->mutex, &virtual);
+       }
+   }
+
+   if (retval == 0) {
+      if (data)
+        memcpy(virtual, data, size);
+
+      BM_CKFATAL(pool->unmap(pool, buf->private));
+   }
+
+ out:
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+
+   return retval;
+}
+
+void
+driBOSubData(struct _DriBufferObject *buf,
+             unsigned long offset, unsigned long size, const void *data)
+{
+   void *virtual;
+
+   assert(!buf->userBuffer); /* XXX just do a memcpy? */
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   if (size && data) {
+      BM_CKFATAL(buf->pool->map(buf->pool, buf->private,
+                                DRM_BO_FLAG_WRITE, 0, &buf->mutex,
+                               &virtual));
+      memcpy((unsigned char *) virtual + offset, data, size);
+      BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
+   }
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+void
+driBOGetSubData(struct _DriBufferObject *buf,
+                unsigned long offset, unsigned long size, void *data)
+{
+   void *virtual;
+
+   assert(!buf->userBuffer); /* XXX just do a memcpy? */
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   if (size && data) {
+      BM_CKFATAL(buf->pool->map(buf->pool, buf->private,
+                                DRM_BO_FLAG_READ, 0, &buf->mutex, &virtual));
+      memcpy(data, (unsigned char *) virtual + offset, size);
+      BM_CKFATAL(buf->pool->unmap(buf->pool, buf->private));
+   }
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+void
+driBOSetReferenced(struct _DriBufferObject *buf,
+                  unsigned long handle)
+{
+   _glthread_LOCK_MUTEX(buf->mutex);
+   if (buf->private != NULL) {
+      assert((size_t)"Invalid buffer for setReferenced\n" & 0);
+      BM_CKFATAL(-EINVAL);
+
+   }
+   if (buf->pool->reference == NULL) {
+      assert((size_t)"Invalid buffer pool for setReferenced\n" & 0);
+      BM_CKFATAL(-EINVAL);
+   }
+   buf->private = buf->pool->reference(buf->pool, handle);
+   if (!buf->private) {
+      assert((size_t)"Invalid buffer pool for setStatic\n" & 0);
+      BM_CKFATAL(-ENOMEM);
+   }
+   buf->createdByReference = TRUE;
+   buf->flags = buf->pool->kernel(buf->pool, buf->private)->flags;
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+int
+driGenBuffers(struct _DriBufferPool *pool,
+              const char *name,
+              unsigned n,
+              struct _DriBufferObject *buffers[],
+              unsigned alignment, uint64_t flags, unsigned hint)
+{
+   struct _DriBufferObject *buf;
+   int i;
+
+   flags = (flags) ? flags : DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_MEM_VRAM |
+      DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE;
+
+   ++num_buffers;
+
+   assert(pool);
+
+   for (i = 0; i < n; ++i) {
+      buf = (struct _DriBufferObject *) calloc(1, sizeof(*buf));
+      if (!buf)
+        return -ENOMEM;
+
+      _glthread_INIT_MUTEX(buf->mutex);
+      _glthread_LOCK_MUTEX(buf->mutex);
+      buf->refCount = 1;
+      buf->flags = flags;
+      buf->hint = hint;
+      buf->name = name;
+      buf->alignment = alignment;
+      buf->pool = pool;
+      buf->createdByReference = 0;
+      _glthread_UNLOCK_MUTEX(buf->mutex);
+      buffers[i] = buf;
+   }
+   return 0;
+}
+
+void
+driGenUserBuffer(struct _DriBufferPool *pool,
+                 const char *name,
+                 struct _DriBufferObject **buffers,
+                 void *ptr, unsigned bytes)
+{
+   const unsigned alignment = 1, flags = 0, hint = 0;
+
+   --num_buffers; /* JB: is inced in GenBuffes */
+   driGenBuffers(pool, name, 1, buffers, alignment, flags, hint);
+   ++num_user_buffers;
+
+   (*buffers)->userBuffer = 1;
+   (*buffers)->userData = ptr;
+   (*buffers)->userSize = bytes;
+}
+
+void
+driDeleteBuffers(unsigned n, struct _DriBufferObject *buffers[])
+{
+   int i;
+
+   for (i = 0; i < n; ++i) {
+      driBOUnReference(buffers[i]);
+   }
+}
+
+
+void
+driInitBufMgr(int fd)
+{
+   ;
+}
+
+/*
+ * Note that lists are per-context and don't need mutex protection.
+ */
+
+struct _DriBufferList *
+driBOCreateList(int target)
+{
+    struct _DriBufferList *list = calloc(sizeof(*list), 1);
+
+    BM_CKFATAL(drmBOCreateList(target, &list->drmBuffers));
+    BM_CKFATAL(drmBOCreateList(target, &list->driBuffers));
+    return list;
+}
+
+int
+driBOResetList(struct _DriBufferList * list)
+{
+    int ret;
+    ret = drmBOResetList(&list->drmBuffers);
+    if (ret)
+       return ret;
+    ret = drmBOResetList(&list->driBuffers);
+    return ret;
+}
+
+void
+driBOFreeList(struct _DriBufferList * list)
+{
+   drmBOFreeList(&list->drmBuffers);
+   drmBOFreeList(&list->driBuffers);
+   free(list);
+}
+
+
+/*
+ * Copied from libdrm, because it is needed by driAddValidateItem.
+ */
+
+static drmBONode *
+driAddListItem(drmBOList * list, drmBO * item,
+              uint64_t arg0, uint64_t arg1)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+
+    l = list->free.next;
+    if (l == &list->free) {
+       node = (drmBONode *) malloc(sizeof(*node));
+       if (!node) {
+           return NULL;
+       }
+       list->numCurrent++;
+    } else {
+       DRMLISTDEL(l);
+       node = DRMLISTENTRY(drmBONode, l, head);
+    }
+    memset(&node->bo_arg, 0, sizeof(node->bo_arg));
+    node->buf = item;
+    node->arg0 = arg0;
+    node->arg1 = arg1;
+    DRMLISTADDTAIL(&node->head, &list->list);
+    list->numOnList++;
+    return node;
+}
+
+/*
+ * Slightly modified version compared to the libdrm version.
+ * This one returns the list index of the buffer put on the list.
+ */
+
+static int
+driAddValidateItem(drmBOList * list, drmBO * buf, uint64_t flags,
+                  uint64_t mask, int *itemLoc,
+                  struct _drmBONode **pnode)
+{
+    drmBONode *node, *cur;
+    drmMMListHead *l;
+    int count = 0;
+
+    cur = NULL;
+
+    for (l = list->list.next; l != &list->list; l = l->next) {
+       node = DRMLISTENTRY(drmBONode, l, head);
+       if (node->buf == buf) {
+           cur = node;
+           break;
+       }
+       count++;
+    }
+    if (!cur) {
+       cur = driAddListItem(list, buf, flags, mask);
+       if (!cur)
+           return -ENOMEM;
+
+       cur->arg0 = flags;
+       cur->arg1 = mask;
+    } else {
+        uint64_t memFlags = cur->arg0 & flags & DRM_BO_MASK_MEM;
+       uint64_t accFlags = (cur->arg0 | flags) & ~DRM_BO_MASK_MEM;
+
+       if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
+           return -EINVAL;
+       }
+
+       cur->arg1 |= mask;
+       cur->arg0 = (cur->arg0 & ~mask) | ((memFlags | accFlags) & mask);
+
+       if (((cur->arg1 & DRM_BO_MASK_MEM) != 0) &&
+           (cur->arg0 & DRM_BO_MASK_MEM) == 0) {
+           return -EINVAL;
+       }
+    }
+    *itemLoc = count;
+    *pnode = cur;
+    return 0;
+}
+
+
+void
+driBOAddListItem(struct _DriBufferList * list, struct _DriBufferObject *buf,
+                 uint64_t flags, uint64_t mask, int *itemLoc,
+                struct _drmBONode **node)
+{
+   int newItem;
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   BM_CKFATAL(driAddValidateItem(&list->drmBuffers,
+                                buf->pool->kernel(buf->pool, buf->private),
+                                 flags, mask, itemLoc, node));
+   BM_CKFATAL(drmAddValidateItem(&list->driBuffers, (drmBO *) buf,
+                                flags, mask, &newItem));
+   if (newItem)
+     buf->refCount++;
+
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+}
+
+drmBOList *driGetdrmBOList(struct _DriBufferList *list)
+{
+       driWriteLockKernelBO();
+       return &list->drmBuffers;
+}
+
+void driPutdrmBOList(struct _DriBufferList *list)
+{
+       driWriteUnlockKernelBO();
+}
+
+
+void
+driBOFence(struct _DriBufferObject *buf, struct _DriFenceObject *fence)
+{
+   _glthread_LOCK_MUTEX(buf->mutex);
+   if (buf->pool->fence)
+       BM_CKFATAL(buf->pool->fence(buf->pool, buf->private, fence));
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+
+}
+
+void
+driBOUnrefUserList(struct _DriBufferList *list)
+{
+    struct _DriBufferObject *buf;
+    void *curBuf;
+
+    curBuf = drmBOListIterator(&list->driBuffers);
+    while (curBuf) {
+       buf = (struct _DriBufferObject *)drmBOListBuf(curBuf);
+       driBOUnReference(buf);
+       curBuf = drmBOListNext(&list->driBuffers, curBuf);
+    }
+}
+
+struct _DriFenceObject *
+driBOFenceUserList(struct _DriFenceMgr *mgr,
+                  struct _DriBufferList *list, const char *name,
+                  drmFence *kFence)
+{
+    struct _DriFenceObject *fence;
+    struct _DriBufferObject *buf;
+    void *curBuf;
+
+    fence = driFenceCreate(mgr, kFence->fence_class, kFence->type,
+                          kFence, sizeof(*kFence));
+    curBuf = drmBOListIterator(&list->driBuffers);
+
+   /*
+    * User-space fencing callbacks.
+    */
+
+   while (curBuf) {
+        buf = (struct _DriBufferObject *) drmBOListBuf(curBuf);
+       driBOFence(buf, fence);
+       driBOUnReference(buf);
+       curBuf = drmBOListNext(&list->driBuffers, curBuf);
+   }
+
+   driBOResetList(list);
+   return fence;
+}
+
+void
+driBOValidateUserList(struct _DriBufferList * list)
+{
+    void *curBuf;
+    struct _DriBufferObject *buf;
+
+    curBuf = drmBOListIterator(&list->driBuffers);
+
+    /*
+     * User-space validation callbacks.
+     */
+
+    while (curBuf) {
+       buf = (struct _DriBufferObject *) drmBOListBuf(curBuf);
+       _glthread_LOCK_MUTEX(buf->mutex);
+       if (buf->pool->validate)
+           BM_CKFATAL(buf->pool->validate(buf->pool, buf->private, &buf->mutex));
+       _glthread_UNLOCK_MUTEX(buf->mutex);
+       curBuf = drmBOListNext(&list->driBuffers, curBuf);
+    }
+}
+
+
+void
+driPoolTakeDown(struct _DriBufferPool *pool)
+{
+   pool->takeDown(pool);
+
+}
+
+unsigned long
+driBOSize(struct _DriBufferObject *buf)
+{
+  unsigned long size;
+
+   _glthread_LOCK_MUTEX(buf->mutex);
+   size = buf->pool->size(buf->pool, buf->private);
+   _glthread_UNLOCK_MUTEX(buf->mutex);
+
+  return size;
+
+}
+
+drmBOList *driBOGetDRMBuffers(struct _DriBufferList *list)
+{
+    return &list->drmBuffers;
+}
+
+drmBOList *driBOGetDRIBuffers(struct _DriBufferList *list)
+{
+    return &list->driBuffers;
+}
+
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.h b/src/gallium/winsys/drm/intel/common/ws_dri_bufmgr.h
new file mode 100644 (file)
index 0000000..e6c0cff
--- /dev/null
@@ -0,0 +1,138 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
+ */
+
+#ifndef _PSB_BUFMGR_H_
+#define _PSB_BUFMGR_H_
+#include <xf86mm.h>
+#include "i915_drm.h"
+#include "ws_dri_fencemgr.h"
+
+typedef struct _drmBONode
+{
+    drmMMListHead head;
+    drmBO *buf;
+    struct drm_i915_op_arg bo_arg;
+    uint64_t arg0;
+    uint64_t arg1;
+} drmBONode;
+
+typedef struct _drmBOList {
+    unsigned numTarget;
+    unsigned numCurrent;
+    unsigned numOnList;
+    drmMMListHead list;
+    drmMMListHead free;
+} drmBOList;
+
+
+struct _DriFenceObject;
+struct _DriBufferObject;
+struct _DriBufferPool;
+struct _DriBufferList;
+
+/*
+ * Return a pointer to the libdrm buffer object this DriBufferObject
+ * uses.
+ */
+
+extern drmBO *driBOKernel(struct _DriBufferObject *buf);
+extern void *driBOMap(struct _DriBufferObject *buf, unsigned flags,
+                      unsigned hint);
+extern void driBOUnmap(struct _DriBufferObject *buf);
+extern unsigned long driBOOffset(struct _DriBufferObject *buf);
+extern unsigned long driBOPoolOffset(struct _DriBufferObject *buf);
+
+extern uint64_t driBOFlags(struct _DriBufferObject *buf);
+extern struct _DriBufferObject *driBOReference(struct _DriBufferObject *buf);
+extern void driBOUnReference(struct _DriBufferObject *buf);
+
+extern int driBOData(struct _DriBufferObject *r_buf,
+                    unsigned size, const void *data,
+                    struct _DriBufferPool *pool, uint64_t flags);
+
+extern void driBOSubData(struct _DriBufferObject *buf,
+                         unsigned long offset, unsigned long size,
+                         const void *data);
+extern void driBOGetSubData(struct _DriBufferObject *buf,
+                            unsigned long offset, unsigned long size,
+                            void *data);
+extern int driGenBuffers(struct _DriBufferPool *pool,
+                        const char *name,
+                        unsigned n,
+                        struct _DriBufferObject *buffers[],
+                        unsigned alignment, uint64_t flags, unsigned hint);
+extern void driGenUserBuffer(struct _DriBufferPool *pool,
+                             const char *name,
+                             struct _DriBufferObject *buffers[],
+                             void *ptr, unsigned bytes);
+extern void driDeleteBuffers(unsigned n, struct _DriBufferObject *buffers[]);
+extern void driInitBufMgr(int fd);
+extern struct _DriBufferList *driBOCreateList(int target);
+extern int driBOResetList(struct _DriBufferList * list);
+extern void driBOAddListItem(struct _DriBufferList * list,
+                            struct _DriBufferObject *buf,
+                             uint64_t flags, uint64_t mask, int *itemLoc,
+                            struct _drmBONode **node);
+
+extern void driBOValidateList(int fd, struct _DriBufferList * list);
+extern void driBOFreeList(struct _DriBufferList * list);
+extern struct _DriFenceObject *driBOFenceUserList(struct _DriFenceMgr *mgr,
+                                                 struct _DriBufferList *list,
+                                                 const char *name,
+                                                 drmFence *kFence);
+extern void driBOUnrefUserList(struct _DriBufferList *list);
+extern void driBOValidateUserList(struct _DriBufferList * list);
+extern drmBOList *driGetdrmBOList(struct _DriBufferList *list);
+extern void driPutdrmBOList(struct _DriBufferList *list);
+
+extern void driBOFence(struct _DriBufferObject *buf,
+                       struct _DriFenceObject *fence);
+
+extern void driPoolTakeDown(struct _DriBufferPool *pool);
+extern void driBOSetReferenced(struct _DriBufferObject *buf,
+                              unsigned long handle);
+unsigned long driBOSize(struct _DriBufferObject *buf);
+extern void driBOWaitIdle(struct _DriBufferObject *buf, int lazy);
+extern void driPoolTakeDown(struct _DriBufferPool *pool);
+
+extern void driReadLockKernelBO(void);
+extern void driReadUnlockKernelBO(void);
+extern void driWriteLockKernelBO(void);
+extern void driWriteUnlockKernelBO(void);
+
+/*
+ * For debugging purposes.
+ */
+
+extern drmBOList *driBOGetDRMBuffers(struct _DriBufferList *list);
+extern drmBOList *driBOGetDRIBuffers(struct _DriBufferList *list);
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_bufpool.h b/src/gallium/winsys/drm/intel/common/ws_dri_bufpool.h
new file mode 100644 (file)
index 0000000..bf60798
--- /dev/null
@@ -0,0 +1,102 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ */
+
+#ifndef _PSB_BUFPOOL_H_
+#define _PSB_BUFPOOL_H_
+
+#include <xf86drm.h>
+#include <glthread.h>
+struct _DriFenceObject;
+
+typedef struct _DriBufferPool
+{
+   int fd;
+   int (*map) (struct _DriBufferPool * pool, void *private,
+               unsigned flags, int hint, _glthread_Mutex *mutex,
+              void **virtual);
+   int (*unmap) (struct _DriBufferPool * pool, void *private);
+   int (*destroy) (struct _DriBufferPool * pool, void *private);
+   unsigned long (*offset) (struct _DriBufferPool * pool, void *private);
+   unsigned long (*poolOffset) (struct _DriBufferPool * pool, void *private);
+   uint64_t (*flags) (struct _DriBufferPool * pool, void *private);
+   unsigned long (*size) (struct _DriBufferPool * pool, void *private);
+   void *(*create) (struct _DriBufferPool * pool, unsigned long size,
+                    uint64_t flags, unsigned hint, unsigned alignment);
+   void *(*reference) (struct _DriBufferPool * pool, unsigned handle);
+   int (*unreference) (struct _DriBufferPool * pool, void *private);
+   int (*fence) (struct _DriBufferPool * pool, void *private,
+                 struct _DriFenceObject * fence);
+   drmBO *(*kernel) (struct _DriBufferPool * pool, void *private);
+   int (*validate) (struct _DriBufferPool * pool, void *private, _glthread_Mutex *mutex);
+   int (*waitIdle) (struct _DriBufferPool *pool, void *private, _glthread_Mutex *mutex,
+                   int lazy);
+   int (*setStatus)  (struct _DriBufferPool *pool, void *private,
+                     uint64_t flag_diff, uint64_t old_flags);
+   void (*takeDown) (struct _DriBufferPool * pool);
+   void *data;
+} DriBufferPool;
+
+extern void bmError(int val, const char *file, const char *function,
+                    int line);
+#define BM_CKFATAL(val)                                               \
+  do{                                                         \
+    int tstVal = (val);                                               \
+    if (tstVal)                                               \
+      bmError(tstVal, __FILE__, __FUNCTION__, __LINE__);       \
+  } while(0);
+
+
+/*
+ * Builtin pools.
+ */
+
+/*
+ * Kernel buffer objects. Size in multiples of page size. Page size aligned.
+ */
+
+extern struct _DriBufferPool *driDRMPoolInit(int fd);
+extern struct _DriBufferPool *driMallocPoolInit(void);
+
+struct _DriFreeSlabManager;
+extern struct _DriBufferPool * driSlabPoolInit(int fd, uint64_t flags,
+                                              uint64_t validMask,
+                                              uint32_t smallestSize,
+                                              uint32_t numSizes,
+                                              uint32_t desiredNumBuffers,
+                                              uint32_t maxSlabSize,
+                                              uint32_t pageAlignment,
+                                              struct _DriFreeSlabManager *fMan);
+extern void driFinishFreeSlabManager(struct _DriFreeSlabManager *fMan);
+extern struct _DriFreeSlabManager *
+driInitFreeSlabManager(uint32_t checkIntervalMsec, uint32_t slabTimeoutMsec);
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_drmpool.c b/src/gallium/winsys/drm/intel/common/ws_dri_drmpool.c
new file mode 100644 (file)
index 0000000..40929ef
--- /dev/null
@@ -0,0 +1,268 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ */
+
+#include <xf86drm.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "ws_dri_bufpool.h"
+#include "ws_dri_bufmgr.h"
+#include "assert.h"
+
+/*
+ * Buffer pool implementation using DRM buffer objects as DRI buffer objects.
+ */
+
+static void *
+pool_create(struct _DriBufferPool *pool,
+            unsigned long size, uint64_t flags, unsigned hint,
+            unsigned alignment)
+{
+   drmBO *buf = (drmBO *) malloc(sizeof(*buf));
+   int ret;
+   unsigned pageSize = getpagesize();
+
+   if (!buf)
+      return NULL;
+
+   if ((alignment > pageSize) && (alignment % pageSize)) {
+      free(buf);
+      return NULL;
+   }
+
+   ret = drmBOCreate(pool->fd, size, alignment / pageSize,
+                    NULL,
+                     flags, hint, buf);
+   if (ret) {
+      free(buf);
+      return NULL;
+   }
+
+   return (void *) buf;
+}
+
+static void *
+pool_reference(struct _DriBufferPool *pool, unsigned handle)
+{
+   drmBO *buf = (drmBO *) malloc(sizeof(*buf));
+   int ret;
+
+   if (!buf)
+      return NULL;
+
+   ret = drmBOReference(pool->fd, handle, buf);
+
+   if (ret) {
+      free(buf);
+      return NULL;
+   }
+
+   return (void *) buf;
+}
+
+static int
+pool_destroy(struct _DriBufferPool *pool, void *private)
+{
+   int ret;
+   drmBO *buf = (drmBO *) private;
+   driReadLockKernelBO();
+   ret = drmBOUnreference(pool->fd, buf);
+   free(buf);
+   driReadUnlockKernelBO();
+   return ret;
+}
+
+static int
+pool_unreference(struct _DriBufferPool *pool, void *private)
+{
+   int ret;
+   drmBO *buf = (drmBO *) private;
+   driReadLockKernelBO();
+   ret = drmBOUnreference(pool->fd, buf);
+   free(buf);
+   driReadUnlockKernelBO();
+   return ret;
+}
+
+static int
+pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
+         int hint, _glthread_Mutex *mutex, void **virtual)
+{
+   drmBO *buf = (drmBO *) private;
+   int ret;
+
+   driReadLockKernelBO();
+   ret = drmBOMap(pool->fd, buf, flags, hint, virtual);
+   driReadUnlockKernelBO();
+   return ret;
+}
+
+static int
+pool_unmap(struct _DriBufferPool *pool, void *private)
+{
+   drmBO *buf = (drmBO *) private;
+   int ret;
+
+   driReadLockKernelBO();
+   ret = drmBOUnmap(pool->fd, buf);
+   driReadUnlockKernelBO();
+
+   return ret;
+}
+
+static unsigned long
+pool_offset(struct _DriBufferPool *pool, void *private)
+{
+   drmBO *buf = (drmBO *) private;
+   unsigned long offset;
+
+   driReadLockKernelBO();
+   assert(buf->flags & DRM_BO_FLAG_NO_MOVE);
+   offset = buf->offset;
+   driReadUnlockKernelBO();
+
+   return buf->offset;
+}
+
+static unsigned long
+pool_poolOffset(struct _DriBufferPool *pool, void *private)
+{
+   return 0;
+}
+
+static uint64_t
+pool_flags(struct _DriBufferPool *pool, void *private)
+{
+   drmBO *buf = (drmBO *) private;
+   uint64_t flags;
+
+   driReadLockKernelBO();
+   flags = buf->flags;
+   driReadUnlockKernelBO();
+
+   return flags;
+}
+
+
+static unsigned long
+pool_size(struct _DriBufferPool *pool, void *private)
+{
+   drmBO *buf = (drmBO *) private;
+   unsigned long size;
+
+   driReadLockKernelBO();
+   size = buf->size;
+   driReadUnlockKernelBO();
+
+   return buf->size;
+}
+
+static int
+pool_fence(struct _DriBufferPool *pool, void *private,
+           struct _DriFenceObject *fence)
+{
+   /*
+    * Noop. The kernel handles all fencing.
+    */
+
+   return 0;
+}
+
+static drmBO *
+pool_kernel(struct _DriBufferPool *pool, void *private)
+{
+   return (drmBO *) private;
+}
+
+static int
+pool_waitIdle(struct _DriBufferPool *pool, void *private, _glthread_Mutex *mutex,
+             int lazy)
+{
+   drmBO *buf = (drmBO *) private;
+   int ret;
+
+   driReadLockKernelBO();
+   ret = drmBOWaitIdle(pool->fd, buf, (lazy) ? DRM_BO_HINT_WAIT_LAZY:0);
+   driReadUnlockKernelBO();
+
+   return ret;
+}
+
+
+static void
+pool_takedown(struct _DriBufferPool *pool)
+{
+   free(pool);
+}
+
+/*static int
+pool_setStatus(struct _DriBufferPool *pool, void *private,
+              uint64_t flag_diff, uint64_t old_flags)
+{
+   drmBO *buf = (drmBO *) private;
+   uint64_t new_flags = old_flags ^ flag_diff;
+   int ret;
+
+   driReadLockKernelBO();
+   ret = drmBOSetStatus(pool->fd, buf, new_flags, flag_diff,
+                       0, 0, 0);
+   driReadUnlockKernelBO();
+   return ret;
+}*/
+
+struct _DriBufferPool *
+driDRMPoolInit(int fd)
+{
+   struct _DriBufferPool *pool;
+
+   pool = (struct _DriBufferPool *) malloc(sizeof(*pool));
+
+   if (!pool)
+      return NULL;
+
+   pool->fd = fd;
+   pool->map = &pool_map;
+   pool->unmap = &pool_unmap;
+   pool->destroy = &pool_destroy;
+   pool->offset = &pool_offset;
+   pool->poolOffset = &pool_poolOffset;
+   pool->flags = &pool_flags;
+   pool->size = &pool_size;
+   pool->create = &pool_create;
+   pool->fence = &pool_fence;
+   pool->kernel = &pool_kernel;
+   pool->validate = NULL;
+   pool->waitIdle = &pool_waitIdle;
+   pool->takeDown = &pool_takedown;
+   pool->reference = &pool_reference;
+   pool->unreference = &pool_unreference;
+   pool->data = NULL;
+   return pool;
+}
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.c b/src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.c
new file mode 100644 (file)
index 0000000..b56bc26
--- /dev/null
@@ -0,0 +1,377 @@
+#include "ws_dri_fencemgr.h"
+#include "glthread.h"
+#include <xf86mm.h>
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * Note: Locking order is
+ * _DriFenceObject::mutex
+ * _DriFenceMgr::mutex
+ */
+
+struct _DriFenceMgr {
+    /*
+     * Constant members. Need no mutex protection.
+     */
+    struct _DriFenceMgrCreateInfo info;
+    void *private;
+
+    /*
+     * These members are protected by this->mutex
+     */
+    _glthread_Mutex mutex;
+    int refCount;
+    drmMMListHead *heads;
+    int num_fences;
+};
+
+struct _DriFenceObject {
+
+    /*
+     * These members are constant and need no mutex protection.
+     */
+    struct _DriFenceMgr *mgr;
+    uint32_t fence_class;
+    uint32_t fence_type;
+
+    /*
+     * These members are protected by mgr->mutex.
+     */
+    drmMMListHead head;
+    int refCount;
+
+    /*
+     * These members are protected by this->mutex.
+     */
+    _glthread_Mutex mutex;
+    uint32_t signaled_type;
+    void *private;
+};
+
+uint32_t
+driFenceType(struct _DriFenceObject *fence)
+{
+  return fence->fence_type;
+}
+
+struct _DriFenceMgr *
+driFenceMgrCreate(const struct _DriFenceMgrCreateInfo *info)
+{
+  struct _DriFenceMgr *tmp;
+  uint32_t i;
+
+  tmp = calloc(1, sizeof(*tmp));
+  if (!tmp)
+      return NULL;
+
+  _glthread_INIT_MUTEX(tmp->mutex);
+  _glthread_LOCK_MUTEX(tmp->mutex);
+  tmp->refCount = 1;
+  tmp->info = *info;
+  tmp->num_fences = 0;
+  tmp->heads = calloc(tmp->info.num_classes, sizeof(*tmp->heads));
+  if (!tmp->heads)
+      goto out_err;
+
+  for (i=0; i<tmp->info.num_classes; ++i) {
+      DRMINITLISTHEAD(&tmp->heads[i]);
+  }
+  _glthread_UNLOCK_MUTEX(tmp->mutex);
+  return tmp;
+
+  out_err:
+  if (tmp)
+      free(tmp);
+  return NULL;
+}
+
+static void
+driFenceMgrUnrefUnlock(struct _DriFenceMgr **pMgr)
+{
+    struct _DriFenceMgr *mgr = *pMgr;
+
+    *pMgr = NULL;
+    if (--mgr->refCount == 0)
+       free(mgr);
+    else
+       _glthread_UNLOCK_MUTEX(mgr->mutex);
+}
+
+void
+driFenceMgrUnReference(struct _DriFenceMgr **pMgr)
+{
+    _glthread_LOCK_MUTEX((*pMgr)->mutex);
+    driFenceMgrUnrefUnlock(pMgr);
+}
+
+static void
+driFenceUnReferenceLocked(struct _DriFenceObject **pFence)
+{
+    struct _DriFenceObject *fence = *pFence;
+    struct _DriFenceMgr *mgr = fence->mgr;
+
+    *pFence = NULL;
+    if (--fence->refCount == 0) {
+       DRMLISTDELINIT(&fence->head);
+       if (fence->private)
+           mgr->info.unreference(mgr, &fence->private);
+    --mgr->num_fences;
+       fence->mgr = NULL;
+       --mgr->refCount;
+       free(fence);
+
+    }
+}
+
+
+static void
+driSignalPreviousFencesLocked(struct _DriFenceMgr *mgr,
+                             drmMMListHead *list,
+                             uint32_t fence_class,
+                             uint32_t fence_type)
+{
+    struct _DriFenceObject *entry;
+    drmMMListHead *prev;
+
+    while(list != &mgr->heads[fence_class]) {
+       entry = DRMLISTENTRY(struct _DriFenceObject, list, head);
+
+       /*
+        * Up refcount so that entry doesn't disappear from under us
+        * when we unlock-relock mgr to get the correct locking order.
+        */
+
+       ++entry->refCount;
+       _glthread_UNLOCK_MUTEX(mgr->mutex);
+       _glthread_LOCK_MUTEX(entry->mutex);
+       _glthread_LOCK_MUTEX(mgr->mutex);
+
+       prev = list->prev;
+
+
+
+       if (list->prev == list) {
+
+               /*
+                * Somebody else removed the entry from the list.
+                */
+
+               _glthread_UNLOCK_MUTEX(entry->mutex);
+               driFenceUnReferenceLocked(&entry);
+               return;
+       }
+
+       entry->signaled_type |= (fence_type & entry->fence_type);
+       if (entry->signaled_type == entry->fence_type) {
+           DRMLISTDELINIT(list);
+           mgr->info.unreference(mgr, &entry->private);
+       }
+       _glthread_UNLOCK_MUTEX(entry->mutex);
+       driFenceUnReferenceLocked(&entry);
+       list = prev;
+    }
+}
+
+
+int
+driFenceFinish(struct _DriFenceObject *fence, uint32_t fence_type,
+              int lazy_hint)
+{
+    struct _DriFenceMgr *mgr = fence->mgr;
+    int ret = 0;
+
+    _glthread_LOCK_MUTEX(fence->mutex);
+
+    if ((fence->signaled_type & fence_type) == fence_type)
+       goto out0;
+
+    ret = mgr->info.finish(mgr, fence->private, fence_type, lazy_hint);
+    if (ret)
+       goto out0;
+
+    _glthread_LOCK_MUTEX(mgr->mutex);
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+
+    driSignalPreviousFencesLocked(mgr, &fence->head, fence->fence_class,
+                                 fence_type);
+    _glthread_UNLOCK_MUTEX(mgr->mutex);
+    return 0;
+
+  out0:
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+    return ret;
+}
+
+uint32_t driFenceSignaledTypeCached(struct _DriFenceObject *fence)
+{
+    uint32_t ret;
+
+    _glthread_LOCK_MUTEX(fence->mutex);
+    ret = fence->signaled_type;
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+
+    return ret;
+}
+
+int
+driFenceSignaledType(struct _DriFenceObject *fence, uint32_t flush_type,
+                uint32_t *signaled)
+{
+    int ret = 0;
+    struct _DriFenceMgr *mgr;
+
+    _glthread_LOCK_MUTEX(fence->mutex);
+    mgr = fence->mgr;
+    *signaled = fence->signaled_type;
+    if ((fence->signaled_type & flush_type) == flush_type)
+       goto out0;
+
+    ret = mgr->info.signaled(mgr, fence->private, flush_type, signaled);
+    if (ret) {
+       *signaled = fence->signaled_type;
+       goto out0;
+    }
+
+    if ((fence->signaled_type | *signaled) == fence->signaled_type)
+       goto out0;
+
+    _glthread_LOCK_MUTEX(mgr->mutex);
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+
+    driSignalPreviousFencesLocked(mgr, &fence->head, fence->fence_class,
+                                 *signaled);
+
+    _glthread_UNLOCK_MUTEX(mgr->mutex);
+    return 0;
+  out0:
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+    return ret;
+}
+
+struct _DriFenceObject *
+driFenceReference(struct _DriFenceObject *fence)
+{
+    _glthread_LOCK_MUTEX(fence->mgr->mutex);
+    ++fence->refCount;
+    _glthread_UNLOCK_MUTEX(fence->mgr->mutex);
+    return fence;
+}
+
+void
+driFenceUnReference(struct _DriFenceObject **pFence)
+{
+    struct _DriFenceMgr *mgr;
+
+    if (*pFence == NULL)
+       return;
+
+    mgr = (*pFence)->mgr;
+    _glthread_LOCK_MUTEX(mgr->mutex);
+    ++mgr->refCount;
+    driFenceUnReferenceLocked(pFence);
+    driFenceMgrUnrefUnlock(&mgr);
+}
+
+struct _DriFenceObject
+*driFenceCreate(struct _DriFenceMgr *mgr, uint32_t fence_class,
+               uint32_t fence_type, void *private, size_t private_size)
+{
+    struct _DriFenceObject *fence;
+    size_t fence_size = sizeof(*fence);
+
+    if (private_size)
+       fence_size = ((fence_size + 15) & ~15);
+
+    fence = calloc(1, fence_size + private_size);
+
+    if (!fence) {
+       int ret = mgr->info.finish(mgr, private, fence_type, 0);
+
+       if (ret)
+           usleep(10000000);
+
+       return NULL;
+    }
+
+    _glthread_INIT_MUTEX(fence->mutex);
+    _glthread_LOCK_MUTEX(fence->mutex);
+    _glthread_LOCK_MUTEX(mgr->mutex);
+    fence->refCount = 1;
+    DRMLISTADDTAIL(&fence->head, &mgr->heads[fence_class]);
+    fence->mgr = mgr;
+    ++mgr->refCount;
+    ++mgr->num_fences;
+    _glthread_UNLOCK_MUTEX(mgr->mutex);
+    fence->fence_class = fence_class;
+    fence->fence_type = fence_type;
+    fence->signaled_type = 0;
+    fence->private = private;
+    if (private_size) {
+        fence->private = (void *)(((uint8_t *) fence) + fence_size);
+       memcpy(fence->private, private, private_size);
+    }
+
+    _glthread_UNLOCK_MUTEX(fence->mutex);
+    return fence;
+}
+
+
+static int
+tSignaled(struct _DriFenceMgr *mgr, void *private, uint32_t flush_type,
+         uint32_t *signaled_type)
+{
+  long fd = (long) mgr->private;
+  int dummy;
+  drmFence *fence = (drmFence *) private;
+  int ret;
+
+  *signaled_type = 0;
+  ret = drmFenceSignaled((int) fd, fence, flush_type, &dummy);
+  if (ret)
+    return ret;
+
+  *signaled_type = fence->signaled;
+
+  return 0;
+}
+
+static int
+tFinish(struct _DriFenceMgr *mgr, void *private, uint32_t fence_type,
+       int lazy_hint)
+{
+  long fd = (long) mgr->private;
+  unsigned flags = lazy_hint ? DRM_FENCE_FLAG_WAIT_LAZY : 0;
+
+  return drmFenceWait((int)fd, flags, (drmFence *) private, fence_type);
+}
+
+static int
+tUnref(struct _DriFenceMgr *mgr, void **private)
+{
+  long fd = (long) mgr->private;
+  drmFence *fence = (drmFence *) *private;
+  *private = NULL;
+
+  return drmFenceUnreference(fd, fence);
+}
+
+struct _DriFenceMgr *driFenceMgrTTMInit(int fd)
+{
+  struct _DriFenceMgrCreateInfo info;
+  struct _DriFenceMgr *mgr;
+
+  info.flags = DRI_FENCE_CLASS_ORDERED;
+  info.num_classes = 4;
+  info.signaled = tSignaled;
+  info.finish = tFinish;
+  info.unreference = tUnref;
+
+  mgr = driFenceMgrCreate(&info);
+  if (mgr == NULL)
+    return NULL;
+
+  mgr->private = (void *) (long) fd;
+  return mgr;
+}
+
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.h b/src/gallium/winsys/drm/intel/common/ws_dri_fencemgr.h
new file mode 100644 (file)
index 0000000..4ea58df
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef DRI_FENCEMGR_H
+#define DRI_FENCEMGR_H
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct _DriFenceObject;
+struct _DriFenceMgr;
+
+/*
+ * Do a quick check to see if the fence manager has registered the fence
+ * object as signaled. Note that this function may return a false negative
+ * answer.
+ */
+extern uint32_t driFenceSignaledTypeCached(struct _DriFenceObject *fence);
+
+/*
+ * Check if the fence object is signaled. This function can be substantially
+ * more expensive to call than the above function, but will not return a false
+ * negative answer. The argument "flush_type" sets the types that the
+ * underlying mechanism must make sure will eventually signal.
+ */
+extern int driFenceSignaledType(struct _DriFenceObject *fence,
+                               uint32_t flush_type, uint32_t *signaled);
+
+/*
+ * Convenience functions.
+ */
+
+static inline int driFenceSignaled(struct _DriFenceObject *fence,
+                                  uint32_t flush_type)
+{
+    uint32_t signaled_types;
+    int ret = driFenceSignaledType(fence, flush_type, &signaled_types);
+    if (ret)
+       return 0;
+    return ((signaled_types & flush_type) == flush_type);
+}
+
+static inline int driFenceSignaledCached(struct _DriFenceObject *fence,
+                                        uint32_t flush_type)
+{
+    uint32_t signaled_types =
+       driFenceSignaledTypeCached(fence);
+
+    return ((signaled_types & flush_type) == flush_type);
+}
+
+/*
+ * Reference a fence object.
+ */
+extern struct _DriFenceObject *driFenceReference(struct _DriFenceObject *fence);
+
+/*
+ * Unreference a fence object. The fence object pointer will be reset to NULL.
+ */
+
+extern void driFenceUnReference(struct _DriFenceObject **pFence);
+
+
+/*
+ * Wait for a fence to signal the indicated fence_type.
+ * If "lazy_hint" is true, it indicates that the wait may sleep to avoid
+ * busy-wait polling.
+ */
+extern int driFenceFinish(struct _DriFenceObject *fence, uint32_t fence_type,
+                         int lazy_hint);
+
+/*
+ * Create a DriFenceObject for manager "mgr".
+ *
+ * "private" is a pointer that should be used for the callbacks in
+ * struct _DriFenceMgrCreateInfo.
+ *
+ * if private_size is nonzero, then the info stored at *private, with size
+ * private size will be copied and the fence manager will instead use a
+ * pointer to the copied data for the callbacks in
+ * struct _DriFenceMgrCreateInfo. In that case, the object pointed to by
+ * "private" may be destroyed after the call to driFenceCreate.
+ */
+extern struct _DriFenceObject *driFenceCreate(struct _DriFenceMgr *mgr,
+                                             uint32_t fence_class,
+                                             uint32_t fence_type,
+                                             void *private,
+                                             size_t private_size);
+
+extern uint32_t driFenceType(struct _DriFenceObject *fence);
+
+/*
+ * Fence creations are ordered. If a fence signals a fence_type,
+ * it is safe to assume that all fences of the same class that was
+ * created before that fence has signaled the same type.
+ */
+
+#define DRI_FENCE_CLASS_ORDERED (1 << 0)
+
+struct _DriFenceMgrCreateInfo {
+    uint32_t flags;
+    uint32_t num_classes;
+    int (*signaled) (struct _DriFenceMgr *mgr, void *private, uint32_t flush_type,
+                    uint32_t *signaled_type);
+    int (*finish) (struct _DriFenceMgr *mgr, void *private, uint32_t fence_type, int lazy_hint);
+    int (*unreference) (struct _DriFenceMgr *mgr, void **private);
+};
+
+extern struct _DriFenceMgr *
+driFenceMgrCreate(const struct _DriFenceMgrCreateInfo *info);
+
+void
+driFenceMgrUnReference(struct _DriFenceMgr **pMgr);
+
+extern struct _DriFenceMgr *
+driFenceMgrTTMInit(int fd);
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_mallocpool.c b/src/gallium/winsys/drm/intel/common/ws_dri_mallocpool.c
new file mode 100644 (file)
index 0000000..a80555c
--- /dev/null
@@ -0,0 +1,161 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ */
+
+#include <xf86drm.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "pipe/p_debug.h"
+#include "glthread.h"
+#include "ws_dri_bufpool.h"
+#include "ws_dri_bufmgr.h"
+
+static void *
+pool_create(struct _DriBufferPool *pool,
+            unsigned long size, uint64_t flags, unsigned hint,
+            unsigned alignment)
+{
+    unsigned long *private = malloc(size + 2*sizeof(unsigned long));
+    if ((flags & DRM_BO_MASK_MEM) != DRM_BO_FLAG_MEM_LOCAL)
+      abort();
+
+    *private = size;
+    return (void *)private;
+}
+
+
+static int
+pool_destroy(struct _DriBufferPool *pool, void *private)
+{
+    free(private);
+    return 0;
+}
+
+static int
+pool_waitIdle(struct _DriBufferPool *pool, void *private,
+             _glthread_Mutex *mutex, int lazy)
+{
+    return 0;
+}
+
+static int
+pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
+         int hint, _glthread_Mutex *mutex, void **virtual)
+{
+    *virtual = (void *)((unsigned long *)private + 2);
+    return 0;
+}
+
+static int
+pool_unmap(struct _DriBufferPool *pool, void *private)
+{
+    return 0;
+}
+
+static unsigned long
+pool_offset(struct _DriBufferPool *pool, void *private)
+{
+    /*
+     * BUG
+     */
+    abort();
+    return 0UL;
+}
+
+static unsigned long
+pool_poolOffset(struct _DriBufferPool *pool, void *private)
+{
+    /*
+     * BUG
+     */
+    abort();
+}
+
+static uint64_t
+pool_flags(struct _DriBufferPool *pool, void *private)
+{
+    return DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_CACHED;
+}
+
+static unsigned long
+pool_size(struct _DriBufferPool *pool, void *private)
+{
+    return *(unsigned long *) private;
+}
+
+
+static int
+pool_fence(struct _DriBufferPool *pool, void *private,
+           struct _DriFenceObject *fence)
+{
+    abort();
+    return 0UL;
+}
+
+static drmBO *
+pool_kernel(struct _DriBufferPool *pool, void *private)
+{
+    abort();
+    return NULL;
+}
+
+static void
+pool_takedown(struct _DriBufferPool *pool)
+{
+    free(pool);
+}
+
+
+struct _DriBufferPool *
+driMallocPoolInit(void)
+{
+   struct _DriBufferPool *pool;
+
+   pool = (struct _DriBufferPool *) malloc(sizeof(*pool));
+   if (!pool)
+       return NULL;
+
+   pool->data = NULL;
+   pool->fd = -1;
+   pool->map = &pool_map;
+   pool->unmap = &pool_unmap;
+   pool->destroy = &pool_destroy;
+   pool->offset = &pool_offset;
+   pool->poolOffset = &pool_poolOffset;
+   pool->flags = &pool_flags;
+   pool->size = &pool_size;
+   pool->create = &pool_create;
+   pool->fence = &pool_fence;
+   pool->kernel = &pool_kernel;
+   pool->validate = NULL;
+   pool->waitIdle = &pool_waitIdle;
+   pool->takeDown = &pool_takedown;
+   return pool;
+}
diff --git a/src/gallium/winsys/drm/intel/common/ws_dri_slabpool.c b/src/gallium/winsys/drm/intel/common/ws_dri_slabpool.c
new file mode 100644 (file)
index 0000000..dfcf6d6
--- /dev/null
@@ -0,0 +1,968 @@
+/**************************************************************************
+ *
+ * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
+ */
+
+#include <stdint.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <unistd.h>
+#include <assert.h>
+#include "ws_dri_bufpool.h"
+#include "ws_dri_fencemgr.h"
+#include "ws_dri_bufmgr.h"
+#include "glthread.h"
+
+#define DRI_SLABPOOL_ALLOC_RETRIES 100
+
+struct _DriSlab;
+
+struct _DriSlabBuffer {
+    int isSlabBuffer;
+    drmBO *bo;
+    struct _DriFenceObject *fence;
+    struct _DriSlab *parent;
+    drmMMListHead head;
+    uint32_t mapCount;
+    uint32_t start;
+    uint32_t fenceType;
+    int unFenced;
+    _glthread_Cond event;
+};
+
+struct _DriKernelBO {
+    int fd;
+    drmBO bo;
+    drmMMListHead timeoutHead;
+    drmMMListHead head;
+    struct timeval timeFreed;
+    uint32_t pageAlignment;
+    void *virtual;
+};
+
+struct _DriSlab{
+    drmMMListHead head;
+    drmMMListHead freeBuffers;
+    uint32_t numBuffers;
+    uint32_t numFree;
+    struct _DriSlabBuffer *buffers;
+    struct _DriSlabSizeHeader *header;
+    struct _DriKernelBO *kbo;
+};
+
+
+struct _DriSlabSizeHeader {
+    drmMMListHead slabs;
+    drmMMListHead freeSlabs;
+    drmMMListHead delayedBuffers;
+    uint32_t numDelayed;
+    struct _DriSlabPool *slabPool;
+    uint32_t bufSize;
+    _glthread_Mutex mutex;
+};
+
+struct _DriFreeSlabManager {
+    struct timeval slabTimeout;
+    struct timeval checkInterval;
+    struct timeval nextCheck;
+    drmMMListHead timeoutList;
+    drmMMListHead unCached;
+    drmMMListHead cached;
+    _glthread_Mutex mutex;
+};
+
+
+struct _DriSlabPool {
+
+    /*
+     * The data of this structure remains constant after
+     * initialization and thus needs no mutex protection.
+     */
+
+    struct _DriFreeSlabManager *fMan;
+    uint64_t proposedFlags;
+    uint64_t validMask;
+    uint32_t *bucketSizes;
+    uint32_t numBuckets;
+    uint32_t pageSize;
+    int fd;
+    int pageAlignment;
+    int maxSlabSize;
+    int desiredNumBuffers;
+    struct _DriSlabSizeHeader *headers;
+};
+
+/*
+ * FIXME: Perhaps arrange timeout slabs in size buckets for fast
+ * retreival??
+ */
+
+
+static inline int
+driTimeAfterEq(struct timeval *arg1, struct timeval *arg2)
+{
+    return ((arg1->tv_sec > arg2->tv_sec) ||
+           ((arg1->tv_sec == arg2->tv_sec) &&
+            (arg1->tv_usec > arg2->tv_usec)));
+}
+
+static inline void
+driTimeAdd(struct timeval *arg, struct timeval *add)
+{
+    unsigned int sec;
+
+    arg->tv_sec += add->tv_sec;
+    arg->tv_usec += add->tv_usec;
+    sec = arg->tv_usec / 1000000;
+    arg->tv_sec += sec;
+    arg->tv_usec -= sec*1000000;
+}
+
+static void
+driFreeKernelBO(struct _DriKernelBO *kbo)
+{
+    if (!kbo)
+       return;
+
+    (void) drmBOUnreference(kbo->fd, &kbo->bo);
+    free(kbo);
+}
+
+
+static void
+driFreeTimeoutKBOsLocked(struct _DriFreeSlabManager *fMan,
+                        struct timeval *time)
+{
+    drmMMListHead *list, *next;
+    struct _DriKernelBO *kbo;
+
+    if (!driTimeAfterEq(time, &fMan->nextCheck))
+       return;
+
+    for (list = fMan->timeoutList.next, next = list->next;
+        list != &fMan->timeoutList;
+        list = next, next = list->next) {
+
+       kbo = DRMLISTENTRY(struct _DriKernelBO, list, timeoutHead);
+
+       if (!driTimeAfterEq(time, &kbo->timeFreed))
+           break;
+
+       DRMLISTDELINIT(&kbo->timeoutHead);
+       DRMLISTDELINIT(&kbo->head);
+       driFreeKernelBO(kbo);
+    }
+
+    fMan->nextCheck = *time;
+    driTimeAdd(&fMan->nextCheck, &fMan->checkInterval);
+}
+
+
+/*
+ * Add a _DriKernelBO to the free slab manager.
+ * This means that it is available for reuse, but if it's not
+ * reused in a while, it will be freed.
+ */
+
+static void
+driSetKernelBOFree(struct _DriFreeSlabManager *fMan,
+                  struct _DriKernelBO *kbo)
+{
+    struct timeval time;
+
+    _glthread_LOCK_MUTEX(fMan->mutex);
+    gettimeofday(&time, NULL);
+    driTimeAdd(&time, &fMan->slabTimeout);
+
+    kbo->timeFreed = time;
+
+    if (kbo->bo.flags & DRM_BO_FLAG_CACHED)
+       DRMLISTADD(&kbo->head, &fMan->cached);
+    else
+       DRMLISTADD(&kbo->head, &fMan->unCached);
+
+    DRMLISTADDTAIL(&kbo->timeoutHead, &fMan->timeoutList);
+    driFreeTimeoutKBOsLocked(fMan, &time);
+
+    _glthread_UNLOCK_MUTEX(fMan->mutex);
+}
+
+/*
+ * Get a _DriKernelBO for us to use as storage for a slab.
+ *
+ */
+
+static struct _DriKernelBO *
+driAllocKernelBO(struct _DriSlabSizeHeader *header)
+
+{
+    struct _DriSlabPool *slabPool = header->slabPool;
+    struct _DriFreeSlabManager *fMan = slabPool->fMan;
+    drmMMListHead *list, *next, *head;
+    uint32_t size = header->bufSize * slabPool->desiredNumBuffers;
+    struct _DriKernelBO *kbo;
+    struct _DriKernelBO *kboTmp;
+    int ret;
+
+    /*
+     * FIXME: We should perhaps allow some variation in slabsize in order
+     * to efficiently reuse slabs.
+     */
+
+    size = (size <= slabPool->maxSlabSize) ? size : slabPool->maxSlabSize;
+    size = (size + slabPool->pageSize - 1) & ~(slabPool->pageSize - 1);
+    _glthread_LOCK_MUTEX(fMan->mutex);
+
+    kbo = NULL;
+
+  retry:
+    head = (slabPool->proposedFlags & DRM_BO_FLAG_CACHED) ?
+       &fMan->cached : &fMan->unCached;
+
+    for (list = head->next, next = list->next;
+        list != head;
+        list = next, next = list->next) {
+
+       kboTmp = DRMLISTENTRY(struct _DriKernelBO, list, head);
+
+       if ((kboTmp->bo.size == size) &&
+           (slabPool->pageAlignment == 0 ||
+            (kboTmp->pageAlignment % slabPool->pageAlignment) == 0)) {
+
+           if (!kbo)
+               kbo = kboTmp;
+
+           if ((kbo->bo.proposedFlags ^ slabPool->proposedFlags) == 0)
+               break;
+
+       }
+    }
+
+    if (kbo) {
+       DRMLISTDELINIT(&kbo->head);
+       DRMLISTDELINIT(&kbo->timeoutHead);
+    }
+
+    _glthread_UNLOCK_MUTEX(fMan->mutex);
+
+    if (kbo) {
+        uint64_t new_mask = kbo->bo.proposedFlags ^ slabPool->proposedFlags;
+
+       ret = 0;
+       if (new_mask) {
+           ret = drmBOSetStatus(kbo->fd, &kbo->bo, slabPool->proposedFlags,
+                                new_mask, DRM_BO_HINT_DONT_FENCE, 0, 0);
+       }
+       if (ret == 0)
+           return kbo;
+
+       driFreeKernelBO(kbo);
+       kbo = NULL;
+       goto retry;
+    }
+
+    kbo = calloc(1, sizeof(struct _DriKernelBO));
+    if (!kbo)
+       return NULL;
+
+    kbo->fd = slabPool->fd;
+    DRMINITLISTHEAD(&kbo->head);
+    DRMINITLISTHEAD(&kbo->timeoutHead);
+    ret = drmBOCreate(kbo->fd, size, slabPool->pageAlignment, NULL,
+                     slabPool->proposedFlags,
+                     DRM_BO_HINT_DONT_FENCE, &kbo->bo);
+    if (ret)
+       goto out_err0;
+
+    ret = drmBOMap(kbo->fd, &kbo->bo,
+                  DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE,
+                  0, &kbo->virtual);
+
+    if (ret)
+       goto out_err1;
+
+    ret = drmBOUnmap(kbo->fd, &kbo->bo);
+    if (ret)
+       goto out_err1;
+
+    return kbo;
+
+  out_err1:
+    drmBOUnreference(kbo->fd, &kbo->bo);
+  out_err0:
+    free(kbo);
+    return NULL;
+}
+
+
+static int
+driAllocSlab(struct _DriSlabSizeHeader *header)
+{
+    struct _DriSlab *slab;
+    struct _DriSlabBuffer *buf;
+    uint32_t numBuffers;
+    int ret;
+    int i;
+
+    slab = calloc(1, sizeof(*slab));
+    if (!slab)
+       return -ENOMEM;
+
+    slab->kbo = driAllocKernelBO(header);
+    if (!slab->kbo) {
+       ret = -ENOMEM;
+       goto out_err0;
+    }
+
+    numBuffers = slab->kbo->bo.size / header->bufSize;
+
+    slab->buffers = calloc(numBuffers, sizeof(*slab->buffers));
+    if (!slab->buffers) {
+       ret = -ENOMEM;
+       goto out_err1;
+    }
+
+    DRMINITLISTHEAD(&slab->head);
+    DRMINITLISTHEAD(&slab->freeBuffers);
+    slab->numBuffers = numBuffers;
+    slab->numFree = 0;
+    slab->header = header;
+
+    buf = slab->buffers;
+    for (i=0; i < numBuffers; ++i) {
+       buf->parent = slab;
+       buf->start = i* header->bufSize;
+       buf->mapCount = 0;
+       buf->isSlabBuffer = 1;
+       _glthread_INIT_COND(buf->event);
+       DRMLISTADDTAIL(&buf->head, &slab->freeBuffers);
+       slab->numFree++;
+       buf++;
+    }
+
+    DRMLISTADDTAIL(&slab->head, &header->slabs);
+
+    return 0;
+
+  out_err1:
+    driSetKernelBOFree(header->slabPool->fMan, slab->kbo);
+    free(slab->buffers);
+  out_err0:
+    free(slab);
+    return ret;
+}
+
+/*
+ * Delete a buffer from the slab header delayed list and put
+ * it on the slab free list.
+ */
+
+static void
+driSlabFreeBufferLocked(struct _DriSlabBuffer *buf)
+{
+    struct _DriSlab *slab = buf->parent;
+    struct _DriSlabSizeHeader *header = slab->header;
+    drmMMListHead *list = &buf->head;
+
+    DRMLISTDEL(list);
+    DRMLISTADDTAIL(list, &slab->freeBuffers);
+    slab->numFree++;
+
+    if (slab->head.next == &slab->head)
+       DRMLISTADDTAIL(&slab->head, &header->slabs);
+
+    if (slab->numFree == slab->numBuffers) {
+       list = &slab->head;
+       DRMLISTDEL(list);
+       DRMLISTADDTAIL(list, &header->freeSlabs);
+    }
+
+    if (header->slabs.next == &header->slabs ||
+       slab->numFree != slab->numBuffers) {
+
+       drmMMListHead *next;
+       struct _DriFreeSlabManager *fMan = header->slabPool->fMan;
+
+       for (list = header->freeSlabs.next, next = list->next;
+            list != &header->freeSlabs;
+            list = next, next = list->next) {
+
+           slab = DRMLISTENTRY(struct _DriSlab, list, head);
+
+           DRMLISTDELINIT(list);
+           driSetKernelBOFree(fMan, slab->kbo);
+           free(slab->buffers);
+           free(slab);
+       }
+    }
+}
+
+static void
+driSlabCheckFreeLocked(struct _DriSlabSizeHeader *header, int wait)
+{
+  drmMMListHead *list, *prev, *first;
+   struct _DriSlabBuffer *buf;
+   struct _DriSlab *slab;
+   int firstWasSignaled = 1;
+   int signaled;
+   int i;
+   int ret;
+
+   /*
+    * Rerun the freeing test if the youngest tested buffer
+    * was signaled, since there might be more idle buffers
+    * in the delay list.
+    */
+
+   while (firstWasSignaled) {
+       firstWasSignaled = 0;
+       signaled = 0;
+       first = header->delayedBuffers.next;
+
+       /* Only examine the oldest 1/3 of delayed buffers:
+       */
+       if (header->numDelayed > 3) {
+          for (i = 0; i < header->numDelayed; i += 3) {
+              first = first->next;
+          }
+       }
+
+       for (list = first, prev = list->prev;
+           list != &header->delayedBuffers;
+           list = prev, prev = list->prev) {
+          buf = DRMLISTENTRY(struct _DriSlabBuffer, list, head);
+          slab = buf->parent;
+
+          if (!signaled) {
+              if (wait) {
+                  ret = driFenceFinish(buf->fence, buf->fenceType, 0);
+                  if (ret)
+                      break;
+                  signaled = 1;
+                  wait = 0;
+              } else {
+                  signaled = driFenceSignaled(buf->fence, buf->fenceType);
+              }
+              if (signaled) {
+                  if (list == first)
+                      firstWasSignaled = 1;
+                  driFenceUnReference(&buf->fence);
+                  header->numDelayed--;
+                  driSlabFreeBufferLocked(buf);
+              }
+          } else if (driFenceSignaledCached(buf->fence, buf->fenceType)) {
+              driFenceUnReference(&buf->fence);
+              header->numDelayed--;
+              driSlabFreeBufferLocked(buf);
+          }
+       }
+   }
+}
+
+
+static struct _DriSlabBuffer *
+driSlabAllocBuffer(struct _DriSlabSizeHeader *header)
+{
+    static struct _DriSlabBuffer *buf;
+    struct _DriSlab *slab;
+    drmMMListHead *list;
+    int count = DRI_SLABPOOL_ALLOC_RETRIES;
+
+    _glthread_LOCK_MUTEX(header->mutex);
+    while(header->slabs.next == &header->slabs && count > 0) {
+        driSlabCheckFreeLocked(header, 0);
+       if (header->slabs.next != &header->slabs)
+         break;
+
+       _glthread_UNLOCK_MUTEX(header->mutex);
+       if (count != DRI_SLABPOOL_ALLOC_RETRIES)
+           usleep(1);
+       _glthread_LOCK_MUTEX(header->mutex);
+       (void) driAllocSlab(header);
+       count--;
+    }
+
+    list = header->slabs.next;
+    if (list == &header->slabs) {
+       _glthread_UNLOCK_MUTEX(header->mutex);
+       return NULL;
+    }
+    slab = DRMLISTENTRY(struct _DriSlab, list, head);
+    if (--slab->numFree == 0)
+       DRMLISTDELINIT(list);
+
+    list = slab->freeBuffers.next;
+    DRMLISTDELINIT(list);
+
+    _glthread_UNLOCK_MUTEX(header->mutex);
+    buf = DRMLISTENTRY(struct _DriSlabBuffer, list, head);
+    return buf;
+}
+
+static void *
+pool_create(struct _DriBufferPool *driPool, unsigned long size,
+           uint64_t flags, unsigned hint, unsigned alignment)
+{
+    struct _DriSlabPool *pool = (struct _DriSlabPool *) driPool->data;
+    struct _DriSlabSizeHeader *header;
+    struct _DriSlabBuffer *buf;
+    void *dummy;
+    int i;
+    int ret;
+
+    /*
+     * FIXME: Check for compatibility.
+     */
+
+    header = pool->headers;
+    for (i=0; i<pool->numBuckets; ++i) {
+      if (header->bufSize >= size)
+       break;
+      header++;
+    }
+
+    if (i < pool->numBuckets)
+       return driSlabAllocBuffer(header);
+
+
+    /*
+     * Fall back to allocate a buffer object directly from DRM.
+     * and wrap it in a driBO structure.
+     */
+
+
+    buf = calloc(1, sizeof(*buf));
+
+    if (!buf)
+       return NULL;
+
+    buf->bo = calloc(1, sizeof(*buf->bo));
+    if (!buf->bo)
+       goto out_err0;
+
+    if (alignment) {
+       if ((alignment < pool->pageSize) && (pool->pageSize % alignment))
+           goto out_err1;
+       if ((alignment > pool->pageSize) && (alignment % pool->pageSize))
+           goto out_err1;
+    }
+
+    ret = drmBOCreate(pool->fd, size, alignment / pool->pageSize, NULL,
+                       flags, hint, buf->bo);
+    if (ret)
+       goto out_err1;
+
+    ret  = drmBOMap(pool->fd, buf->bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE,
+                   0, &dummy);
+    if (ret)
+       goto out_err2;
+
+    ret = drmBOUnmap(pool->fd, buf->bo);
+    if (ret)
+       goto out_err2;
+
+    return buf;
+  out_err2:
+    drmBOUnreference(pool->fd, buf->bo);
+  out_err1:
+    free(buf->bo);
+  out_err0:
+    free(buf);
+    return NULL;
+}
+
+static int
+pool_destroy(struct _DriBufferPool *driPool, void *private)
+{
+    struct _DriSlabBuffer *buf =
+       (struct _DriSlabBuffer *) private;
+    struct _DriSlab *slab;
+    struct _DriSlabSizeHeader *header;
+
+    if (!buf->isSlabBuffer) {
+       struct _DriSlabPool *pool = (struct _DriSlabPool *) driPool->data;
+       int ret;
+
+       ret = drmBOUnreference(pool->fd, buf->bo);
+       free(buf->bo);
+       free(buf);
+       return ret;
+    }
+
+    slab = buf->parent;
+    header = slab->header;
+
+    _glthread_LOCK_MUTEX(header->mutex);
+    buf->unFenced = 0;
+    buf->mapCount = 0;
+
+    if (buf->fence && !driFenceSignaledCached(buf->fence, buf->fenceType)) {
+       DRMLISTADDTAIL(&buf->head, &header->delayedBuffers);
+       header->numDelayed++;
+    } else {
+       if (buf->fence)
+           driFenceUnReference(&buf->fence);
+       driSlabFreeBufferLocked(buf);
+    }
+
+    _glthread_UNLOCK_MUTEX(header->mutex);
+    return 0;
+}
+
+static int
+pool_waitIdle(struct _DriBufferPool *driPool, void *private,
+             _glthread_Mutex *mutex, int lazy)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   while(buf->unFenced)
+       _glthread_COND_WAIT(buf->event, *mutex);
+
+   if (!buf->fence)
+     return 0;
+
+   driFenceFinish(buf->fence, buf->fenceType, lazy);
+   driFenceUnReference(&buf->fence);
+
+   return 0;
+}
+
+static int
+pool_map(struct _DriBufferPool *pool, void *private, unsigned flags,
+         int hint, _glthread_Mutex *mutex, void **virtual)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+   int busy;
+
+   if (buf->isSlabBuffer)
+       busy = buf->unFenced || (buf->fence && !driFenceSignaledCached(buf->fence, buf->fenceType));
+   else
+       busy = buf->fence && !driFenceSignaled(buf->fence, buf->fenceType);
+
+
+   if (busy) {
+       if (hint & DRM_BO_HINT_DONT_BLOCK)
+          return -EBUSY;
+       else {
+          (void) pool_waitIdle(pool, private, mutex, 0);
+       }
+   }
+
+   ++buf->mapCount;
+   *virtual = (buf->isSlabBuffer) ?
+       (void *) ((uint8_t *) buf->parent->kbo->virtual + buf->start) :
+       (void *) buf->bo->virtual;
+
+   return 0;
+}
+
+static int
+pool_unmap(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   --buf->mapCount;
+   if (buf->mapCount == 0 && buf->isSlabBuffer)
+       _glthread_COND_BROADCAST(buf->event);
+
+   return 0;
+}
+
+static unsigned long
+pool_offset(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+   struct _DriSlab *slab;
+   struct _DriSlabSizeHeader *header;
+
+   if (!buf->isSlabBuffer) {
+       assert(buf->bo->proposedFlags & DRM_BO_FLAG_NO_MOVE);
+       return buf->bo->offset;
+   }
+
+   slab = buf->parent;
+   header = slab->header;
+
+   (void) header;
+   assert(header->slabPool->proposedFlags & DRM_BO_FLAG_NO_MOVE);
+   return slab->kbo->bo.offset + buf->start;
+}
+
+static unsigned long
+pool_poolOffset(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   return buf->start;
+}
+
+static uint64_t
+pool_flags(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   if (!buf->isSlabBuffer)
+       return buf->bo->flags;
+
+   return buf->parent->kbo->bo.flags;
+}
+
+static unsigned long
+pool_size(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+   if (!buf->isSlabBuffer)
+       return buf->bo->size;
+
+   return buf->parent->header->bufSize;
+}
+
+static int
+pool_fence(struct _DriBufferPool *pool, void *private,
+           struct _DriFenceObject *fence)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+   drmBO *bo;
+
+   if (buf->fence)
+      driFenceUnReference(&buf->fence);
+
+   buf->fence = driFenceReference(fence);
+   bo = (buf->isSlabBuffer) ?
+     &buf->parent->kbo->bo:
+     buf->bo;
+   buf->fenceType = bo->fenceFlags;
+
+   buf->unFenced = 0;
+   _glthread_COND_BROADCAST(buf->event);
+
+   return 0;
+}
+
+static drmBO *
+pool_kernel(struct _DriBufferPool *pool, void *private)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   return (buf->isSlabBuffer) ? &buf->parent->kbo->bo : buf->bo;
+}
+
+static int
+pool_validate(struct _DriBufferPool *pool, void *private,
+             _glthread_Mutex *mutex)
+{
+   struct _DriSlabBuffer *buf = (struct _DriSlabBuffer *) private;
+
+   if (!buf->isSlabBuffer)
+       return 0;
+
+   while(buf->mapCount != 0)
+       _glthread_COND_WAIT(buf->event, *mutex);
+
+   buf->unFenced = 1;
+   return 0;
+}
+
+
+struct _DriFreeSlabManager *
+driInitFreeSlabManager(uint32_t checkIntervalMsec, uint32_t slabTimeoutMsec)
+{
+    struct _DriFreeSlabManager *tmp;
+
+    tmp = calloc(1, sizeof(*tmp));
+    if (!tmp)
+       return NULL;
+
+    _glthread_INIT_MUTEX(tmp->mutex);
+    _glthread_LOCK_MUTEX(tmp->mutex);
+    tmp->slabTimeout.tv_usec = slabTimeoutMsec*1000;
+    tmp->slabTimeout.tv_sec = tmp->slabTimeout.tv_usec / 1000000;
+    tmp->slabTimeout.tv_usec -=  tmp->slabTimeout.tv_sec*1000000;
+
+    tmp->checkInterval.tv_usec = checkIntervalMsec*1000;
+    tmp->checkInterval.tv_sec = tmp->checkInterval.tv_usec / 1000000;
+    tmp->checkInterval.tv_usec -=  tmp->checkInterval.tv_sec*1000000;
+
+    gettimeofday(&tmp->nextCheck, NULL);
+    driTimeAdd(&tmp->nextCheck, &tmp->checkInterval);
+    DRMINITLISTHEAD(&tmp->timeoutList);
+    DRMINITLISTHEAD(&tmp->unCached);
+    DRMINITLISTHEAD(&tmp->cached);
+    _glthread_UNLOCK_MUTEX(tmp->mutex);
+
+    return tmp;
+}
+
+void
+driFinishFreeSlabManager(struct _DriFreeSlabManager *fMan)
+{
+    struct timeval time;
+
+    time = fMan->nextCheck;
+    driTimeAdd(&time, &fMan->checkInterval);
+
+    _glthread_LOCK_MUTEX(fMan->mutex);
+    driFreeTimeoutKBOsLocked(fMan, &time);
+    _glthread_UNLOCK_MUTEX(fMan->mutex);
+
+    assert(fMan->timeoutList.next == &fMan->timeoutList);
+    assert(fMan->unCached.next == &fMan->unCached);
+    assert(fMan->cached.next == &fMan->cached);
+
+    free(fMan);
+}
+
+static void
+driInitSizeHeader(struct _DriSlabPool *pool, uint32_t size,
+                 struct _DriSlabSizeHeader *header)
+{
+    _glthread_INIT_MUTEX(header->mutex);
+    _glthread_LOCK_MUTEX(header->mutex);
+
+    DRMINITLISTHEAD(&header->slabs);
+    DRMINITLISTHEAD(&header->freeSlabs);
+    DRMINITLISTHEAD(&header->delayedBuffers);
+
+    header->numDelayed = 0;
+    header->slabPool = pool;
+    header->bufSize = size;
+
+    _glthread_UNLOCK_MUTEX(header->mutex);
+}
+
+static void
+driFinishSizeHeader(struct _DriSlabSizeHeader *header)
+{
+    drmMMListHead *list, *next;
+    struct _DriSlabBuffer *buf;
+
+    _glthread_LOCK_MUTEX(header->mutex);
+    for (list = header->delayedBuffers.next, next = list->next;
+        list != &header->delayedBuffers;
+        list = next, next = list->next) {
+
+       buf = DRMLISTENTRY(struct _DriSlabBuffer, list , head);
+       if (buf->fence) {
+           (void) driFenceFinish(buf->fence, buf->fenceType, 0);
+           driFenceUnReference(&buf->fence);
+       }
+       header->numDelayed--;
+       driSlabFreeBufferLocked(buf);
+    }
+    _glthread_UNLOCK_MUTEX(header->mutex);
+}
+
+static void
+pool_takedown(struct _DriBufferPool *driPool)
+{
+   struct _DriSlabPool *pool = driPool->data;
+   int i;
+
+   for (i=0; i<pool->numBuckets; ++i) {
+     driFinishSizeHeader(&pool->headers[i]);
+   }
+
+   free(pool->headers);
+   free(pool->bucketSizes);
+   free(pool);
+   free(driPool);
+}
+
+struct _DriBufferPool *
+driSlabPoolInit(int fd, uint64_t flags,
+               uint64_t validMask,
+               uint32_t smallestSize,
+               uint32_t numSizes,
+               uint32_t desiredNumBuffers,
+               uint32_t maxSlabSize,
+               uint32_t pageAlignment,
+               struct _DriFreeSlabManager *fMan)
+{
+    struct _DriBufferPool *driPool;
+    struct _DriSlabPool *pool;
+    uint32_t i;
+
+    driPool = calloc(1, sizeof(*driPool));
+    if (!driPool)
+       return NULL;
+
+    pool = calloc(1, sizeof(*pool));
+    if (!pool)
+       goto out_err0;
+
+    pool->bucketSizes = calloc(numSizes, sizeof(*pool->bucketSizes));
+    if (!pool->bucketSizes)
+       goto out_err1;
+
+    pool->headers = calloc(numSizes, sizeof(*pool->headers));
+    if (!pool->headers)
+       goto out_err2;
+
+    pool->fMan = fMan;
+    pool->proposedFlags = flags;
+    pool->validMask = validMask;
+    pool->numBuckets = numSizes;
+    pool->pageSize = getpagesize();
+    pool->fd = fd;
+    pool->pageAlignment = pageAlignment;
+    pool->maxSlabSize = maxSlabSize;
+    pool->desiredNumBuffers = desiredNumBuffers;
+
+    for (i=0; i<pool->numBuckets; ++i) {
+       pool->bucketSizes[i] = (smallestSize << i);
+       driInitSizeHeader(pool, pool->bucketSizes[i],
+                         &pool->headers[i]);
+    }
+
+    driPool->data = (void *) pool;
+    driPool->map = &pool_map;
+    driPool->unmap = &pool_unmap;
+    driPool->destroy = &pool_destroy;
+    driPool->offset = &pool_offset;
+    driPool->poolOffset = &pool_poolOffset;
+    driPool->flags = &pool_flags;
+    driPool->size = &pool_size;
+    driPool->create = &pool_create;
+    driPool->fence = &pool_fence;
+    driPool->kernel = &pool_kernel;
+    driPool->validate = &pool_validate;
+    driPool->waitIdle = &pool_waitIdle;
+    driPool->takeDown = &pool_takedown;
+
+    return driPool;
+
+  out_err2:
+    free(pool->bucketSizes);
+  out_err1:
+    free(pool);
+  out_err0:
+    free(driPool);
+
+    return NULL;
+}
diff --git a/src/gallium/winsys/drm/intel/dri/Makefile b/src/gallium/winsys/drm/intel/dri/Makefile
new file mode 100644 (file)
index 0000000..2046441
--- /dev/null
@@ -0,0 +1,33 @@
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = i915_dri.so
+LIBNAME_EGL = egl_i915_dri.so
+
+PIPE_DRIVERS = \
+       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+       ../common/libinteldrm.a \
+       $(TOP)/src/gallium/drivers/i915simple/libi915simple.a
+
+
+DRIVER_SOURCES = \
+       intel_winsys_softpipe.c \
+       intel_swapbuffers.c \
+       intel_context.c \
+       intel_lock.c \
+       intel_screen.c
+
+C_SOURCES = \
+       $(COMMON_GALLIUM_SOURCES) \
+       $(DRIVER_SOURCES)
+
+ASM_SOURCES = 
+
+DRIVER_DEFINES = -I../common $(shell pkg-config libdrm --atleast-version=2.3.1 \
+                               && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
+
+include ../../Makefile.template
+
+#intel_tex_layout.o: $(TOP)/src/mesa/drivers/dri/intel/intel_tex_layout.c
+
+symlinks:
diff --git a/src/gallium/winsys/drm/intel/dri/SConscript b/src/gallium/winsys/drm/intel/dri/SConscript
new file mode 100644 (file)
index 0000000..6a4f50a
--- /dev/null
@@ -0,0 +1,41 @@
+Import('*')
+
+if 'mesa' in env['statetrackers']:
+
+       env = drienv.Clone()
+
+       env.Append(CPPPATH = [
+               '../intel',
+               'server'
+       ])
+
+       #MINIGLX_SOURCES = server/intel_dri.c
+
+       DRIVER_SOURCES = [
+               'intel_winsys_pipe.c',
+               'intel_winsys_softpipe.c',
+               'intel_winsys_i915.c',
+               'intel_batchbuffer.c',
+               'intel_swapbuffers.c',
+               'intel_context.c',
+               'intel_lock.c',
+               'intel_screen.c',
+               'intel_batchpool.c',
+       ]
+
+       sources = \
+               COMMON_GALLIUM_SOURCES + \
+               COMMON_BM_SOURCES + \
+               DRIVER_SOURCES
+
+       drivers = [
+               softpipe,
+               i915simple
+       ]
+
+       # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
+       env.SharedLibrary(
+               target ='i915tex_dri.so',
+               source = sources,
+               LIBS = drivers + mesa + auxiliaries + env['LIBS'],
+       )
diff --git a/src/gallium/winsys/drm/intel/dri/intel_batchbuffer.h b/src/gallium/winsys/drm/intel/dri/intel_batchbuffer.h
new file mode 100644 (file)
index 0000000..3e95326
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef INTEL_BATCHBUFFER_H
+#define INTEL_BATCHBUFFER_H
+
+#include "intel_be_batchbuffer.h"
+
+/*
+ * Need to redefine the BATCH defines
+ */
+
+#undef BEGIN_BATCH
+#define BEGIN_BATCH(dwords, relocs) \
+   (i915_batchbuffer_check(&intel->base.batch->base, dwords, relocs))
+
+#undef OUT_BATCH
+#define OUT_BATCH(d) \
+   i915_batchbuffer_dword(&intel->base.batch->base, d)
+
+#undef OUT_RELOC
+#define OUT_RELOC(buf,flags,mask,delta) do {                                   \
+   assert((delta) >= 0);                                                       \
+   intel_be_offset_relocation(intel->base.batch, delta, buf, flags, mask);     \
+} while (0)
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/dri/intel_context.c b/src/gallium/winsys/drm/intel/dri/intel_context.c
new file mode 100644 (file)
index 0000000..97ef731
--- /dev/null
@@ -0,0 +1,337 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#include "i830_dri.h"
+
+#include "intel_screen.h"
+#include "intel_context.h"
+#include "intel_swapbuffers.h"
+#include "intel_batchbuffer.h"
+#include "intel_winsys_softpipe.h"
+
+#include "i915simple/i915_screen.h"
+
+#include "state_tracker/st_public.h"
+#include "state_tracker/st_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_context.h"
+
+#include "utils.h"
+
+
+#ifdef DEBUG
+int __intel_debug = 0;
+#endif
+
+
+#define need_GL_ARB_multisample
+#define need_GL_ARB_point_parameters
+#define need_GL_ARB_texture_compression
+#define need_GL_ARB_vertex_buffer_object
+#define need_GL_ARB_vertex_program
+#define need_GL_ARB_window_pos
+#define need_GL_EXT_blend_color
+#define need_GL_EXT_blend_equation_separate
+#define need_GL_EXT_blend_func_separate
+#define need_GL_EXT_blend_minmax
+#define need_GL_EXT_cull_vertex
+#define need_GL_EXT_fog_coord
+#define need_GL_EXT_framebuffer_object
+#define need_GL_EXT_multi_draw_arrays
+#define need_GL_EXT_secondary_color
+#define need_GL_NV_vertex_program
+#include "extension_helper.h"
+
+
+/**
+ * Extension strings exported by the intel driver.
+ *
+ * \note
+ * It appears that ARB_texture_env_crossbar has "disappeared" compared to the
+ * old i830-specific driver.
+ */
+const struct dri_extension card_extensions[] = {
+   {"GL_ARB_multisample", GL_ARB_multisample_functions},
+   {"GL_ARB_multitexture", NULL},
+   {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
+   {"GL_ARB_texture_border_clamp", NULL},
+   {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
+   {"GL_ARB_texture_cube_map", NULL},
+   {"GL_ARB_texture_env_add", NULL},
+   {"GL_ARB_texture_env_combine", NULL},
+   {"GL_ARB_texture_env_dot3", NULL},
+   {"GL_ARB_texture_mirrored_repeat", NULL},
+   {"GL_ARB_texture_rectangle", NULL},
+   {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
+   {"GL_ARB_pixel_buffer_object", NULL},
+   {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
+   {"GL_ARB_window_pos", GL_ARB_window_pos_functions},
+   {"GL_EXT_blend_color", GL_EXT_blend_color_functions},
+   {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
+   {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
+   {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
+   {"GL_EXT_blend_subtract", NULL},
+   {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
+   {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions},
+   {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},
+   {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
+   {"GL_EXT_packed_depth_stencil", NULL},
+   {"GL_EXT_pixel_buffer_object", NULL},
+   {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
+   {"GL_EXT_stencil_wrap", NULL},
+   {"GL_EXT_texture_edge_clamp", NULL},
+   {"GL_EXT_texture_env_combine", NULL},
+   {"GL_EXT_texture_env_dot3", NULL},
+   {"GL_EXT_texture_filter_anisotropic", NULL},
+   {"GL_EXT_texture_lod_bias", NULL},
+   {"GL_3DFX_texture_compression_FXT1", NULL},
+   {"GL_APPLE_client_storage", NULL},
+   {"GL_MESA_pack_invert", NULL},
+   {"GL_MESA_ycbcr_texture", NULL},
+   {"GL_NV_blend_square", NULL},
+   {"GL_NV_vertex_program", GL_NV_vertex_program_functions},
+   {"GL_NV_vertex_program1_1", NULL},
+   {"GL_SGIS_generate_mipmap", NULL },
+   {NULL, NULL}
+};
+
+
+
+#ifdef DEBUG
+static const struct dri_debug_control debug_control[] = {
+   {"ioctl", DEBUG_IOCTL},
+   {"bat", DEBUG_BATCH},
+   {"lock", DEBUG_LOCK},
+   {"swap", DEBUG_SWAP},
+   {NULL, 0}
+};
+#endif
+
+
+
+static void
+intel_lock_hardware(struct intel_be_context *context)
+{
+   struct intel_context *intel = (struct intel_context *)context;
+   LOCK_HARDWARE(intel);
+}
+
+static void
+intel_unlock_hardware(struct intel_be_context *context)
+{
+   struct intel_context *intel = (struct intel_context *)context;
+   UNLOCK_HARDWARE(intel);
+}
+
+static boolean
+intel_locked_hardware(struct intel_be_context *context)
+{
+   struct intel_context *intel = (struct intel_context *)context;
+   return intel->locked ? TRUE : FALSE;
+}
+
+GLboolean
+intelCreateContext(const __GLcontextModes * visual,
+                   __DRIcontextPrivate * driContextPriv,
+                   void *sharedContextPrivate)
+{
+   struct intel_context *intel = CALLOC_STRUCT(intel_context);
+   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
+   struct intel_screen *intelScreen = intel_screen(sPriv);
+   drmI830Sarea *saPriv = intelScreen->sarea;
+   int fthrottle_mode;
+   GLboolean havePools;
+   struct pipe_context *pipe;
+   struct st_context *st_share = NULL;
+
+   if (sharedContextPrivate) {
+      st_share = ((struct intel_context *) sharedContextPrivate)->st;
+   }
+
+   driContextPriv->driverPrivate = intel;
+   intel->intelScreen = intelScreen;
+   intel->driScreen = sPriv;
+   intel->sarea = saPriv;
+
+   driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache,
+                       intel->driScreen->myNum, "i915");
+
+
+   /*
+    * memory pools
+    */
+   DRM_LIGHT_LOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
+   // ZZZ JB should be per screen and not be done per context
+   havePools = intelCreatePools(sPriv);
+   DRM_UNLOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
+   if (!havePools)
+      return GL_FALSE;
+
+
+   /* Dri stuff */
+   intel->hHWContext = driContextPriv->hHWContext;
+   intel->driFd = sPriv->fd;
+   intel->driHwLock = (drmLock *) & sPriv->pSAREA->lock;
+
+   fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode");
+   intel->iw.irq_seq = -1;
+   intel->irqsEmitted = 0;
+
+   intel->last_swap_fence = NULL;
+   intel->first_swap_fence = NULL;
+
+#ifdef DEBUG
+   __intel_debug = driParseDebugString(getenv("INTEL_DEBUG"), debug_control);
+#endif
+   intel->base.hardware_lock = intel_lock_hardware;
+   intel->base.hardware_unlock = intel_unlock_hardware;
+   intel->base.hardware_locked = intel_locked_hardware;
+
+   intel_be_init_context(&intel->base, &intelScreen->base);
+
+   /*
+    * Pipe-related setup
+    */
+   if (getenv("INTEL_SP")) {
+      /* use softpipe driver instead of hw */
+      pipe = intel_create_softpipe( intel, &intelScreen->base.base );
+   }
+   else {
+      switch (intel->intelScreen->deviceID) {
+      case PCI_CHIP_I945_G:
+      case PCI_CHIP_I945_GM:
+      case PCI_CHIP_I945_GME:
+      case PCI_CHIP_G33_G:
+      case PCI_CHIP_Q33_G:
+      case PCI_CHIP_Q35_G:
+      case PCI_CHIP_I915_G:
+      case PCI_CHIP_I915_GM:
+        pipe = i915_create_context(intelScreen->base.screen,
+                                   &intelScreen->base.base,
+                                   &intel->base.base);
+        break;
+      default:
+        fprintf(stderr, "Unknown PCIID %x in %s, using software driver\n",
+                 intel->intelScreen->deviceID, __FUNCTION__);
+
+        pipe = intel_create_softpipe( intel, &intelScreen->base.base );
+        break;
+      }
+   }
+
+   pipe->priv = intel;
+
+   intel->st = st_create_context(pipe, visual, st_share);
+
+   driInitExtensions( intel->st->ctx, card_extensions, GL_TRUE );
+
+   return GL_TRUE;
+}
+
+
+void
+intelDestroyContext(__DRIcontextPrivate * driContextPriv)
+{
+   struct intel_context *intel = intel_context(driContextPriv);
+
+   assert(intel);               /* should never be null */
+   if (intel) {
+      st_finish(intel->st);
+
+      if (intel->last_swap_fence) {
+        driFenceFinish(intel->last_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE);
+        driFenceUnReference(&intel->last_swap_fence);
+        intel->last_swap_fence = NULL;
+      }
+      if (intel->first_swap_fence) {
+        driFenceFinish(intel->first_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE);
+        driFenceUnReference(&intel->first_swap_fence);
+        intel->first_swap_fence = NULL;
+      }
+
+      if (intel->intelScreen->dummyContext == intel)
+         intel->intelScreen->dummyContext = NULL;
+
+      st_destroy_context(intel->st);
+      intel_be_destroy_context(&intel->base);
+      free(intel);
+   }
+}
+
+
+GLboolean
+intelUnbindContext(__DRIcontextPrivate * driContextPriv)
+{
+   struct intel_context *intel = intel_context(driContextPriv);
+   st_flush(intel->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+   /* XXX make_current(NULL)? */
+   return GL_TRUE;
+}
+
+
+GLboolean
+intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
+                 __DRIdrawablePrivate * driDrawPriv,
+                 __DRIdrawablePrivate * driReadPriv)
+{
+   if (driContextPriv) {
+      struct intel_context *intel = intel_context(driContextPriv);
+      struct intel_framebuffer *draw_fb = intel_framebuffer(driDrawPriv);
+      struct intel_framebuffer *read_fb = intel_framebuffer(driReadPriv);
+
+      assert(draw_fb->stfb);
+      assert(read_fb->stfb);
+
+      /* This is for situations in which we need a rendering context but
+       * there may not be any currently bound.
+       */
+      intel->intelScreen->dummyContext = intel;
+
+      st_make_current(intel->st, draw_fb->stfb, read_fb->stfb);
+
+      if ((intel->driDrawable != driDrawPriv) ||
+         (intel->lastStamp != driDrawPriv->lastStamp)) {
+         intel->driDrawable = driDrawPriv;
+         intelUpdateWindowSize(driDrawPriv);
+         intel->lastStamp = driDrawPriv->lastStamp;
+      }
+
+      /* The size of the draw buffer will have been updated above.
+       * If the readbuffer is a different window, check/update its size now.
+       */
+      if (driReadPriv != driDrawPriv) {
+         intelUpdateWindowSize(driReadPriv);
+      }
+
+   }
+   else {
+      st_make_current(NULL, NULL, NULL);
+   }
+
+   return GL_TRUE;
+}
diff --git a/src/gallium/winsys/drm/intel/dri/intel_context.h b/src/gallium/winsys/drm/intel/dri/intel_context.h
new file mode 100644 (file)
index 0000000..5d22a42
--- /dev/null
@@ -0,0 +1,164 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef INTEL_CONTEXT_H
+#define INTEL_CONTEXT_H
+
+#include <stdint.h>
+#include "drm.h"
+
+#include "pipe/p_debug.h"
+
+#include "intel_screen.h"
+#include "i915_drm.h"
+
+#include "intel_be_context.h"
+
+
+struct pipe_context;
+struct intel_context;
+struct _DriBufferObject;
+struct st_context;
+
+
+#define INTEL_MAX_FIXUP 64
+
+/**
+ * Intel rendering context, contains a state tracker and intel-specific info.
+ */
+struct intel_context
+{
+   struct intel_be_context base;
+   struct st_context *st;
+
+   struct _DriFenceObject *last_swap_fence;
+   struct _DriFenceObject *first_swap_fence;
+
+//   struct intel_batchbuffer *batch;
+
+   boolean locked;
+   char *prevLockFile;
+   int prevLockLine;
+
+   uint irqsEmitted;
+   drm_i915_irq_wait_t iw;
+
+   drm_context_t hHWContext;
+   drmLock *driHwLock;
+   int driFd;
+
+   __DRIdrawablePrivate *driDrawable;
+   __DRIscreenPrivate *driScreen;
+   struct intel_screen *intelScreen;
+   drmI830Sarea *sarea;
+
+   uint lastStamp;
+
+   /**
+    * Configuration cache
+    */
+   driOptionCache optionCache;
+};
+
+
+
+/**
+ * Intel framebuffer.
+ */
+struct intel_framebuffer
+{
+   struct st_framebuffer *stfb;
+
+   /* other fields TBD */
+   int other;
+};
+
+
+
+
+/* These are functions now:
+ */
+void LOCK_HARDWARE( struct intel_context *intel );
+void UNLOCK_HARDWARE( struct intel_context *intel );
+
+extern char *__progname;
+
+
+
+/* ================================================================
+ * Debugging:
+ */
+#ifdef DEBUG
+extern int __intel_debug;
+
+#define DEBUG_SWAP     0x1
+#define DEBUG_LOCK      0x2
+#define DEBUG_IOCTL    0x4
+#define DEBUG_BATCH     0x8
+
+#define DBG(flag, ...)  do {                   \
+   if (__intel_debug & (DEBUG_##flag))                 \
+      printf(__VA_ARGS__);             \
+} while(0)
+
+#else
+#define DBG(flag, ...)
+#endif
+
+
+
+#define PCI_CHIP_845_G                 0x2562
+#define PCI_CHIP_I830_M                        0x3577
+#define PCI_CHIP_I855_GM               0x3582
+#define PCI_CHIP_I865_G                        0x2572
+#define PCI_CHIP_I915_G                        0x2582
+#define PCI_CHIP_I915_GM               0x2592
+#define PCI_CHIP_I945_G                        0x2772
+#define PCI_CHIP_I945_GM               0x27A2
+#define PCI_CHIP_I945_GME              0x27AE
+#define PCI_CHIP_G33_G                 0x29C2
+#define PCI_CHIP_Q35_G                 0x29B2
+#define PCI_CHIP_Q33_G                 0x29D2
+
+
+/** Cast wrapper */
+static INLINE struct intel_context *
+intel_context(__DRIcontextPrivate *driContextPriv)
+{
+   return (struct intel_context *) driContextPriv->driverPrivate;
+}
+
+
+/** Cast wrapper */
+static INLINE struct intel_framebuffer *
+intel_framebuffer(__DRIdrawablePrivate * driDrawPriv)
+{
+   return (struct intel_framebuffer *) driDrawPriv->driverPrivate;
+}
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/dri/intel_lock.c b/src/gallium/winsys/drm/intel/dri/intel_lock.c
new file mode 100644 (file)
index 0000000..406284c
--- /dev/null
@@ -0,0 +1,102 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#include "main/glheader.h"
+#include "glapi/glthread.h"
+#include <GL/internal/glcore.h>
+#include "state_tracker/st_public.h"
+#include "intel_context.h"
+#include "i830_dri.h"
+
+
+
+_glthread_DECLARE_STATIC_MUTEX( lockMutex );
+
+
+static void
+intelContendedLock(struct intel_context *intel, uint flags)
+{
+   __DRIdrawablePrivate *dPriv = intel->driDrawable;
+   __DRIscreenPrivate *sPriv = intel->driScreen;
+   struct intel_screen *intelScreen = intel_screen(sPriv);
+   drmI830Sarea *sarea = intel->sarea;
+
+   drmGetLock(intel->driFd, intel->hHWContext, flags);
+
+   DBG(LOCK, "%s - got contended lock\n", __progname);
+
+   /* If the window moved, may need to set a new cliprect now.
+    *
+    * NOTE: This releases and regains the hw lock, so all state
+    * checking must be done *after* this call:
+    */
+   if (dPriv)
+      DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
+
+   if (sarea->width != intelScreen->front.width ||
+       sarea->height != intelScreen->front.height) {
+
+      intelUpdateScreenRotation(sPriv, sarea);
+   }
+}
+
+
+/* Lock the hardware and validate our state.
+ */
+void LOCK_HARDWARE( struct intel_context *intel )
+{
+    char __ret = 0;
+
+    _glthread_LOCK_MUTEX(lockMutex);
+    assert(!intel->locked);
+
+    DRM_CAS(intel->driHwLock, intel->hHWContext,
+            (DRM_LOCK_HELD|intel->hHWContext), __ret);
+
+    if (__ret)
+       intelContendedLock( intel, 0 );
+
+    DBG(LOCK, "%s - locked\n", __progname);
+
+    intel->locked = 1;
+}
+
+
+/* Unlock the hardware using the global current context
+ */
+void UNLOCK_HARDWARE( struct intel_context *intel )
+{
+   assert(intel->locked);
+   intel->locked = 0;
+
+   DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext);
+
+   _glthread_UNLOCK_MUTEX(lockMutex);
+
+   DBG(LOCK, "%s - unlocked\n", __progname);
+}
diff --git a/src/gallium/winsys/drm/intel/dri/intel_reg.h b/src/gallium/winsys/drm/intel/dri/intel_reg.h
new file mode 100644 (file)
index 0000000..4f33bee
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#ifndef _INTEL_REG_H_
+#define _INTEL_REG_H_
+
+
+#define BR00_BITBLT_CLIENT   0x40000000
+#define BR00_OP_COLOR_BLT    0x10000000
+#define BR00_OP_SRC_COPY_BLT 0x10C00000
+#define BR13_SOLID_PATTERN   0x80000000
+
+#define XY_COLOR_BLT_CMD               ((2<<29)|(0x50<<22)|0x4)
+#define XY_COLOR_BLT_WRITE_ALPHA       (1<<21)
+#define XY_COLOR_BLT_WRITE_RGB         (1<<20)
+
+#define XY_SRC_COPY_BLT_CMD             ((2<<29)|(0x53<<22)|6)
+#define XY_SRC_COPY_BLT_WRITE_ALPHA     (1<<21)
+#define XY_SRC_COPY_BLT_WRITE_RGB       (1<<20)
+
+#define MI_WAIT_FOR_EVENT               ((0x3<<23))
+#define MI_WAIT_FOR_PLANE_B_FLIP        (1<<6)
+#define MI_WAIT_FOR_PLANE_A_FLIP        (1<<2)
+
+#define MI_BATCH_BUFFER_END            (0xA<<23)
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/dri/intel_screen.c b/src/gallium/winsys/drm/intel/dri/intel_screen.c
new file mode 100644 (file)
index 0000000..46d4861
--- /dev/null
@@ -0,0 +1,607 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#include "utils.h"
+#include "vblank.h"
+#include "xmlpool.h"
+
+#include "intel_context.h"
+#include "intel_screen.h"
+#include "intel_batchbuffer.h"
+#include "intel_swapbuffers.h"
+
+#include "i830_dri.h"
+#include "ws_dri_bufpool.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_screen.h"
+#include "pipe/p_inlines.h"
+#include "state_tracker/st_public.h"
+#include "state_tracker/st_cb_fbo.h"
+
+static void
+intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle);
+
+static void
+intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle)
+{
+   struct pipe_screen *screen = intelScreen->base.screen;
+   struct pipe_texture *texture;
+   struct pipe_texture templat;
+   struct pipe_surface *surface;
+   struct pipe_buffer *buffer;
+   unsigned pitch;
+
+   assert(intelScreen->front.cpp == 4);
+
+   buffer = intel_be_buffer_from_handle(&intelScreen->base,
+                                        "front", handle);
+
+   if (!buffer)
+      return;
+
+   intelScreen->front.buffer = dri_bo(buffer);
+
+   memset(&templat, 0, sizeof(templat));
+   templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
+   templat.target = PIPE_TEXTURE_2D;
+   templat.last_level = 0;
+   templat.depth[0] = 1;
+   templat.format = PIPE_FORMAT_A8R8G8B8_UNORM;
+   templat.width[0] = intelScreen->front.width;
+   templat.height[0] = intelScreen->front.height;
+   pf_get_block(templat.format, &templat.block);
+   pitch = intelScreen->front.pitch;
+
+   texture = screen->texture_blanket(screen,
+                                     &templat,
+                                     &pitch,
+                                     buffer);
+
+   /* Unref the buffer we don't need it anyways */
+   pipe_buffer_reference(screen->winsys, &buffer, NULL);
+
+   surface = screen->get_tex_surface(screen,
+                                     texture,
+                                     0,
+                                     0,
+                                     0,
+                                     PIPE_BUFFER_USAGE_GPU_WRITE);
+
+   intelScreen->front.texture = texture;
+   intelScreen->front.surface = surface;
+}
+
+PUBLIC const char __driConfigOptions[] =
+   DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE
+   DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
+   DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
+   DRI_CONF_SECTION_END DRI_CONF_SECTION_QUALITY
+//   DRI_CONF_FORCE_S3TC_ENABLE(false)
+   DRI_CONF_ALLOW_LARGE_TEXTURES(1)
+   DRI_CONF_SECTION_END DRI_CONF_END;
+
+const uint __driNConfigOptions = 3;
+
+#ifdef USE_NEW_INTERFACE
+static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
+#endif /*USE_NEW_INTERFACE */
+
+extern const struct dri_extension card_extensions[];
+
+
+
+
+static void
+intelPrintDRIInfo(struct intel_screen * intelScreen,
+                  __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv)
+{
+   fprintf(stderr, "*** Front size:   0x%x  offset: 0x%x  pitch: %d\n",
+           intelScreen->front.size, intelScreen->front.offset,
+           intelScreen->front.pitch);
+   fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem);
+}
+
+
+#if 0
+static void
+intelPrintSAREA(const drmI830Sarea * sarea)
+{
+   fprintf(stderr, "SAREA: sarea width %d  height %d\n", sarea->width,
+           sarea->height);
+   fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch);
+   fprintf(stderr,
+           "SAREA: front offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
+           sarea->front_offset, sarea->front_size,
+           (unsigned) sarea->front_handle);
+   fprintf(stderr,
+           "SAREA: back  offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
+           sarea->back_offset, sarea->back_size,
+           (unsigned) sarea->back_handle);
+   fprintf(stderr, "SAREA: depth offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
+           sarea->depth_offset, sarea->depth_size,
+           (unsigned) sarea->depth_handle);
+   fprintf(stderr, "SAREA: tex   offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
+           sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle);
+   fprintf(stderr, "SAREA: rotation: %d\n", sarea->rotation);
+   fprintf(stderr,
+           "SAREA: rotated offset: 0x%08x  size: 0x%x\n",
+           sarea->rotated_offset, sarea->rotated_size);
+   fprintf(stderr, "SAREA: rotated pitch: %d\n", sarea->rotated_pitch);
+}
+#endif
+
+
+/**
+ * Use the information in the sarea to update the screen parameters
+ * related to screen rotation. Needs to be called locked.
+ */
+void
+intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea)
+{
+   struct intel_screen *intelScreen = intel_screen(sPriv);
+
+   if (intelScreen->front.map) {
+      drmUnmap(intelScreen->front.map, intelScreen->front.size);
+      intelScreen->front.map = NULL;
+   }
+
+   if (intelScreen->front.buffer)
+      driDeleteBuffers(1, &intelScreen->front.buffer);
+
+   intelScreen->front.width = sarea->width;
+   intelScreen->front.height = sarea->height;
+   intelScreen->front.offset = sarea->front_offset;
+   intelScreen->front.pitch = sarea->pitch * intelScreen->front.cpp;
+   intelScreen->front.size = sarea->front_size;
+   intelScreen->front.handle = sarea->front_handle;
+
+   assert( sarea->front_size >=
+          intelScreen->front.pitch * intelScreen->front.height );
+
+#if 0 /* JB not important */
+   if (!sarea->front_handle)
+      return;
+
+   if (drmMap(sPriv->fd,
+             sarea->front_handle,
+             intelScreen->front.size,
+             (drmAddress *) & intelScreen->front.map) != 0) {
+      fprintf(stderr, "drmMap(frontbuffer) failed!\n");
+      return;
+   }
+#endif
+
+#if 0 /* JB */
+   if (intelScreen->staticPool) {
+      driGenBuffers(intelScreen->staticPool, "static region", 1,
+                   &intelScreen->front.buffer, 64,
+                   DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_NO_MOVE |
+                   DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0);
+
+      driBOSetStatic(intelScreen->front.buffer,
+                    intelScreen->front.offset,
+                    intelScreen->front.pitch * intelScreen->front.height,
+                    intelScreen->front.map, 0);
+   }
+#else
+   if (intelScreen->base.staticPool) {
+      if (intelScreen->front.buffer) {
+        driBOUnReference(intelScreen->front.buffer);
+        pipe_surface_reference(&intelScreen->front.surface, NULL);
+        pipe_texture_reference(&intelScreen->front.texture, NULL);
+      }
+      intelCreateSurface(intelScreen, &intelScreen->base.base, sarea->front_bo_handle);
+   }
+#endif
+}
+
+
+boolean
+intelCreatePools(__DRIscreenPrivate * sPriv)
+{
+   //unsigned batchPoolSize = 1024*1024;
+   struct intel_screen *intelScreen = intel_screen(sPriv);
+
+   if (intelScreen->havePools)
+      return GL_TRUE;
+
+   intelScreen->havePools = GL_TRUE;
+
+   intelUpdateScreenRotation(sPriv, intelScreen->sarea);
+
+   return GL_TRUE;
+}
+
+static const char *
+intel_get_name( struct pipe_winsys *winsys )
+{
+   return "Intel/DRI/ttm";
+}
+
+/*
+ * The state tracker (should!) keep track of whether the fake
+ * frontbuffer has been touched by any rendering since the last time
+ * we copied its contents to the real frontbuffer.  Our task is easy:
+ */
+static void
+intel_flush_frontbuffer( struct pipe_winsys *winsys,
+                         struct pipe_surface *surf,
+                         void *context_private)
+{
+   struct intel_context *intel = (struct intel_context *) context_private;
+   __DRIdrawablePrivate *dPriv = intel->driDrawable;
+
+   intelDisplaySurface(dPriv, surf, NULL);
+}
+
+static boolean
+intelInitDriver(__DRIscreenPrivate * sPriv)
+{
+   struct intel_screen *intelScreen;
+   I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
+
+   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
+      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->
+                                      getProcAddress("glxEnableExtension"));
+   void *const psc = sPriv->psc->screenConfigs;
+
+   if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
+      fprintf(stderr,
+              "\nERROR!  sizeof(I830DRIRec) does not match passed size from device driver\n");
+      return GL_FALSE;
+   }
+
+   /* Allocate the private area */
+   intelScreen = CALLOC_STRUCT(intel_screen);
+   if (!intelScreen)
+      return GL_FALSE;
+
+   /* parse information in __driConfigOptions */
+   driParseOptionInfo(&intelScreen->optionCache,
+                      __driConfigOptions, __driNConfigOptions);
+
+   sPriv->private = (void *) intelScreen;
+
+   intelScreen->sarea = (drmI830Sarea *) (((GLubyte *) sPriv->pSAREA) +
+                                         gDRIPriv->sarea_priv_offset);
+   intelScreen->deviceID = gDRIPriv->deviceID;
+   intelScreen->front.cpp = gDRIPriv->cpp;
+   intelScreen->drmMinor = sPriv->drmMinor;
+
+   assert(gDRIPriv->bitsPerPixel == 16 ||
+         gDRIPriv->bitsPerPixel == 32);
+
+   intelUpdateScreenRotation(sPriv, intelScreen->sarea);
+
+   if (0)
+      intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);
+
+   if (glx_enable_extension != NULL) {
+      (*glx_enable_extension) (psc, "GLX_SGI_swap_control");
+      (*glx_enable_extension) (psc, "GLX_SGI_video_sync");
+      (*glx_enable_extension) (psc, "GLX_MESA_swap_control");
+      (*glx_enable_extension) (psc, "GLX_MESA_swap_frame_usage");
+      (*glx_enable_extension) (psc, "GLX_SGI_make_current_read");
+   }
+
+   intelScreen->base.base.flush_frontbuffer = intel_flush_frontbuffer;
+   intelScreen->base.base.get_name = intel_get_name;
+   intel_be_init_device(&intelScreen->base, sPriv->fd, intelScreen->deviceID);
+
+   return GL_TRUE;
+}
+
+
+static void
+intelDestroyScreen(__DRIscreenPrivate * sPriv)
+{
+   struct intel_screen *intelScreen = intel_screen(sPriv);
+
+   intel_be_destroy_device(&intelScreen->base);
+   /*  intelUnmapScreenRegions(intelScreen); */
+
+   FREE(intelScreen);
+   sPriv->private = NULL;
+}
+
+
+/**
+ * This is called when we need to set up GL rendering to a new X window.
+ */
+static boolean
+intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
+                  __DRIdrawablePrivate * driDrawPriv,
+                  const __GLcontextModes * visual, boolean isPixmap)
+{
+   if (isPixmap) {
+      return GL_FALSE;          /* not implemented */
+   }
+   else {
+      enum pipe_format colorFormat, depthFormat, stencilFormat;
+      struct intel_framebuffer *intelfb = CALLOC_STRUCT(intel_framebuffer);
+
+      if (!intelfb)
+         return GL_FALSE;
+
+      if (visual->redBits == 5)
+         colorFormat = PIPE_FORMAT_R5G6B5_UNORM;
+      else
+         colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
+
+      if (visual->depthBits == 16)
+         depthFormat = PIPE_FORMAT_Z16_UNORM;
+      else if (visual->depthBits == 24)
+         depthFormat = PIPE_FORMAT_S8Z24_UNORM;
+      else
+         depthFormat = PIPE_FORMAT_NONE;
+
+      if (visual->stencilBits == 8)
+         stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
+      else
+         stencilFormat = PIPE_FORMAT_NONE;
+
+      intelfb->stfb = st_create_framebuffer(visual,
+                                            colorFormat,
+                                            depthFormat,
+                                            stencilFormat,
+                                            driDrawPriv->w,
+                                            driDrawPriv->h,
+                                            (void*) intelfb);
+      if (!intelfb->stfb) {
+         free(intelfb);
+         return GL_FALSE;
+      }
+
+      driDrawPriv->driverPrivate = (void *) intelfb;
+      return GL_TRUE;
+   }
+}
+
+static void
+intelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
+{
+   struct intel_framebuffer *intelfb = intel_framebuffer(driDrawPriv);
+   assert(intelfb->stfb);
+   st_unreference_framebuffer(&intelfb->stfb);
+   free(intelfb);
+}
+
+
+/**
+ * Get information about previous buffer swaps.
+ */
+static int
+intelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo)
+{
+   if ((dPriv == NULL) || (dPriv->driverPrivate == NULL)
+       || (sInfo == NULL)) {
+      return -1;
+   }
+
+   return 0;
+}
+
+
+static void
+intelSetTexOffset(__DRIcontext *pDRICtx, int texname,
+                 unsigned long long offset, int depth, uint pitch)
+{
+   abort();
+#if 0
+   struct intel_context *intel = (struct intel_context*)
+      ((__DRIcontextPrivate*)pDRICtx->private)->driverPrivate;
+   struct gl_texture_object *tObj = _mesa_lookup_texture(&intel->ctx, texname);
+   struct st_texture_object *stObj = st_texture_object(tObj);
+
+   if (!stObj)
+      return;
+
+   if (stObj->pt)
+      st->pipe->texture_release(intel->st->pipe, &stObj->pt);
+
+   stObj->imageOverride = GL_TRUE;
+   stObj->depthOverride = depth;
+   stObj->pitchOverride = pitch;
+
+   if (offset)
+      stObj->textureOffset = offset;
+#endif
+}
+
+
+static const struct __DriverAPIRec intelAPI = {
+   .InitDriver = intelInitDriver,
+   .DestroyScreen = intelDestroyScreen,
+   .CreateContext = intelCreateContext,
+   .DestroyContext = intelDestroyContext,
+   .CreateBuffer = intelCreateBuffer,
+   .DestroyBuffer = intelDestroyBuffer,
+   .SwapBuffers = intelSwapBuffers,
+   .MakeCurrent = intelMakeCurrent,
+   .UnbindContext = intelUnbindContext,
+   .GetSwapInfo = intelGetSwapInfo,
+   .GetMSC = driGetMSC32,
+   .WaitForMSC = driWaitForMSC32,
+   .WaitForSBC = NULL,
+   .SwapBuffersMSC = NULL,
+   .CopySubBuffer = intelCopySubBuffer,
+   .setTexOffset = intelSetTexOffset,
+};
+
+
+static __GLcontextModes *
+intelFillInModes(unsigned pixel_bits, unsigned depth_bits,
+                 unsigned stencil_bits, boolean have_back_buffer)
+{
+   __GLcontextModes *modes;
+   __GLcontextModes *m;
+   unsigned num_modes;
+   unsigned depth_buffer_factor;
+   unsigned back_buffer_factor;
+   GLenum fb_format;
+   GLenum fb_type;
+
+   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
+    * support pageflipping at all.
+    */
+   static const GLenum back_buffer_modes[] = {
+      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
+   };
+
+   uint8_t depth_bits_array[3];
+   uint8_t stencil_bits_array[3];
+   uint8_t msaa_samples_array[1];
+
+
+   depth_bits_array[0] = 0;
+   depth_bits_array[1] = depth_bits;
+   depth_bits_array[2] = depth_bits;
+   msaa_samples_array[0] = 0;
+
+   /* Just like with the accumulation buffer, always provide some modes
+    * with a stencil buffer.  It will be a sw fallback, but some apps won't
+    * care about that.
+    */
+   stencil_bits_array[0] = 0;
+   stencil_bits_array[1] = 0;
+   if (depth_bits == 24)
+      stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
+
+   stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
+
+   depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
+   back_buffer_factor = (have_back_buffer) ? 3 : 1;
+
+   num_modes = depth_buffer_factor * back_buffer_factor * 4;
+
+   if (pixel_bits == 16) {
+      fb_format = GL_RGB;
+      fb_type = GL_UNSIGNED_SHORT_5_6_5;
+   }
+   else {
+      fb_format = GL_BGRA;
+      fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+   }
+
+   modes =
+      (*dri_interface->createContextModes) (num_modes,
+                                            sizeof(__GLcontextModes));
+   m = modes;
+   if (!driFillInModes(&m, fb_format, fb_type,
+                       depth_bits_array, stencil_bits_array,
+                       depth_buffer_factor, back_buffer_modes,
+                       back_buffer_factor, msaa_samples_array, 1, GLX_TRUE_COLOR)) {
+      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
+              __LINE__);
+      return NULL;
+   }
+   if (!driFillInModes(&m, fb_format, fb_type,
+                       depth_bits_array, stencil_bits_array,
+                       depth_buffer_factor, back_buffer_modes,
+                       back_buffer_factor, msaa_samples_array, 1, GLX_DIRECT_COLOR)) {
+      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
+              __LINE__);
+      return NULL;
+   }
+
+   /* Mark the visual as slow if there are "fake" stencil bits.
+    */
+   for (m = modes; m != NULL; m = m->next) {
+      if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
+         m->visualRating = GLX_SLOW_CONFIG;
+      }
+   }
+
+   return modes;
+}
+
+
+/**
+ * This is the bootstrap function for the driver.  libGL supplies all of the
+ * requisite information about the system, and the driver initializes itself.
+ * This routine also fills in the linked list pointed to by \c driver_modes
+ * with the \c __GLcontextModes that the driver can support for windows or
+ * pbuffers.
+ *
+ * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
+ *         failure.
+ */
+PUBLIC void *
+__driCreateNewScreen_20050727(__DRInativeDisplay * dpy, int scrn,
+                              __DRIscreen * psc,
+                              const __GLcontextModes * modes,
+                              const __DRIversion * ddx_version,
+                              const __DRIversion * dri_version,
+                              const __DRIversion * drm_version,
+                              const __DRIframebuffer * frame_buffer,
+                              drmAddress pSAREA, int fd,
+                              int internal_api_version,
+                              const __DRIinterfaceMethods * interface,
+                              __GLcontextModes ** driver_modes)
+{
+   __DRIscreenPrivate *psp;
+   static const __DRIversion ddx_expected = { 1, 7, 0 };
+   static const __DRIversion dri_expected = { 4, 0, 0 };
+   static const __DRIversion drm_expected = { 1, 7, 0 };
+
+   dri_interface = interface;
+
+   if (!driCheckDriDdxDrmVersions2("i915",
+                                   dri_version, &dri_expected,
+                                   ddx_version, &ddx_expected,
+                                   drm_version, &drm_expected)) {
+      return NULL;
+   }
+
+   psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
+                                  ddx_version, dri_version, drm_version,
+                                  frame_buffer, pSAREA, fd,
+                                  internal_api_version, &intelAPI);
+
+   if (psp != NULL) {
+      I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
+      *driver_modes = intelFillInModes(dri_priv->cpp * 8,
+                                       (dri_priv->cpp == 2) ? 16 : 24,
+                                       (dri_priv->cpp == 2) ? 0 : 8, 1);
+
+      /* Calling driInitExtensions here, with a NULL context pointer,
+       * does not actually enable the extensions.  It just makes sure
+       * that all the dispatch offsets for all the extensions that
+       * *might* be enables are known.  This is needed because the
+       * dispatch offsets need to be known when _mesa_context_create
+       * is called, but we can't enable the extensions until we have a
+       * context pointer.
+       *
+       * Hello chicken.  Hello egg.  How are you two today?
+       */
+      driInitExtensions(NULL, card_extensions, GL_FALSE);
+   }
+
+   return (void *) psp;
+}
+
diff --git a/src/gallium/winsys/drm/intel/dri/intel_screen.h b/src/gallium/winsys/drm/intel/dri/intel_screen.h
new file mode 100644 (file)
index 0000000..0bb43a9
--- /dev/null
@@ -0,0 +1,122 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef _INTEL_SCREEN_H_
+#define _INTEL_SCREEN_H_
+
+#include "dri_util.h"
+#include "i830_common.h"
+#include "xmlconfig.h"
+#include "ws_dri_bufpool.h"
+
+#include "pipe/p_compiler.h"
+
+#include "intel_be_device.h"
+
+struct intel_screen
+{
+   struct intel_be_device base;
+
+   struct {
+      drm_handle_t handle;
+
+      /* We create a static dri buffer for the frontbuffer.
+       */
+      struct _DriBufferObject *buffer;
+      struct pipe_surface *surface;
+      struct pipe_texture *texture;
+
+      char *map;                   /* memory map */
+      int offset;                  /* from start of video mem, in bytes */
+      int pitch;                   /* row stride, in bytes */
+      int width;
+      int height;
+      int size;
+      int cpp;                     /* for front and back buffers */
+   } front;
+
+   int deviceID;
+   int drmMinor;
+
+   drmI830Sarea *sarea;
+
+   /**
+   * Configuration cache with default values for all contexts
+   */
+   driOptionCache optionCache;
+
+   boolean havePools;
+
+   /**
+    * Temporary(?) context to use for SwapBuffers or other situations in
+    * which we need a rendering context, but none is currently bound.
+    */
+   struct intel_context *dummyContext;
+
+   /*
+    * New stuff form the i915tex integration
+    */
+   unsigned batch_id;
+
+
+   struct pipe_winsys *winsys;
+};
+
+
+
+/** cast wrapper */
+static INLINE struct intel_screen *
+intel_screen(__DRIscreenPrivate *sPriv)
+{
+   return (struct intel_screen *) sPriv->private;
+}
+
+
+extern void
+intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea);
+
+
+extern void intelDestroyContext(__DRIcontextPrivate * driContextPriv);
+
+extern boolean intelUnbindContext(__DRIcontextPrivate * driContextPriv);
+
+extern boolean
+intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
+                 __DRIdrawablePrivate * driDrawPriv,
+                 __DRIdrawablePrivate * driReadPriv);
+
+
+extern boolean
+intelCreatePools(__DRIscreenPrivate *sPriv);
+
+extern boolean
+intelCreateContext(const __GLcontextModes * visual,
+                   __DRIcontextPrivate * driContextPriv,
+                   void *sharedContextPrivate);
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/dri/intel_swapbuffers.c b/src/gallium/winsys/drm/intel/dri/intel_swapbuffers.c
new file mode 100644 (file)
index 0000000..8a18bfd
--- /dev/null
@@ -0,0 +1,261 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#include "intel_screen.h"
+#include "intel_context.h"
+#include "intel_swapbuffers.h"
+
+#include "intel_reg.h"
+
+#include "pipe/p_context.h"
+#include "state_tracker/st_public.h"
+#include "state_tracker/st_context.h"
+#include "state_tracker/st_cb_fbo.h"
+
+#include "ws_dri_bufmgr.h"
+#include "intel_batchbuffer.h"
+
+/**
+ * Display a colorbuffer surface in an X window.
+ * Used for SwapBuffers and flushing front buffer rendering.
+ *
+ * \param dPriv  the window/drawable to display into
+ * \param surf  the surface to display
+ * \param rect  optional subrect of surface to display (may be NULL).
+ */
+void
+intelDisplaySurface(__DRIdrawablePrivate *dPriv,
+                    struct pipe_surface *surf,
+                    const drm_clip_rect_t *rect)
+{
+   struct intel_screen *intelScreen = intel_screen(dPriv->driScreenPriv);
+   struct intel_context *intel = intelScreen->dummyContext;
+
+   DBG(SWAP, "%s\n", __FUNCTION__);
+
+   if (!intel) {
+      /* XXX this is where some kind of extra/meta context could be useful */
+      return;
+   }
+
+   if (intel->last_swap_fence) {
+      driFenceFinish(intel->last_swap_fence, DRM_FENCE_TYPE_EXE, TRUE);
+      driFenceUnReference(&intel->last_swap_fence);
+      intel->last_swap_fence = NULL;
+   }
+   intel->last_swap_fence = intel->first_swap_fence;
+   intel->first_swap_fence = NULL;
+
+   /* The LOCK_HARDWARE is required for the cliprects.  Buffer offsets
+    * should work regardless.
+    */
+   LOCK_HARDWARE(intel);
+   /* if this drawable isn't currently bound the LOCK_HARDWARE done on the
+    * current context (which is what intelScreenContext should return) might
+    * not get a contended lock and thus cliprects not updated (tests/manywin)
+    */
+   if (intel_context(dPriv->driContextPriv) != intel)
+      DRI_VALIDATE_DRAWABLE_INFO(intel->driScreen, dPriv);
+
+
+   if (dPriv && dPriv->numClipRects) {
+      const int srcWidth = surf->width;
+      const int srcHeight = surf->height;
+      const int nbox = dPriv->numClipRects;
+      const drm_clip_rect_t *pbox = dPriv->pClipRects;
+      const int pitch = intelScreen->front.pitch / intelScreen->front.cpp;
+      const int cpp = intelScreen->front.cpp;
+      const int srcpitch = surf->stride / cpp;
+      int BR13, CMD;
+      int i;
+
+      ASSERT(surf->buffer);
+      ASSERT(surf->cpp == cpp);
+
+      DBG(SWAP, "screen pitch %d  src surface pitch %d\n",
+         pitch, surf->stride);
+
+      if (cpp == 2) {
+        BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
+        CMD = XY_SRC_COPY_BLT_CMD;
+      }
+      else {
+        BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
+        CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
+               XY_SRC_COPY_BLT_WRITE_RGB);
+      }
+
+      for (i = 0; i < nbox; i++, pbox++) {
+        drm_clip_rect_t box;
+        drm_clip_rect_t sbox;
+
+        if (pbox->x1 > pbox->x2 ||
+            pbox->y1 > pbox->y2 ||
+            pbox->x2 > intelScreen->front.width ||
+            pbox->y2 > intelScreen->front.height) {
+            /* invalid cliprect, skip it */
+           continue;
+         }
+
+        box = *pbox;
+
+        if (rect) {
+            /* intersect cliprect with user-provided src rect */
+           drm_clip_rect_t rrect;
+
+           rrect.x1 = dPriv->x + rect->x1;
+           rrect.y1 = (dPriv->h - rect->y1 - rect->y2) + dPriv->y;
+           rrect.x2 = rect->x2 + rrect.x1;
+           rrect.y2 = rect->y2 + rrect.y1;
+           if (rrect.x1 > box.x1)
+              box.x1 = rrect.x1;
+           if (rrect.y1 > box.y1)
+              box.y1 = rrect.y1;
+           if (rrect.x2 < box.x2)
+              box.x2 = rrect.x2;
+           if (rrect.y2 < box.y2)
+              box.y2 = rrect.y2;
+
+           if (box.x1 > box.x2 || box.y1 > box.y2)
+              continue;
+        }
+
+        /* restrict blit to size of actually rendered area */
+        if (box.x2 - box.x1 > srcWidth)
+           box.x2 = srcWidth + box.x1;
+        if (box.y2 - box.y1 > srcHeight)
+           box.y2 = srcHeight + box.y1;
+
+        DBG(SWAP, "box x1 x2 y1 y2 %d %d %d %d\n",
+            box.x1, box.x2, box.y1, box.y2);
+
+        sbox.x1 = box.x1 - dPriv->x;
+        sbox.y1 = box.y1 - dPriv->y;
+
+         assert(box.x1 < box.x2);
+         assert(box.y1 < box.y2);
+
+         /* XXX this could be done with pipe->surface_copy() */
+        /* XXX should have its own batch buffer */
+        if (!BEGIN_BATCH(8, 2)) {
+           /*
+            * Since we share this batch buffer with a context
+            * we can't flush it since that risks a GPU lockup
+            */
+           assert(0);
+           continue;
+        }
+
+        OUT_BATCH(CMD);
+        OUT_BATCH(BR13);
+        OUT_BATCH((box.y1 << 16) | box.x1);
+        OUT_BATCH((box.y2 << 16) | box.x2);
+
+        OUT_RELOC(intelScreen->front.buffer,
+                  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
+                  DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
+        OUT_BATCH((sbox.y1 << 16) | sbox.x1);
+        OUT_BATCH((srcpitch * cpp) & 0xffff);
+        OUT_RELOC(dri_bo(surf->buffer),
+                   DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
+                  DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
+
+      }
+
+      if (intel->first_swap_fence)
+        driFenceUnReference(&intel->first_swap_fence);
+      intel->first_swap_fence = intel_be_batchbuffer_flush(intel->base.batch);
+   }
+
+   UNLOCK_HARDWARE(intel);
+
+   if (intel->lastStamp != dPriv->lastStamp) {
+      intelUpdateWindowSize(dPriv);
+      intel->lastStamp = dPriv->lastStamp;
+   }
+}
+
+
+
+/**
+ * This will be called whenever the currently bound window is moved/resized.
+ */
+void
+intelUpdateWindowSize(__DRIdrawablePrivate *dPriv)
+{
+   struct intel_framebuffer *intelfb = intel_framebuffer(dPriv);
+   assert(intelfb->stfb);
+   st_resize_framebuffer(intelfb->stfb, dPriv->w, dPriv->h);
+}
+
+
+
+void
+intelSwapBuffers(__DRIdrawablePrivate * dPriv)
+{
+   struct intel_framebuffer *intel_fb = intel_framebuffer(dPriv);
+   struct pipe_surface *back_surf;
+
+   assert(intel_fb);
+   assert(intel_fb->stfb);
+
+   back_surf = st_get_framebuffer_surface(intel_fb->stfb,
+                                          ST_SURFACE_BACK_LEFT);
+   if (back_surf) {
+      st_notify_swapbuffers(intel_fb->stfb);
+      intelDisplaySurface(dPriv, back_surf, NULL);
+      st_notify_swapbuffers_complete(intel_fb->stfb);
+   }
+}
+
+
+/**
+ * Called via glXCopySubBufferMESA() to copy a subrect of the back
+ * buffer to the front buffer/screen.
+ */
+void
+intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
+{
+   struct intel_framebuffer *intel_fb = intel_framebuffer(dPriv);
+   struct pipe_surface *back_surf;
+
+   assert(intel_fb);
+   assert(intel_fb->stfb);
+
+   back_surf = st_get_framebuffer_surface(intel_fb->stfb,
+                                          ST_SURFACE_BACK_LEFT);
+   if (back_surf) {
+      drm_clip_rect_t rect;
+      rect.x1 = x;
+      rect.y1 = y;
+      rect.x2 = w;
+      rect.y2 = h;
+
+      st_notify_swapbuffers(intel_fb->stfb);
+      intelDisplaySurface(dPriv, back_surf, &rect);
+   }
+}
diff --git a/src/gallium/winsys/drm/intel/dri/intel_swapbuffers.h b/src/gallium/winsys/drm/intel/dri/intel_swapbuffers.h
new file mode 100644 (file)
index 0000000..46c9bab
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef INTEL_SWAPBUFFERS_H
+#define INTEL_SWAPBUFFERS_H
+
+
+struct pipe_surface;
+
+
+extern void intelDisplaySurface(__DRIdrawablePrivate * dPriv,
+                                struct pipe_surface *surf,
+                                const drm_clip_rect_t * rect);
+
+extern void intelSwapBuffers(__DRIdrawablePrivate * dPriv);
+
+extern void intelCopySubBuffer(__DRIdrawablePrivate * dPriv,
+                               int x, int y, int w, int h);
+
+extern void intelUpdateWindowSize(__DRIdrawablePrivate *dPriv);
+
+
+#endif /* INTEL_SWAPBUFFERS_H */
diff --git a/src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.c b/src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.c
new file mode 100644 (file)
index 0000000..0d98d16
--- /dev/null
@@ -0,0 +1,82 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ *
+ **************************************************************************/
+/*
+ * Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
+ */
+
+#include "intel_context.h"
+#include "intel_winsys_softpipe.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_util.h"
+#include "pipe/p_format.h"
+#include "softpipe/sp_winsys.h"
+
+
+struct intel_softpipe_winsys {
+   struct softpipe_winsys sws;
+   struct intel_context *intel;
+};
+
+/**
+ * Return list of surface formats supported by this driver.
+ */
+static boolean
+intel_is_format_supported(struct softpipe_winsys *sws,
+                          enum pipe_format format)
+{
+   switch(format) {
+   case PIPE_FORMAT_A8R8G8B8_UNORM:
+   case PIPE_FORMAT_R5G6B5_UNORM:
+   case PIPE_FORMAT_S8Z24_UNORM:
+      return TRUE;
+   default:
+      return FALSE;
+   }
+}
+
+
+/**
+ * Create rendering context which uses software rendering.
+ */
+struct pipe_context *
+intel_create_softpipe( struct intel_context *intel,
+                       struct pipe_winsys *winsys )
+{
+   struct intel_softpipe_winsys *isws = CALLOC_STRUCT( intel_softpipe_winsys );
+   struct pipe_screen *screen = softpipe_create_screen(winsys);
+
+   /* Fill in this struct with callbacks that softpipe will need to
+    * communicate with the window system, buffer manager, etc.
+    */
+   isws->sws.is_format_supported = intel_is_format_supported;
+   isws->intel = intel;
+
+   /* Create the softpipe context:
+    */
+   return softpipe_create( screen, winsys, &isws->sws );
+}
diff --git a/src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.h b/src/gallium/winsys/drm/intel/dri/intel_winsys_softpipe.h
new file mode 100644 (file)
index 0000000..5fa14cb
--- /dev/null
@@ -0,0 +1,39 @@
+/**************************************************************************
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef INTEL_SOFTPIPE_H
+#define INTEL_SOFTPIPE_H
+
+struct pipe_winsys;
+struct pipe_context;
+struct intel_context;
+
+struct pipe_context *
+intel_create_softpipe( struct intel_context *intel,
+                       struct pipe_winsys *winsys );
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/dri/server/i830_common.h b/src/gallium/winsys/drm/intel/dri/server/i830_common.h
new file mode 100644 (file)
index 0000000..3452ddb
--- /dev/null
@@ -0,0 +1,255 @@
+/**************************************************************************
+
+Copyright 2001 VA Linux Systems Inc., Fremont, California.
+Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
+
+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
+on 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
+ATI, VA LINUX SYSTEMS AND/OR THEIR 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.
+
+**************************************************************************/
+
+
+#ifndef _I830_COMMON_H_
+#define _I830_COMMON_H_
+
+
+#define I830_NR_TEX_REGIONS 255        /* maximum due to use of chars for next/prev */
+#define I830_LOG_MIN_TEX_REGION_SIZE 14
+
+
+/* Driver specific DRM command indices
+ * NOTE: these are not OS specific, but they are driver specific
+ */
+#define DRM_I830_INIT                     0x00
+#define DRM_I830_FLUSH                    0x01
+#define DRM_I830_FLIP                     0x02
+#define DRM_I830_BATCHBUFFER              0x03
+#define DRM_I830_IRQ_EMIT                 0x04
+#define DRM_I830_IRQ_WAIT                 0x05
+#define DRM_I830_GETPARAM                 0x06
+#define DRM_I830_SETPARAM                 0x07
+#define DRM_I830_ALLOC                    0x08
+#define DRM_I830_FREE                     0x09
+#define DRM_I830_INIT_HEAP                0x0a
+#define DRM_I830_CMDBUFFER                0x0b
+#define DRM_I830_DESTROY_HEAP             0x0c
+#define DRM_I830_SET_VBLANK_PIPE          0x0d
+#define DRM_I830_GET_VBLANK_PIPE          0x0e
+#define DRM_I830_MMIO                    0x10
+
+typedef struct {
+   enum {
+      I830_INIT_DMA = 0x01,
+      I830_CLEANUP_DMA = 0x02,
+      I830_RESUME_DMA = 0x03
+   } func;
+   unsigned int mmio_offset;
+   int sarea_priv_offset;
+   unsigned int ring_start;
+   unsigned int ring_end;
+   unsigned int ring_size;
+   unsigned int front_offset;
+   unsigned int back_offset;
+   unsigned int depth_offset;
+   unsigned int w;
+   unsigned int h;
+   unsigned int pitch;
+   unsigned int pitch_bits;
+   unsigned int back_pitch;
+   unsigned int depth_pitch;
+   unsigned int cpp;
+   unsigned int chipset;
+} drmI830Init;
+
+typedef struct {
+       drmTextureRegion texList[I830_NR_TEX_REGIONS+1];
+        int last_upload;       /* last time texture was uploaded */
+        int last_enqueue;      /* last time a buffer was enqueued */
+       int last_dispatch;      /* age of the most recently dispatched buffer */
+       int ctxOwner;           /* last context to upload state */
+       /** Last context that used the buffer manager. */
+       int texAge;
+        int pf_enabled;                /* is pageflipping allowed? */
+        int pf_active;
+        int pf_current_page;   /* which buffer is being displayed? */
+        int perf_boxes;                /* performance boxes to be displayed */
+       int width, height;      /* screen size in pixels */
+
+       drm_handle_t front_handle;
+       int front_offset;
+       int front_size;
+
+       drm_handle_t back_handle;
+       int back_offset;
+       int back_size;
+
+       drm_handle_t depth_handle;
+       int depth_offset;
+       int depth_size;
+
+       drm_handle_t tex_handle;
+       int tex_offset;
+       int tex_size;
+       int log_tex_granularity;
+       int pitch;
+       int rotation;           /* 0, 90, 180 or 270 */
+       int rotated_offset;
+       int rotated_size;
+       int rotated_pitch;
+       int virtualX, virtualY;
+
+       unsigned int front_tiled;
+       unsigned int back_tiled;
+       unsigned int depth_tiled;
+       unsigned int rotated_tiled;
+       unsigned int rotated2_tiled;
+
+       int planeA_x;
+       int planeA_y;
+       int planeA_w;
+       int planeA_h;
+       int planeB_x;
+       int planeB_y;
+       int planeB_w;
+       int planeB_h;
+
+       /* Triple buffering */
+       drm_handle_t third_handle;
+       int third_offset;
+       int third_size;
+       unsigned int third_tiled;
+
+       /* buffer object handles for the static buffers.  May change
+        * over the lifetime of the client, though it doesn't in our current
+        * implementation.
+        */
+       unsigned int front_bo_handle;
+       unsigned int back_bo_handle;
+       unsigned int third_bo_handle;
+       unsigned int depth_bo_handle;
+} drmI830Sarea;
+
+/* Flags for perf_boxes
+ */
+#define I830_BOX_RING_EMPTY    0x1 /* populated by kernel */
+#define I830_BOX_FLIP          0x2 /* populated by kernel */
+#define I830_BOX_WAIT          0x4 /* populated by kernel & client */
+#define I830_BOX_TEXTURE_LOAD  0x8 /* populated by kernel */
+#define I830_BOX_LOST_CONTEXT  0x10 /* populated by client */
+
+
+typedef struct {
+       int start;              /* agp offset */
+       int used;               /* nr bytes in use */
+       int DR1;                /* hw flags for GFX_OP_DRAWRECT_INFO */
+        int DR4;               /* window origin for GFX_OP_DRAWRECT_INFO*/
+       int num_cliprects;      /* mulitpass with multiple cliprects? */
+        drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
+} drmI830BatchBuffer;
+
+typedef struct {
+       char *buf;              /* agp offset */
+       int sz;                 /* nr bytes in use */
+       int DR1;                /* hw flags for GFX_OP_DRAWRECT_INFO */
+        int DR4;               /* window origin for GFX_OP_DRAWRECT_INFO*/
+       int num_cliprects;      /* mulitpass with multiple cliprects? */
+        drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
+} drmI830CmdBuffer;
+
+typedef struct {
+       int *irq_seq;
+} drmI830IrqEmit;
+
+typedef struct {
+       int irq_seq;
+} drmI830IrqWait;
+
+typedef struct {
+       int param;
+       int *value;
+} drmI830GetParam;
+
+#define I830_PARAM_IRQ_ACTIVE     1
+#define I830_PARAM_ALLOW_BATCHBUFFER   2
+
+typedef struct {
+       int param;
+       int value;
+} drmI830SetParam;
+
+#define I830_SETPARAM_USE_MI_BATCHBUFFER_START  1
+#define I830_SETPARAM_TEX_LRU_LOG_GRANULARITY   2
+#define I830_SETPARAM_ALLOW_BATCHBUFFER         3
+
+
+/* A memory manager for regions of shared memory:
+ */
+#define I830_MEM_REGION_AGP 1
+
+typedef struct {
+       int region;
+       int alignment;
+       int size;
+       int *region_offset;     /* offset from start of fb or agp */
+} drmI830MemAlloc;
+
+typedef struct {
+       int region;
+       int region_offset;
+} drmI830MemFree;
+
+typedef struct {
+       int region;
+       int size;
+       int start;      
+} drmI830MemInitHeap;
+
+typedef struct {
+       int region;
+} drmI830MemDestroyHeap;
+
+#define DRM_I830_VBLANK_PIPE_A  1
+#define DRM_I830_VBLANK_PIPE_B  2
+
+typedef struct {
+        int pipe;
+} drmI830VBlankPipe;
+
+#define MMIO_READ  0
+#define MMIO_WRITE 1
+
+#define MMIO_REGS_IA_PRIMATIVES_COUNT           0
+#define MMIO_REGS_IA_VERTICES_COUNT             1
+#define MMIO_REGS_VS_INVOCATION_COUNT           2
+#define MMIO_REGS_GS_PRIMITIVES_COUNT           3
+#define MMIO_REGS_GS_INVOCATION_COUNT           4
+#define MMIO_REGS_CL_PRIMITIVES_COUNT           5
+#define MMIO_REGS_CL_INVOCATION_COUNT           6
+#define MMIO_REGS_PS_INVOCATION_COUNT           7
+#define MMIO_REGS_PS_DEPTH_COUNT                8
+
+typedef struct {
+        unsigned int read_write:1;
+        unsigned int reg:31;
+        void __user *data;
+} drmI830MMIO;
+
+#endif /* _I830_DRM_H_ */
diff --git a/src/gallium/winsys/drm/intel/dri/server/i830_dri.h b/src/gallium/winsys/drm/intel/dri/server/i830_dri.h
new file mode 100644 (file)
index 0000000..0d514b6
--- /dev/null
@@ -0,0 +1,62 @@
+
+#ifndef _I830_DRI_H
+#define _I830_DRI_H
+
+#include "xf86drm.h"
+#include "i830_common.h"
+
+#define I830_MAX_DRAWABLES 256
+
+#define I830_MAJOR_VERSION 1
+#define I830_MINOR_VERSION 7
+#define I830_PATCHLEVEL 2
+
+#define I830_REG_SIZE 0x80000
+
+typedef struct _I830DRIRec {
+   drm_handle_t regs;
+   drmSize regsSize;
+
+   drmSize unused1; /* backbufferSize */
+   drm_handle_t unused2; /* backbuffer */
+
+   drmSize unused3; /* depthbufferSize */
+   drm_handle_t unused4; /* depthbuffer */
+
+   drmSize unused5; /* rotatedSize */
+   drm_handle_t unused6; /* rotatedbuffer */
+
+   drm_handle_t unused7; /* textures */
+   int unused8; /* textureSize */
+
+   drm_handle_t unused9; /* agp_buffers */
+   drmSize unused10; /* agp_buf_size */
+
+   int deviceID;
+   int width;
+   int height;
+   int mem;
+   int cpp;
+   int bitsPerPixel;
+
+   int unused11[8]; /* was front/back/depth/rotated offset/pitch */
+
+   int unused12; /* logTextureGranularity */
+   int unused13; /* textureOffset */
+
+   int irq;
+   int sarea_priv_offset;
+} I830DRIRec, *I830DRIPtr;
+
+typedef struct {
+   /* Nothing here yet */
+   int dummy;
+} I830ConfigPrivRec, *I830ConfigPrivPtr;
+
+typedef struct {
+   /* Nothing here yet */
+   int dummy;
+} I830DRIContextRec, *I830DRIContextPtr;
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/Makefile b/src/gallium/winsys/drm/intel/egl/Makefile
new file mode 100644 (file)
index 0000000..f0b5a44
--- /dev/null
@@ -0,0 +1,28 @@
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = EGL_i915.so
+
+PIPE_DRIVERS = \
+       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+       $(TOP)/src/gallium/drivers/i915simple/libi915simple.a \
+       ../common/libinteldrm.a
+
+DRIVER_SOURCES = \
+       intel_swapbuffers.c \
+       intel_context.c \
+       intel_device.c \
+       intel_egl.c
+
+C_SOURCES = \
+       $(COMMON_GALLIUM_SOURCES) \
+       $(DRIVER_SOURCES)
+
+ASM_SOURCES = 
+
+DRIVER_DEFINES = -I../common $(shell pkg-config libdrm --atleast-version=2.3.1 \
+                               && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
+
+include ../../Makefile.template
+
+symlinks:
diff --git a/src/gallium/winsys/drm/intel/egl/SConscript b/src/gallium/winsys/drm/intel/egl/SConscript
new file mode 100644 (file)
index 0000000..0ad19d4
--- /dev/null
@@ -0,0 +1,39 @@
+Import('*')
+
+env = drienv.Clone()
+
+env.Append(CPPPATH = [
+       '../intel',
+       'server'
+])
+
+#MINIGLX_SOURCES = server/intel_dri.c
+
+DRIVER_SOURCES = [
+       'intel_winsys_pipe.c',
+       'intel_winsys_softpipe.c',
+       'intel_winsys_i915.c',
+       'intel_batchbuffer.c',
+       'intel_swapbuffers.c',
+       'intel_context.c',
+       'intel_lock.c',
+       'intel_screen.c',
+       'intel_batchpool.c',
+]
+
+sources = \
+       COMMON_GALLIUM_SOURCES + \
+       COMMON_BM_SOURCES + \
+       DRIVER_SOURCES
+
+drivers = [
+       softpipe,
+       i915simple
+]
+
+# TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
+env.SharedLibrary(
+       target ='i915tex_dri.so',
+       source = sources,
+       LIBS = drivers + mesa + auxiliaries + env['LIBS'],
+)
\ No newline at end of file
diff --git a/src/gallium/winsys/drm/intel/egl/intel_batchbuffer.h b/src/gallium/winsys/drm/intel/egl/intel_batchbuffer.h
new file mode 100644 (file)
index 0000000..3e95326
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef INTEL_BATCHBUFFER_H
+#define INTEL_BATCHBUFFER_H
+
+#include "intel_be_batchbuffer.h"
+
+/*
+ * Need to redefine the BATCH defines
+ */
+
+#undef BEGIN_BATCH
+#define BEGIN_BATCH(dwords, relocs) \
+   (i915_batchbuffer_check(&intel->base.batch->base, dwords, relocs))
+
+#undef OUT_BATCH
+#define OUT_BATCH(d) \
+   i915_batchbuffer_dword(&intel->base.batch->base, d)
+
+#undef OUT_RELOC
+#define OUT_RELOC(buf,flags,mask,delta) do {                                   \
+   assert((delta) >= 0);                                                       \
+   intel_be_offset_relocation(intel->base.batch, delta, buf, flags, mask);     \
+} while (0)
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_context.c b/src/gallium/winsys/drm/intel/egl/intel_context.c
new file mode 100644 (file)
index 0000000..927addb
--- /dev/null
@@ -0,0 +1,242 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#include "i915simple/i915_screen.h"
+
+#include "intel_device.h"
+#include "intel_context.h"
+#include "intel_batchbuffer.h"
+
+#include "state_tracker/st_public.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_context.h"
+#include "intel_egl.h"
+#include "utils.h"
+
+#ifdef DEBUG
+int __intel_debug = 0;
+#endif
+
+
+#define need_GL_ARB_multisample
+#define need_GL_ARB_point_parameters
+#define need_GL_ARB_texture_compression
+#define need_GL_ARB_vertex_buffer_object
+#define need_GL_ARB_vertex_program
+#define need_GL_ARB_window_pos
+#define need_GL_EXT_blend_color
+#define need_GL_EXT_blend_equation_separate
+#define need_GL_EXT_blend_func_separate
+#define need_GL_EXT_blend_minmax
+#define need_GL_EXT_cull_vertex
+#define need_GL_EXT_fog_coord
+#define need_GL_EXT_framebuffer_object
+#define need_GL_EXT_multi_draw_arrays
+#define need_GL_EXT_secondary_color
+#define need_GL_NV_vertex_program
+#include "extension_helper.h"
+
+
+/**
+ * Extension strings exported by the intel driver.
+ *
+ * \note
+ * It appears that ARB_texture_env_crossbar has "disappeared" compared to the
+ * old i830-specific driver.
+ */
+const struct dri_extension card_extensions[] = {
+       {"GL_ARB_multisample", GL_ARB_multisample_functions},
+       {"GL_ARB_multitexture", NULL},
+       {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
+       {"GL_ARB_texture_border_clamp", NULL},
+       {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
+       {"GL_ARB_texture_cube_map", NULL},
+       {"GL_ARB_texture_env_add", NULL},
+       {"GL_ARB_texture_env_combine", NULL},
+       {"GL_ARB_texture_env_dot3", NULL},
+       {"GL_ARB_texture_mirrored_repeat", NULL},
+       {"GL_ARB_texture_rectangle", NULL},
+       {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
+       {"GL_ARB_pixel_buffer_object", NULL},
+       {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
+       {"GL_ARB_window_pos", GL_ARB_window_pos_functions},
+       {"GL_EXT_blend_color", GL_EXT_blend_color_functions},
+       {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
+       {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
+       {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
+       {"GL_EXT_blend_subtract", NULL},
+       {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
+       {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions},
+       {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},
+       {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
+       {"GL_EXT_packed_depth_stencil", NULL},
+       {"GL_EXT_pixel_buffer_object", NULL},
+       {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
+       {"GL_EXT_stencil_wrap", NULL},
+       {"GL_EXT_texture_edge_clamp", NULL},
+       {"GL_EXT_texture_env_combine", NULL},
+       {"GL_EXT_texture_env_dot3", NULL},
+       {"GL_EXT_texture_filter_anisotropic", NULL},
+       {"GL_EXT_texture_lod_bias", NULL},
+       {"GL_3DFX_texture_compression_FXT1", NULL},
+       {"GL_APPLE_client_storage", NULL},
+       {"GL_MESA_pack_invert", NULL},
+       {"GL_MESA_ycbcr_texture", NULL},
+       {"GL_NV_blend_square", NULL},
+       {"GL_NV_vertex_program", GL_NV_vertex_program_functions},
+       {"GL_NV_vertex_program1_1", NULL},
+       {"GL_SGIS_generate_mipmap", NULL },
+       {NULL, NULL}
+};
+
+
+/*
+ * Hardware lock functions.
+ * Doesn't do anything in EGL
+ */
+
+static void
+intel_lock_hardware(struct intel_be_context *context)
+{
+       (void)context;
+}
+
+static void
+intel_unlock_hardware(struct intel_be_context *context)
+{
+       (void)context;
+}
+
+static boolean
+intel_locked_hardware(struct intel_be_context *context)
+{
+       (void)context;
+       return FALSE;
+}
+
+
+/*
+ * Misc functions.
+ */
+
+int
+intel_create_context(struct egl_drm_context *egl_context, const __GLcontextModes *visual, void *sharedContextPrivate)
+{
+       struct intel_context *intel = CALLOC_STRUCT(intel_context);
+       struct intel_device *device = (struct intel_device *)egl_context->device->priv;
+       struct pipe_context *pipe;
+       struct st_context *st_share = NULL;
+
+       egl_context->priv = intel;
+
+       intel->intel_device = device;
+       intel->egl_context = egl_context;
+       intel->egl_device = egl_context->device;
+
+       intel->base.hardware_lock = intel_lock_hardware;
+       intel->base.hardware_unlock = intel_unlock_hardware;
+       intel->base.hardware_locked = intel_locked_hardware;
+
+       intel_be_init_context(&intel->base, &device->base);
+
+#if 0
+       pipe = intel_create_softpipe(intel, screen->winsys);
+#else
+       pipe = i915_create_context(device->pipe, &device->base.base, &intel->base.base);
+#endif
+
+       pipe->priv = intel;
+
+       intel->st = st_create_context(pipe, visual, st_share);
+
+       device->dummy = intel;
+
+       return TRUE;
+}
+
+int
+intel_destroy_context(struct egl_drm_context *egl_context)
+{
+       struct intel_context *intel = egl_context->priv;
+
+       if (intel->intel_device->dummy == intel)
+               intel->intel_device->dummy = NULL;
+
+       st_destroy_context(intel->st);
+       intel_be_destroy_context(&intel->base);
+       free(intel);
+       return TRUE;
+}
+
+void
+intel_make_current(struct egl_drm_context *context, struct egl_drm_drawable *draw, struct egl_drm_drawable *read)
+{
+       if (context) {
+               struct intel_context *intel = (struct intel_context *)context->priv;
+               struct intel_framebuffer *draw_fb = (struct intel_framebuffer *)draw->priv;
+               struct intel_framebuffer *read_fb = (struct intel_framebuffer *)read->priv;
+
+               assert(draw_fb->stfb);
+               assert(read_fb->stfb);
+
+               st_make_current(intel->st, draw_fb->stfb, read_fb->stfb);
+
+               intel->egl_drawable = draw;
+
+               st_resize_framebuffer(draw_fb->stfb, draw->w, draw->h);
+
+               if (draw != read)
+                       st_resize_framebuffer(read_fb->stfb, read->w, read->h);
+
+       } else {
+               st_make_current(NULL, NULL, NULL);
+       }
+}
+
+void
+intel_bind_frontbuffer(struct egl_drm_drawable *draw, struct egl_drm_frontbuffer *front)
+{
+       struct intel_device *device = (struct intel_device *)draw->device->priv;
+       struct intel_framebuffer *draw_fb = (struct intel_framebuffer *)draw->priv;
+
+       if (draw_fb->front_buffer)
+               driBOUnReference(draw_fb->front_buffer);
+
+       draw_fb->front_buffer = NULL;
+       draw_fb->front = NULL;
+
+       /* to unbind just call this function with front == NULL */
+       if (!front)
+               return;
+
+       draw_fb->front = front;
+
+       driGenBuffers(device->base.staticPool, "front", 1, &draw_fb->front_buffer, 0, 0, 0);
+       driBOSetReferenced(draw_fb->front_buffer, front->handle);
+
+       st_resize_framebuffer(draw_fb->stfb, draw->w, draw->h);
+}
diff --git a/src/gallium/winsys/drm/intel/egl/intel_context.h b/src/gallium/winsys/drm/intel/egl/intel_context.h
new file mode 100644 (file)
index 0000000..477fdec
--- /dev/null
@@ -0,0 +1,118 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef INTEL_CONTEXT_H
+#define INTEL_CONTEXT_H
+
+#include "pipe/p_debug.h"
+#include "intel_be_context.h"
+
+
+struct st_context;
+struct egl_drm_device;
+struct egl_drm_context;
+struct egl_drm_frontbuffer;
+
+
+/**
+ * Intel rendering context, contains a state tracker and intel-specific info.
+ */
+struct intel_context
+{
+       struct intel_be_context base;
+
+       struct st_context *st;
+
+       struct intel_device *intel_device;
+
+       /* new egl stuff */
+       struct egl_drm_device *egl_device;
+       struct egl_drm_context *egl_context;
+       struct egl_drm_drawable *egl_drawable;
+};
+
+
+
+/**
+ * Intel framebuffer.
+ */
+struct intel_framebuffer
+{
+       struct st_framebuffer *stfb;
+
+       struct intel_device *device;
+       struct _DriBufferObject *front_buffer;
+       struct egl_drm_frontbuffer *front;
+};
+
+
+
+
+/* These are functions now:
+ */
+void LOCK_HARDWARE( struct intel_context *intel );
+void UNLOCK_HARDWARE( struct intel_context *intel );
+
+extern char *__progname;
+
+
+
+/* ================================================================
+ * Debugging:
+ */
+#ifdef DEBUG
+extern int __intel_debug;
+
+#define DEBUG_SWAP     0x1
+#define DEBUG_LOCK      0x2
+#define DEBUG_IOCTL    0x4
+#define DEBUG_BATCH     0x8
+
+#define DBG(flag, ...)  do {                   \
+   if (__intel_debug & (DEBUG_##flag))                 \
+      printf(__VA_ARGS__);             \
+} while(0)
+
+#else
+#define DBG(flag, ...)
+#endif
+
+
+#define PCI_CHIP_845_G                 0x2562
+#define PCI_CHIP_I830_M                        0x3577
+#define PCI_CHIP_I855_GM               0x3582
+#define PCI_CHIP_I865_G                        0x2572
+#define PCI_CHIP_I915_G                        0x2582
+#define PCI_CHIP_I915_GM               0x2592
+#define PCI_CHIP_I945_G                        0x2772
+#define PCI_CHIP_I945_GM               0x27A2
+#define PCI_CHIP_I945_GME              0x27AE
+#define PCI_CHIP_G33_G                 0x29C2
+#define PCI_CHIP_Q35_G                 0x29B2
+#define PCI_CHIP_Q33_G                 0x29D2
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_device.c b/src/gallium/winsys/drm/intel/egl/intel_device.c
new file mode 100644 (file)
index 0000000..b9649cb
--- /dev/null
@@ -0,0 +1,137 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#include "utils.h"
+
+#include "state_tracker/st_public.h"
+#include "i915simple/i915_screen.h"
+
+#include "intel_context.h"
+#include "intel_device.h"
+#include "intel_batchbuffer.h"
+#include "intel_egl.h"
+
+
+extern const struct dri_extension card_extensions[];
+
+
+int
+intel_create_device(struct egl_drm_device *device)
+{
+       struct intel_device *intel_device;
+
+       /* Allocate the private area */
+       intel_device = CALLOC_STRUCT(intel_device);
+       if (!intel_device)
+               return FALSE;
+
+       device->priv = (void *)intel_device;
+       intel_device->device = device;
+
+       intel_device->deviceID = device->deviceID;
+
+       intel_be_init_device(&intel_device->base, device->drmFD, intel_device->deviceID);
+
+       intel_device->pipe = i915_create_screen(&intel_device->base.base, intel_device->deviceID);
+
+       /* hack */
+       driInitExtensions(NULL, card_extensions, GL_FALSE);
+
+       return TRUE;
+}
+
+int
+intel_destroy_device(struct egl_drm_device *device)
+{
+       struct intel_device *intel_device = (struct intel_device *)device->priv;
+       
+       intel_be_destroy_device(&intel_device->base);
+
+       free(intel_device);
+       device->priv = NULL;
+
+       return TRUE;
+}
+
+int
+intel_create_drawable(struct egl_drm_drawable *drawable,
+                      const __GLcontextModes * visual)
+{
+       enum pipe_format colorFormat, depthFormat, stencilFormat;
+       struct intel_framebuffer *intelfb = CALLOC_STRUCT(intel_framebuffer);
+
+       if (!intelfb)
+               return GL_FALSE;
+
+       intelfb->device = drawable->device->priv;
+
+       if (visual->redBits == 5)
+               colorFormat = PIPE_FORMAT_R5G6B5_UNORM;
+       else
+               colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
+
+       if (visual->depthBits == 16)
+               depthFormat = PIPE_FORMAT_Z16_UNORM;
+       else if (visual->depthBits == 24)
+               depthFormat = PIPE_FORMAT_S8Z24_UNORM;
+       else
+               depthFormat = PIPE_FORMAT_NONE;
+
+       if (visual->stencilBits == 8)
+               stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
+       else
+               stencilFormat = PIPE_FORMAT_NONE;
+
+       intelfb->stfb = st_create_framebuffer(visual,
+                       colorFormat,
+                       depthFormat,
+                       stencilFormat,
+                       drawable->w,
+                       drawable->h,
+                       (void*) intelfb);
+
+       if (!intelfb->stfb) {
+               free(intelfb);
+               return GL_FALSE;
+       }
+
+       drawable->priv = (void *) intelfb;
+       return GL_TRUE;
+}
+
+int
+intel_destroy_drawable(struct egl_drm_drawable *drawable)
+{
+       struct intel_framebuffer *intelfb = (struct intel_framebuffer *)drawable->priv;
+       drawable->priv = NULL;
+
+       assert(intelfb->stfb);
+       st_unreference_framebuffer(&intelfb->stfb);
+       free(intelfb);
+       return TRUE;
+}
diff --git a/src/gallium/winsys/drm/intel/egl/intel_device.h b/src/gallium/winsys/drm/intel/egl/intel_device.h
new file mode 100644 (file)
index 0000000..323a7c2
--- /dev/null
@@ -0,0 +1,50 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#ifndef _INTEL_SCREEN_H_
+#define _INTEL_SCREEN_H_
+
+#include "intel_be_device.h"
+
+#include "pipe/p_compiler.h"
+
+struct pipe_screen;
+struct egl_drm_device;
+struct intel_context;
+
+struct intel_device
+{
+       struct intel_be_device base;
+       struct pipe_screen *pipe;
+
+       int deviceID;
+       struct egl_drm_device *device;
+
+       struct intel_context *dummy;
+};
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_egl.c b/src/gallium/winsys/drm/intel/egl/intel_egl.c
new file mode 100644 (file)
index 0000000..b89c5c5
--- /dev/null
@@ -0,0 +1,796 @@
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include "eglconfig.h"
+#include "eglcontext.h"
+#include "egldisplay.h"
+#include "egldriver.h"
+#include "eglglobals.h"
+#include "eglmode.h"
+#include "eglscreen.h"
+#include "eglsurface.h"
+#include "egllog.h"
+
+#include "intel_egl.h"
+
+#include "xf86drm.h"
+#include "xf86drmMode.h"
+
+#include "intel_context.h"
+
+#include "state_tracker/st_public.h"
+
+#define MAX_SCREENS 16
+
+static void
+drm_get_device_id(struct egl_drm_device *device)
+{
+       char path[512];
+       FILE *file;
+
+       /* TODO get the real minor */
+       int minor = 0;
+
+       snprintf(path, sizeof(path), "/sys/class/drm/card%d/device/device", minor);
+       file = fopen(path, "r");
+       if (!file) {
+               _eglLog(_EGL_WARNING, "Could not retrive device ID\n");
+               return;
+       }
+
+       fgets(path, sizeof( path ), file);
+       sscanf(path, "%x", &device->deviceID);
+       fclose(file);
+}
+
+static struct egl_drm_device*
+egl_drm_create_device(int drmFD)
+{
+       struct egl_drm_device *device = malloc(sizeof(*device));
+       memset(device, 0, sizeof(*device));
+       device->drmFD = drmFD;
+
+       device->version = drmGetVersion(device->drmFD);
+
+       drm_get_device_id(device);
+
+       if (!intel_create_device(device)) {
+               free(device);
+               return NULL;
+       }
+
+       return device;
+}
+
+static void
+_egl_context_modes_destroy(__GLcontextModes *modes)
+{
+   _eglLog(_EGL_DEBUG, "%s", __FUNCTION__);
+
+   while (modes) {
+      __GLcontextModes * const next = modes->next;
+      free(modes);
+      modes = next;
+   }
+}
+/**
+ * Create a linked list of 'count' GLcontextModes.
+ * These are used during the client/server visual negotiation phase,
+ * then discarded.
+ */
+static __GLcontextModes *
+_egl_context_modes_create(unsigned count, size_t minimum_size)
+{
+   /* This code copied from libGLX, and modified */
+   const size_t size = (minimum_size > sizeof(__GLcontextModes))
+       ? minimum_size : sizeof(__GLcontextModes);
+   __GLcontextModes * head = NULL;
+   __GLcontextModes ** next;
+   unsigned   i;
+
+   _eglLog(_EGL_DEBUG, "%s %d %d", __FUNCTION__, count, minimum_size);
+
+   next = & head;
+   for (i = 0 ; i < count ; i++) {
+      *next = (__GLcontextModes *) calloc(1, size);
+      if (*next == NULL) {
+        _egl_context_modes_destroy(head);
+        head = NULL;
+        break;
+      }
+      
+      (*next)->doubleBufferMode = 1;
+      (*next)->visualID = GLX_DONT_CARE;
+      (*next)->visualType = GLX_DONT_CARE;
+      (*next)->visualRating = GLX_NONE;
+      (*next)->transparentPixel = GLX_NONE;
+      (*next)->transparentRed = GLX_DONT_CARE;
+      (*next)->transparentGreen = GLX_DONT_CARE;
+      (*next)->transparentBlue = GLX_DONT_CARE;
+      (*next)->transparentAlpha = GLX_DONT_CARE;
+      (*next)->transparentIndex = GLX_DONT_CARE;
+      (*next)->xRenderable = GLX_DONT_CARE;
+      (*next)->fbconfigID = GLX_DONT_CARE;
+      (*next)->swapMethod = GLX_SWAP_UNDEFINED_OML;
+      (*next)->bindToTextureRgb = GLX_DONT_CARE;
+      (*next)->bindToTextureRgba = GLX_DONT_CARE;
+      (*next)->bindToMipmapTexture = GLX_DONT_CARE;
+      (*next)->bindToTextureTargets = 0;
+      (*next)->yInverted = GLX_DONT_CARE;
+
+      next = & ((*next)->next);
+   }
+
+   return head;
+}
+
+struct drm_screen;
+
+struct drm_driver
+{
+       _EGLDriver base;  /* base class/object */
+
+       drmModeResPtr res;
+
+       struct drm_screen *screens[MAX_SCREENS];
+       size_t count_screens;
+
+       struct egl_drm_device *device;
+};
+
+struct drm_surface
+{
+       _EGLSurface base;  /* base class/object */
+
+       struct egl_drm_drawable *drawable;
+};
+
+struct drm_context
+{
+       _EGLContext base;  /* base class/object */
+
+       struct egl_drm_context *context;
+};
+
+struct drm_screen
+{
+       _EGLScreen base;
+
+       /* currently only support one connector */
+       drmModeConnectorPtr connector;
+
+       /* Has this screen been shown */
+       int shown;
+
+       /* Surface that is currently attached to this screen */
+       struct drm_surface *surf;
+
+       /* backing buffer */
+       drmBO buffer;
+
+       /* framebuffer */
+       drmModeFBPtr fb;
+       uint32_t fbID;
+
+       /* crtc and mode used */
+       drmModeCrtcPtr crtc;
+       uint32_t crtcID;
+
+       struct drm_mode_modeinfo *mode;
+
+       /* geometry of the screen */
+       struct egl_drm_frontbuffer front;
+};
+
+static void
+drm_update_res(struct drm_driver *drm_drv)
+{
+       drmModeFreeResources(drm_drv->res);
+       drm_drv->res = drmModeGetResources(drm_drv->device->drmFD);
+}
+
+static void
+drm_add_modes_from_connector(_EGLScreen *screen, drmModeConnectorPtr connector)
+{
+       struct drm_mode_modeinfo *m;
+       int i;
+
+       for (i = 0; i < connector->count_modes; i++) {
+               m = &connector->modes[i];
+               _eglAddNewMode(screen, m->hdisplay, m->vdisplay, m->vrefresh, m->name);
+       }
+}
+
+
+static EGLBoolean
+drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
+{
+       _EGLDisplay *disp = _eglLookupDisplay(dpy);
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       struct drm_screen *screen = NULL;
+       drmModeConnectorPtr connector = NULL;
+       drmModeResPtr res = NULL;
+       unsigned count_connectors = 0;
+       int num_screens = 0;
+
+       EGLint i;
+       int fd;
+
+       fd = drmOpen("i915", NULL);
+       if (fd < 0) {
+               return EGL_FALSE;
+       }
+
+       drm_drv->device = egl_drm_create_device(fd);
+       if (!drm_drv->device) {
+               drmClose(fd);
+               return EGL_FALSE;
+       }
+
+       drm_update_res(drm_drv);
+       res = drm_drv->res;
+       if (res)
+               count_connectors = res->count_connectors;
+
+       for(i = 0; i < count_connectors && i < MAX_SCREENS; i++) {
+               connector = drmModeGetConnector(fd, res->connectors[i]);
+
+               if (!connector)
+                       continue;
+
+               if (connector->connection != DRM_MODE_CONNECTED) {
+                       drmModeFreeConnector(connector);
+                       continue;
+               }
+
+               screen = malloc(sizeof(struct drm_screen));
+               memset(screen, 0, sizeof(*screen));
+               screen->connector = connector;
+               _eglInitScreen(&screen->base);
+               _eglAddScreen(disp, &screen->base);
+               drm_add_modes_from_connector(&screen->base, connector);
+               drm_drv->screens[num_screens++] = screen;
+       }
+       drm_drv->count_screens = num_screens;
+
+       /* for now we only have one config */
+       _EGLConfig *config = calloc(1, sizeof(*config));
+       memset(config, 1, sizeof(*config));
+       _eglInitConfig(config, 1);
+       _eglSetConfigAttrib(config, EGL_RED_SIZE, 8);
+       _eglSetConfigAttrib(config, EGL_GREEN_SIZE, 8);
+       _eglSetConfigAttrib(config, EGL_BLUE_SIZE, 8);
+       _eglSetConfigAttrib(config, EGL_ALPHA_SIZE, 8);
+       _eglSetConfigAttrib(config, EGL_BUFFER_SIZE, 32);
+       _eglSetConfigAttrib(config, EGL_DEPTH_SIZE, 24);
+       _eglSetConfigAttrib(config, EGL_STENCIL_SIZE, 8);
+       _eglSetConfigAttrib(config, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT);
+       _eglAddConfig(disp, config);
+
+       drv->Initialized = EGL_TRUE;
+
+       *major = 1;
+       *minor = 4;
+
+       return EGL_TRUE;
+}
+
+static void
+drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen)
+{
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       unsigned int i;
+
+       intel_bind_frontbuffer(screen->surf->drawable, NULL);
+       screen->surf = NULL;
+
+       for (i = 0; i < drm_drv->res->count_crtcs; i++) {
+               drmModeSetCrtc(
+                       drm_drv->device->drmFD,
+                       drm_drv->res->crtcs[i],
+                       0, // FD
+                       0, 0,
+                       NULL, 0, // List of output ids
+                       NULL);
+       }
+
+       drmModeRmFB(drm_drv->device->drmFD, screen->fbID);
+       drmModeFreeFB(screen->fb);
+       screen->fb = NULL;
+
+       drmBOUnreference(drm_drv->device->drmFD, &screen->buffer);
+
+       screen->shown = 0;
+}
+
+static EGLBoolean
+drm_terminate(_EGLDriver *drv, EGLDisplay dpy)
+{
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       struct drm_screen *screen;
+       int i = 0;
+
+       intel_destroy_device(drm_drv->device);
+       drmFreeVersion(drm_drv->device->version);
+
+       for (i = 0; i < drm_drv->count_screens; i++) {
+               screen = drm_drv->screens[i];
+
+               if (screen->shown)
+                       drm_takedown_shown_screen(drv, screen);
+
+               drmModeFreeConnector(screen->connector);
+               _eglDestroyScreen(&screen->base);
+               drm_drv->screens[i] = NULL;
+       }
+
+       drmClose(drm_drv->device->drmFD);
+
+       free(drm_drv->device);
+
+       _eglCleanupDisplay(_eglLookupDisplay(dpy));
+       free(drm_drv);
+
+       return EGL_TRUE;
+}
+
+
+static struct drm_context *
+lookup_drm_context(EGLContext context)
+{
+       _EGLContext *c = _eglLookupContext(context);
+       return (struct drm_context *) c;
+}
+
+
+static struct drm_surface *
+lookup_drm_surface(EGLSurface surface)
+{
+       _EGLSurface *s = _eglLookupSurface(surface);
+       return (struct drm_surface *) s;
+}
+
+static struct drm_screen *
+lookup_drm_screen(EGLDisplay dpy, EGLScreenMESA screen)
+{
+       _EGLScreen *s = _eglLookupScreen(dpy, screen);
+       return (struct drm_screen *) s;
+}
+
+static __GLcontextModes*
+visual_from_config(_EGLConfig *conf)
+{
+       __GLcontextModes *visual;
+       (void)conf;
+
+       visual = _egl_context_modes_create(1, sizeof(*visual));
+       visual->redBits = 8;
+       visual->greenBits = 8;
+       visual->blueBits = 8;
+       visual->alphaBits = 8;
+
+       visual->rgbBits = 32;
+       visual->doubleBufferMode = 1;
+
+       visual->depthBits = 24;
+       visual->haveDepthBuffer = visual->depthBits > 0;
+       visual->stencilBits = 8;
+       visual->haveStencilBuffer = visual->stencilBits > 0;
+
+       return visual;
+}
+
+
+
+static EGLContext
+drm_create_context(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
+{
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       struct drm_context *c;
+       struct drm_egl_context *share = NULL;
+       _EGLConfig *conf;
+       int i;
+       int ret;
+       __GLcontextModes *visual;
+       struct egl_drm_context *context;
+
+       conf = _eglLookupConfig(drv, dpy, config);
+       if (!conf) {
+               _eglError(EGL_BAD_CONFIG, "eglCreateContext");
+               return EGL_NO_CONTEXT;
+       }
+
+       for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
+               switch (attrib_list[i]) {
+                       /* no attribs defined for now */
+                       default:
+                               _eglError(EGL_BAD_ATTRIBUTE, "eglCreateContext");
+                               return EGL_NO_CONTEXT;
+               }
+       }
+
+       c = (struct drm_context *) calloc(1, sizeof(struct drm_context));
+       if (!c)
+               return EGL_NO_CONTEXT;
+
+       _eglInitContext(drv, dpy, &c->base, config, attrib_list);
+
+       context = malloc(sizeof(*context));
+       memset(context, 0, sizeof(*context));
+
+       if (!context)
+               goto err_c;
+
+       context->device = drm_drv->device;
+       visual = visual_from_config(conf);
+
+       ret = intel_create_context(context, visual, share);
+       free(visual);
+
+       if (!ret)
+               goto err_gl;
+
+       c->context = context;
+
+       /* generate handle and insert into hash table */
+       _eglSaveContext(&c->base);
+       assert(_eglGetContextHandle(&c->base));
+
+       return _eglGetContextHandle(&c->base);
+err_gl:
+       free(context);
+err_c:
+       free(c);
+       return EGL_NO_CONTEXT;
+}
+
+static EGLBoolean
+drm_destroy_context(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
+{
+       struct drm_context *fc = lookup_drm_context(context);
+       _eglRemoveContext(&fc->base);
+       if (fc->base.IsBound) {
+               fc->base.DeletePending = EGL_TRUE;
+       } else {
+               intel_destroy_context(fc->context);
+               free(fc->context);
+               free(fc);
+       }
+       return EGL_TRUE;
+}
+
+
+static EGLSurface
+drm_create_window_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
+{
+       return EGL_NO_SURFACE;
+}
+
+
+static EGLSurface
+drm_create_pixmap_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
+{
+       return EGL_NO_SURFACE;
+}
+
+
+static EGLSurface
+drm_create_pbuffer_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
+                         const EGLint *attrib_list)
+{
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       int i;
+       int ret;
+       int width = -1;
+       int height = -1;
+       struct drm_surface *surf = NULL;
+       struct egl_drm_drawable *drawable = NULL;
+       __GLcontextModes *visual;
+       _EGLConfig *conf;
+
+       conf = _eglLookupConfig(drv, dpy, config);
+       if (!conf) {
+               _eglError(EGL_BAD_CONFIG, "eglCreatePbufferSurface");
+               return EGL_NO_CONTEXT;
+       }
+
+       for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
+               switch (attrib_list[i]) {
+                       case EGL_WIDTH:
+                               width = attrib_list[++i];
+                               break;
+                       case EGL_HEIGHT:
+                               height = attrib_list[++i];
+                               break;
+                       default:
+                               _eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface");
+                               return EGL_NO_SURFACE;
+               }
+       }
+
+       if (width < 1 || height < 1) {
+               _eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface");
+               return EGL_NO_SURFACE;
+       }
+
+       surf = (struct drm_surface *) calloc(1, sizeof(struct drm_surface));
+       if (!surf)
+               goto err;
+
+       if (!_eglInitSurface(drv, dpy, &surf->base, EGL_PBUFFER_BIT, config, attrib_list))
+               goto err_surf;
+
+       drawable = malloc(sizeof(*drawable));
+       memset(drawable, 0, sizeof(*drawable));
+
+       drawable->w = width;
+       drawable->h = height;
+
+       visual = visual_from_config(conf);
+
+       drawable->device = drm_drv->device;
+       ret = intel_create_drawable(drawable, visual);
+       free(visual);
+
+       if (!ret)
+               goto err_draw;
+
+       surf->drawable = drawable;
+
+       _eglSaveSurface(&surf->base);
+       return surf->base.Handle;
+
+err_draw:
+       free(drawable);
+err_surf:
+       free(surf);
+err:
+       return EGL_NO_SURFACE;
+}
+
+static EGLSurface
+drm_create_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy, EGLConfig cfg,
+                               const EGLint *attrib_list)
+{
+       EGLSurface surf = drm_create_pbuffer_surface(drv, dpy, cfg, attrib_list);
+
+       return surf;
+}
+
+static struct drm_mode_modeinfo *
+drm_find_mode(drmModeConnectorPtr connector, _EGLMode *mode)
+{
+       int i;
+       struct drm_mode_modeinfo *m;
+
+       for (i = 0; i < connector->count_modes; i++) {
+               m = &connector->modes[i];
+               if (m->hdisplay == mode->Width && m->vdisplay == mode->Height && m->vrefresh == mode->RefreshRate)
+                       break;
+               m = NULL;
+       }
+
+       return m;
+}
+static void
+draw(size_t x, size_t y, size_t w, size_t h, size_t pitch, size_t v, unsigned int *ptr)
+{
+    int i, j;
+
+    for (i = x; i < x + w; i++)
+        for(j = y; j < y + h; j++)
+            ptr[(i * pitch / 4) + j] = v;
+
+}
+
+static void
+prettyColors(int fd, unsigned int handle, size_t pitch)
+{
+       drmBO bo;
+       unsigned int *ptr;
+       void *p;
+       int i;
+
+       drmBOReference(fd, handle, &bo);
+       drmBOMap(fd, &bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &p);
+       ptr = (unsigned int*)p;
+
+       for (i = 0; i < (bo.size / 4); i++)
+               ptr[i] = 0xFFFFFFFF;
+
+       for (i = 0; i < 4; i++)
+               draw(i * 40, i * 40, 40, 40, pitch, 0, ptr);
+
+
+       draw(200, 100, 40, 40, pitch, 0xff00ff, ptr);
+       draw(100, 200, 40, 40, pitch, 0xff00ff, ptr);
+
+       drmBOUnmap(fd, &bo);
+}
+
+static EGLBoolean
+drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
+                         EGLScreenMESA screen,
+                         EGLSurface surface, EGLModeMESA m)
+{
+       struct drm_driver *drm_drv = (struct drm_driver *)drv;
+       struct drm_surface *surf = lookup_drm_surface(surface);
+       struct drm_screen *scrn = lookup_drm_screen(dpy, screen);
+       _EGLMode *mode = _eglLookupMode(dpy, m);
+       size_t pitch = mode->Width * 4;
+       size_t size = mode->Height * pitch;
+       int ret;
+       unsigned int i,j,k;
+
+       if (scrn->shown)
+               drm_takedown_shown_screen(drv, scrn);
+
+       ret = drmBOCreate(drm_drv->device->drmFD, size, 0, 0,
+               DRM_BO_FLAG_READ |
+               DRM_BO_FLAG_WRITE |
+               DRM_BO_FLAG_MEM_TT |
+               DRM_BO_FLAG_MEM_VRAM |
+               DRM_BO_FLAG_NO_EVICT,
+               DRM_BO_HINT_DONT_FENCE, &scrn->buffer);
+
+       if (ret)
+               return EGL_FALSE;
+
+       prettyColors(drm_drv->device->drmFD, scrn->buffer.handle, pitch);
+
+       ret = drmModeAddFB(drm_drv->device->drmFD, mode->Width, mode->Height,
+                       32, 32, pitch,
+                       scrn->buffer.handle,
+                       &scrn->fbID);
+
+       if (ret)
+               goto err_bo;
+
+       scrn->fb = drmModeGetFB(drm_drv->device->drmFD, scrn->fbID);
+       if (!scrn->fb)
+               goto err_bo;
+
+       scrn->mode = drm_find_mode(scrn->connector, mode);
+       if (!scrn->mode)
+               goto err_fb;
+
+       for (j = 0; j < drm_drv->res->count_connectors; j++) {
+               drmModeConnector *con = drmModeGetConnector(drm_drv->device->drmFD, drm_drv->res->connectors[j]);
+               for (k = 0; k < con->count_encoders; k++) {
+                       drmModeEncoder *enc = drmModeGetEncoder(drm_drv->device->drmFD, con->encoders[k]);
+                       for (i = 0; i < drm_drv->res->count_crtcs; i++) {
+                               if (enc->possible_crtcs & (1<<i)) {
+                                       ret = drmModeSetCrtc(
+                                               drm_drv->device->drmFD,
+                                               drm_drv->res->crtcs[i],
+                                               scrn->fbID,
+                                               0, 0,
+                                               &drm_drv->res->connectors[j], 1,
+                                               scrn->mode);    
+                                       /* skip the other crtcs now */
+                                       i = drm_drv->res->count_crtcs;
+                               }
+                       }
+               }
+       }
+
+       scrn->front.handle = scrn->buffer.handle;
+       scrn->front.pitch = pitch;
+       scrn->front.width = mode->Width;
+       scrn->front.height = mode->Height;
+
+       scrn->surf = surf;
+       intel_bind_frontbuffer(surf->drawable, &scrn->front);
+
+       scrn->shown = 1;
+
+       return EGL_TRUE;
+
+err_fb:
+       /* TODO remove fb */
+
+err_bo:
+       drmBOUnreference(drm_drv->device->drmFD, &scrn->buffer);
+       return EGL_FALSE;
+}
+
+static EGLBoolean
+drm_destroy_surface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
+{
+       struct drm_surface *fs = lookup_drm_surface(surface);
+       _eglRemoveSurface(&fs->base);
+       if (fs->base.IsBound) {
+               fs->base.DeletePending = EGL_TRUE;
+       } else {
+               intel_bind_frontbuffer(fs->drawable, NULL);
+               intel_destroy_drawable(fs->drawable);
+               free(fs->drawable);
+               free(fs);
+       }
+       return EGL_TRUE;
+}
+
+
+static EGLBoolean
+drm_make_current(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext context)
+{
+       struct drm_surface *readSurf = lookup_drm_surface(read);
+       struct drm_surface *drawSurf = lookup_drm_surface(draw);
+       struct drm_context *ctx = lookup_drm_context(context);
+       EGLBoolean b;
+
+       b = _eglMakeCurrent(drv, dpy, draw, read, context);
+       if (!b)
+               return EGL_FALSE;
+
+       if (ctx) {
+               if (!drawSurf || !readSurf)
+                       return EGL_FALSE;
+
+               intel_make_current(ctx->context, drawSurf->drawable, readSurf->drawable);
+       } else {
+               intel_make_current(NULL, NULL, NULL);
+       }
+
+       return EGL_TRUE;
+}
+
+static EGLBoolean
+drm_swap_buffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
+{
+       struct drm_surface *surf = lookup_drm_surface(draw);
+       if (!surf)
+               return EGL_FALSE;
+
+       /* error checking */
+       if (!_eglSwapBuffers(drv, dpy, draw))
+               return EGL_FALSE;
+
+       intel_swap_buffers(surf->drawable);
+       return EGL_TRUE;
+}
+
+
+/**
+ * The bootstrap function.  Return a new drm_driver object and
+ * plug in API functions.
+ */
+_EGLDriver *
+_eglMain(_EGLDisplay *dpy, const char *args)
+{
+       struct drm_driver *drm;
+
+       drm = (struct drm_driver *) calloc(1, sizeof(struct drm_driver));
+       if (!drm) {
+               return NULL;
+       }
+
+       /* First fill in the dispatch table with defaults */
+       _eglInitDriverFallbacks(&drm->base);
+       /* then plug in our Drm-specific functions */
+       drm->base.API.Initialize = drm_initialize;
+       drm->base.API.Terminate = drm_terminate;
+       drm->base.API.CreateContext = drm_create_context;
+       drm->base.API.MakeCurrent = drm_make_current;
+       drm->base.API.CreateWindowSurface = drm_create_window_surface;
+       drm->base.API.CreatePixmapSurface = drm_create_pixmap_surface;
+       drm->base.API.CreatePbufferSurface = drm_create_pbuffer_surface;
+       drm->base.API.DestroySurface = drm_destroy_surface;
+       drm->base.API.DestroyContext = drm_destroy_context;
+       drm->base.API.CreateScreenSurfaceMESA = drm_create_screen_surface_mesa;
+       drm->base.API.ShowScreenSurfaceMESA = drm_show_screen_surface_mesa;
+       drm->base.API.SwapBuffers = drm_swap_buffers;
+
+       drm->base.ClientAPIsMask = EGL_OPENGL_BIT /*| EGL_OPENGL_ES_BIT*/;
+       drm->base.Name = "DRM/Gallium";
+
+       /* enable supported extensions */
+       drm->base.Extensions.MESA_screen_surface = EGL_TRUE;
+       drm->base.Extensions.MESA_copy_context = EGL_TRUE;
+
+       return &drm->base;
+}
diff --git a/src/gallium/winsys/drm/intel/egl/intel_egl.h b/src/gallium/winsys/drm/intel/egl/intel_egl.h
new file mode 100644 (file)
index 0000000..1ee27e0
--- /dev/null
@@ -0,0 +1,53 @@
+
+#ifndef _INTEL_EGL_H_
+#define _INTEL_EGL_H_
+
+#include <xf86drm.h>
+
+struct egl_drm_device
+{
+       void *priv;
+       int drmFD;
+
+       drmVersionPtr version;
+       int deviceID;
+};
+
+struct egl_drm_context
+{
+       void *priv;
+       struct egl_drm_device *device;
+};
+
+struct egl_drm_drawable
+{
+       void *priv;
+       struct egl_drm_device *device;
+       size_t h;
+       size_t w;
+};
+
+struct egl_drm_frontbuffer
+{
+       uint32_t handle;
+       uint32_t pitch;
+       uint32_t width;
+       uint32_t height;
+};
+
+#include "GL/internal/glcore.h"
+
+int intel_create_device(struct egl_drm_device *device);
+int intel_destroy_device(struct egl_drm_device *device);
+
+int intel_create_context(struct egl_drm_context *context, const __GLcontextModes *visual, void *sharedContextPrivate);
+int intel_destroy_context(struct egl_drm_context *context);
+
+int intel_create_drawable(struct egl_drm_drawable *drawable, const __GLcontextModes * visual);
+int intel_destroy_drawable(struct egl_drm_drawable *drawable);
+
+void intel_make_current(struct egl_drm_context *context, struct egl_drm_drawable *draw, struct egl_drm_drawable *read);
+void intel_swap_buffers(struct egl_drm_drawable *draw);
+void intel_bind_frontbuffer(struct egl_drm_drawable *draw, struct egl_drm_frontbuffer *front);
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_reg.h b/src/gallium/winsys/drm/intel/egl/intel_reg.h
new file mode 100644 (file)
index 0000000..4f33bee
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#ifndef _INTEL_REG_H_
+#define _INTEL_REG_H_
+
+
+#define BR00_BITBLT_CLIENT   0x40000000
+#define BR00_OP_COLOR_BLT    0x10000000
+#define BR00_OP_SRC_COPY_BLT 0x10C00000
+#define BR13_SOLID_PATTERN   0x80000000
+
+#define XY_COLOR_BLT_CMD               ((2<<29)|(0x50<<22)|0x4)
+#define XY_COLOR_BLT_WRITE_ALPHA       (1<<21)
+#define XY_COLOR_BLT_WRITE_RGB         (1<<20)
+
+#define XY_SRC_COPY_BLT_CMD             ((2<<29)|(0x53<<22)|6)
+#define XY_SRC_COPY_BLT_WRITE_ALPHA     (1<<21)
+#define XY_SRC_COPY_BLT_WRITE_RGB       (1<<20)
+
+#define MI_WAIT_FOR_EVENT               ((0x3<<23))
+#define MI_WAIT_FOR_PLANE_B_FLIP        (1<<6)
+#define MI_WAIT_FOR_PLANE_A_FLIP        (1<<2)
+
+#define MI_BATCH_BUFFER_END            (0xA<<23)
+
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_swapbuffers.c b/src/gallium/winsys/drm/intel/egl/intel_swapbuffers.c
new file mode 100644 (file)
index 0000000..2edcbc7
--- /dev/null
@@ -0,0 +1,111 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+#include "intel_device.h"
+#include "intel_context.h"
+#include "intel_batchbuffer.h"
+#include "intel_reg.h"
+
+#include "pipe/p_context.h"
+#include "state_tracker/st_public.h"
+#include "state_tracker/st_context.h"
+#include "state_tracker/st_cb_fbo.h"
+#include "intel_egl.h"
+
+
+static void
+intel_display_surface(struct egl_drm_drawable *draw,
+                      struct pipe_surface *surf);
+
+void intel_swap_buffers(struct egl_drm_drawable *draw)
+{
+       struct intel_framebuffer *intel_fb = (struct intel_framebuffer *)draw->priv;
+       struct pipe_surface *back_surf;
+
+       assert(intel_fb);
+       assert(intel_fb->stfb);
+
+       back_surf = st_get_framebuffer_surface(intel_fb->stfb, ST_SURFACE_BACK_LEFT);
+       if (back_surf) {
+               st_notify_swapbuffers(intel_fb->stfb);
+               if (intel_fb->front)
+                       intel_display_surface(draw, back_surf);
+               st_notify_swapbuffers_complete(intel_fb->stfb);
+       }
+}
+
+static void
+intel_display_surface(struct egl_drm_drawable *draw,
+                      struct pipe_surface *surf)
+{
+       struct intel_context *intel = NULL;
+       struct intel_framebuffer *intel_fb = (struct intel_framebuffer *)draw->priv;
+       struct _DriFenceObject *fence;
+
+       //const int srcWidth = surf->width;
+       //const int srcHeight = surf->height;
+
+       intel = intel_fb->device->dummy;
+       if (!intel) {
+               printf("No dummy context\n");
+               return;
+       }
+
+       const int dstWidth = intel_fb->front->width;
+       const int dstHeight = intel_fb->front->height;
+       const int dstPitch = intel_fb->front->pitch / 4;//draw->front.cpp;
+
+       const int cpp = 4;//intel_fb->front->cpp;
+       const int srcPitch = surf->stride / cpp;
+
+       int BR13, CMD;
+       //int i;
+
+       BR13 = (dstPitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
+       CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
+                       XY_SRC_COPY_BLT_WRITE_RGB);
+
+       BEGIN_BATCH(8, 2);
+       OUT_BATCH(CMD);
+       OUT_BATCH(BR13);
+       OUT_BATCH((0 << 16) | 0);
+       OUT_BATCH((dstHeight << 16) | dstWidth);
+
+       OUT_RELOC(intel_fb->front_buffer,
+               DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
+               DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
+
+       OUT_BATCH((0 << 16) | 0);
+       OUT_BATCH((srcPitch * cpp) & 0xffff);
+       OUT_RELOC(dri_bo(surf->buffer),
+                       DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
+                       DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
+
+       fence = intel_be_batchbuffer_flush(intel->base.batch);
+       driFenceUnReference(&fence);
+       intel_be_batchbuffer_finish(intel->base.batch);
+}
diff --git a/src/gallium/winsys/egl_drm/Makefile b/src/gallium/winsys/egl_drm/Makefile
deleted file mode 100644 (file)
index 4139d9e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-# src/mesa/drivers/egl_drm/Makefile
-
-TOP = ../../../..
-
-include $(TOP)/configs/current
-
-
-
-default: $(TOP)/$(LIB_DIR) subdirs
-
-
-$(TOP)/$(LIB_DIR):
-       -mkdir $(TOP)/$(LIB_DIR)
-
-
-subdirs:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE)) || exit 1 ; \
-               fi \
-       done
-
-
-install:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE) install) || exit 1 ; \
-               fi \
-       done
-
-
-clean:
-       @for dir in $(DRI_DIRS) ; do \
-               if [ -d $$dir ] ; then \
-                       (cd $$dir && $(MAKE) clean) ; \
-               fi \
-       done
-       -rm -f common/*.o
diff --git a/src/gallium/winsys/egl_drm/Makefile.template b/src/gallium/winsys/egl_drm/Makefile.template
deleted file mode 100644 (file)
index 07abfa5..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-# -*-makefile-*-
-
-MESA_MODULES = \
-       $(TOP)/src/mesa/libmesa.a \
-       $(GALLIUM_AUXILIARIES)
-       
-COMMON_GALLIUM_SOURCES = \
-        $(TOP)/src/mesa/drivers/dri/common/utils.c \
-        $(TOP)/src/mesa/drivers/dri/common/vblank.c \
-        $(TOP)/src/mesa/drivers/dri/common/dri_util.c \
-        $(TOP)/src/mesa/drivers/dri/common/xmlconfig.c
-
-COMMON_SOURCES = $(COMMON_GALLIUM_SOURCES) \
-        $(TOP)/src/mesa/drivers/common/driverfuncs.c \
-        $(TOP)/src/mesa/drivers/dri/common/texmem.c \
-        $(TOP)/src/mesa/drivers/dri/common/drirenderbuffer.c
-
-COMMON_BM_SOURCES = \
-       $(TOP)/src/mesa/drivers/dri/common/dri_bufmgr.c \
-       $(TOP)/src/mesa/drivers/dri/common/dri_drmpool.c
-
-
-ifeq ($(WINDOW_SYSTEM),dri)
-WINOBJ=
-WINLIB=
-INCLUDES = $(SHARED_INCLUDES) $(EXPAT_INCLUDES)
-
-OBJECTS = \
-       $(C_SOURCES:.c=.o) \
-       $(ASM_SOURCES:.S=.o) 
-
-else
-# miniglx
-WINOBJ=
-WINLIB=-L$(MESA)/src/glx/mini
-MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini
-INCLUDES = $(MINIGLX_INCLUDES) \
-          $(SHARED_INCLUDES) \
-          $(PCIACCESS_CFLAGS)
-
-OBJECTS = $(C_SOURCES:.c=.o) \
-         $(MINIGLX_SOURCES:.c=.o) \
-         $(ASM_SOURCES:.S=.o) 
-endif
-
-
-### Include directories
-SHARED_INCLUDES = \
-       -I. \
-       -I$(TOP)/src/mesa/drivers/dri/common \
-       -Iserver \
-       -I$(TOP)/include \
-       -I$(TOP)/include/GL/internal \
-       -I$(TOP)/src/gallium/include \
-       -I$(TOP)/src/gallium/auxiliary \
-       -I$(TOP)/src/gallium/drivers \
-       -I$(TOP)/src/gallium/winsys/common \
-       -I$(TOP)/src/mesa \
-       -I$(TOP)/src/mesa/main \
-       -I$(TOP)/src/mesa/glapi \
-       -I$(TOP)/src/mesa/math \
-       -I$(TOP)/src/mesa/transform \
-       -I$(TOP)/src/mesa/shader \
-       -I$(TOP)/src/mesa/swrast \
-       -I$(TOP)/src/mesa/swrast_setup \
-       -I$(TOP)/src/egl/main \
-       -I$(TOP)/src/egl/drivers/dri \
-       $(LIBDRM_CFLAGS)
-
-
-##### RULES #####
-
-.c.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@
-
-.S.o:
-       $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES)  $< -o $@
-
-
-##### TARGETS #####
-
-default: depend symlinks $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME)
-
-
-$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template
-       $(TOP)/bin/mklib -noprefix -o $@ \
-               $(OBJECTS) $(PIPE_DRIVERS) $(MESA_MODULES)  $(WINOBJ) $(DRI_LIB_DEPS)
-
-
-$(TOP)/$(LIB_DIR)/$(LIBNAME): $(LIBNAME)
-       $(INSTALL) $(LIBNAME) $(TOP)/$(LIB_DIR) 
-
-
-depend: $(C_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
-       rm -f depend
-       touch depend
-       $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) \
-               $(ASM_SOURCES) 2> /dev/null
-
-
-# Emacs tags
-tags:
-       etags `find . -name \*.[ch]` `find ../include`
-
-
-# Remove .o and backup files
-clean:
-       -rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
-       -rm -f depend depend.bak
-
-
-install: $(LIBNAME)
-       $(INSTALL) -d $(DRI_DRIVER_INSTALL_DIR)
-       $(INSTALL) -m 755 $(LIBNAME) $(DRI_DRIVER_INSTALL_DIR)
-
-
-include depend
diff --git a/src/gallium/winsys/egl_drm/intel/Makefile b/src/gallium/winsys/egl_drm/intel/Makefile
deleted file mode 100644 (file)
index e67b49f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-
-TOP = ../../../../..
-include $(TOP)/configs/current
-
-LIBNAME = EGL_i915.so
-
-PIPE_DRIVERS = \
-       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
-       $(TOP)/src/gallium/drivers/i915simple/libi915simple.a \
-       $(TOP)/src/gallium/winsys/common/intel_drm/libinteldrm.a
-
-DRIVER_SOURCES = \
-       intel_swapbuffers.c \
-       intel_context.c \
-       intel_device.c \
-       intel_egl.c
-
-C_SOURCES = \
-       $(COMMON_GALLIUM_SOURCES) \
-       $(DRIVER_SOURCES)
-
-ASM_SOURCES = 
-
-DRIVER_DEFINES = -I$(TOP)/src/mesa/drivers/dri/intel $(shell pkg-config libdrm --atleast-version=2.3.1 \
-                               && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
-
-include ../Makefile.template
-
-symlinks:
diff --git a/src/gallium/winsys/egl_drm/intel/SConscript b/src/gallium/winsys/egl_drm/intel/SConscript
deleted file mode 100644 (file)
index 0ad19d4..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-Import('*')
-
-env = drienv.Clone()
-
-env.Append(CPPPATH = [
-       '../intel',
-       'server'
-])
-
-#MINIGLX_SOURCES = server/intel_dri.c
-
-DRIVER_SOURCES = [
-       'intel_winsys_pipe.c',
-       'intel_winsys_softpipe.c',
-       'intel_winsys_i915.c',
-       'intel_batchbuffer.c',
-       'intel_swapbuffers.c',
-       'intel_context.c',
-       'intel_lock.c',
-       'intel_screen.c',
-       'intel_batchpool.c',
-]
-
-sources = \
-       COMMON_GALLIUM_SOURCES + \
-       COMMON_BM_SOURCES + \
-       DRIVER_SOURCES
-
-drivers = [
-       softpipe,
-       i915simple
-]
-
-# TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
-env.SharedLibrary(
-       target ='i915tex_dri.so',
-       source = sources,
-       LIBS = drivers + mesa + auxiliaries + env['LIBS'],
-)
\ No newline at end of file
diff --git a/src/gallium/winsys/egl_drm/intel/intel_batchbuffer.h b/src/gallium/winsys/egl_drm/intel/intel_batchbuffer.h
deleted file mode 100644 (file)
index 1fa2719..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef INTEL_BATCHBUFFER_H
-#define INTEL_BATCHBUFFER_H
-
-#include "intel_drm/intel_be_batchbuffer.h"
-
-/*
- * Need to redefine the BATCH defines
- */
-
-#undef BEGIN_BATCH
-#define BEGIN_BATCH(dwords, relocs) \
-   (i915_batchbuffer_check(&intel->base.batch->base, dwords, relocs))
-
-#undef OUT_BATCH
-#define OUT_BATCH(d) \
-   i915_batchbuffer_dword(&intel->base.batch->base, d)
-
-#undef OUT_RELOC
-#define OUT_RELOC(buf,flags,mask,delta) do {                                   \
-   assert((delta) >= 0);                                                       \
-   intel_be_offset_relocation(intel->base.batch, delta, buf, flags, mask);     \
-} while (0)
-
-#endif
diff --git a/src/gallium/winsys/egl_drm/intel/intel_context.c b/src/gallium/winsys/egl_drm/intel/intel_context.c
deleted file mode 100644 (file)
index 927addb..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#include "i915simple/i915_screen.h"
-
-#include "intel_device.h"
-#include "intel_context.h"
-#include "intel_batchbuffer.h"
-
-#include "state_tracker/st_public.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_context.h"
-#include "intel_egl.h"
-#include "utils.h"
-
-#ifdef DEBUG
-int __intel_debug = 0;
-#endif
-
-
-#define need_GL_ARB_multisample
-#define need_GL_ARB_point_parameters
-#define need_GL_ARB_texture_compression
-#define need_GL_ARB_vertex_buffer_object
-#define need_GL_ARB_vertex_program
-#define need_GL_ARB_window_pos
-#define need_GL_EXT_blend_color
-#define need_GL_EXT_blend_equation_separate
-#define need_GL_EXT_blend_func_separate
-#define need_GL_EXT_blend_minmax
-#define need_GL_EXT_cull_vertex
-#define need_GL_EXT_fog_coord
-#define need_GL_EXT_framebuffer_object
-#define need_GL_EXT_multi_draw_arrays
-#define need_GL_EXT_secondary_color
-#define need_GL_NV_vertex_program
-#include "extension_helper.h"
-
-
-/**
- * Extension strings exported by the intel driver.
- *
- * \note
- * It appears that ARB_texture_env_crossbar has "disappeared" compared to the
- * old i830-specific driver.
- */
-const struct dri_extension card_extensions[] = {
-       {"GL_ARB_multisample", GL_ARB_multisample_functions},
-       {"GL_ARB_multitexture", NULL},
-       {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
-       {"GL_ARB_texture_border_clamp", NULL},
-       {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
-       {"GL_ARB_texture_cube_map", NULL},
-       {"GL_ARB_texture_env_add", NULL},
-       {"GL_ARB_texture_env_combine", NULL},
-       {"GL_ARB_texture_env_dot3", NULL},
-       {"GL_ARB_texture_mirrored_repeat", NULL},
-       {"GL_ARB_texture_rectangle", NULL},
-       {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
-       {"GL_ARB_pixel_buffer_object", NULL},
-       {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
-       {"GL_ARB_window_pos", GL_ARB_window_pos_functions},
-       {"GL_EXT_blend_color", GL_EXT_blend_color_functions},
-       {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
-       {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
-       {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
-       {"GL_EXT_blend_subtract", NULL},
-       {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
-       {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions},
-       {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},
-       {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
-       {"GL_EXT_packed_depth_stencil", NULL},
-       {"GL_EXT_pixel_buffer_object", NULL},
-       {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
-       {"GL_EXT_stencil_wrap", NULL},
-       {"GL_EXT_texture_edge_clamp", NULL},
-       {"GL_EXT_texture_env_combine", NULL},
-       {"GL_EXT_texture_env_dot3", NULL},
-       {"GL_EXT_texture_filter_anisotropic", NULL},
-       {"GL_EXT_texture_lod_bias", NULL},
-       {"GL_3DFX_texture_compression_FXT1", NULL},
-       {"GL_APPLE_client_storage", NULL},
-       {"GL_MESA_pack_invert", NULL},
-       {"GL_MESA_ycbcr_texture", NULL},
-       {"GL_NV_blend_square", NULL},
-       {"GL_NV_vertex_program", GL_NV_vertex_program_functions},
-       {"GL_NV_vertex_program1_1", NULL},
-       {"GL_SGIS_generate_mipmap", NULL },
-       {NULL, NULL}
-};
-
-
-/*
- * Hardware lock functions.
- * Doesn't do anything in EGL
- */
-
-static void
-intel_lock_hardware(struct intel_be_context *context)
-{
-       (void)context;
-}
-
-static void
-intel_unlock_hardware(struct intel_be_context *context)
-{
-       (void)context;
-}
-
-static boolean
-intel_locked_hardware(struct intel_be_context *context)
-{
-       (void)context;
-       return FALSE;
-}
-
-
-/*
- * Misc functions.
- */
-
-int
-intel_create_context(struct egl_drm_context *egl_context, const __GLcontextModes *visual, void *sharedContextPrivate)
-{
-       struct intel_context *intel = CALLOC_STRUCT(intel_context);
-       struct intel_device *device = (struct intel_device *)egl_context->device->priv;
-       struct pipe_context *pipe;
-       struct st_context *st_share = NULL;
-
-       egl_context->priv = intel;
-
-       intel->intel_device = device;
-       intel->egl_context = egl_context;
-       intel->egl_device = egl_context->device;
-
-       intel->base.hardware_lock = intel_lock_hardware;
-       intel->base.hardware_unlock = intel_unlock_hardware;
-       intel->base.hardware_locked = intel_locked_hardware;
-
-       intel_be_init_context(&intel->base, &device->base);
-
-#if 0
-       pipe = intel_create_softpipe(intel, screen->winsys);
-#else
-       pipe = i915_create_context(device->pipe, &device->base.base, &intel->base.base);
-#endif
-
-       pipe->priv = intel;
-
-       intel->st = st_create_context(pipe, visual, st_share);
-
-       device->dummy = intel;
-
-       return TRUE;
-}
-
-int
-intel_destroy_context(struct egl_drm_context *egl_context)
-{
-       struct intel_context *intel = egl_context->priv;
-
-       if (intel->intel_device->dummy == intel)
-               intel->intel_device->dummy = NULL;
-
-       st_destroy_context(intel->st);
-       intel_be_destroy_context(&intel->base);
-       free(intel);
-       return TRUE;
-}
-
-void
-intel_make_current(struct egl_drm_context *context, struct egl_drm_drawable *draw, struct egl_drm_drawable *read)
-{
-       if (context) {
-               struct intel_context *intel = (struct intel_context *)context->priv;
-               struct intel_framebuffer *draw_fb = (struct intel_framebuffer *)draw->priv;
-               struct intel_framebuffer *read_fb = (struct intel_framebuffer *)read->priv;
-
-               assert(draw_fb->stfb);
-               assert(read_fb->stfb);
-
-               st_make_current(intel->st, draw_fb->stfb, read_fb->stfb);
-
-               intel->egl_drawable = draw;
-
-               st_resize_framebuffer(draw_fb->stfb, draw->w, draw->h);
-
-               if (draw != read)
-                       st_resize_framebuffer(read_fb->stfb, read->w, read->h);
-
-       } else {
-               st_make_current(NULL, NULL, NULL);
-       }
-}
-
-void
-intel_bind_frontbuffer(struct egl_drm_drawable *draw, struct egl_drm_frontbuffer *front)
-{
-       struct intel_device *device = (struct intel_device *)draw->device->priv;
-       struct intel_framebuffer *draw_fb = (struct intel_framebuffer *)draw->priv;
-
-       if (draw_fb->front_buffer)
-               driBOUnReference(draw_fb->front_buffer);
-
-       draw_fb->front_buffer = NULL;
-       draw_fb->front = NULL;
-
-       /* to unbind just call this function with front == NULL */
-       if (!front)
-               return;
-
-       draw_fb->front = front;
-
-       driGenBuffers(device->base.staticPool, "front", 1, &draw_fb->front_buffer, 0, 0, 0);
-       driBOSetReferenced(draw_fb->front_buffer, front->handle);
-
-       st_resize_framebuffer(draw_fb->stfb, draw->w, draw->h);
-}
diff --git a/src/gallium/winsys/egl_drm/intel/intel_context.h b/src/gallium/winsys/egl_drm/intel/intel_context.h
deleted file mode 100644 (file)
index dfa4720..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef INTEL_CONTEXT_H
-#define INTEL_CONTEXT_H
-
-#include "pipe/p_debug.h"
-#include "intel_drm/intel_be_context.h"
-
-
-struct st_context;
-struct egl_drm_device;
-struct egl_drm_context;
-struct egl_drm_frontbuffer;
-
-
-/**
- * Intel rendering context, contains a state tracker and intel-specific info.
- */
-struct intel_context
-{
-       struct intel_be_context base;
-
-       struct st_context *st;
-
-       struct intel_device *intel_device;
-
-       /* new egl stuff */
-       struct egl_drm_device *egl_device;
-       struct egl_drm_context *egl_context;
-       struct egl_drm_drawable *egl_drawable;
-};
-
-
-
-/**
- * Intel framebuffer.
- */
-struct intel_framebuffer
-{
-       struct st_framebuffer *stfb;
-
-       struct intel_device *device;
-       struct _DriBufferObject *front_buffer;
-       struct egl_drm_frontbuffer *front;
-};
-
-
-
-
-/* These are functions now:
- */
-void LOCK_HARDWARE( struct intel_context *intel );
-void UNLOCK_HARDWARE( struct intel_context *intel );
-
-extern char *__progname;
-
-
-
-/* ================================================================
- * Debugging:
- */
-#ifdef DEBUG
-extern int __intel_debug;
-
-#define DEBUG_SWAP     0x1
-#define DEBUG_LOCK      0x2
-#define DEBUG_IOCTL    0x4
-#define DEBUG_BATCH     0x8
-
-#define DBG(flag, ...)  do {                   \
-   if (__intel_debug & (DEBUG_##flag))                 \
-      printf(__VA_ARGS__);             \
-} while(0)
-
-#else
-#define DBG(flag, ...)
-#endif
-
-
-#define PCI_CHIP_845_G                 0x2562
-#define PCI_CHIP_I830_M                        0x3577
-#define PCI_CHIP_I855_GM               0x3582
-#define PCI_CHIP_I865_G                        0x2572
-#define PCI_CHIP_I915_G                        0x2582
-#define PCI_CHIP_I915_GM               0x2592
-#define PCI_CHIP_I945_G                        0x2772
-#define PCI_CHIP_I945_GM               0x27A2
-#define PCI_CHIP_I945_GME              0x27AE
-#define PCI_CHIP_G33_G                 0x29C2
-#define PCI_CHIP_Q35_G                 0x29B2
-#define PCI_CHIP_Q33_G                 0x29D2
-
-#endif
diff --git a/src/gallium/winsys/egl_drm/intel/intel_device.c b/src/gallium/winsys/egl_drm/intel/intel_device.c
deleted file mode 100644 (file)
index b9649cb..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-
-#include "utils.h"
-
-#include "state_tracker/st_public.h"
-#include "i915simple/i915_screen.h"
-
-#include "intel_context.h"
-#include "intel_device.h"
-#include "intel_batchbuffer.h"
-#include "intel_egl.h"
-
-
-extern const struct dri_extension card_extensions[];
-
-
-int
-intel_create_device(struct egl_drm_device *device)
-{
-       struct intel_device *intel_device;
-
-       /* Allocate the private area */
-       intel_device = CALLOC_STRUCT(intel_device);
-       if (!intel_device)
-               return FALSE;
-
-       device->priv = (void *)intel_device;
-       intel_device->device = device;
-
-       intel_device->deviceID = device->deviceID;
-
-       intel_be_init_device(&intel_device->base, device->drmFD, intel_device->deviceID);
-
-       intel_device->pipe = i915_create_screen(&intel_device->base.base, intel_device->deviceID);
-
-       /* hack */
-       driInitExtensions(NULL, card_extensions, GL_FALSE);
-
-       return TRUE;
-}
-
-int
-intel_destroy_device(struct egl_drm_device *device)
-{
-       struct intel_device *intel_device = (struct intel_device *)device->priv;
-       
-       intel_be_destroy_device(&intel_device->base);
-
-       free(intel_device);
-       device->priv = NULL;
-
-       return TRUE;
-}
-
-int
-intel_create_drawable(struct egl_drm_drawable *drawable,
-                      const __GLcontextModes * visual)
-{
-       enum pipe_format colorFormat, depthFormat, stencilFormat;
-       struct intel_framebuffer *intelfb = CALLOC_STRUCT(intel_framebuffer);
-
-       if (!intelfb)
-               return GL_FALSE;
-
-       intelfb->device = drawable->device->priv;
-
-       if (visual->redBits == 5)
-               colorFormat = PIPE_FORMAT_R5G6B5_UNORM;
-       else
-               colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
-
-       if (visual->depthBits == 16)
-               depthFormat = PIPE_FORMAT_Z16_UNORM;
-       else if (visual->depthBits == 24)
-               depthFormat = PIPE_FORMAT_S8Z24_UNORM;
-       else
-               depthFormat = PIPE_FORMAT_NONE;
-
-       if (visual->stencilBits == 8)
-               stencilFormat = PIPE_FORMAT_S8Z24_UNORM;
-       else
-               stencilFormat = PIPE_FORMAT_NONE;
-
-       intelfb->stfb = st_create_framebuffer(visual,
-                       colorFormat,
-                       depthFormat,
-                       stencilFormat,
-                       drawable->w,
-                       drawable->h,
-                       (void*) intelfb);
-
-       if (!intelfb->stfb) {
-               free(intelfb);
-               return GL_FALSE;
-       }
-
-       drawable->priv = (void *) intelfb;
-       return GL_TRUE;
-}
-
-int
-intel_destroy_drawable(struct egl_drm_drawable *drawable)
-{
-       struct intel_framebuffer *intelfb = (struct intel_framebuffer *)drawable->priv;
-       drawable->priv = NULL;
-
-       assert(intelfb->stfb);
-       st_unreference_framebuffer(&intelfb->stfb);
-       free(intelfb);
-       return TRUE;
-}
diff --git a/src/gallium/winsys/egl_drm/intel/intel_device.h b/src/gallium/winsys/egl_drm/intel/intel_device.h
deleted file mode 100644 (file)
index 2f9d4f8..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#ifndef _INTEL_SCREEN_H_
-#define _INTEL_SCREEN_H_
-
-#include "intel_drm/intel_be_device.h"
-
-#include "pipe/p_compiler.h"
-
-struct pipe_screen;
-struct egl_drm_device;
-struct intel_context;
-
-struct intel_device
-{
-       struct intel_be_device base;
-       struct pipe_screen *pipe;
-
-       int deviceID;
-       struct egl_drm_device *device;
-
-       struct intel_context *dummy;
-};
-
-#endif
diff --git a/src/gallium/winsys/egl_drm/intel/intel_egl.c b/src/gallium/winsys/egl_drm/intel/intel_egl.c
deleted file mode 100644 (file)
index 1851bab..0000000
+++ /dev/null
@@ -1,796 +0,0 @@
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdint.h>
-
-#include "eglconfig.h"
-#include "eglcontext.h"
-#include "egldisplay.h"
-#include "egldriver.h"
-#include "eglglobals.h"
-#include "eglmode.h"
-#include "eglscreen.h"
-#include "eglsurface.h"
-#include "egllog.h"
-
-#include "intel_egl.h"
-
-#include "xf86drm.h"
-#include "xf86drmMode.h"
-
-#include "intel_context.h"
-
-#include "state_tracker/st_public.h"
-
-#define MAX_SCREENS 16
-
-static void
-drm_get_device_id(struct egl_drm_device *device)
-{
-       char path[512];
-       FILE *file;
-
-       /* TODO get the real minor */
-       int minor = 0;
-
-       snprintf(path, sizeof(path), "/sys/class/drm/card%d/device/device", minor);
-       file = fopen(path, "r");
-       if (!file) {
-               _eglLog(_EGL_WARNING, "Could not retrive device ID\n");
-               return;
-       }
-
-       fgets(path, sizeof( path ), file);
-       sscanf(path, "%x", &device->deviceID);
-       fclose(file);
-}
-
-static struct egl_drm_device*
-egl_drm_create_device(int drmFD)
-{
-       struct egl_drm_device *device = malloc(sizeof(*device));
-       memset(device, 0, sizeof(*device));
-       device->drmFD = drmFD;
-
-       device->version = drmGetVersion(device->drmFD);
-
-       drm_get_device_id(device);
-
-       if (!intel_create_device(device)) {
-               free(device);
-               return NULL;
-       }
-
-       return device;
-}
-
-static void
-_egl_context_modes_destroy(__GLcontextModes *modes)
-{
-   _eglLog(_EGL_DEBUG, "%s", __FUNCTION__);
-
-   while (modes) {
-      __GLcontextModes * const next = modes->next;
-      free(modes);
-      modes = next;
-   }
-}
-/**
- * Create a linked list of 'count' GLcontextModes.
- * These are used during the client/server visual negotiation phase,
- * then discarded.
- */
-static __GLcontextModes *
-_egl_context_modes_create(unsigned count, size_t minimum_size)
-{
-   /* This code copied from libGLX, and modified */
-   const size_t size = (minimum_size > sizeof(__GLcontextModes))
-       ? minimum_size : sizeof(__GLcontextModes);
-   __GLcontextModes * head = NULL;
-   __GLcontextModes ** next;
-   unsigned   i;
-
-   _eglLog(_EGL_DEBUG, "%s %d %d", __FUNCTION__, count, minimum_size);
-
-   next = & head;
-   for (i = 0 ; i < count ; i++) {
-      *next = (__GLcontextModes *) calloc(1, size);
-      if (*next == NULL) {
-        _egl_context_modes_destroy(head);
-        head = NULL;
-        break;
-      }
-      
-      (*next)->doubleBufferMode = 1;
-      (*next)->visualID = GLX_DONT_CARE;
-      (*next)->visualType = GLX_DONT_CARE;
-      (*next)->visualRating = GLX_NONE;
-      (*next)->transparentPixel = GLX_NONE;
-      (*next)->transparentRed = GLX_DONT_CARE;
-      (*next)->transparentGreen = GLX_DONT_CARE;
-      (*next)->transparentBlue = GLX_DONT_CARE;
-      (*next)->transparentAlpha = GLX_DONT_CARE;
-      (*next)->transparentIndex = GLX_DONT_CARE;
-      (*next)->xRenderable = GLX_DONT_CARE;
-      (*next)->fbconfigID = GLX_DONT_CARE;
-      (*next)->swapMethod = GLX_SWAP_UNDEFINED_OML;
-      (*next)->bindToTextureRgb = GLX_DONT_CARE;
-      (*next)->bindToTextureRgba = GLX_DONT_CARE;
-      (*next)->bindToMipmapTexture = GLX_DONT_CARE;
-      (*next)->bindToTextureTargets = 0;
-      (*next)->yInverted = GLX_DONT_CARE;
-
-      next = & ((*next)->next);
-   }
-
-   return head;
-}
-
-struct drm_screen;
-
-struct drm_driver
-{
-       _EGLDriver base;  /* base class/object */
-
-       drmModeResPtr res;
-
-       struct drm_screen *screens[MAX_SCREENS];
-       size_t count_screens;
-
-       struct egl_drm_device *device;
-};
-
-struct drm_surface
-{
-       _EGLSurface base;  /* base class/object */
-
-       struct egl_drm_drawable *drawable;
-};
-
-struct drm_context
-{
-       _EGLContext base;  /* base class/object */
-
-       struct egl_drm_context *context;
-};
-
-struct drm_screen
-{
-       _EGLScreen base;
-
-       /* currently only support one connector */
-       drmModeConnectorPtr connector;
-
-       /* Has this screen been shown */
-       int shown;
-
-       /* Surface that is currently attached to this screen */
-       struct drm_surface *surf;
-
-       /* backing buffer */
-       drmBO buffer;
-
-       /* framebuffer */
-       drmModeFBPtr fb;
-       uint32_t fbID;
-
-       /* crtc and mode used */
-       drmModeCrtcPtr crtc;
-       uint32_t crtcID;
-
-       struct drm_mode_modeinfo *mode;
-
-       /* geometry of the screen */
-       struct egl_drm_frontbuffer front;
-};
-
-static void
-drm_update_res(struct drm_driver *drm_drv)
-{
-       drmModeFreeResources(drm_drv->res);
-       drm_drv->res = drmModeGetResources(drm_drv->device->drmFD);
-}
-
-static void
-drm_add_modes_from_connector(_EGLScreen *screen, drmModeConnectorPtr connector)
-{
-       struct drm_mode_modeinfo *m;
-       int i;
-
-       for (i = 0; i < connector->count_modes; i++) {
-               m = &connector->modes[i];
-               _eglAddNewMode(screen, m->hdisplay, m->vdisplay, m->vrefresh, m->name);
-       }
-}
-
-
-static EGLBoolean
-drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
-{
-       _EGLDisplay *disp = _eglLookupDisplay(dpy);
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       struct drm_screen *screen = NULL;
-       drmModeConnectorPtr connector = NULL;
-       drmModeResPtr res = NULL;
-       unsigned count_connectors = 0;
-       int num_screens = 0;
-
-       EGLint i;
-       int fd;
-
-       fd = drmOpen("i915", NULL);
-       if (fd < 0) {
-               return EGL_FALSE;
-       }
-
-       drm_drv->device = egl_drm_create_device(fd);
-       if (!drm_drv->device) {
-               drmClose(fd);
-               return EGL_FALSE;
-       }
-
-       drm_update_res(drm_drv);
-       res = drm_drv->res;
-       if (res)
-               count_connectors = res->count_connectors;
-
-       for(i = 0; i < count_connectors && i < MAX_SCREENS; i++) {
-               connector = drmModeGetConnector(fd, res->connectors[i]);
-
-               if (!connector)
-                       continue;
-
-               if (connector->connection != DRM_MODE_CONNECTED) {
-                       drmModeFreeConnector(connector);
-                       continue;
-               }
-
-               screen = malloc(sizeof(struct drm_screen));
-               memset(screen, 0, sizeof(*screen));
-               screen->connector = connector;
-               _eglInitScreen(&screen->base);
-               _eglAddScreen(disp, &screen->base);
-               drm_add_modes_from_connector(&screen->base, connector);
-               drm_drv->screens[num_screens++] = screen;
-       }
-       drm_drv->count_screens = num_screens;
-
-       /* for now we only have one config */
-       _EGLConfig *config = calloc(1, sizeof(*config));
-       memset(config, 1, sizeof(*config));
-       _eglInitConfig(config, 1);
-       _eglSetConfigAttrib(config, EGL_RED_SIZE, 8);
-       _eglSetConfigAttrib(config, EGL_GREEN_SIZE, 8);
-       _eglSetConfigAttrib(config, EGL_BLUE_SIZE, 8);
-       _eglSetConfigAttrib(config, EGL_ALPHA_SIZE, 8);
-       _eglSetConfigAttrib(config, EGL_BUFFER_SIZE, 32);
-       _eglSetConfigAttrib(config, EGL_DEPTH_SIZE, 24);
-       _eglSetConfigAttrib(config, EGL_STENCIL_SIZE, 8);
-       _eglSetConfigAttrib(config, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT);
-       _eglAddConfig(disp, config);
-
-       drv->Initialized = EGL_TRUE;
-
-       *major = 1;
-       *minor = 4;
-
-       return EGL_TRUE;
-}
-
-static void
-drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen)
-{
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       unsigned int i;
-
-       intel_bind_frontbuffer(screen->surf->drawable, NULL);
-       screen->surf = NULL;
-
-       for (i = 0; i < drm_drv->res->count_crtcs; i++) {
-               drmModeSetCrtc(
-                       drm_drv->device->drmFD,
-                       drm_drv->res->crtcs[i],
-                       0, // FD
-                       0, 0,
-                       NULL, 0, // List of output ids
-                       NULL);
-       }
-
-       drmModeRmFB(drm_drv->device->drmFD, screen->fbID);
-       drmModeFreeFB(screen->fb);
-       screen->fb = NULL;
-
-       drmBOUnreference(drm_drv->device->drmFD, &screen->buffer);
-
-       screen->shown = 0;
-}
-
-static EGLBoolean
-drm_terminate(_EGLDriver *drv, EGLDisplay dpy)
-{
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       struct drm_screen *screen;
-       int i = 0;
-
-       intel_destroy_device(drm_drv->device);
-       drmFreeVersion(drm_drv->device->version);
-
-       for (i = 0; i < drm_drv->count_screens; i++) {
-               screen = drm_drv->screens[i];
-
-               if (screen->shown)
-                       drm_takedown_shown_screen(drv, screen);
-
-               drmModeFreeConnector(screen->connector);
-               _eglDestroyScreen(&screen->base);
-               drm_drv->screens[i] = NULL;
-       }
-
-       drmClose(drm_drv->device->drmFD);
-
-       free(drm_drv->device);
-
-       _eglCleanupDisplay(_eglLookupDisplay(dpy));
-       free(drm_drv);
-
-       return EGL_TRUE;
-}
-
-
-static struct drm_context *
-lookup_drm_context(EGLContext context)
-{
-       _EGLContext *c = _eglLookupContext(context);
-       return (struct drm_context *) c;
-}
-
-
-static struct drm_surface *
-lookup_drm_surface(EGLSurface surface)
-{
-       _EGLSurface *s = _eglLookupSurface(surface);
-       return (struct drm_surface *) s;
-}
-
-static struct drm_screen *
-lookup_drm_screen(EGLDisplay dpy, EGLScreenMESA screen)
-{
-       _EGLScreen *s = _eglLookupScreen(dpy, screen);
-       return (struct drm_screen *) s;
-}
-
-static __GLcontextModes*
-visual_from_config(_EGLConfig *conf)
-{
-       __GLcontextModes *visual;
-       (void)conf;
-
-       visual = _gl_context_modes_create(1, sizeof(*visual));
-       visual->redBits = 8;
-       visual->greenBits = 8;
-       visual->blueBits = 8;
-       visual->alphaBits = 8;
-
-       visual->rgbBits = 32;
-       visual->doubleBufferMode = 1;
-
-       visual->depthBits = 24;
-       visual->haveDepthBuffer = visual->depthBits > 0;
-       visual->stencilBits = 8;
-       visual->haveStencilBuffer = visual->stencilBits > 0;
-
-       return visual;
-}
-
-
-
-static EGLContext
-drm_create_context(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
-{
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       struct drm_context *c;
-       struct drm_egl_context *share = NULL;
-       _EGLConfig *conf;
-       int i;
-       int ret;
-       __GLcontextModes *visual;
-       struct egl_drm_context *context;
-
-       conf = _eglLookupConfig(drv, dpy, config);
-       if (!conf) {
-               _eglError(EGL_BAD_CONFIG, "eglCreateContext");
-               return EGL_NO_CONTEXT;
-       }
-
-       for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
-               switch (attrib_list[i]) {
-                       /* no attribs defined for now */
-                       default:
-                               _eglError(EGL_BAD_ATTRIBUTE, "eglCreateContext");
-                               return EGL_NO_CONTEXT;
-               }
-       }
-
-       c = (struct drm_context *) calloc(1, sizeof(struct drm_context));
-       if (!c)
-               return EGL_NO_CONTEXT;
-
-       _eglInitContext(drv, dpy, &c->base, config, attrib_list);
-
-       context = malloc(sizeof(*context));
-       memset(context, 0, sizeof(*context));
-
-       if (!context)
-               goto err_c;
-
-       context->device = drm_drv->device;
-       visual = visual_from_config(conf);
-
-       ret = intel_create_context(context, visual, share);
-       free(visual);
-
-       if (!ret)
-               goto err_gl;
-
-       c->context = context;
-
-       /* generate handle and insert into hash table */
-       _eglSaveContext(&c->base);
-       assert(_eglGetContextHandle(&c->base));
-
-       return _eglGetContextHandle(&c->base);
-err_gl:
-       free(context);
-err_c:
-       free(c);
-       return EGL_NO_CONTEXT;
-}
-
-static EGLBoolean
-drm_destroy_context(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
-{
-       struct drm_context *fc = lookup_drm_context(context);
-       _eglRemoveContext(&fc->base);
-       if (fc->base.IsBound) {
-               fc->base.DeletePending = EGL_TRUE;
-       } else {
-               intel_destroy_context(fc->context);
-               free(fc->context);
-               free(fc);
-       }
-       return EGL_TRUE;
-}
-
-
-static EGLSurface
-drm_create_window_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
-{
-       return EGL_NO_SURFACE;
-}
-
-
-static EGLSurface
-drm_create_pixmap_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
-{
-       return EGL_NO_SURFACE;
-}
-
-
-static EGLSurface
-drm_create_pbuffer_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
-                         const EGLint *attrib_list)
-{
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       int i;
-       int ret;
-       int width = -1;
-       int height = -1;
-       struct drm_surface *surf = NULL;
-       struct egl_drm_drawable *drawable = NULL;
-       __GLcontextModes *visual;
-       _EGLConfig *conf;
-
-       conf = _eglLookupConfig(drv, dpy, config);
-       if (!conf) {
-               _eglError(EGL_BAD_CONFIG, "eglCreatePbufferSurface");
-               return EGL_NO_CONTEXT;
-       }
-
-       for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
-               switch (attrib_list[i]) {
-                       case EGL_WIDTH:
-                               width = attrib_list[++i];
-                               break;
-                       case EGL_HEIGHT:
-                               height = attrib_list[++i];
-                               break;
-                       default:
-                               _eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface");
-                               return EGL_NO_SURFACE;
-               }
-       }
-
-       if (width < 1 || height < 1) {
-               _eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface");
-               return EGL_NO_SURFACE;
-       }
-
-       surf = (struct drm_surface *) calloc(1, sizeof(struct drm_surface));
-       if (!surf)
-               goto err;
-
-       if (!_eglInitSurface(drv, dpy, &surf->base, EGL_PBUFFER_BIT, config, attrib_list))
-               goto err_surf;
-
-       drawable = malloc(sizeof(*drawable));
-       memset(drawable, 0, sizeof(*drawable));
-
-       drawable->w = width;
-       drawable->h = height;
-
-       visual = visual_from_config(conf);
-
-       drawable->device = drm_drv->device;
-       ret = intel_create_drawable(drawable, visual);
-       free(visual);
-
-       if (!ret)
-               goto err_draw;
-
-       surf->drawable = drawable;
-
-       _eglSaveSurface(&surf->base);
-       return surf->base.Handle;
-
-err_draw:
-       free(drawable);
-err_surf:
-       free(surf);
-err:
-       return EGL_NO_SURFACE;
-}
-
-static EGLSurface
-drm_create_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy, EGLConfig cfg,
-                               const EGLint *attrib_list)
-{
-       EGLSurface surf = drm_create_pbuffer_surface(drv, dpy, cfg, attrib_list);
-
-       return surf;
-}
-
-static struct drm_mode_modeinfo *
-drm_find_mode(drmModeConnectorPtr connector, _EGLMode *mode)
-{
-       int i;
-       struct drm_mode_modeinfo *m;
-
-       for (i = 0; i < connector->count_modes; i++) {
-               m = &connector->modes[i];
-               if (m->hdisplay == mode->Width && m->vdisplay == mode->Height && m->vrefresh == mode->RefreshRate)
-                       break;
-               m = NULL;
-       }
-
-       return m;
-}
-static void
-draw(size_t x, size_t y, size_t w, size_t h, size_t pitch, size_t v, unsigned int *ptr)
-{
-    int i, j;
-
-    for (i = x; i < x + w; i++)
-        for(j = y; j < y + h; j++)
-            ptr[(i * pitch / 4) + j] = v;
-
-}
-
-static void
-prettyColors(int fd, unsigned int handle, size_t pitch)
-{
-       drmBO bo;
-       unsigned int *ptr;
-       void *p;
-       int i;
-
-       drmBOReference(fd, handle, &bo);
-       drmBOMap(fd, &bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &p);
-       ptr = (unsigned int*)p;
-
-       for (i = 0; i < (bo.size / 4); i++)
-               ptr[i] = 0xFFFFFFFF;
-
-       for (i = 0; i < 4; i++)
-               draw(i * 40, i * 40, 40, 40, pitch, 0, ptr);
-
-
-       draw(200, 100, 40, 40, pitch, 0xff00ff, ptr);
-       draw(100, 200, 40, 40, pitch, 0xff00ff, ptr);
-
-       drmBOUnmap(fd, &bo);
-}
-
-static EGLBoolean
-drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
-                         EGLScreenMESA screen,
-                         EGLSurface surface, EGLModeMESA m)
-{
-       struct drm_driver *drm_drv = (struct drm_driver *)drv;
-       struct drm_surface *surf = lookup_drm_surface(surface);
-       struct drm_screen *scrn = lookup_drm_screen(dpy, screen);
-       _EGLMode *mode = _eglLookupMode(dpy, m);
-       size_t pitch = mode->Width * 4;
-       size_t size = mode->Height * pitch;
-       int ret;
-       unsigned int i,j,k;
-
-       if (scrn->shown)
-               drm_takedown_shown_screen(drv, scrn);
-
-       ret = drmBOCreate(drm_drv->device->drmFD, size, 0, 0,
-               DRM_BO_FLAG_READ |
-               DRM_BO_FLAG_WRITE |
-               DRM_BO_FLAG_MEM_TT |
-               DRM_BO_FLAG_MEM_VRAM |
-               DRM_BO_FLAG_NO_EVICT,
-               DRM_BO_HINT_DONT_FENCE, &scrn->buffer);
-
-       if (ret)
-               return EGL_FALSE;
-
-       prettyColors(drm_drv->device->drmFD, scrn->buffer.handle, pitch);
-
-       ret = drmModeAddFB(drm_drv->device->drmFD, mode->Width, mode->Height,
-                       32, 32, pitch,
-                       scrn->buffer.handle,
-                       &scrn->fbID);
-
-       if (ret)
-               goto err_bo;
-
-       scrn->fb = drmModeGetFB(drm_drv->device->drmFD, scrn->fbID);
-       if (!scrn->fb)
-               goto err_bo;
-
-       scrn->mode = drm_find_mode(scrn->connector, mode);
-       if (!scrn->mode)
-               goto err_fb;
-
-       for (j = 0; j < drm_drv->res->count_connectors; j++) {
-               drmModeConnector *con = drmModeGetConnector(drm_drv->device->drmFD, drm_drv->res->connectors[j]);
-               for (k = 0; k < con->count_encoders; k++) {
-                       drmModeEncoder *enc = drmModeGetEncoder(drm_drv->device->drmFD, con->encoders[k]);
-                       for (i = 0; i < drm_drv->res->count_crtcs; i++) {
-                               if (enc->possible_crtcs & (1<<i)) {
-                                       ret = drmModeSetCrtc(
-                                               drm_drv->device->drmFD,
-                                               drm_drv->res->crtcs[i],
-                                               scrn->fbID,
-                                               0, 0,
-                                               &drm_drv->res->connectors[j], 1,
-                                               scrn->mode);    
-                                       /* skip the other crtcs now */
-                                       i = drm_drv->res->count_crtcs;
-                               }
-                       }
-               }
-       }
-
-       scrn->front.handle = scrn->buffer.handle;
-       scrn->front.pitch = pitch;
-       scrn->front.width = mode->Width;
-       scrn->front.height = mode->Height;
-
-       scrn->surf = surf;
-       intel_bind_frontbuffer(surf->drawable, &scrn->front);
-
-       scrn->shown = 1;
-
-       return EGL_TRUE;
-
-err_fb:
-       /* TODO remove fb */
-
-err_bo:
-       drmBOUnreference(drm_drv->device->drmFD, &scrn->buffer);
-       return EGL_FALSE;
-}
-
-static EGLBoolean
-drm_destroy_surface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
-{
-       struct drm_surface *fs = lookup_drm_surface(surface);
-       _eglRemoveSurface(&fs->base);
-       if (fs->base.IsBound) {
-               fs->base.DeletePending = EGL_TRUE;
-       } else {
-               intel_bind_frontbuffer(fs->drawable, NULL);
-               intel_destroy_drawable(fs->drawable);
-               free(fs->drawable);
-               free(fs);
-       }
-       return EGL_TRUE;
-}
-
-
-static EGLBoolean
-drm_make_current(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext context)
-{
-       struct drm_surface *readSurf = lookup_drm_surface(read);
-       struct drm_surface *drawSurf = lookup_drm_surface(draw);
-       struct drm_context *ctx = lookup_drm_context(context);
-       EGLBoolean b;
-
-       b = _eglMakeCurrent(drv, dpy, draw, read, context);
-       if (!b)
-               return EGL_FALSE;
-
-       if (ctx) {
-               if (!drawSurf || !readSurf)
-                       return EGL_FALSE;
-
-               intel_make_current(ctx->context, drawSurf->drawable, readSurf->drawable);
-       } else {
-               intel_make_current(NULL, NULL, NULL);
-       }
-
-       return EGL_TRUE;
-}
-
-static EGLBoolean
-drm_swap_buffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
-{
-       struct drm_surface *surf = lookup_drm_surface(draw);
-       if (!surf)
-               return EGL_FALSE;
-
-       /* error checking */
-       if (!_eglSwapBuffers(drv, dpy, draw))
-               return EGL_FALSE;
-
-       intel_swap_buffers(surf->drawable);
-       return EGL_TRUE;
-}
-
-
-/**
- * The bootstrap function.  Return a new drm_driver object and
- * plug in API functions.
- */
-_EGLDriver *
-_eglMain(_EGLDisplay *dpy, const char *args)
-{
-       struct drm_driver *drm;
-
-       drm = (struct drm_driver *) calloc(1, sizeof(struct drm_driver));
-       if (!drm) {
-               return NULL;
-       }
-
-       /* First fill in the dispatch table with defaults */
-       _eglInitDriverFallbacks(&drm->base);
-       /* then plug in our Drm-specific functions */
-       drm->base.API.Initialize = drm_initialize;
-       drm->base.API.Terminate = drm_terminate;
-       drm->base.API.CreateContext = drm_create_context;
-       drm->base.API.MakeCurrent = drm_make_current;
-       drm->base.API.CreateWindowSurface = drm_create_window_surface;
-       drm->base.API.CreatePixmapSurface = drm_create_pixmap_surface;
-       drm->base.API.CreatePbufferSurface = drm_create_pbuffer_surface;
-       drm->base.API.DestroySurface = drm_destroy_surface;
-       drm->base.API.DestroyContext = drm_destroy_context;
-       drm->base.API.CreateScreenSurfaceMESA = drm_create_screen_surface_mesa;
-       drm->base.API.ShowScreenSurfaceMESA = drm_show_screen_surface_mesa;
-       drm->base.API.SwapBuffers = drm_swap_buffers;
-
-       drm->base.ClientAPIsMask = EGL_OPENGL_BIT /*| EGL_OPENGL_ES_BIT*/;
-       drm->base.Name = "DRM/Gallium";
-
-       /* enable supported extensions */
-       drm->base.Extensions.MESA_screen_surface = EGL_TRUE;
-       drm->base.Extensions.MESA_copy_context = EGL_TRUE;
-
-       return &drm->base;
-}
diff --git a/src/gallium/winsys/egl_drm/intel/intel_egl.h b/src/gallium/winsys/egl_drm/intel/intel_egl.h
deleted file mode 100644 (file)
index 1ee27e0..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-
-#ifndef _INTEL_EGL_H_
-#define _INTEL_EGL_H_
-
-#include <xf86drm.h>
-
-struct egl_drm_device
-{
-       void *priv;
-       int drmFD;
-
-       drmVersionPtr version;
-       int deviceID;
-};
-
-struct egl_drm_context
-{
-       void *priv;
-       struct egl_drm_device *device;
-};
-
-struct egl_drm_drawable
-{
-       void *priv;
-       struct egl_drm_device *device;
-       size_t h;
-       size_t w;
-};
-
-struct egl_drm_frontbuffer
-{
-       uint32_t handle;
-       uint32_t pitch;
-       uint32_t width;
-       uint32_t height;
-};
-
-#include "GL/internal/glcore.h"
-
-int intel_create_device(struct egl_drm_device *device);
-int intel_destroy_device(struct egl_drm_device *device);
-
-int intel_create_context(struct egl_drm_context *context, const __GLcontextModes *visual, void *sharedContextPrivate);
-int intel_destroy_context(struct egl_drm_context *context);
-
-int intel_create_drawable(struct egl_drm_drawable *drawable, const __GLcontextModes * visual);
-int intel_destroy_drawable(struct egl_drm_drawable *drawable);
-
-void intel_make_current(struct egl_drm_context *context, struct egl_drm_drawable *draw, struct egl_drm_drawable *read);
-void intel_swap_buffers(struct egl_drm_drawable *draw);
-void intel_bind_frontbuffer(struct egl_drm_drawable *draw, struct egl_drm_frontbuffer *front);
-
-#endif
diff --git a/src/gallium/winsys/egl_drm/intel/intel_reg.h b/src/gallium/winsys/egl_drm/intel/intel_reg.h
deleted file mode 100644 (file)
index 4f33bee..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-
-#ifndef _INTEL_REG_H_
-#define _INTEL_REG_H_
-
-
-#define BR00_BITBLT_CLIENT   0x40000000
-#define BR00_OP_COLOR_BLT    0x10000000
-#define BR00_OP_SRC_COPY_BLT 0x10C00000
-#define BR13_SOLID_PATTERN   0x80000000
-
-#define XY_COLOR_BLT_CMD               ((2<<29)|(0x50<<22)|0x4)
-#define XY_COLOR_BLT_WRITE_ALPHA       (1<<21)
-#define XY_COLOR_BLT_WRITE_RGB         (1<<20)
-
-#define XY_SRC_COPY_BLT_CMD             ((2<<29)|(0x53<<22)|6)
-#define XY_SRC_COPY_BLT_WRITE_ALPHA     (1<<21)
-#define XY_SRC_COPY_BLT_WRITE_RGB       (1<<20)
-
-#define MI_WAIT_FOR_EVENT               ((0x3<<23))
-#define MI_WAIT_FOR_PLANE_B_FLIP        (1<<6)
-#define MI_WAIT_FOR_PLANE_A_FLIP        (1<<2)
-
-#define MI_BATCH_BUFFER_END            (0xA<<23)
-
-
-#endif
diff --git a/src/gallium/winsys/egl_drm/intel/intel_swapbuffers.c b/src/gallium/winsys/egl_drm/intel/intel_swapbuffers.c
deleted file mode 100644 (file)
index 2edcbc7..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#include "intel_device.h"
-#include "intel_context.h"
-#include "intel_batchbuffer.h"
-#include "intel_reg.h"
-
-#include "pipe/p_context.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "state_tracker/st_cb_fbo.h"
-#include "intel_egl.h"
-
-
-static void
-intel_display_surface(struct egl_drm_drawable *draw,
-                      struct pipe_surface *surf);
-
-void intel_swap_buffers(struct egl_drm_drawable *draw)
-{
-       struct intel_framebuffer *intel_fb = (struct intel_framebuffer *)draw->priv;
-       struct pipe_surface *back_surf;
-
-       assert(intel_fb);
-       assert(intel_fb->stfb);
-
-       back_surf = st_get_framebuffer_surface(intel_fb->stfb, ST_SURFACE_BACK_LEFT);
-       if (back_surf) {
-               st_notify_swapbuffers(intel_fb->stfb);
-               if (intel_fb->front)
-                       intel_display_surface(draw, back_surf);
-               st_notify_swapbuffers_complete(intel_fb->stfb);
-       }
-}
-
-static void
-intel_display_surface(struct egl_drm_drawable *draw,
-                      struct pipe_surface *surf)
-{
-       struct intel_context *intel = NULL;
-       struct intel_framebuffer *intel_fb = (struct intel_framebuffer *)draw->priv;
-       struct _DriFenceObject *fence;
-
-       //const int srcWidth = surf->width;
-       //const int srcHeight = surf->height;
-
-       intel = intel_fb->device->dummy;
-       if (!intel) {
-               printf("No dummy context\n");
-               return;
-       }
-
-       const int dstWidth = intel_fb->front->width;
-       const int dstHeight = intel_fb->front->height;
-       const int dstPitch = intel_fb->front->pitch / 4;//draw->front.cpp;
-
-       const int cpp = 4;//intel_fb->front->cpp;
-       const int srcPitch = surf->stride / cpp;
-
-       int BR13, CMD;
-       //int i;
-
-       BR13 = (dstPitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
-       CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
-                       XY_SRC_COPY_BLT_WRITE_RGB);
-
-       BEGIN_BATCH(8, 2);
-       OUT_BATCH(CMD);
-       OUT_BATCH(BR13);
-       OUT_BATCH((0 << 16) | 0);
-       OUT_BATCH((dstHeight << 16) | dstWidth);
-
-       OUT_RELOC(intel_fb->front_buffer,
-               DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
-               DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
-
-       OUT_BATCH((0 << 16) | 0);
-       OUT_BATCH((srcPitch * cpp) & 0xffff);
-       OUT_RELOC(dri_bo(surf->buffer),
-                       DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-                       DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
-
-       fence = intel_be_batchbuffer_flush(intel->base.batch);
-       driFenceUnReference(&fence);
-       intel_be_batchbuffer_finish(intel->base.batch);
-}
index 86b085ab8418a167bcdeb484c7fed510f133316f..ff52ceb8c41076e7ec28ed6be687740aa2893a37 100644 (file)
@@ -118,48 +118,6 @@ static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
     }
 }
 
-
-/**
- * Create DIB for back buffer.
- * We write into this memory with the span routines and then blit it
- * to the window on a buffer swap.
- */
-BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize)
-{
-    HDC          hdc = pwfb->hDC;
-    BITMAPINFO   bmi;
-    LPBITMAPINFO pbmi = &bmi;
-    HDC          hic;
-
-    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-    pbmi->bmiHeader.biWidth = lxSize;
-    pbmi->bmiHeader.biHeight= -lySize;
-    pbmi->bmiHeader.biPlanes = 1;
-    pbmi->bmiHeader.biBitCount = pwfb->cColorBits;
-    pbmi->bmiHeader.biCompression = BI_RGB;
-    pbmi->bmiHeader.biSizeImage = 0;
-    pbmi->bmiHeader.biXPelsPerMeter = 0;
-    pbmi->bmiHeader.biYPelsPerMeter = 0;
-    pbmi->bmiHeader.biClrUsed = 0;
-    pbmi->bmiHeader.biClrImportant = 0;
-    
-    hic = CreateIC("display", NULL, NULL, NULL);
-    pwfb->dib_hDC = CreateCompatibleDC(hic);
-    
-    pwfb->hbmDIB = CreateDIBSection(hic,
-                                  pbmi,
-                                  DIB_RGB_COLORS,
-                                  (void **)&(pwfb->pbPixels),
-                                  0,
-                                  0);
-    pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB);
-    
-    DeleteDC(hic);
-
-    wmSetPixelFormat(pwfb, pwfb->hDC);
-    return TRUE;
-}
-
 /**
  * Create a new WMesaFramebuffer object which will correspond to the
  * given HDC (Window handle).
@@ -201,10 +159,6 @@ wmesa_new_framebuffer(HDC hdc, GLvisual *visual, GLuint width, GLuint height)
 
         pwfb->cColorBits = GetDeviceCaps(hdc, BITSPIXEL);
 
-#if 0
-       wmCreateBackingStore(pwfb, width, height);
-#endif
-
         pwfb->hDC = hdc;
         /* insert at head of list */
        pwfb->next = FirstFramebuffer;
@@ -266,16 +220,6 @@ static WMesaContext wmesa_context(const GLcontext *ctx)
     return (WMesaContext) ctx;
 }
 
-static wmDeleteBackingStore(WMesaFramebuffer pwfb)
-{
-    if (pwfb->hbmDIB) {
-       SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap);
-       DeleteDC(pwfb->dib_hDC);
-       DeleteObject(pwfb->hbmDIB);
-    }
-}
-
-
 /**
  * Find the width and height of the window named by hdc.
  */
@@ -383,11 +327,6 @@ wm_flush_frontbuffer(struct pipe_winsys *pws,
    struct wm_buffer *wm_buf;
     BITMAPINFO bmi, *pbmi;
 
-#if 0
-    if (pwfb)
-       BitBlt(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height,
-              pwfb->dib_hDC, 0, 0, SRCCOPY);
-#else
     wm_buf = wm_buffer(surf->buffer);
 
     pbmi = &bmi;
@@ -405,7 +344,6 @@ wm_flush_frontbuffer(struct pipe_winsys *pws,
     pbmi->bmiHeader.biClrImportant = 0;
 
     StretchDIBits(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, wm_buf->data, pbmi, 0, SRCCOPY);
-#endif
 }
 
 
@@ -706,9 +644,6 @@ void WMesaDestroyContext( WMesaContext pwc )
     /* clean up frame buffer resources */
     pwfb = wmesa_lookup_framebuffer(pwc->hDC);
     if (pwfb) {
-#if 0
-       wmDeleteBackingStore(pwfb);
-#endif
        wmesa_free_framebuffer(pwc->hDC);
     }
 
@@ -779,10 +714,6 @@ void WMesaSwapBuffers( HDC hdc )
      */
     st_notify_swapbuffers(pwfb->stfb);
 
-#if 0
-    BitBlt(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height,
-              pwfb->dib_hDC, 0, 0, SRCCOPY);
-#else
     surf = st_get_framebuffer_surface(pwfb->stfb, ST_SURFACE_BACK_LEFT);
     wm_buf = wm_buffer(surf->buffer);
 
@@ -809,7 +740,6 @@ void WMesaSwapBuffers( HDC hdc )
 
        st_resize_framebuffer(pwfb->stfb, width, height);
     }
-#endif
 }
 
 /* This is hopefully a temporary hack to define some needed dispatch