コード例 #1
0
ファイル: prime_nv_api.c プロジェクト: jmb82/intel-gpu-tools
static void test_nv_i915_reimport_twice_check_flink_name(void)
{
    drm_intel_bo *intel_bo = NULL, *intel_bo2 = NULL;
    int prime_fd;
    struct nouveau_bo *nvbo = NULL;
    uint32_t flink_name1, flink_name2;

    igt_assert(nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
                              0, BO_SIZE, NULL, &nvbo) == 0);

    igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);

    intel_bo = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
    igt_assert(intel_bo);
    close(prime_fd);
    igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);

    intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
    igt_assert(intel_bo2);
    close(prime_fd);

    igt_assert(drm_intel_bo_flink(intel_bo, &flink_name1) == 0);
    igt_assert(drm_intel_bo_flink(intel_bo2, &flink_name2) == 0);

    igt_assert_eq_u32(flink_name1, flink_name2);

    nouveau_bo_ref(NULL, &nvbo);
    drm_intel_bo_unreference(intel_bo);
    drm_intel_bo_unreference(intel_bo2);
}
コード例 #2
0
ファイル: intel_regions.c プロジェクト: ashmew2/kolibriosSVN
struct intel_region *
intel_region_alloc_for_fd(struct intel_screen *screen,
                          GLuint cpp,
                          GLuint width, GLuint height, GLuint pitch,
                          int fd, const char *name)
{
   struct intel_region *region;
   drm_intel_bo *buffer;
   int ret;
   uint32_t bit_6_swizzle, tiling;

   buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr,
                                               fd, height * pitch);
   if (buffer == NULL)
      return NULL;
   ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle);
   if (ret != 0) {
      fprintf(stderr, "Couldn't get tiling of buffer (%s): %s\n",
	      name, strerror(-ret));
      drm_intel_bo_unreference(buffer);
      return NULL;
   }

   region = intel_region_alloc_internal(screen, cpp,
					width, height, pitch, tiling, buffer);
   if (region == NULL) {
      drm_intel_bo_unreference(buffer);
      return NULL;
   }

   return region;
}
コード例 #3
0
ファイル: intel_dri3.c プロジェクト: 01org/iotg-lin-gfx-ddx
static PixmapPtr intel_dri3_pixmap_from_fd(ScreenPtr screen,
					   int fd,
					   CARD16 width,
					   CARD16 height,
					   CARD16 stride,
					   CARD8 depth,
					   CARD8 bpp)
{
	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
	intel_screen_private *intel = intel_get_screen_private(scrn);
	struct intel_uxa_pixmap *priv;
	PixmapPtr pixmap;
	dri_bo *bo;

	if (depth < 8)
		return NULL;

	switch (bpp) {
	case 8:
	case 16:
	case 32:
		break;
	default:
		return NULL;
	}

	pixmap = fbCreatePixmap(screen, 0, 0, depth, 0);
	if (!pixmap)
		return NULL;

	if (!screen->ModifyPixmapHeader(pixmap, width, height, 0, 0, stride, NULL))
		goto free_pixmap;

	bo = drm_intel_bo_gem_create_from_prime(intel->bufmgr,
						fd, (uint32_t)height * stride);
	if (bo == NULL)
		goto free_pixmap;

	intel_uxa_set_pixmap_bo(pixmap, bo);
	dri_bo_unreference(bo);

	priv = intel_uxa_get_pixmap_private(pixmap);
	if (priv == NULL)
		goto free_pixmap;

	priv->pinned |= PIN_DRI3;

	return pixmap;

free_pixmap:
	fbDestroyPixmap(pixmap);
	return NULL;
}
コード例 #4
0
ファイル: intel_screen.c プロジェクト: ashmew2/kolibriosSVN
static __DRIimage *
intel_create_image_from_fds(__DRIscreen *screen,
                            int width, int height, int fourcc,
                            int *fds, int num_fds, int *strides, int *offsets,
                            void *loaderPrivate)
{
   struct intel_screen *intelScreen = screen->driverPrivate;
   struct intel_image_format *f;
   __DRIimage *image;
   int i, index;

   if (fds == NULL || num_fds != 1)
      return NULL;

   f = intel_image_format_lookup(fourcc);
   if (f == NULL)
      return NULL;

   if (f->nplanes == 1)
      image = intel_allocate_image(f->planes[0].dri_format, loaderPrivate);
   else
      image = intel_allocate_image(__DRI_IMAGE_FORMAT_NONE, loaderPrivate);

   if (image == NULL)
      return NULL;

   image->bo = drm_intel_bo_gem_create_from_prime(intelScreen->bufmgr,
                                                  fds[0],
                                                  height * strides[0]);
   if (image->bo == NULL) {
      free(image);
      return NULL;
   }
   image->width = width;
   image->height = height;
   image->pitch = strides[0];

   image->planar_format = f;
   for (i = 0; i < f->nplanes; i++) {
      index = f->planes[i].buffer_index;
      image->offsets[index] = offsets[index];
      image->strides[index] = strides[index];
   }

   if (f->nplanes == 1) {
      image->offset = image->offsets[0];
      intel_image_warn_if_unaligned(image, __func__);
   }

   return image;
}
コード例 #5
0
ファイル: prime_nv_api.c プロジェクト: jmb82/intel-gpu-tools
/* export handle from intel driver - reimport to another intel driver bufmgr
   see if you get same object */
static void test_i915_self_import_to_different_fd(void)
{
    drm_intel_bo *test_intel_bo, *test_intel_bo2;
    int prime_fd;

    test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);

    drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);

    test_intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
    close(prime_fd);
    igt_assert(test_intel_bo2);

    drm_intel_bo_unreference(test_intel_bo2);
    drm_intel_bo_unreference(test_intel_bo);
}
コード例 #6
0
ファイル: intel_drm_winsys.c プロジェクト: pwnz7777/Mesa-3D
struct intel_bo *
intel_winsys_import_handle(struct intel_winsys *winsys,
                           const char *name,
                           const struct winsys_handle *handle,
                           unsigned long height,
                           enum intel_tiling_mode *tiling,
                           unsigned long *pitch)
{
   uint32_t real_tiling, swizzle;
   drm_intel_bo *bo;
   int err;

   switch (handle->type) {
   case DRM_API_HANDLE_TYPE_SHARED:
      {
         const uint32_t gem_name = handle->handle;
         bo = drm_intel_bo_gem_create_from_name(winsys->bufmgr,
               name, gem_name);
      }
      break;
   case DRM_API_HANDLE_TYPE_FD:
      {
         const int fd = (int) handle->handle;
         bo = drm_intel_bo_gem_create_from_prime(winsys->bufmgr,
               fd, height * handle->stride);
      }
      break;
   default:
      bo = NULL;
      break;
   }

   if (!bo)
      return NULL;

   err = drm_intel_bo_get_tiling(bo, &real_tiling, &swizzle);
   if (err) {
      drm_intel_bo_unreference(bo);
      return NULL;
   }

   *tiling = real_tiling;
   *pitch = handle->stride;

   return (struct intel_bo *) bo;
}
コード例 #7
0
static VAStatus
media_suface_external_memory (VADriverContextP ctx,
			      struct object_surface *obj_surface,
			      INT external_memory_type,
			      VASurfaceAttribExternalBuffers *
			      memory_attibute, INT index)
{
  MEDIA_DRV_CONTEXT *drv_ctx = (MEDIA_DRV_CONTEXT *) ctx->pDriverData;
  MEDIA_DRV_ASSERT (ctx);
  MEDIA_DRV_ASSERT (drv_ctx);


  if (!memory_attibute ||
      !memory_attibute->buffers || index > memory_attibute->num_buffers)
    return VA_STATUS_ERROR_INVALID_PARAMETER;

  MEDIA_DRV_ASSERT (obj_surface->orig_width == memory_attibute->width);
  MEDIA_DRV_ASSERT (obj_surface->orig_height == memory_attibute->height);
  MEDIA_DRV_ASSERT (memory_attibute->num_planes >= 1);

  obj_surface->fourcc = memory_attibute->pixel_format;
  obj_surface->width = memory_attibute->pitches[0];
  obj_surface->size = memory_attibute->data_size;

  if (memory_attibute->num_planes == 1)
    obj_surface->height = memory_attibute->data_size / obj_surface->width;
  else
    obj_surface->height = memory_attibute->offsets[1] / obj_surface->width;

  obj_surface->x_cb_offset = 0;	/* X offset is always 0 */
  obj_surface->x_cr_offset = 0;

  switch (obj_surface->fourcc)
    {
    case VA_FOURCC ('N', 'V', '1', '2'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 2);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[0] ==
			memory_attibute->pitches[1]);

      obj_surface->subsampling = SUBSAMPLE_YUV420;
      obj_surface->y_cb_offset = obj_surface->height;
      obj_surface->y_cr_offset = obj_surface->height;
      obj_surface->cb_cr_width = obj_surface->orig_width / 2;
      obj_surface->cb_cr_height = obj_surface->orig_height / 2;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('Y', 'V', '1', '2'):
    case VA_FOURCC ('I', 'M', 'C', '1'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV420;
      obj_surface->y_cr_offset = obj_surface->height;
      obj_surface->y_cb_offset =
	memory_attibute->offsets[2] / obj_surface->width;
      obj_surface->cb_cr_width = obj_surface->orig_width / 2;
      obj_surface->cb_cr_height = obj_surface->orig_height / 2;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('I', '4', '2', '0'):
    case VA_FOURCC ('I', 'Y', 'U', 'V'):
    case VA_FOURCC ('I', 'M', 'C', '3'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV420;
      obj_surface->y_cb_offset = obj_surface->height;
      obj_surface->y_cr_offset =
	memory_attibute->offsets[2] / obj_surface->width;
      obj_surface->cb_cr_width = obj_surface->orig_width / 2;
      obj_surface->cb_cr_height = obj_surface->orig_height / 2;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('Y', 'U', 'Y', '2'):
    case VA_FOURCC ('U', 'Y', 'V', 'Y'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 1);

      obj_surface->subsampling = SUBSAMPLE_YUV422H;
      obj_surface->y_cb_offset = 0;
      obj_surface->y_cr_offset = 0;
      obj_surface->cb_cr_width = obj_surface->orig_width / 2;
      obj_surface->cb_cr_height = obj_surface->orig_height;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[0];

      break;

    case VA_FOURCC ('R', 'G', 'B', 'A'):
    case VA_FOURCC ('R', 'G', 'B', 'X'):
    case VA_FOURCC ('B', 'G', 'R', 'A'):
    case VA_FOURCC ('B', 'G', 'R', 'X'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 1);

      obj_surface->subsampling = SUBSAMPLE_RGBX;
      obj_surface->y_cb_offset = 0;
      obj_surface->y_cr_offset = 0;
      obj_surface->cb_cr_width = 0;
      obj_surface->cb_cr_height = 0;
      obj_surface->cb_cr_pitch = 0;

      break;

    case VA_FOURCC ('Y', '8', '0', '0'):	/* monochrome surface */
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 1);

      obj_surface->subsampling = SUBSAMPLE_YUV400;
      obj_surface->y_cb_offset = 0;
      obj_surface->y_cr_offset = 0;
      obj_surface->cb_cr_width = 0;
      obj_surface->cb_cr_height = 0;
      obj_surface->cb_cr_pitch = 0;

      break;

    case VA_FOURCC ('4', '1', '1', 'P'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV411;
      obj_surface->y_cb_offset = 0;
      obj_surface->y_cr_offset = 0;
      obj_surface->cb_cr_width = obj_surface->orig_width / 4;
      obj_surface->cb_cr_height = obj_surface->orig_height;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('4', '2', '2', 'H'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV422H;
      obj_surface->y_cb_offset = obj_surface->height;
      obj_surface->y_cr_offset =
	memory_attibute->offsets[2] / obj_surface->width;
      obj_surface->cb_cr_width = obj_surface->orig_width / 2;
      obj_surface->cb_cr_height = obj_surface->orig_height;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('4', '2', '2', 'V'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV422H;
      obj_surface->y_cb_offset = obj_surface->height;
      obj_surface->y_cr_offset =
	memory_attibute->offsets[2] / obj_surface->width;
      obj_surface->cb_cr_width = obj_surface->orig_width;
      obj_surface->cb_cr_height = obj_surface->orig_height / 2;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    case VA_FOURCC ('4', '4', '4', 'P'):
      MEDIA_DRV_ASSERT (memory_attibute->num_planes == 3);
      MEDIA_DRV_ASSERT (memory_attibute->pitches[1] ==
			memory_attibute->pitches[2]);

      obj_surface->subsampling = SUBSAMPLE_YUV444;
      obj_surface->y_cb_offset = obj_surface->height;
      obj_surface->y_cr_offset =
	memory_attibute->offsets[2] / obj_surface->width;
      obj_surface->cb_cr_width = obj_surface->orig_width;
      obj_surface->cb_cr_height = obj_surface->orig_height;
      obj_surface->cb_cr_pitch = memory_attibute->pitches[1];

      break;

    default:

      return VA_STATUS_ERROR_INVALID_PARAMETER;
    }

  if (external_memory_type == I965_SURFACE_MEM_GEM_FLINK)
    obj_surface->bo =
      drm_intel_bo_gem_create_from_name (drv_ctx->drv_data.bufmgr,
					 "gem flinked vaapi surface",
					 memory_attibute->buffers[index]);
  else if (external_memory_type == I965_SURFACE_MEM_DRM_PRIME)
    obj_surface->bo =
      drm_intel_bo_gem_create_from_prime (drv_ctx->drv_data.bufmgr,
					  memory_attibute->buffers[index],
					  obj_surface->size);

  if (!obj_surface->bo)
    return VA_STATUS_ERROR_INVALID_PARAMETER;

  return VA_STATUS_SUCCESS;
}