diff options
Diffstat (limited to 'src/gallium/winsys')
44 files changed, 532 insertions, 1281 deletions
| diff --git a/src/gallium/winsys/drm/Makefile.template b/src/gallium/winsys/drm/Makefile.template index 9f92cb4207..985e5a861f 100644 --- a/src/gallium/winsys/drm/Makefile.template +++ b/src/gallium/winsys/drm/Makefile.template @@ -118,7 +118,7 @@ clean:  install: $(LIBNAME)  	$(INSTALL) -d $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR) -	$(INSTALL) -m 755 $(LIBNAME) $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(LIBNAME) $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR)  include depend diff --git a/src/gallium/winsys/drm/intel/SConscript b/src/gallium/winsys/drm/intel/SConscript new file mode 100644 index 0000000000..50d7b75ed6 --- /dev/null +++ b/src/gallium/winsys/drm/intel/SConscript @@ -0,0 +1,7 @@ +Import('*') + +SConscript(['gem/SConscript',]) + +if 'mesa' in env['statetrackers']: + +    SConscript(['dri/SConscript']) diff --git a/src/gallium/winsys/drm/intel/dri/Makefile b/src/gallium/winsys/drm/intel/dri/Makefile index ac0891a646..5e212b62a4 100644 --- a/src/gallium/winsys/drm/intel/dri/Makefile +++ b/src/gallium/winsys/drm/intel/dri/Makefile @@ -6,7 +6,9 @@ LIBNAME = i915_dri.so  PIPE_DRIVERS = \  	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \  	$(TOP)/src/gallium/winsys/drm/intel/gem/libinteldrm.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/identity/libidentity.a \  	$(TOP)/src/gallium/drivers/i915simple/libi915simple.a diff --git a/src/gallium/winsys/drm/intel/dri/SConscript b/src/gallium/winsys/drm/intel/dri/SConscript new file mode 100644 index 0000000000..e14e96e32f --- /dev/null +++ b/src/gallium/winsys/drm/intel/dri/SConscript @@ -0,0 +1,16 @@ +Import('*') + +env = drienv.Clone() + +drivers = [ +    softpipe, +    i915simple, +    trace, +    inteldrm +] + +env.SharedLibrary( +    target ='i915_dri.so', +    source = COMMON_GALLIUM_SOURCES, +    LIBS = drivers + mesa + auxiliaries + env['LIBS'], +) diff --git a/src/gallium/winsys/drm/intel/gem/SConscript b/src/gallium/winsys/drm/intel/gem/SConscript new file mode 100644 index 0000000000..ea8a2e55f6 --- /dev/null +++ b/src/gallium/winsys/drm/intel/gem/SConscript @@ -0,0 +1,17 @@ +Import('*') + +env = drienv.Clone() + +inteldrm_sources = [ +    'intel_be_api.c', +    'intel_be_batchbuffer.c', +    'intel_be_context.c', +    'intel_be_device.c', +] + +inteldrm = env.ConvenienceLibrary( +    target ='inteldrm', +    source = inteldrm_sources, +) + +Export('inteldrm') diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.c b/src/gallium/winsys/drm/intel/gem/intel_be_api.c index f4ef7c2d88..dd5f814da3 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_api.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.c @@ -1,15 +1,37 @@  #include "intel_be_api.h"  #include "i915simple/i915_winsys.h" +#include "identity/id_drm.h" +#include "trace/tr_drm.h" -struct drm_api drm_api_hooks = +static void destroy(struct drm_api *api) +{ + +} + +struct drm_api intel_be_drm_api =  {  	/* intel_be_context.c */  	.create_context = intel_be_create_context,  	/* intel_be_device.c */  	.create_screen = intel_be_create_screen, -	.buffer_from_texture = i915_get_texture_buffer, +	.buffer_from_texture = intel_be_get_texture_buffer,  	.buffer_from_handle = intel_be_buffer_from_handle,  	.handle_from_buffer = intel_be_handle_from_buffer,  	.global_handle_from_buffer = intel_be_global_handle_from_buffer, +	.destroy = destroy,  }; + +struct drm_api * +drm_api_create() +{ +#ifdef DEBUG +#if 0 +	return identity_drm_create(&intel_be_drm_api); +#else +	return trace_drm_create(&intel_be_drm_api); +#endif +#else +	return &intel_be_drm_api; +#endif +} diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.h b/src/gallium/winsys/drm/intel/gem/intel_be_api.h index 1c622f3b97..f286b62eb8 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_api.h +++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.h @@ -8,8 +8,11 @@  #include "intel_be_device.h" -struct pipe_screen *intel_be_create_screen(int drmFD, +extern struct drm_api intel_be_drm_api; + +struct pipe_screen *intel_be_create_screen(struct drm_api *api, int drmFD,  					   struct drm_create_screen_arg *arg); -struct pipe_context *intel_be_create_context(struct pipe_screen *screen); +struct pipe_context *intel_be_create_context(struct drm_api *api, +					     struct pipe_screen *screen);  #endif diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_context.c b/src/gallium/winsys/drm/intel/gem/intel_be_context.c index fe0b138fbe..db84f9af51 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_context.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_context.c @@ -97,7 +97,7 @@ intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *de  }  struct pipe_context * -intel_be_create_context(struct pipe_screen *screen) +intel_be_create_context(struct drm_api *api, struct pipe_screen *screen)  {  	struct intel_be_context *intel;  	struct pipe_context *pipe; diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.c b/src/gallium/winsys/drm/intel/gem/intel_be_device.c index 907ac86637..e3630f5d12 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_device.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.c @@ -142,8 +142,27 @@ err:  	return NULL;  } +boolean +intel_be_get_texture_buffer(struct drm_api *api, +                            struct pipe_texture *texture, +                            struct pipe_buffer **buffer, +                            unsigned *stride) +{ +	struct intel_be_device *dev; + +	if (!texture) +		return FALSE; + +	dev = intel_be_device(texture->screen->winsys); +	if (dev->softpipe) +		return softpipe_get_texture_buffer(texture, buffer, stride); +	else +		return i915_get_texture_buffer(texture, buffer, stride); +} +  struct pipe_buffer * -intel_be_buffer_from_handle(struct pipe_screen *screen, +intel_be_buffer_from_handle(struct drm_api *api, +                            struct pipe_screen *screen,                              const char* name, unsigned handle)  {  	struct intel_be_device *dev = intel_be_device(screen->winsys); @@ -174,7 +193,8 @@ err:  }  boolean -intel_be_handle_from_buffer(struct pipe_screen *screen, +intel_be_handle_from_buffer(struct drm_api *api, +                            struct pipe_screen *screen,                              struct pipe_buffer *buffer,                              unsigned *handle)  { @@ -186,7 +206,8 @@ intel_be_handle_from_buffer(struct pipe_screen *screen,  }  boolean -intel_be_global_handle_from_buffer(struct pipe_screen *screen, +intel_be_global_handle_from_buffer(struct drm_api *api, +                                   struct pipe_screen *screen,  				   struct pipe_buffer *buffer,  				   unsigned *handle)  { @@ -296,6 +317,7 @@ intel_be_get_device_id(unsigned int *device_id)  {     char path[512];     FILE *file; +   void *shutup_gcc;     /*      * FIXME: Fix this up to use a drm ioctl or whatever. @@ -307,13 +329,14 @@ intel_be_get_device_id(unsigned int *device_id)        return;     } -   fgets(path, sizeof(path), file); +   shutup_gcc = fgets(path, sizeof(path), file);     sscanf(path, "%x", device_id);     fclose(file);  }  struct pipe_screen * -intel_be_create_screen(int drmFD, struct drm_create_screen_arg *arg) +intel_be_create_screen(struct drm_api *api, int drmFD, +		       struct drm_create_screen_arg *arg)  {  	struct intel_be_device *dev;  	struct pipe_screen *screen; @@ -339,7 +362,6 @@ intel_be_create_screen(int drmFD, struct drm_create_screen_arg *arg)  	if (dev->softpipe) {  		screen = softpipe_create_screen(&dev->base); -		drm_api_hooks.buffer_from_texture = softpipe_get_texture_buffer;  	} else  		screen = i915_create_screen(&dev->base, deviceID); diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.h b/src/gallium/winsys/drm/intel/gem/intel_be_device.h index b32637ece2..56d95bd7fe 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_device.h +++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.h @@ -8,6 +8,8 @@  #include "drm.h"  #include "intel_bufmgr.h" +struct drm_api; +  /*   * Device   */ @@ -50,13 +52,23 @@ struct intel_be_buffer {  	unsigned flink;  }; +/* + * Wrapper for driver get_texture_buffer functions. + */ +boolean +intel_be_get_texture_buffer(struct drm_api *api, +                            struct pipe_texture *texture, +                            struct pipe_buffer **buffer, +                            unsigned *stride); +  /**   * Create a be buffer from a drm bo handle.   *   * Takes a reference.   */  struct pipe_buffer * -intel_be_buffer_from_handle(struct pipe_screen *screen, +intel_be_buffer_from_handle(struct drm_api *api, +                            struct pipe_screen *screen,                              const char* name, unsigned handle);  /** @@ -65,7 +77,8 @@ intel_be_buffer_from_handle(struct pipe_screen *screen,   * If buffer is destroyed handle may become invalid.   */  boolean -intel_be_handle_from_buffer(struct pipe_screen *screen, +intel_be_handle_from_buffer(struct drm_api *api, +                            struct pipe_screen *screen,                              struct pipe_buffer *buffer,                              unsigned *handle); @@ -75,7 +88,8 @@ intel_be_handle_from_buffer(struct pipe_screen *screen,   * If buffer is destroyed handle may become invalid.   */  boolean -intel_be_global_handle_from_buffer(struct pipe_screen *screen, +intel_be_global_handle_from_buffer(struct drm_api *api, +                                   struct pipe_screen *screen,                                     struct pipe_buffer *buffer,                                     unsigned *handle); diff --git a/src/gallium/winsys/drm/intel/xorg/Makefile b/src/gallium/winsys/drm/intel/xorg/Makefile index b1b6b9362b..d51cca8d21 100644 --- a/src/gallium/winsys/drm/intel/xorg/Makefile +++ b/src/gallium/winsys/drm/intel/xorg/Makefile @@ -1,36 +1,38 @@  TARGET     = modesetting_drv.so  CFILES     = $(wildcard ./*.c)  OBJECTS    = $(patsubst ./%.c,./%.o,$(CFILES)) -GALLIUMDIR = ../../../..  TOP        = ../../../../../.. -include ${TOP}/configs/current +include $(TOP)/configs/current -CFLAGS = -DHAVE_CONFIG_H \ -         -g -Wall -Wimplicit-function-declaration -fPIC \ -         $(shell pkg-config --cflags pixman-1 xorg-server libdrm xproto) \ -	 -I../gem \ -         -I${GALLIUMDIR}/include \ -         -I${GALLIUMDIR}/drivers \ -         -I${GALLIUMDIR}/auxiliary \ -         -I${TOP}/src/mesa \ -         -I$(TOP)/include \ -         -I$(TOP)/src/egl/main +INCLUDES = \ +	$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \ +	-I../gem \ +	-I$(TOP)/src/gallium/include \ +	-I$(TOP)/src/gallium/drivers \ +	-I$(TOP)/src/gallium/auxiliary \ +	-I$(TOP)/src/mesa \ +	-I$(TOP)/include \ +	-I$(TOP)/src/egl/main  LIBS = \ -	$(GALLIUMDIR)/state_trackers/xorg/libxorgtracker.a \ -	$(GALLIUMDIR)/winsys/drm/intel/gem/libinteldrm.a \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(TOP)/src/gallium/winsys/drm/intel/gem/libinteldrm.a \  	$(TOP)/src/gallium/drivers/i915simple/libi915simple.a \  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \  	$(GALLIUM_AUXILIARIES) +DRIVER_DEFINES = \ +	-DHAVE_CONFIG_H + +  #############################################  all default: $(TARGET) -$(TARGET): $(OBJECTS) Makefile $(GALLIUMDIR)/state_trackers/xorg/libxorgtracker.a $(LIBS) +$(TARGET): $(OBJECTS) Makefile $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a $(LIBS)  	$(TOP)/bin/mklib -noprefix -o $@ \  	$(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_intel @@ -39,6 +41,16 @@ clean:  install:  	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) -	$(INSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + + +############################################## + + +.c.o: +	$(CC) -c $(CFLAGS) $(INCLUDES) $(DRIVER_DEFINES) $< -o $@ + + +##############################################  .PHONY	= all clean install diff --git a/src/gallium/winsys/drm/nouveau/Makefile b/src/gallium/winsys/drm/nouveau/Makefile index f8c8135854..6c9cbef26d 100644 --- a/src/gallium/winsys/drm/nouveau/Makefile +++ b/src/gallium/winsys/drm/nouveau/Makefile @@ -2,7 +2,7 @@  TOP = ../../../../..  include $(TOP)/configs/current -SUBDIRS = drm dri dri2 +SUBDIRS = drm $(GALLIUM_STATE_TRACKERS_DIRS)  default install clean:  	@for dir in $(SUBDIRS) ; do \ diff --git a/src/gallium/winsys/drm/nouveau/dri/Makefile b/src/gallium/winsys/drm/nouveau/dri/Makefile index f7db6201fe..0937f68c34 100644 --- a/src/gallium/winsys/drm/nouveau/dri/Makefile +++ b/src/gallium/winsys/drm/nouveau/dri/Makefile @@ -3,32 +3,25 @@ include $(TOP)/configs/current  LIBNAME = nouveau_dri.so -MINIGLX_SOURCES = -  PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \  	$(TOP)/src/gallium/winsys/drm/nouveau/drm/libnouveaudrm.a \  	$(TOP)/src/gallium/drivers/nv04/libnv04.a \  	$(TOP)/src/gallium/drivers/nv10/libnv10.a \  	$(TOP)/src/gallium/drivers/nv20/libnv20.a \  	$(TOP)/src/gallium/drivers/nv30/libnv30.a \  	$(TOP)/src/gallium/drivers/nv40/libnv40.a \ -	$(TOP)/src/gallium/drivers/nv50/libnv50.a -	 -DRIVER_SOURCES = \ -	nouveau_context.c \ -	nouveau_screen.c \ -	nouveau_swapbuffers.c \ -	nouveau_lock.c +	$(TOP)/src/gallium/drivers/nv50/libnv50.a \ +	$(TOP)/src/gallium/drivers/nouveau/libnouveau.a + +DRIVER_SOURCES =  C_SOURCES = \  	$(COMMON_GALLIUM_SOURCES) \  	$(DRIVER_SOURCES) -ASM_SOURCES =  +include ../../Makefile.template -DRIVER_DEFINES = $(shell pkg-config libdrm_nouveau --cflags)  DRI_LIB_DEPS += $(shell pkg-config libdrm_nouveau --libs) -include ../../Makefile.template -  symlinks: diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_context.c b/src/gallium/winsys/drm/nouveau/dri/nouveau_context.c deleted file mode 100644 index deb6ffcff1..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_context.c +++ /dev/null @@ -1,118 +0,0 @@ -#include <main/glheader.h> -#include <glapi/glthread.h> -#include <GL/internal/glcore.h> -#include <utils.h> - -#include <state_tracker/st_public.h> -#include <state_tracker/st_context.h> -#include <state_tracker/drm_api.h> -#include <pipe/p_defines.h> -#include <pipe/p_context.h> -#include <pipe/p_screen.h> - -#include "nouveau_context.h" -#include "nouveau_screen.h" - -#include "nouveau_drmif.h" - -GLboolean -nouveau_context_create(const __GLcontextModes *glVis, -		       __DRIcontextPrivate *driContextPriv, -		       void *sharedContextPrivate) -{ -	__DRIscreenPrivate *driScrnPriv = driContextPriv->driScreenPriv; -	struct nouveau_screen  *nv_screen = driScrnPriv->private; -	struct nouveau_context *nv; -	struct pipe_context *pipe; -	struct st_context *st_share = NULL; - -	if (sharedContextPrivate) -		st_share = ((struct nouveau_context *)sharedContextPrivate)->st; - -	nv = CALLOC_STRUCT(nouveau_context); -	if (!nv) -		return GL_FALSE; - -	{ -		struct nouveau_device_priv *nvdev = -			nouveau_device(nv_screen->device); - -		nvdev->ctx  = driContextPriv->hHWContext; -		nvdev->lock = (drmLock *)&driScrnPriv->pSAREA->lock; -	} - -	pipe = drm_api_hooks.create_context(nv_screen->pscreen); -	if (!pipe) { -		FREE(nv); -		return GL_FALSE; -	} -	pipe->priv = nv; - -	driContextPriv->driverPrivate = nv; -	nv->dri_screen = driScrnPriv; - -	driParseConfigFiles(&nv->dri_option_cache, &nv_screen->option_cache, -			    nv->dri_screen->myNum, "nouveau"); - -	nv->st = st_create_context(pipe, glVis, st_share); -	return GL_TRUE; -} - -void -nouveau_context_destroy(__DRIcontextPrivate *driContextPriv) -{ -	struct nouveau_context *nv = driContextPriv->driverPrivate; - -	assert(nv); - -	st_finish(nv->st); -	st_destroy_context(nv->st); - -	FREE(nv); -} - -GLboolean -nouveau_context_bind(__DRIcontextPrivate *driContextPriv, -		     __DRIdrawablePrivate *driDrawPriv, -		     __DRIdrawablePrivate *driReadPriv) -{ -	struct nouveau_context *nv; -	struct nouveau_framebuffer *draw, *read; - -	if (!driContextPriv) { -		st_make_current(NULL, NULL, NULL); -		return GL_TRUE; -	} - -	nv = driContextPriv->driverPrivate; -	draw = driDrawPriv->driverPrivate; -	read = driReadPriv->driverPrivate; - -	st_make_current(nv->st, draw->stfb, read->stfb); - -	if ((nv->dri_drawable != driDrawPriv) || -	    (nv->last_stamp != driDrawPriv->lastStamp)) { -		nv->dri_drawable = driDrawPriv; -		st_resize_framebuffer(draw->stfb, driDrawPriv->w, -				      driDrawPriv->h); -		nv->last_stamp = driDrawPriv->lastStamp; -	} - -	if (driDrawPriv != driReadPriv) { -		st_resize_framebuffer(read->stfb, driReadPriv->w, -				      driReadPriv->h); -	} - -	return GL_TRUE; -} - -GLboolean -nouveau_context_unbind(__DRIcontextPrivate *driContextPriv) -{ -	struct nouveau_context *nv = driContextPriv->driverPrivate; -	(void)nv; - -	st_flush(nv->st, 0, NULL); -	return GL_TRUE; -} - diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_context.h b/src/gallium/winsys/drm/nouveau/dri/nouveau_context.h deleted file mode 100644 index 2779b092e6..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_context.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef __NOUVEAU_CONTEXT_DRI_H__ -#define __NOUVEAU_CONTEXT_DRI_H__ - -#include <dri_util.h> -#include <xmlconfig.h> - -#include "nouveau/nouveau_winsys.h" - -#define NOUVEAU_ERR(fmt, args...) debug_printf("%s: "fmt, __func__, ##args) - -struct nouveau_framebuffer { -	struct st_framebuffer *stfb; -}; - -struct nouveau_context { -	struct st_context *st; - -	/* DRI stuff */ -	__DRIscreenPrivate    *dri_screen; -	__DRIdrawablePrivate  *dri_drawable; -	unsigned int           last_stamp; -	driOptionCache         dri_option_cache; -	drm_context_t          drm_context; -	drmLock                drm_lock; -	int                    locked; -}; - -extern GLboolean nouveau_context_create(const __GLcontextModes *, -					__DRIcontextPrivate *, void *); -extern void nouveau_context_destroy(__DRIcontextPrivate *); -extern GLboolean nouveau_context_bind(__DRIcontextPrivate *, -				      __DRIdrawablePrivate *draw, -				      __DRIdrawablePrivate *read); -extern GLboolean nouveau_context_unbind(__DRIcontextPrivate *); - -extern void nouveau_contended_lock(struct nouveau_context *nv); -extern void LOCK_HARDWARE(struct nouveau_context *nv); -extern void UNLOCK_HARDWARE(struct nouveau_context *nv); - -#ifdef DEBUG -extern int __nouveau_debug; - -#define DEBUG_BO (1 << 0) - -#define DBG(flag, ...) do {                   \ -	if (__nouveau_debug & (DEBUG_##flag)) \ -		NOUVEAU_ERR(__VA_ARGS__);     \ -} while(0) -#else -#define DBG(flag, ...) -#endif - -#endif diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_lock.c b/src/gallium/winsys/drm/nouveau/dri/nouveau_lock.c deleted file mode 100644 index 92f5bd09c9..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_lock.c +++ /dev/null @@ -1,73 +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 <pipe/p_thread.h> -#include "nouveau_context.h" -#include "nouveau_screen.h" -#include "nouveau_drmif.h" - -pipe_static_mutex(lockMutex); - -/* Lock the hardware and validate our state. - */ -void -LOCK_HARDWARE(struct nouveau_context *nv) -{ -	struct nouveau_screen *nv_screen = nv->dri_screen->private; -	struct nouveau_device *dev = nv_screen->device; -	struct nouveau_device_priv *nvdev = nouveau_device(dev); -	char __ret=0; - -	assert(!nv->locked); -	pipe_mutex_lock(lockMutex); - -	DRM_CAS(nvdev->lock, nvdev->ctx, -		(DRM_LOCK_HELD | nvdev->ctx), __ret); - -	if (__ret) { -		drmGetLock(nvdev->fd, nvdev->ctx, 0); -		nouveau_contended_lock(nv); -	} -	nv->locked = 1; -} - -/* Unlock the hardware using the global current context  - */ -void -UNLOCK_HARDWARE(struct nouveau_context *nv) -{ -	struct nouveau_screen *nv_screen = nv->dri_screen->private; -	struct nouveau_device *dev = nv_screen->device; -	struct nouveau_device_priv *nvdev = nouveau_device(dev); - -	assert(nv->locked); -	nv->locked = 0; - -	DRM_UNLOCK(nvdev->fd, nvdev->lock, nvdev->ctx); - -	pipe_mutex_unlock(lockMutex); -}  diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.c b/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.c deleted file mode 100644 index 4e9b76a909..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.c +++ /dev/null @@ -1,330 +0,0 @@ -#include <utils.h> -#include <vblank.h> -#include <xmlpool.h> - -#include <pipe/p_context.h> -#include <state_tracker/st_public.h> -#include <state_tracker/st_cb_fbo.h> -#include <state_tracker/drm_api.h> - -#include "nouveau_context.h" -#include "nouveau_screen.h" -#include "nouveau_swapbuffers.h" -#include "nouveau_dri.h" - -#include "nouveau_drm.h" -#include "nouveau_drmif.h" - -#if NOUVEAU_DRM_HEADER_PATCHLEVEL != 12 -#error nouveau_drm.h version does not match expected version -#endif - -/* Extension stuff, enabling of extensions handled by Gallium's GL state - * tracker.  But, we still need to define the entry points we want. - */ -#define need_GL_ARB_fragment_program -#define need_GL_ARB_multisample -#define need_GL_ARB_occlusion_query -#define need_GL_ARB_point_parameters -#define need_GL_ARB_shader_objects -#define need_GL_ARB_texture_compression -#define need_GL_ARB_vertex_program -#define need_GL_ARB_vertex_shader -#define need_GL_ARB_vertex_buffer_object -#define need_GL_EXT_compiled_vertex_array -#define need_GL_EXT_fog_coord -#define need_GL_EXT_secondary_color -#define need_GL_EXT_framebuffer_object -#define need_GL_VERSION_2_0 -#define need_GL_VERSION_2_1 -#include "extension_helper.h" - -const struct dri_extension card_extensions[] = -{ -	{ "GL_ARB_multisample", GL_ARB_multisample_functions }, -	{ "GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions }, -	{ "GL_ARB_point_parameters", GL_ARB_point_parameters_functions }, -	{ "GL_ARB_shader_objects", GL_ARB_shader_objects_functions }, -	{ "GL_ARB_shading_language_100", GL_VERSION_2_0_functions }, -	{ "GL_ARB_shading_language_120", GL_VERSION_2_1_functions }, -	{ "GL_ARB_texture_compression", GL_ARB_texture_compression_functions }, -	{ "GL_ARB_vertex_program", GL_ARB_vertex_program_functions }, -	{ "GL_ARB_vertex_shader", GL_ARB_vertex_shader_functions }, -	{ "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions }, -	{ "GL_EXT_compiled_vertex_array", GL_EXT_compiled_vertex_array_functions }, -	{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions }, -	{ "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, -	{ "GL_EXT_secondary_color", GL_EXT_secondary_color_functions }, -	{ NULL, 0 } -}; - -PUBLIC const char __driConfigOptions[] = -DRI_CONF_BEGIN -DRI_CONF_END; -static const GLuint __driNConfigOptions = 0; - -extern const struct dri_extension common_extensions[]; -extern const struct dri_extension nv40_extensions[]; - -static GLboolean -nouveau_create_buffer(__DRIscreenPrivate * driScrnPriv, -		      __DRIdrawablePrivate * driDrawPriv, -		      const __GLcontextModes *glVis, GLboolean pixmapBuffer) -{ -	struct nouveau_framebuffer *nvfb; -	enum pipe_format colour, depth, stencil; - -	if (pixmapBuffer) -		return GL_FALSE; - -	nvfb = CALLOC_STRUCT(nouveau_framebuffer); -	if (!nvfb) -		return GL_FALSE; - -	if (glVis->redBits == 5) -		colour = PIPE_FORMAT_R5G6B5_UNORM; -	else -		colour = PIPE_FORMAT_A8R8G8B8_UNORM; - -	if (glVis->depthBits == 16) -		depth = PIPE_FORMAT_Z16_UNORM; -	else if (glVis->depthBits == 24) -		depth = PIPE_FORMAT_Z24S8_UNORM; -	else -		depth = PIPE_FORMAT_NONE; - -	if (glVis->stencilBits == 8) -		stencil = PIPE_FORMAT_Z24S8_UNORM; -	else -		stencil = PIPE_FORMAT_NONE; - -	nvfb->stfb = st_create_framebuffer(glVis, colour, depth, stencil, -					   driDrawPriv->w, driDrawPriv->h, -					   (void*)nvfb); -	if (!nvfb->stfb) { -		free(nvfb); -		return  GL_FALSE; -	} - -	driDrawPriv->driverPrivate = (void *)nvfb; -	return GL_TRUE; -} - -static void -nouveau_destroy_buffer(__DRIdrawablePrivate * driDrawPriv) -{ -	struct nouveau_framebuffer *nvfb; -	 -	nvfb = (struct nouveau_framebuffer *)driDrawPriv->driverPrivate; -	st_unreference_framebuffer(nvfb->stfb); -	free(nvfb); -} - -static __DRIconfig ** -nouveau_fill_in_modes(__DRIscreenPrivate *psp, -		      unsigned pixel_bits, unsigned depth_bits, -		      unsigned stencil_bits, GLboolean have_back_buffer) -{ -	__DRIconfig **configs; -	unsigned depth_buffer_factor; -	unsigned back_buffer_factor; -	GLenum fb_format; -	GLenum fb_type; - -	static const GLenum back_buffer_modes[] = { -		GLX_NONE, GLX_SWAP_UNDEFINED_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; - -	/* 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; - -	msaa_samples_array[0] = 0; - -	depth_buffer_factor = -		((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1; -	back_buffer_factor = (have_back_buffer) ? 3 : 1; - -	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; -	} - -	configs = driCreateConfigs(fb_format, fb_type, -				   depth_bits_array, stencil_bits_array, -				   depth_buffer_factor, back_buffer_modes, -				   back_buffer_factor, msaa_samples_array, 1); -	if (configs == NULL) { -	 fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", -			 __func__, __LINE__); -		return NULL; -	} - -	return configs; -} - -static struct pipe_surface * -dri_surface_from_handle(struct pipe_screen *screen, -                        unsigned handle, -                        enum pipe_format format, -                        unsigned width, -                        unsigned height, -                        unsigned pitch) -{ -   struct pipe_surface *surface = NULL; -   struct pipe_texture *texture = NULL; -   struct pipe_texture templat; -   struct pipe_buffer *buf = NULL; - -   buf = drm_api_hooks.buffer_from_handle(screen, "front buffer", handle); -   if (!buf) -      return NULL; - -   memset(&templat, 0, sizeof(templat)); -   templat.tex_usage = PIPE_TEXTURE_USAGE_PRIMARY | -                       NOUVEAU_TEXTURE_USAGE_LINEAR; -   templat.target = PIPE_TEXTURE_2D; -   templat.last_level = 0; -   templat.depth[0] = 1; -   templat.format = format; -   templat.width[0] = width; -   templat.height[0] = height; -   pf_get_block(templat.format, &templat.block); - -   texture = screen->texture_blanket(screen, -                                     &templat, -                                     &pitch, -                                     buf); - -   /* we don't need the buffer from this point on */ -   pipe_buffer_reference(&buf, NULL); - -   if (!texture) -      return NULL; - -   surface = screen->get_tex_surface(screen, texture, 0, 0, 0, -                                     PIPE_BUFFER_USAGE_GPU_READ | -                                     PIPE_BUFFER_USAGE_GPU_WRITE); - -   /* we don't need the texture from this point on */ -   pipe_texture_reference(&texture, NULL); -   return surface; -} - -static const __DRIconfig ** -nouveau_screen_create(__DRIscreenPrivate *psp) -{ -	struct nouveau_dri *nv_dri = psp->pDevPriv; -	struct nouveau_screen *nv_screen; -	static const __DRIversion ddx_expected = -		{ 0, 0, NOUVEAU_DRM_HEADER_PATCHLEVEL }; -	static const __DRIversion dri_expected = { 4, 0, 0 }; -	static const __DRIversion drm_expected = -		{ 0, 0, NOUVEAU_DRM_HEADER_PATCHLEVEL }; - -	if (!driCheckDriDdxDrmVersions2("nouveau", -					&psp->dri_version, &dri_expected, -					&psp->ddx_version, &ddx_expected, -					&psp->drm_version, &drm_expected)) { -		return NULL; -	} - -	if (drm_expected.patch != psp->drm_version.patch) { -		fprintf(stderr, "Incompatible DRM patch level.\n" -				"Expected: %d\n" "Current : %d\n", -			drm_expected.patch, psp->drm_version.patch); -		return NULL; -	} - -	driInitExtensions(NULL, card_extensions, GL_FALSE); - -	if (psp->devPrivSize != sizeof(struct nouveau_dri)) { -		NOUVEAU_ERR("DRI struct mismatch between DDX/DRI\n"); -		return NULL; -	} - -	nv_screen = CALLOC_STRUCT(nouveau_screen); -	if (!nv_screen) -		return NULL; - -	nouveau_device_open_existing(&nv_screen->device, 0, psp->fd, 0); - -	nv_screen->pscreen = drm_api_hooks.create_screen(psp->fd, NULL); -	if (!nv_screen->pscreen) { -		FREE(nv_screen); -		return NULL; -	} -	nv_screen->pscreen->flush_frontbuffer = nouveau_flush_frontbuffer; - -	{ -		enum pipe_format format; - -		if (nv_dri->bpp == 16) -			format = PIPE_FORMAT_R5G6B5_UNORM; -		else -			format = PIPE_FORMAT_A8R8G8B8_UNORM; - -		nv_screen->fb = dri_surface_from_handle(nv_screen->pscreen, -							nv_dri->front_offset, -							format, -							nv_dri->width, -							nv_dri->height, -							nv_dri->front_pitch * -							nv_dri->bpp / 8); -	} -						 -	driParseOptionInfo(&nv_screen->option_cache, -			   __driConfigOptions, __driNConfigOptions); - -	nv_screen->driScrnPriv = psp; -	psp->private = (void *)nv_screen; - -	return (const __DRIconfig **) -		nouveau_fill_in_modes(psp, nv_dri->bpp, -				      (nv_dri->bpp == 16) ? 16 : 24, -				      (nv_dri->bpp == 16) ? 0 : 8, 1); -} - -static void -nouveau_screen_destroy(__DRIscreenPrivate *driScrnPriv) -{ -	struct nouveau_screen *nv_screen = driScrnPriv->private; - -	driScrnPriv->private = NULL; -	FREE(nv_screen); -} - -const struct __DriverAPIRec -driDriverAPI = { -	.InitScreen	= nouveau_screen_create, -	.DestroyScreen	= nouveau_screen_destroy, -	.CreateContext	= nouveau_context_create, -	.DestroyContext	= nouveau_context_destroy, -	.CreateBuffer	= nouveau_create_buffer, -	.DestroyBuffer	= nouveau_destroy_buffer, -	.SwapBuffers	= nouveau_swap_buffers, -	.MakeCurrent	= nouveau_context_bind, -	.UnbindContext	= nouveau_context_unbind, -	.CopySubBuffer	= nouveau_copy_sub_buffer, - -	.InitScreen2	= NULL, /* one day, I promise! */ -}; - diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.h b/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.h deleted file mode 100644 index ac078f3c63..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_screen.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __NOUVEAU_SCREEN_DRI_H__ -#define __NOUVEAU_SCREEN_DRI_H__ - -#include "xmlconfig.h" - -struct nouveau_screen { -	__DRIscreenPrivate *driScrnPriv; -	driOptionCache      option_cache; - -	struct nouveau_device *device; - -	struct pipe_screen *pscreen; -	struct pipe_surface *fb; -}; - -#endif diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.c b/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.c deleted file mode 100644 index 9c841a0b2d..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.c +++ /dev/null @@ -1,115 +0,0 @@ -#include <main/glheader.h> -#include <glapi/glthread.h> -#include <GL/internal/glcore.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 "nouveau_context.h" -#include "nouveau_screen.h" -#include "nouveau_swapbuffers.h" - -#include "nouveau_pushbuf.h" - -void -nouveau_copy_buffer(__DRIdrawablePrivate *dPriv, struct pipe_surface *surf, -		    const drm_clip_rect_t *rect) -{ -	struct nouveau_context *nv = dPriv->driContextPriv->driverPrivate; -	struct nouveau_screen *nv_screen = nv->dri_screen->private; -	struct pipe_context *pipe = nv->st->pipe; -	drm_clip_rect_t *pbox; -	int nbox, i; - -	LOCK_HARDWARE(nv); -	if (!dPriv->numClipRects) { -		UNLOCK_HARDWARE(nv); -		return; -	} -	pbox = dPriv->pClipRects; -	nbox = dPriv->numClipRects; - -	for (i = 0; i < nbox; i++, pbox++) { -		int sx, sy, dx, dy, w, h; - -		sx = pbox->x1 - dPriv->x; -		sy = pbox->y1 - dPriv->y; -		dx = pbox->x1; -		dy = pbox->y1; -		w  = pbox->x2 - pbox->x1; -		h  = pbox->y2 - pbox->y1; - -		pipe->surface_copy(pipe, nv_screen->fb, dx, dy, surf, -				   sx, sy, w, h); -	} - -	pipe->flush(pipe, 0, NULL); -	UNLOCK_HARDWARE(nv); - -	if (nv->last_stamp != dPriv->lastStamp) { -		struct nouveau_framebuffer *nvfb = dPriv->driverPrivate; -		st_resize_framebuffer(nvfb->stfb, dPriv->w, dPriv->h); -		nv->last_stamp = dPriv->lastStamp; -	} -} - -void -nouveau_copy_sub_buffer(__DRIdrawablePrivate *dPriv, int x, int y, int w, int h) -{ -	struct nouveau_framebuffer *nvfb = dPriv->driverPrivate; -	struct pipe_surface *surf; - -	st_get_framebuffer_surface(nvfb->stfb, ST_SURFACE_BACK_LEFT, &surf); -	if (surf) { -		drm_clip_rect_t rect; -		rect.x1 = x; -		rect.y1 = y; -		rect.x2 = x + w; -		rect.y2 = y + h; - -		st_notify_swapbuffers(nvfb->stfb); -		nouveau_copy_buffer(dPriv, surf, &rect); -	} -} - -void -nouveau_swap_buffers(__DRIdrawablePrivate *dPriv) -{ -	struct nouveau_framebuffer *nvfb = dPriv->driverPrivate; -	struct pipe_surface *surf; - -	st_get_framebuffer_surface(nvfb->stfb, ST_SURFACE_BACK_LEFT, &surf); -	if (surf) { -		st_notify_swapbuffers(nvfb->stfb); -		nouveau_copy_buffer(dPriv, surf, NULL); -	} -} - -void -nouveau_flush_frontbuffer(struct pipe_screen *pscreen, struct pipe_surface *ps, -			  void *context_private) -{ -	struct nouveau_context *nv = context_private; -	__DRIdrawablePrivate *dPriv = nv->dri_drawable; - -	nouveau_copy_buffer(dPriv, ps, NULL); -} - -void -nouveau_contended_lock(struct nouveau_context *nv) -{ -	struct nouveau_context *nv_sub = (struct nouveau_context*)nv; -	__DRIdrawablePrivate *dPriv = nv_sub->dri_drawable; -	__DRIscreenPrivate *sPriv = nv_sub->dri_screen; - -	/* 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); -} - diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.h b/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.h deleted file mode 100644 index 4ca9cc2283..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_swapbuffers.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __NOUVEAU_SWAPBUFFERS_H__ -#define __NOUVEAU_SWAPBUFFERS_H__ - -void nouveau_copy_buffer(__DRIdrawablePrivate *, struct pipe_surface *, -			 const drm_clip_rect_t *); -void nouveau_copy_sub_buffer(__DRIdrawablePrivate *, int x, int y, int w, int h); -void nouveau_swap_buffers(__DRIdrawablePrivate *); -void nouveau_flush_frontbuffer(struct pipe_screen *, struct pipe_surface *, -			       void *context_private); - -#endif diff --git a/src/gallium/winsys/drm/nouveau/dri2/Makefile b/src/gallium/winsys/drm/nouveau/dri2/Makefile deleted file mode 100644 index 377a80d518..0000000000 --- a/src/gallium/winsys/drm/nouveau/dri2/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -TOP = ../../../../../.. -include $(TOP)/configs/current - -LIBNAME = nouveau_dri2.so - -PIPE_DRIVERS = \ -	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ -	$(TOP)/src/gallium/winsys/drm/nouveau/drm/libnouveaudrm.a \ -	$(TOP)/src/gallium/drivers/nv04/libnv04.a \ -	$(TOP)/src/gallium/drivers/nv10/libnv10.a \ -	$(TOP)/src/gallium/drivers/nv20/libnv20.a \ -	$(TOP)/src/gallium/drivers/nv30/libnv30.a \ -	$(TOP)/src/gallium/drivers/nv40/libnv40.a \ -	$(TOP)/src/gallium/drivers/nv50/libnv50.a - -DRIVER_SOURCES = - -C_SOURCES = \ -	$(COMMON_GALLIUM_SOURCES) \ -	$(DRIVER_SOURCES) - -include ../../Makefile.template - -DRI_LIB_DEPS += $(shell pkg-config libdrm_nouveau --libs) - -symlinks: diff --git a/src/gallium/winsys/drm/nouveau/drm/Makefile b/src/gallium/winsys/drm/nouveau/drm/Makefile index 2da78d8690..54c3b26c75 100644 --- a/src/gallium/winsys/drm/nouveau/drm/Makefile +++ b/src/gallium/winsys/drm/nouveau/drm/Makefile @@ -3,9 +3,7 @@ include $(TOP)/configs/current  LIBNAME = nouveaudrm -C_SOURCES = nouveau_drm_api.c \ -	    nouveau_winsys_pipe.c \ -	    nouveau_winsys.c +C_SOURCES = nouveau_drm_api.c  LIBRARY_INCLUDES = $(shell pkg-config libdrm libdrm_nouveau --cflags-only-I)  LIBRARY_DEFINES = $(shell pkg-config libdrm libdrm_nouveau --cflags-only-other) diff --git a/src/gallium/winsys/drm/nouveau/dri/nouveau_dri.h b/src/gallium/winsys/drm/nouveau/drm/nouveau_dri.h index 1207c2d609..1207c2d609 100644 --- a/src/gallium/winsys/drm/nouveau/dri/nouveau_dri.h +++ b/src/gallium/winsys/drm/nouveau/drm/nouveau_dri.h diff --git a/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c b/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c index a558fda140..3167ccfdc1 100644 --- a/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c +++ b/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c @@ -1,20 +1,84 @@ +#include "pipe/p_context.h" +#include "pipe/p_state.h"  #include "util/u_memory.h"  #include "nouveau_drm_api.h" -#include "nouveau_winsys_pipe.h"  #include "nouveau_drmif.h"  #include "nouveau_channel.h"  #include "nouveau_bo.h" +#include "nouveau/nouveau_winsys.h" +#include "nouveau/nouveau_screen.h" + +static struct pipe_surface * +dri_surface_from_handle(struct drm_api *api, struct pipe_screen *screen, +                        unsigned handle, +                        enum pipe_format format, +                        unsigned width, +                        unsigned height, +                        unsigned pitch) +{ +   struct pipe_surface *surface = NULL; +   struct pipe_texture *texture = NULL; +   struct pipe_texture templat; +   struct pipe_buffer *buf = NULL; + +   buf = api->buffer_from_handle(api, screen, "front buffer", handle); +   if (!buf) +      return NULL; + +   memset(&templat, 0, sizeof(templat)); +   templat.tex_usage = PIPE_TEXTURE_USAGE_PRIMARY | +                       NOUVEAU_TEXTURE_USAGE_LINEAR; +   templat.target = PIPE_TEXTURE_2D; +   templat.last_level = 0; +   templat.depth[0] = 1; +   templat.format = format; +   templat.width[0] = width; +   templat.height[0] = height; +   pf_get_block(templat.format, &templat.block); + +   texture = screen->texture_blanket(screen, +                                     &templat, +                                     &pitch, +                                     buf); + +   /* we don't need the buffer from this point on */ +   pipe_buffer_reference(&buf, NULL); + +   if (!texture) +      return NULL; + +   surface = screen->get_tex_surface(screen, texture, 0, 0, 0, +                                     PIPE_BUFFER_USAGE_GPU_READ | +                                     PIPE_BUFFER_USAGE_GPU_WRITE); + +   /* we don't need the texture from this point on */ +   pipe_texture_reference(&texture, NULL); +   return surface; +} + +static struct pipe_surface * +nouveau_dri1_front_surface(struct pipe_context *pipe) +{ +	return nouveau_winsys_screen(pipe->screen)->front; +} + +static struct dri1_api nouveau_dri1_api = { +	nouveau_dri1_front_surface, +}; +  static struct pipe_screen * -nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg) +nouveau_drm_create_screen(struct drm_api *api, int fd, +			  struct drm_create_screen_arg *arg)  { -	struct pipe_winsys *ws; +	struct dri1_create_screen_arg *dri1 = (void *)arg;  	struct nouveau_winsys *nvws; +	struct pipe_winsys *ws;  	struct nouveau_device *dev = NULL;  	struct pipe_screen *(*init)(struct pipe_winsys *, -				    struct nouveau_winsys *); +				    struct nouveau_device *);  	int ret;  	ret = nouveau_device_open_existing(&dev, 0, fd, 0); @@ -49,33 +113,53 @@ nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg)  		return NULL;  	} -	ws = nouveau_pipe_winsys_new(dev); -	if (!ws) { +	nvws = CALLOC_STRUCT(nouveau_winsys); +	if (!nvws) {  		nouveau_device_close(&dev);  		return NULL;  	} +	ws = &nvws->base; -	nvws = nouveau_winsys_new(ws); -	if (!nvws) { +	nvws->pscreen = init(ws, dev); +	if (!nvws->pscreen) {  		ws->destroy(ws);  		return NULL;  	} -	nouveau_pipe_winsys(ws)->pscreen = init(ws, nvws); -	if (!nouveau_pipe_winsys(ws)->pscreen) { -		ws->destroy(ws); -		return NULL; +	if (arg->mode == DRM_CREATE_DRI1) { +		struct nouveau_dri *nvdri = dri1->ddx_info; +		enum pipe_format format; + +		if (nvdri->bpp == 16) +			format = PIPE_FORMAT_R5G6B5_UNORM; +		else +			format = PIPE_FORMAT_A8R8G8B8_UNORM; + +		nvws->front = dri_surface_from_handle(api, nvws->pscreen, +						      nvdri->front_offset, +						      format, nvdri->width, +						      nvdri->height, +						      nvdri->front_pitch * +						      (nvdri->bpp / 8)); +		if (!nvws->front) { +			debug_printf("%s: error referencing front buffer\n", +				     __func__); +			ws->destroy(ws); +			return NULL; +		} + +		dri1->api = &nouveau_dri1_api;  	} -	return nouveau_pipe_winsys(ws)->pscreen; +	return nvws->pscreen;  }  static struct pipe_context * -nouveau_drm_create_context(struct pipe_screen *pscreen) +nouveau_drm_create_context(struct drm_api *api, struct pipe_screen *pscreen)  { -	struct nouveau_pipe_winsys *nvpws = nouveau_screen(pscreen); +	struct nouveau_winsys *nvws = nouveau_winsys_screen(pscreen);  	struct pipe_context *(*init)(struct pipe_screen *, unsigned); -	unsigned chipset = nvpws->channel->device->chipset; +	unsigned chipset = nouveau_screen(pscreen)->device->chipset;  	int i;  	switch (chipset & 0xf0) { @@ -106,81 +190,80 @@ nouveau_drm_create_context(struct pipe_screen *pscreen)  	}  	/* Find a free slot for a pipe context, allocate a new one if needed */ -	for (i = 0; i < nvpws->nr_pctx; i++) { -		if (nvpws->pctx[i] == NULL) +	for (i = 0; i < nvws->nr_pctx; i++) { +		if (nvws->pctx[i] == NULL)  			break;  	} -	if (i == nvpws->nr_pctx) { -		nvpws->nr_pctx++; -		nvpws->pctx = realloc(nvpws->pctx, -				      sizeof(*nvpws->pctx) * nvpws->nr_pctx); +	if (i == nvws->nr_pctx) { +		nvws->nr_pctx++; +		nvws->pctx = realloc(nvws->pctx, +				      sizeof(*nvws->pctx) * nvws->nr_pctx);  	} -	nvpws->pctx[i] = init(pscreen, i); -	return nvpws->pctx[i]; +	nvws->pctx[i] = init(pscreen, i); +	return nvws->pctx[i];  }  static boolean -nouveau_drm_pb_from_pt(struct pipe_texture *pt, struct pipe_buffer **ppb, -		       unsigned *stride) +nouveau_drm_pb_from_pt(struct drm_api *api, struct pipe_texture *pt, +		       struct pipe_buffer **ppb, unsigned *stride)  {  	return false;  }  static struct pipe_buffer * -nouveau_drm_pb_from_handle(struct pipe_screen *pscreen, const char *name, -			   unsigned handle) +nouveau_drm_pb_from_handle(struct drm_api *api, struct pipe_screen *pscreen, +			   const char *name, unsigned handle)  { -	struct nouveau_pipe_winsys *nvpws = nouveau_screen(pscreen); -	struct nouveau_device *dev = nvpws->channel->device; -	struct nouveau_pipe_buffer *nvpb; +	struct nouveau_device *dev = nouveau_screen(pscreen)->device; +	struct pipe_buffer *pb;  	int ret; -	nvpb = CALLOC_STRUCT(nouveau_pipe_buffer); -	if (!nvpb) +	pb = CALLOC(1, sizeof(struct pipe_buffer) + sizeof(struct nouveau_bo*)); +	if (!pb)  		return NULL; -	ret = nouveau_bo_handle_ref(dev, handle, &nvpb->bo); +	ret = nouveau_bo_handle_ref(dev, handle, (struct nouveau_bo**)(pb+1));  	if (ret) {  		debug_printf("%s: ref name 0x%08x failed with %d\n",  			     __func__, handle, ret); -		FREE(nvpb); +		FREE(pb);  		return NULL;  	} -	pipe_reference_init(&nvpb->base.reference, 1); -	nvpb->base.screen = pscreen; -	nvpb->base.alignment = 0; -	nvpb->base.usage = PIPE_BUFFER_USAGE_GPU_READ_WRITE | -			   PIPE_BUFFER_USAGE_CPU_READ_WRITE; -	nvpb->base.size = nvpb->bo->size; -	return &nvpb->base; +	pipe_reference_init(&pb->reference, 1); +	pb->screen = pscreen; +	pb->alignment = 0; +	pb->usage = PIPE_BUFFER_USAGE_GPU_READ_WRITE | +		    PIPE_BUFFER_USAGE_CPU_READ_WRITE; +	pb->size = nouveau_bo(pb)->size; +	return pb;  }  static boolean -nouveau_drm_handle_from_pb(struct pipe_screen *pscreen, struct pipe_buffer *pb, -			   unsigned *handle) +nouveau_drm_handle_from_pb(struct drm_api *api, struct pipe_screen *pscreen, +			   struct pipe_buffer *pb, unsigned *handle)  { -	struct nouveau_pipe_buffer *nvpb = nouveau_pipe_buffer(pb); +	struct nouveau_bo *bo = nouveau_bo(pb); -	if (!nvpb) +	if (!bo)  		return FALSE; -	*handle = nvpb->bo->handle; +	*handle = bo->handle;  	return TRUE;  }  static boolean -nouveau_drm_name_from_pb(struct pipe_screen *pscreen, struct pipe_buffer *pb, -			 unsigned *handle) +nouveau_drm_name_from_pb(struct drm_api *api, struct pipe_screen *pscreen, +			 struct pipe_buffer *pb, unsigned *handle)  { -	struct nouveau_pipe_buffer *nvpb = nouveau_pipe_buffer(pb); +	struct nouveau_bo *bo = nouveau_bo(pb); -	if (!nvpb) +	if (!bo)  		return FALSE; -	return nouveau_bo_handle_get(nvpb->bo, handle) == 0; +	return nouveau_bo_handle_get(bo, handle) == 0;  }  struct drm_api drm_api_hooks = { @@ -192,3 +275,8 @@ struct drm_api drm_api_hooks = {  	.global_handle_from_buffer = nouveau_drm_name_from_pb,  }; +struct drm_api * +drm_api_create() { +	return &drm_api_hooks; +} + diff --git a/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.h b/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.h index 2782c83c0e..e61e0e0957 100644 --- a/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.h +++ b/src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.h @@ -1,5 +1,34 @@  #ifndef __NOUVEAU_DRM_API_H__  #define __NOUVEAU_DRM_API_H__ +  #include "state_tracker/drm_api.h" +#include "state_tracker/dri1_api.h" + +#include "pipe/internal/p_winsys_screen.h" + +#include "nouveau_dri.h" + +struct nouveau_winsys { +	struct pipe_winsys base; + +	struct pipe_screen *pscreen; + +	unsigned nr_pctx; +	struct pipe_context **pctx; + +	struct pipe_surface *front; +}; + +static INLINE struct nouveau_winsys * +nouveau_winsys(struct pipe_winsys *ws) +{ +	return (struct nouveau_winsys *)ws; +} + +static INLINE struct nouveau_winsys * +nouveau_winsys_screen(struct pipe_screen *pscreen) +{ +	return nouveau_winsys(pscreen->winsys); +}  #endif diff --git a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys.c b/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys.c deleted file mode 100644 index e3175fd775..0000000000 --- a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "util/u_memory.h" - -#include "nouveau_winsys_pipe.h" - -static int -nouveau_pipe_notifier_alloc(struct nouveau_winsys *nvws, int count, -			    struct nouveau_notifier **notify) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws); - -	return nouveau_notifier_alloc(nvpws->channel, nvpws->next_handle++, -				      count, notify); -} - -static int -nouveau_pipe_grobj_alloc(struct nouveau_winsys *nvws, int grclass, -			 struct nouveau_grobj **grobj) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws); -	struct nouveau_channel *chan = nvpws->channel; -	int ret; - -	ret = nouveau_grobj_alloc(chan, nvpws->next_handle++, grclass, grobj); -	if (ret) -		return ret; - -	BEGIN_RING(chan, *grobj, 0x0000, 1); -	OUT_RING  (chan, (*grobj)->handle); -	(*grobj)->bound = NOUVEAU_GROBJ_BOUND_EXPLICIT; -	return 0; -} - -static int -nouveau_pipe_push_reloc(struct nouveau_winsys *nvws, void *ptr, -			struct pipe_buffer *buf, uint32_t data, -			uint32_t flags, uint32_t vor, uint32_t tor) -{ -	struct nouveau_bo *bo = nouveau_pipe_buffer(buf)->bo; - -	return nouveau_pushbuf_emit_reloc(nvws->channel, ptr, bo, -					  data, flags, vor, tor); -} - -static int -nouveau_pipe_push_flush(struct nouveau_winsys *nvws, unsigned size, -			struct pipe_fence_handle **fence) -{ -	if (fence) -		*fence = NULL; - -	return nouveau_pushbuf_flush(nvws->channel, size); -} - -static struct nouveau_bo * -nouveau_pipe_get_bo(struct pipe_buffer *pb) -{ -	return nouveau_pipe_buffer(pb)->bo; -} - -struct nouveau_winsys * -nouveau_winsys_new(struct pipe_winsys *ws) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws); -	struct nouveau_winsys *nvws; - -	nvws = CALLOC_STRUCT(nouveau_winsys); -	if (!nvws) -		return NULL; - -	nvws->ws		= ws; -	nvws->channel		= nvpws->channel; - -	nvws->res_init		= nouveau_resource_init; -	nvws->res_alloc		= nouveau_resource_alloc; -	nvws->res_free		= nouveau_resource_free; - -	nvws->push_reloc        = nouveau_pipe_push_reloc; -	nvws->push_flush	= nouveau_pipe_push_flush; - -	nvws->grobj_alloc	= nouveau_pipe_grobj_alloc; -	nvws->grobj_free	= nouveau_grobj_free; - -	nvws->notifier_alloc	= nouveau_pipe_notifier_alloc; -	nvws->notifier_free	= nouveau_notifier_free; -	nvws->notifier_reset	= nouveau_notifier_reset; -	nvws->notifier_status	= nouveau_notifier_status; -	nvws->notifier_retval	= nouveau_notifier_return_val; -	nvws->notifier_wait	= nouveau_notifier_wait_status; - -	nvws->get_bo		= nouveau_pipe_get_bo; - -	return nvws; -} - diff --git a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.c b/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.c deleted file mode 100644 index 9e03a9f5db..0000000000 --- a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.c +++ /dev/null @@ -1,204 +0,0 @@ -#include "pipe/internal/p_winsys_screen.h" -#include <pipe/p_defines.h> -#include <pipe/p_inlines.h> -#include <util/u_memory.h> - -#include "nouveau_winsys_pipe.h" - -#include "nouveau_drmif.h" -#include "nouveau_bo.h" - -static const char * -nouveau_get_name(struct pipe_winsys *pws) -{ -	return "Nouveau/DRI"; -} - -static uint32_t -nouveau_flags_from_usage(struct pipe_winsys *ws, unsigned usage) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws); -	struct pipe_screen *pscreen = nvpws->pscreen; -	uint32_t flags = NOUVEAU_BO_LOCAL; - -	if (usage & NOUVEAU_BUFFER_USAGE_TRANSFER) -		flags |= NOUVEAU_BO_GART; - -	if (usage & PIPE_BUFFER_USAGE_PIXEL) { -		if (usage & NOUVEAU_BUFFER_USAGE_TEXTURE) -			flags |= NOUVEAU_BO_GART; -		if (!(usage & PIPE_BUFFER_USAGE_CPU_READ_WRITE)) -			flags |= NOUVEAU_BO_VRAM; - -		switch (nvpws->channel->device->chipset & 0xf0) { -		case 0x50: -		case 0x80: -		case 0x90: -			flags |= NOUVEAU_BO_TILED; -			if (usage & NOUVEAU_BUFFER_USAGE_ZETA) -				flags |= NOUVEAU_BO_ZTILE; -			break; -		default: -			break; -		} -	} - -	if (usage & PIPE_BUFFER_USAGE_VERTEX) { -		if (pscreen->get_param(pscreen, NOUVEAU_CAP_HW_VTXBUF)) -			flags |= NOUVEAU_BO_GART; -	} - -	if (usage & PIPE_BUFFER_USAGE_INDEX) { -		if (pscreen->get_param(pscreen, NOUVEAU_CAP_HW_IDXBUF)) -			flags |= NOUVEAU_BO_GART; -	} - -	return flags; -} - -static struct pipe_buffer * -nouveau_pipe_bo_create(struct pipe_winsys *ws, unsigned alignment, -		       unsigned usage, unsigned size) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws); -	struct nouveau_device *dev = nvpws->channel->device; -	struct nouveau_pipe_buffer *nvbuf; -	uint32_t flags; - -	nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer); -	if (!nvbuf) -		return NULL; -	pipe_reference_init(&nvbuf->base.reference, 1); -	nvbuf->base.alignment = alignment; -	nvbuf->base.usage = usage; -	nvbuf->base.size = size; - -	flags = nouveau_flags_from_usage(ws, usage); -	if (nouveau_bo_new(dev, flags, alignment, size, &nvbuf->bo)) { -		FREE(nvbuf); -		return NULL; -	} - -	return &nvbuf->base; -} - -static struct pipe_buffer * -nouveau_pipe_bo_user_create(struct pipe_winsys *ws, void *ptr, unsigned bytes) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws); -	struct nouveau_device *dev = nvpws->channel->device; -	struct nouveau_pipe_buffer *nvbuf; - -	nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer); -	if (!nvbuf) -		return NULL; -	pipe_reference_init(&nvbuf->base.reference, 1); -	nvbuf->base.size = bytes; - -	if (nouveau_bo_user(dev, ptr, bytes, &nvbuf->bo)) { -		FREE(nvbuf); -		return NULL; -	} - -	return &nvbuf->base; -} - -static void -nouveau_pipe_bo_del(struct pipe_buffer *buf) -{ -	struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf); - -	nouveau_bo_ref(NULL, &nvbuf->bo); -	FREE(nvbuf); -} - -static void * -nouveau_pipe_bo_map(struct pipe_winsys *pws, struct pipe_buffer *buf, -		    unsigned flags) -{ -	struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf); -	uint32_t map_flags = 0; - -	if (flags & PIPE_BUFFER_USAGE_CPU_READ) -		map_flags |= NOUVEAU_BO_RD; -	if (flags & PIPE_BUFFER_USAGE_CPU_WRITE) -		map_flags |= NOUVEAU_BO_WR; - -	if (nouveau_bo_map(nvbuf->bo, map_flags)) -		return NULL; -	return nvbuf->bo->map; -} - -static void -nouveau_pipe_bo_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf) -{ -	struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf); - -	nouveau_bo_unmap(nvbuf->bo); -} - -static void -nouveau_pipe_fence_reference(struct pipe_winsys *ws, -			     struct pipe_fence_handle **ptr, -			     struct pipe_fence_handle *pfence) -{ -	*ptr = pfence; -} - -static int -nouveau_pipe_fence_signalled(struct pipe_winsys *ws, -			     struct pipe_fence_handle *pfence, unsigned flag) -{ -	return 0; -} - -static int -nouveau_pipe_fence_finish(struct pipe_winsys *ws, -			  struct pipe_fence_handle *pfence, unsigned flag) -{ -	return 0; -} - -static void -nouveau_destroy(struct pipe_winsys *ws) -{ -	struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws); - -	nouveau_device_close(&nvpws->channel->device); -	FREE(nvpws); -} - -struct pipe_winsys * -nouveau_pipe_winsys_new(struct nouveau_device *dev) -{ -	struct nouveau_pipe_winsys *nvpws; -	int ret; - -	nvpws = CALLOC_STRUCT(nouveau_pipe_winsys); -	if (!nvpws) -		return NULL; - -	ret = nouveau_channel_alloc(dev, 0xbeef0201, 0xbeef0202, -				    &nvpws->channel); -	if (ret) { -		debug_printf("%s: error opening GPU channel: %d\n", -			     __func__, ret); -		FREE(nvpws); -		return NULL; -	} -	nvpws->next_handle = 0x77000000; - -	nvpws->base.buffer_create = nouveau_pipe_bo_create; -	nvpws->base.buffer_destroy = nouveau_pipe_bo_del; -	nvpws->base.user_buffer_create = nouveau_pipe_bo_user_create; -	nvpws->base.buffer_map = nouveau_pipe_bo_map; -	nvpws->base.buffer_unmap = nouveau_pipe_bo_unmap; - -	nvpws->base.fence_reference = nouveau_pipe_fence_reference; -	nvpws->base.fence_signalled = nouveau_pipe_fence_signalled; -	nvpws->base.fence_finish = nouveau_pipe_fence_finish; - -	nvpws->base.get_name = nouveau_get_name; -	nvpws->base.destroy = nouveau_destroy; -	return &nvpws->base; -} diff --git a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.h b/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.h deleted file mode 100644 index 10e1e269e8..0000000000 --- a/src/gallium/winsys/drm/nouveau/drm/nouveau_winsys_pipe.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef NOUVEAU_PIPE_WINSYS_H -#define NOUVEAU_PIPE_WINSYS_H - -#include "pipe/internal/p_winsys_screen.h" -#include "pipe/p_context.h" - -#include "nouveau/nouveau_winsys.h" - -#include "nouveau_device.h" - -struct nouveau_pipe_buffer { -	struct pipe_buffer base; -	struct nouveau_bo *bo; -}; - -static INLINE struct nouveau_pipe_buffer * -nouveau_pipe_buffer(struct pipe_buffer *buf) -{ -	return (struct nouveau_pipe_buffer *)buf; -} - -struct nouveau_pipe_winsys { -	struct pipe_winsys base; - -	struct pipe_screen *pscreen; - -	struct nouveau_channel *channel; -	uint32_t next_handle; - -	unsigned nr_pctx; -	struct pipe_context **pctx; -}; - -static INLINE struct nouveau_pipe_winsys * -nouveau_pipe_winsys(struct pipe_winsys *ws) -{ -	return (struct nouveau_pipe_winsys *)ws; -} - -static INLINE struct nouveau_pipe_winsys * -nouveau_screen(struct pipe_screen *pscreen) -{ -	return nouveau_pipe_winsys(pscreen->winsys); -} - -struct pipe_winsys * -nouveau_pipe_winsys_new(struct nouveau_device *); - -struct nouveau_winsys * -nouveau_winsys_new(struct pipe_winsys *ws); - -#endif diff --git a/src/gallium/winsys/drm/radeon/SConscript b/src/gallium/winsys/drm/radeon/SConscript index 8f99055b2f..b2dfd504d4 100644 --- a/src/gallium/winsys/drm/radeon/SConscript +++ b/src/gallium/winsys/drm/radeon/SConscript @@ -4,4 +4,4 @@ SConscript(['core/SConscript',])  if 'mesa' in env['statetrackers']: -    SConscript(['dri2/SConscript']) +    SConscript(['dri/SConscript']) diff --git a/src/gallium/winsys/drm/radeon/core/SConscript b/src/gallium/winsys/drm/radeon/core/SConscript index 578174e32b..2ad68e403f 100644 --- a/src/gallium/winsys/drm/radeon/core/SConscript +++ b/src/gallium/winsys/drm/radeon/core/SConscript @@ -11,7 +11,9 @@ radeon_sources = [  env.Append(CPPPATH = '#/src/gallium/drivers/r300') -env.ConvenienceLibrary( +radeonwinsys = env.ConvenienceLibrary(      target ='radeonwinsys',      source = radeon_sources,  ) + +Export('radeonwinsys') diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c index a15487352b..684a487f24 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c +++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c @@ -1,8 +1,8 @@ -/*  +/*   * Copyright © 2008 Jérôme Glisse   *             2009 Corbin Simpson   * 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 @@ -10,14 +10,14 @@   * 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  + * 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 @@ -93,6 +93,29 @@ static struct pipe_buffer *radeon_buffer_user_create(struct pipe_winsys *ws,      return &radeon_buffer->base;  } +static struct pipe_buffer *radeon_surface_buffer_create(struct pipe_winsys *ws, +                                                        unsigned width, +                                                        unsigned height, +                                                        enum pipe_format format, +                                                        unsigned usage, +                                                        unsigned *stride) +{ +    struct pipe_format_block block; +    unsigned nblocksx, nblocksy, size; + +    pf_get_block(format, &block); + +    nblocksx = pf_get_nblocksx(&block, width); +    nblocksy = pf_get_nblocksy(&block, height); + +    /* Radeons enjoy things in multiples of 32. */ +    /* XXX this can be 32 when POT */ +    *stride = (nblocksx * block.size + 63) & ~63; +    size = *stride * nblocksy; + +    return radeon_buffer_create(ws, 64, usage, size); +} +  static void radeon_buffer_del(struct pipe_buffer *buffer)  {      struct radeon_pipe_buffer *radeon_buffer = @@ -118,6 +141,8 @@ static void *radeon_buffer_map(struct pipe_winsys *ws,          write = 1;      } +    radeon_bo_wait(radeon_buffer->bo); +      if (radeon_bo_map(radeon_buffer->bo, write))          return NULL;      return radeon_buffer->bo->ptr; @@ -175,15 +200,17 @@ struct radeon_winsys* radeon_pipe_winsys(int fd)          return NULL;      } +    radeon_ws->priv->fd = fd;      radeon_ws->priv->bom = radeon_bo_manager_gem_ctor(fd);      radeon_ws->base.flush_frontbuffer = radeon_flush_frontbuffer;      radeon_ws->base.buffer_create = radeon_buffer_create; -    radeon_ws->base.buffer_destroy = radeon_buffer_del;      radeon_ws->base.user_buffer_create = radeon_buffer_user_create; +    radeon_ws->base.surface_buffer_create = radeon_surface_buffer_create;      radeon_ws->base.buffer_map = radeon_buffer_map;      radeon_ws->base.buffer_unmap = radeon_buffer_unmap; +    radeon_ws->base.buffer_destroy = radeon_buffer_del;      radeon_ws->base.fence_reference = radeon_fence_reference;      radeon_ws->base.fence_signalled = radeon_fence_signalled; diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h index ca8bbb3c11..8c8b61fa10 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h +++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h @@ -1,7 +1,7 @@ -/*  +/*   * Copyright © 2008 Jérôme Glisse   * 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 @@ -9,14 +9,14 @@   * 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  + * 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 @@ -48,11 +48,16 @@  struct radeon_pipe_buffer {      struct pipe_buffer  base;      struct radeon_bo    *bo; +    boolean flinked; +    uint32_t flink;  };  #define RADEON_MAX_BOS 24  struct radeon_winsys_priv { +    /* DRM FD */ +    int fd; +      /* Radeon BO manager. */      struct radeon_bo_manager* bom; diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.c b/src/gallium/winsys/drm/radeon/core/radeon_drm.c index 428d3f65a1..da2010184a 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_drm.c +++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.c @@ -1,7 +1,7 @@ -/*  +/*   * Copyright © 2009 Corbin Simpson   * 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 @@ -9,14 +9,14 @@   * 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  + * 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 @@ -29,9 +29,11 @@   */  #include "radeon_drm.h" +#include "trace/tr_drm.h"  /* Create a pipe_screen. */ -struct pipe_screen* radeon_create_screen(int drmFB, +struct pipe_screen* radeon_create_screen(struct drm_api* api, +                                         int drmFB,  					 struct drm_create_screen_arg *arg)  {      struct radeon_winsys* winsys = radeon_pipe_winsys(drmFB); @@ -46,7 +48,8 @@ struct pipe_screen* radeon_create_screen(int drmFB,  }  /* Create a pipe_context. */ -struct pipe_context* radeon_create_context(struct pipe_screen* screen) +struct pipe_context* radeon_create_context(struct drm_api* api, +                                           struct pipe_screen* screen)  {      if (getenv("RADEON_SOFTPIPE")) {          return radeon_create_softpipe(screen->winsys); @@ -55,16 +58,19 @@ struct pipe_context* radeon_create_context(struct pipe_screen* screen)      }  } -boolean radeon_buffer_from_texture(struct pipe_texture* texture, +boolean radeon_buffer_from_texture(struct drm_api* api, +                                   struct pipe_texture* texture,                                     struct pipe_buffer** buffer,                                     unsigned* stride)  { -    return FALSE; +    /* XXX fix this */ +    return r300_get_texture_buffer(texture, buffer, stride);  }  /* Create a buffer from a handle. */  /* XXX what's up with name? */ -struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen, +struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api, +                                              struct pipe_screen* screen,                                                const char* name,                                                unsigned handle)  { @@ -91,7 +97,8 @@ struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen,      return &radeon_buffer->base;  } -boolean radeon_handle_from_buffer(struct pipe_screen* screen, +boolean radeon_handle_from_buffer(struct drm_api* api, +                                  struct pipe_screen* screen,                                    struct pipe_buffer* buffer,                                    unsigned* handle)  { @@ -101,23 +108,50 @@ boolean radeon_handle_from_buffer(struct pipe_screen* screen,      return TRUE;  } -boolean radeon_global_handle_from_buffer(struct pipe_screen* screen, +boolean radeon_global_handle_from_buffer(struct drm_api* api, +                                         struct pipe_screen* screen,                                           struct pipe_buffer* buffer,                                           unsigned* handle)  { -    /* XXX WTF is the difference here? global? */ +    int retval, fd; +    struct drm_gem_flink flink;      struct radeon_pipe_buffer* radeon_buffer =          (struct radeon_pipe_buffer*)buffer; -    *handle = radeon_buffer->bo->handle; + +    if (!radeon_buffer->flinked) { +        fd = ((struct radeon_winsys*)screen->winsys)->priv->fd; + +        flink.handle = radeon_buffer->bo->handle; + +        retval = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink); +        if (retval) { +            debug_printf("radeon: DRM_IOCTL_GEM_FLINK failed, error %d\n", +                    retval); +            return FALSE; +        } + +        radeon_buffer->flink = flink.name; +        radeon_buffer->flinked = TRUE; +    } + +    *handle = radeon_buffer->flink;      return TRUE;  }  struct drm_api drm_api_hooks = {      .create_screen = radeon_create_screen,      .create_context = radeon_create_context, -    /* XXX fix this */ -    .buffer_from_texture = r300_get_texture_buffer, +    .buffer_from_texture = radeon_buffer_from_texture,      .buffer_from_handle = radeon_buffer_from_handle,      .handle_from_buffer = radeon_handle_from_buffer,      .global_handle_from_buffer = radeon_global_handle_from_buffer,  }; + +struct drm_api* drm_api_create() +{ +#ifdef DEBUG +    return trace_drm_create(&drm_api_hooks); +#else +    return &drm_api_hooks; +#endif +} diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.h b/src/gallium/winsys/drm/radeon/core/radeon_drm.h index 049f9984db..8560f71db6 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_drm.h +++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.h @@ -40,25 +40,32 @@  #include "radeon_r300.h"  #include "radeon_winsys_softpipe.h" -struct pipe_screen* radeon_create_screen(int drmFB, +struct pipe_screen* radeon_create_screen(struct drm_api* api, +                                         int drmFB,  					 struct drm_create_screen_arg *arg); -struct pipe_context* radeon_create_context(struct pipe_screen* screen); +struct pipe_context* radeon_create_context(struct drm_api* api, +                                           struct pipe_screen* screen); -boolean radeon_buffer_from_texture(struct pipe_texture* texture, +boolean radeon_buffer_from_texture(struct drm_api* api, +                                   struct pipe_texture* texture,                                     struct pipe_buffer** buffer,                                     unsigned* stride); -struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen, +struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api, +                                              struct pipe_screen* screen,                                                const char* name,                                                unsigned handle); -boolean radeon_handle_from_buffer(struct pipe_screen* screen, +boolean radeon_handle_from_buffer(struct drm_api* api, +                                  struct pipe_screen* screen,                                    struct pipe_buffer* buffer,                                    unsigned* handle); -boolean radeon_global_handle_from_buffer(struct pipe_screen* screen, +boolean radeon_global_handle_from_buffer(struct drm_api* api, +                                         struct pipe_screen* screen,                                           struct pipe_buffer* buffer,                                           unsigned* handle); +void radeon_destroy_drm_api(struct drm_api* api);  #endif diff --git a/src/gallium/winsys/drm/radeon/core/radeon_r300.c b/src/gallium/winsys/drm/radeon/core/radeon_r300.c index da233203d7..8c5f756ddf 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_r300.c +++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.c @@ -22,10 +22,10 @@  #include "radeon_r300.h" -static void radeon_r300_add_buffer(struct r300_winsys* winsys, -                                   struct pipe_buffer* pbuffer, -                                   uint32_t rd, -                                   uint32_t wd) +static boolean radeon_r300_add_buffer(struct r300_winsys* winsys, +                                      struct pipe_buffer* pbuffer, +                                      uint32_t rd, +                                      uint32_t wd)  {      int i;      struct radeon_winsys_priv* priv = @@ -35,24 +35,30 @@ static void radeon_r300_add_buffer(struct r300_winsys* winsys,      /* Check to see if this BO is already in line for validation;       * find a slot for it otherwise. */ -    for (i = 0; i < RADEON_MAX_BOS; i++) { +    for (i = 0; i < priv->bo_count; i++) {          if (sc[i].bo == bo) { -            return; -        } else if (sc[i].bo == NULL) { -            sc[i].bo = bo; -            sc[i].read_domains = rd; -            sc[i].write_domain = wd; -            priv->bo_count = i + 1; -            return; +            sc[i].read_domains |= rd; +            sc[i].write_domain |= wd; +            return TRUE;          }      } -    assert(FALSE && "Oh God too many BOs!"); +    if (priv->bo_count >= RADEON_MAX_BOS) { +        /* Dohoho. Not falling for that one again. Request a flush. */ +        return FALSE; +    } + +    sc[priv->bo_count].bo = bo; +    sc[priv->bo_count].read_domains = rd; +    sc[priv->bo_count].write_domain = wd; +    priv->bo_count++; + +    return TRUE;  }  static boolean radeon_r300_validate(struct r300_winsys* winsys)  { -    int retval; +    int retval, i;      struct radeon_winsys_priv* priv =          (struct radeon_winsys_priv*)winsys->radeon_winsys;      struct radeon_cs_space_check* sc = priv->sc; @@ -62,12 +68,23 @@ static boolean radeon_r300_validate(struct r300_winsys* winsys)      if (retval == RADEON_CS_SPACE_OP_TO_BIG) {          /* We might as well HCF, since this is not going to fit in the card,           * period. */ +        /* XXX just drop it on the floor instead */  	exit(1);      } else if (retval == RADEON_CS_SPACE_FLUSH) {          /* We must flush before more rendering can commence. */          return TRUE;      } +    /* XXX should probably be its own function */ +    for (i = 0; i < priv->bo_count; i++) { +        if (sc[i].read_domains && sc[i].write_domain) { +            /* Cute, cute. We need to flush first. */ +            debug_printf("radeon: BO %p can't be read and written; " +                    "requesting flush.\n", sc[i].bo); +            return TRUE; +        } +    } +      /* Things are fine, we can proceed as normal. */      return FALSE;  } @@ -108,9 +125,15 @@ static void radeon_r300_write_cs_reloc(struct r300_winsys* winsys,  {      struct radeon_winsys_priv* priv =          (struct radeon_winsys_priv*)winsys->radeon_winsys; +    int retval = 0; -    radeon_cs_write_reloc(priv->cs, +    retval = radeon_cs_write_reloc(priv->cs,              ((struct radeon_pipe_buffer*)pbuffer)->bo, rd, wd, flags); + +    if (retval) { +        debug_printf("radeon: Relocation of %p (%d, %d, %d) failed!\n", +                pbuffer, rd, wd, flags); +    }  }  static void radeon_r300_end_cs(struct r300_winsys* winsys, @@ -128,57 +151,63 @@ static void radeon_r300_flush_cs(struct r300_winsys* winsys)  {      struct radeon_winsys_priv* priv =          (struct radeon_winsys_priv*)winsys->radeon_winsys; -    int retval = 0; +    struct radeon_cs_space_check* sc = priv->sc; +    int retval = 1; +    /* Emit the CS. */      retval = radeon_cs_emit(priv->cs);      if (retval) {          debug_printf("radeon: Bad CS, dumping...\n");          radeon_cs_print(priv->cs, stderr);      }      radeon_cs_erase(priv->cs); + +    /* Clean out BOs. */ +    memset(sc, 0, sizeof(struct radeon_cs_space_check) * RADEON_MAX_BOS); +    priv->bo_count = 0;  }  /* Helper function to do the ioctls needed for setup and init. */  static void do_ioctls(struct r300_winsys* winsys, int fd)  { -    struct drm_radeon_gem_info info; -    drm_radeon_getparam_t gp; -    int target; +    struct drm_radeon_gem_info gem_info = {0}; +    drm_radeon_getparam_t gp = {0}; +    struct drm_radeon_info info = {0}; +    int target = 0;      int retval; +    info.value = ⌖      gp.value = ⌖ -    /* First, get the number of pixel pipes */ -    gp.param = RADEON_PARAM_NUM_GB_PIPES; -    retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); +    /* First, get PCI ID */ +    info.request = RADEON_INFO_DEVICE_ID; +    retval = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));      if (retval) { -        fprintf(stderr, "%s: Failed to get GB pipe count, error number %d\n", +        fprintf(stderr, "%s: New ioctl for PCI ID failed " +                "(error number %d), trying classic ioctl...\n",                  __FUNCTION__, retval); -        exit(1); -    } -    winsys->gb_pipes = target; - -    /* Then, get PCI ID */ -    gp.param = RADEON_PARAM_DEVICE_ID; -    retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); -    if (retval) { -        fprintf(stderr, "%s: Failed to get PCI ID, error number %d\n", -                __FUNCTION__, retval); -        exit(1); +        gp.param = RADEON_PARAM_DEVICE_ID; +        retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, +                sizeof(gp)); +        if (retval) { +            fprintf(stderr, "%s: Failed to get PCI ID, " +                    "error number %d\n", __FUNCTION__, retval); +            exit(1); +        }      }      winsys->pci_id = target; -    /* Finally, retrieve MM info */ +    /* Then, retrieve MM info */      retval = drmCommandWriteRead(fd, DRM_RADEON_GEM_INFO, -            &info, sizeof(info)); +            &gem_info, sizeof(gem_info));      if (retval) {          fprintf(stderr, "%s: Failed to get MM info, error number %d\n",                  __FUNCTION__, retval);          exit(1);      } -    winsys->gart_size = info.gart_size; +    winsys->gart_size = gem_info.gart_size;      /* XXX */ -    winsys->vram_size = info.vram_visible; +    winsys->vram_size = gem_info.vram_visible;  }  struct r300_winsys* diff --git a/src/gallium/winsys/drm/radeon/core/radeon_r300.h b/src/gallium/winsys/drm/radeon/core/radeon_r300.h index 5c373cd084..a2e0e58248 100644 --- a/src/gallium/winsys/drm/radeon/core/radeon_r300.h +++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.h @@ -31,5 +31,18 @@  #include "radeon_buffer.h" +/* protect us from bonghits */ +#ifndef RADEON_INFO_DEVICE_ID +#define RADEON_INFO_DEVICE_ID 0 +#endif +#ifndef DRM_RADEON_INFO +#define DRM_RADEON_INFO 0x1 +struct drm_radeon_info { +	uint32_t		request; +	uint32_t		pad; +	uint64_t		value; +}; +#endif +  struct r300_winsys*  radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys); diff --git a/src/gallium/winsys/drm/radeon/dri/Makefile b/src/gallium/winsys/drm/radeon/dri/Makefile index c218ee9d01..a9889444de 100644 --- a/src/gallium/winsys/drm/radeon/dri/Makefile +++ b/src/gallium/winsys/drm/radeon/dri/Makefile @@ -10,6 +10,7 @@ PIPE_DRIVERS = \  	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \  	$(TOP)/src/gallium/winsys/drm/radeon/core/libradeonwinsys.a \  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \  	$(TOP)/src/gallium/drivers/r300/libr300.a  C_SOURCES = \ diff --git a/src/gallium/winsys/drm/radeon/dri/SConscript b/src/gallium/winsys/drm/radeon/dri/SConscript index f2cdee97d9..aea987a3ac 100644 --- a/src/gallium/winsys/drm/radeon/dri/SConscript +++ b/src/gallium/winsys/drm/radeon/dri/SConscript @@ -2,7 +2,10 @@ Import('*')  env = drienv.Clone() +env.ParseConfig('pkg-config --cflags --libs libdrm_radeon') +  drivers = [ +    trace,      softpipe,      r300  ] @@ -10,5 +13,5 @@ drivers = [  env.SharedLibrary(      target ='radeon_dri.so',      source = COMMON_GALLIUM_SOURCES, -    LIBS = drivers + mesa + auxiliaries + env['LIBS'], +    LIBS = st_dri + radeonwinsys + mesa + drivers + auxiliaries + env['LIBS'],  ) diff --git a/src/gallium/winsys/drm/radeon/egl/Makefile b/src/gallium/winsys/drm/radeon/egl/Makefile index d989b3aa93..6a1448d1b9 100644 --- a/src/gallium/winsys/drm/radeon/egl/Makefile +++ b/src/gallium/winsys/drm/radeon/egl/Makefile @@ -8,6 +8,7 @@ PIPE_DRIVERS = \  	$(TOP)/src/gallium/state_trackers/egl/libegldrm.a \  	$(GALLIUMDIR)/winsys/drm/radeon/core/libradeonwinsys.a \  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \  	$(TOP)/src/gallium/drivers/r300/libr300.a  DRIVER_SOURCES = diff --git a/src/gallium/winsys/drm/radeon/xorg/Makefile b/src/gallium/winsys/drm/radeon/xorg/Makefile index 6ffd4a3a54..0241625f69 100644 --- a/src/gallium/winsys/drm/radeon/xorg/Makefile +++ b/src/gallium/winsys/drm/radeon/xorg/Makefile @@ -37,6 +37,6 @@ clean:  install:  	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) -	$(INSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR)  .PHONY	= all clean install diff --git a/src/gallium/winsys/egl_xlib/Makefile b/src/gallium/winsys/egl_xlib/Makefile index 8646ee3b52..a33a50ec22 100644 --- a/src/gallium/winsys/egl_xlib/Makefile +++ b/src/gallium/winsys/egl_xlib/Makefile @@ -74,7 +74,7 @@ depend: $(ALL_SOURCES)  install: default  	$(INSTALL) -d $(INSTALL_DIR)/$(LIB_DIR)  	@if [ -e $(TOP)/$(LIB_DIR) ]; then \ -		$(INSTALL) $(TOP)/$(LIB_DIR)/$(DRIVER_NAME) $(INSTALL_DIR)/$(LIB_DIR); \ +		$(MINSTALL) $(TOP)/$(LIB_DIR)/$(DRIVER_NAME) $(INSTALL_DIR)/$(LIB_DIR); \  	fi diff --git a/src/gallium/winsys/egl_xlib/egl_xlib.c b/src/gallium/winsys/egl_xlib/egl_xlib.c index b52f427e4a..e1ddcae97b 100644 --- a/src/gallium/winsys/egl_xlib/egl_xlib.c +++ b/src/gallium/winsys/egl_xlib/egl_xlib.c @@ -345,7 +345,7 @@ xlib_eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,        return EGL_NO_CONTEXT;     /* let EGL lib init the common stuff */ -   if (!_eglInitContext(drv, dpy, &ctx->Base, config, attrib_list)) { +   if (!_eglInitContext(drv, &ctx->Base, conf, attrib_list)) {        free(ctx);        return EGL_NO_CONTEXT;     } @@ -370,7 +370,7 @@ xlib_eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,        return EGL_NO_CONTEXT;     } -   _eglSaveContext(&ctx->Base); +   _eglLinkContext(&ctx->Base, _eglLookupDisplay(dpy));     return _eglGetContextHandle(&ctx->Base);  } @@ -381,10 +381,8 @@ xlib_eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)  {     struct xlib_egl_context *context = lookup_context(ctx);     if (context) { -      if (context->Base.IsBound) { -         context->Base.DeletePending = EGL_TRUE; -      } -      else { +      _eglUnlinkContext(&context->Base); +      if (!context->Base.IsBound) {           /* API-dependent clean-up */           switch (context->Base.ClientAPI) {           case EGL_OPENGL_ES_API: @@ -491,13 +489,13 @@ xlib_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,        return EGL_NO_SURFACE;     /* Let EGL lib init the common stuff */ -   if (!_eglInitSurface(drv, dpy, &surf->Base, EGL_WINDOW_BIT, -                        config, attrib_list)) { +   if (!_eglInitSurface(drv, &surf->Base, EGL_WINDOW_BIT, +                        conf, attrib_list)) {        free(surf);        return EGL_NO_SURFACE;     } -   _eglSaveSurface(&surf->Base); +   _eglLinkSurface(&surf->Base, disp);     /*      * Now init the Xlib and gallium stuff @@ -534,11 +532,8 @@ xlib_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)  {     struct xlib_egl_surface *surf = lookup_surface(surface);     if (surf) { -      _eglHashRemove(_eglGlobal.Surfaces, (EGLuint) surface); -      if (surf->Base.IsBound) { -         surf->Base.DeletePending = EGL_TRUE; -      } -      else { +      _eglUnlinkSurface(&surf->Base); +      if (!surf->Base.IsBound) {           XFreeGC(surf->Dpy, surf->Gc);           st_unreference_framebuffer(surf->Framebuffer);           free(surf); @@ -588,7 +583,9 @@ find_supported_apis(void)     EGLint mask = 0;     void *handle; -   handle = dlopen(NULL, 0); +   handle = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL); +   if(!handle) +      return mask;     if (dlsym(handle, "st_api_OpenGL_ES1"))        mask |= EGL_OPENGL_ES_BIT; diff --git a/src/gallium/winsys/gdi/SConscript b/src/gallium/winsys/gdi/SConscript index aabab95f3a..86eb9ef55e 100644 --- a/src/gallium/winsys/gdi/SConscript +++ b/src/gallium/winsys/gdi/SConscript @@ -15,6 +15,7 @@ if env['platform'] == 'windows':  		'gdi32',  		'user32',  		'kernel32', +		'ws2_32',  	])  	sources = [ diff --git a/src/gallium/winsys/xlib/Makefile b/src/gallium/winsys/xlib/Makefile index 04309e67ee..522f6dc5ae 100644 --- a/src/gallium/winsys/xlib/Makefile +++ b/src/gallium/winsys/xlib/Makefile @@ -90,7 +90,7 @@ install: default  	$(INSTALL) -d $(INSTALL_DIR)/$(LIB_DIR)  	$(INSTALL) -m 644 $(TOP)/include/GL/*.h $(INSTALL_DIR)/include/GL  	@if [ -e $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) ]; then \ -		$(INSTALL) $(TOP)/$(LIB_DIR)/libGL* $(INSTALL_DIR)/$(LIB_DIR); \ +		$(MINSTALL) $(TOP)/$(LIB_DIR)/libGL* $(INSTALL_DIR)/$(LIB_DIR); \  	fi | 
