panfrost: Move scanout res creation out of panfrost_resource_create()
Which improves readability and help us avoid a memory leak. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
This commit is contained in:
@@ -180,6 +180,37 @@ panfrost_surface_destroy(struct pipe_context *pipe,
|
|||||||
ralloc_free(surf);
|
ralloc_free(surf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct pipe_resource *
|
||||||
|
panfrost_create_scanout_res(struct pipe_screen *screen,
|
||||||
|
const struct pipe_resource *template)
|
||||||
|
{
|
||||||
|
struct panfrost_screen *pscreen = pan_screen(screen);
|
||||||
|
struct pipe_resource scanout_templat = *template;
|
||||||
|
struct renderonly_scanout *scanout;
|
||||||
|
struct winsys_handle handle;
|
||||||
|
struct pipe_resource *res;
|
||||||
|
|
||||||
|
scanout = renderonly_scanout_for_resource(&scanout_templat,
|
||||||
|
pscreen->ro, &handle);
|
||||||
|
if (!scanout)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
assert(handle.type == WINSYS_HANDLE_TYPE_FD);
|
||||||
|
/* TODO: handle modifiers? */
|
||||||
|
res = screen->resource_from_handle(screen, template, &handle,
|
||||||
|
PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE);
|
||||||
|
close(handle.handle);
|
||||||
|
if (!res)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
struct panfrost_resource *pres = pan_resource(res);
|
||||||
|
|
||||||
|
pres->scanout = scanout;
|
||||||
|
pscreen->display_target = pres;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/* Computes sizes for checksumming, which is 8 bytes per 16x16 tile */
|
/* Computes sizes for checksumming, which is 8 bytes per 16x16 tile */
|
||||||
|
|
||||||
#define CHECKSUM_TILE_WIDTH 16
|
#define CHECKSUM_TILE_WIDTH 16
|
||||||
@@ -368,14 +399,6 @@ static struct pipe_resource *
|
|||||||
panfrost_resource_create(struct pipe_screen *screen,
|
panfrost_resource_create(struct pipe_screen *screen,
|
||||||
const struct pipe_resource *template)
|
const struct pipe_resource *template)
|
||||||
{
|
{
|
||||||
struct panfrost_resource *so = rzalloc(screen, struct panfrost_resource);
|
|
||||||
struct panfrost_screen *pscreen = (struct panfrost_screen *) screen;
|
|
||||||
|
|
||||||
so->base = *template;
|
|
||||||
so->base.screen = screen;
|
|
||||||
|
|
||||||
pipe_reference_init(&so->base.reference, 1);
|
|
||||||
|
|
||||||
/* Make sure we're familiar */
|
/* Make sure we're familiar */
|
||||||
switch (template->target) {
|
switch (template->target) {
|
||||||
case PIPE_BUFFER:
|
case PIPE_BUFFER:
|
||||||
@@ -391,35 +414,21 @@ panfrost_resource_create(struct pipe_screen *screen,
|
|||||||
assert(0);
|
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;
|
||||||
|
|
||||||
|
so->base = *template;
|
||||||
|
so->base.screen = screen;
|
||||||
|
|
||||||
|
pipe_reference_init(&so->base.reference, 1);
|
||||||
|
|
||||||
util_range_init(&so->valid_buffer_range);
|
util_range_init(&so->valid_buffer_range);
|
||||||
|
|
||||||
if (template->bind & PIPE_BIND_DISPLAY_TARGET ||
|
so->bo = panfrost_create_bo(pscreen, template);
|
||||||
template->bind & PIPE_BIND_SCANOUT ||
|
|
||||||
template->bind & PIPE_BIND_SHARED) {
|
|
||||||
struct pipe_resource scanout_templat = *template;
|
|
||||||
struct renderonly_scanout *scanout;
|
|
||||||
struct winsys_handle handle;
|
|
||||||
|
|
||||||
scanout = renderonly_scanout_for_resource(&scanout_templat,
|
|
||||||
pscreen->ro, &handle);
|
|
||||||
if (!scanout)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
assert(handle.type == WINSYS_HANDLE_TYPE_FD);
|
|
||||||
/* TODO: handle modifiers? */
|
|
||||||
so = pan_resource(screen->resource_from_handle(screen, template,
|
|
||||||
&handle,
|
|
||||||
PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE));
|
|
||||||
close(handle.handle);
|
|
||||||
if (!so)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
so->scanout = scanout;
|
|
||||||
pscreen->display_target = so;
|
|
||||||
} else {
|
|
||||||
so->bo = panfrost_create_bo(pscreen, template);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (struct pipe_resource *)so;
|
return (struct pipe_resource *)so;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user