diff options
| author | Kristian Høgsberg <krh@bitplanet.net> | 2010-06-06 20:39:19 -0400 | 
|---|---|---|
| committer | Kristian Høgsberg <krh@bitplanet.net> | 2010-08-25 09:17:48 -0400 | 
| commit | f301932dba4cc75e810e0c051e39247128a899fc (patch) | |
| tree | effae4e2888cff4d6d7bbcf8d8471cfba0bf3c27 /src/mesa | |
| parent | 9087ba128089ed0dc00e6eb38f37126fb7557d3b (diff) | |
intel: Support EGL_MESA_image_drm
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_regions.c | 16 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_regions.h | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_screen.c | 68 | 
3 files changed, 87 insertions, 0 deletions
| diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index 57ffe611d1..e87e29462c 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -192,6 +192,22 @@ intel_region_alloc(struct intel_screen *screen,  				      aligned_pitch / cpp, tiling, buffer);  } +GLboolean +intel_region_flink(struct intel_region *region, uint32_t *name) +{ +   if (region->name == 0) { +      if (drm_intel_bo_flink(region->buffer, ®ion->name)) +	 return GL_FALSE; +       +      _mesa_HashInsert(region->screen->named_regions, +		       region->name, region); +   } + +   *name = region->name; + +   return GL_TRUE; +} +  struct intel_region *  intel_region_alloc_for_handle(struct intel_screen *screen,  			      GLuint cpp, diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h index c88395be18..8464a5e937 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.h +++ b/src/mesa/drivers/dri/intel/intel_regions.h @@ -88,6 +88,9 @@ intel_region_alloc_for_handle(struct intel_screen *screen,  			      GLuint width, GLuint height, GLuint pitch,  			      unsigned int handle, const char *name); +GLboolean +intel_region_flink(struct intel_region *region, uint32_t *name); +  void intel_region_reference(struct intel_region **dst,                              struct intel_region *src); diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 643e7762b0..0a542a7303 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -207,11 +207,79 @@ intel_destroy_image(__DRIimage *image)      FREE(image);  } +static __DRIimage * +intel_create_image(__DRIscreen *screen, +		   int width, int height, int format, +		   unsigned int use, +		   void *loaderPrivate) +{ +   __DRIimage *image; +   struct intel_screen *intelScreen = screen->private; +   int cpp; + +   image = CALLOC(sizeof *image); +   if (image == NULL) +      return NULL; + +   switch (format) { +   case __DRI_IMAGE_FORMAT_RGB565: +      image->format = MESA_FORMAT_RGB565; +      image->internal_format = GL_RGB; +      image->data_type = GL_UNSIGNED_BYTE; +      break; +   case __DRI_IMAGE_FORMAT_XRGB8888: +      image->format = MESA_FORMAT_XRGB8888; +      image->internal_format = GL_RGB; +      image->data_type = GL_UNSIGNED_BYTE; +      break; +   case __DRI_IMAGE_FORMAT_ARGB8888: +      image->format = MESA_FORMAT_ARGB8888; +      image->internal_format = GL_RGBA; +      image->data_type = GL_UNSIGNED_BYTE; +      break; +   default: +      free(image); +      return NULL; +   } + +   image->data = loaderPrivate; +   cpp = _mesa_get_format_bytes(image->format); + +   image->region = +      intel_region_alloc(intelScreen, I915_TILING_NONE, +			 cpp, width, height, GL_TRUE); +   if (image->region == NULL) { +      FREE(image); +      return NULL; +   } +    +   return image; +} + +static GLboolean +intel_query_image(__DRIimage *image, int attrib, int *value) +{ +   switch (attrib) { +   case __DRI_IMAGE_ATTRIB_STRIDE: +      *value = image->region->pitch * image->region->cpp; +      return GL_TRUE; +   case __DRI_IMAGE_ATTRIB_HANDLE: +      *value = image->region->buffer->handle; +      return GL_TRUE; +   case __DRI_IMAGE_ATTRIB_NAME: +      return intel_region_flink(image->region, (uint32_t *) value); +   default: +      return GL_FALSE; +   } +} +  static struct __DRIimageExtensionRec intelImageExtension = {      { __DRI_IMAGE, __DRI_IMAGE_VERSION },      intel_create_image_from_name,      intel_create_image_from_renderbuffer,      intel_destroy_image, +    intel_create_image, +    intel_query_image  };  static const __DRIextension *intelScreenExtensions[] = { | 
