diff options
Diffstat (limited to 'src/gallium/winsys/drm/intel/gem')
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/SConscript | 17 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_api.c | 26 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_api.h | 7 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_context.c | 2 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_device.c | 34 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_device.h | 20 | 
6 files changed, 92 insertions, 14 deletions
| 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); | 
