On Thu, 4 Jul 2019 10:04:42 +0200 Tomeu Vizoso <tomeu.viz...@collabora.com> wrote:
> @@ -382,11 +362,14 @@ panfrost_resource_create_bo(struct panfrost_screen > *screen, struct panfrost_reso > > /* Tiling textures is almost always faster, unless we only use it > once */ > > +#define SCANOUT (PIPE_BIND_SCANOUT | PIPE_BIND_SHARED | > PIPE_BIND_DISPLAY_TARGET) > + > + bool is_scanout = (res->bind & SCANOUT); > bool is_texture = (res->bind & PIPE_BIND_SAMPLER_VIEW); > bool is_2d = res->depth0 == 1 && res->array_size == 1; > - bool is_streaming = (res->usage != PIPE_USAGE_STREAM); > + bool is_streaming = (res->usage == PIPE_USAGE_STREAM); > > - bool should_tile = is_streaming && is_texture && is_2d; > + bool should_tile = !is_streaming && is_texture && is_2d && > !is_scanout; > > /* Depth/stencil can't be tiled, only linear or AFBC */ > should_tile &= !(res->bind & PIPE_BIND_DEPTH_STENCIL); > @@ -425,10 +408,6 @@ panfrost_resource_create(struct pipe_screen *screen, > assert(0); > } > > - if (template->bind & > - (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | > PIPE_BIND_SHARED)) > - return panfrost_create_scanout_res(screen, template); > - > struct panfrost_resource *so = rzalloc(screen, struct > panfrost_resource); > struct panfrost_screen *pscreen = (struct panfrost_screen *) screen; > > @@ -440,6 +419,20 @@ panfrost_resource_create(struct pipe_screen *screen, > util_range_init(&so->valid_buffer_range); > > panfrost_resource_create_bo(pscreen, so); > + > + /* Set up the "scanout resource" (the dmabuf export of our buffer to > + * the KMS handle) if the buffer might ever have > + * resource_get_handle(WINSYS_HANDLE_TYPE_KMS) called on it. > + */ > + if (template->bind & PIPE_BIND_SCANOUT) { That's probably intentional but I thought I'd mention it just to be sure this is what you intend to do: the scanout obj is now only created when PIPE_BIND_SCANOUT is set while it was previously created for PIPE_BIND_SHARED and PIPE_BIND_DISPLAY_TARGET too. > + so->scanout = > + renderonly_scanout_for_resource(&so->base, > pscreen->ro, NULL); > + if (!so->scanout) { > + panfrost_resource_destroy(screen, &so->base); > + return NULL; > + } > + } > + > return (struct pipe_resource *)so; > } > > diff --git a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c > b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c > index bf599a1497c9..5b316a2b1f37 100644 > --- a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c > +++ b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c > @@ -90,7 +90,7 @@ struct pipe_screen *kmsro_drm_screen_create(int fd, > ro.gpu_fd = drmOpenWithType("panfrost", NULL, DRM_NODE_RENDER); > > if (ro.gpu_fd >= 0) { > - ro.create_for_resource = > renderonly_create_kms_dumb_buffer_for_resource, > + ro.create_for_resource = renderonly_create_gpu_import_for_resource, > screen = panfrost_drm_screen_create_renderonly(&ro); > if (!screen) > close(ro.gpu_fd); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev