Example #1
0
boolean
etna_screen_bo_get_handle(struct pipe_screen *pscreen, struct etna_bo *bo,
                          unsigned stride, struct winsys_handle *whandle)
{
   whandle->stride = stride;

   if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
      return etna_bo_get_name(bo, &whandle->handle) == 0;
   } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
      whandle->handle = etna_bo_handle(bo);
      return TRUE;
   } else if (whandle->type == DRM_API_HANDLE_TYPE_FD) {
      whandle->handle = etna_bo_dmabuf(bo);
      return TRUE;
   } else {
      return FALSE;
   }
}
static boolean
etna_resource_get_handle(struct pipe_screen *pscreen,
                         struct pipe_context *pctx,
                         struct pipe_resource *prsc,
                         struct winsys_handle *handle, unsigned usage)
{
   struct etna_resource *rsc = etna_resource(prsc);
   /* Scanout is always attached to the base resource */
   struct renderonly_scanout *scanout = rsc->scanout;

   /*
    * External resources are preferred, so a import->export chain of
    * render/sampler incompatible buffers yield the same handle.
    */
   if (rsc->external)
      rsc = etna_resource(rsc->external);

   handle->stride = rsc->levels[0].stride;
   handle->modifier = layout_to_modifier(rsc->layout);

   if (handle->type == WINSYS_HANDLE_TYPE_SHARED) {
      return etna_bo_get_name(rsc->bo, &handle->handle) == 0;
   } else if (handle->type == WINSYS_HANDLE_TYPE_KMS) {
      if (renderonly_get_handle(scanout, handle)) {
         return TRUE;
      } else {
         handle->handle = etna_bo_handle(rsc->bo);
         return TRUE;
      }
   } else if (handle->type == WINSYS_HANDLE_TYPE_FD) {
      handle->handle = etna_bo_dmabuf(rsc->bo);
      return TRUE;
   } else {
      return FALSE;
   }
}