From: Rob Clark Date: Mon, 22 Apr 2013 17:42:55 +0000 (-0400) Subject: freedreno: implement fd_screen_destroy() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=38d8b02eba9aea5b1ce61e8fc949163debda5cd7;p=mesa.git freedreno: implement fd_screen_destroy() Opps, didn't notice that I had left it stubbed out. Also, make things fail a bit more gracefully when things go wrong. Signed-off-by: Rob Clark --- diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 4a9a54e3aea..336d0306ec9 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -111,8 +111,15 @@ fd_screen_fence_finish(struct pipe_screen *screen, static void fd_screen_destroy(struct pipe_screen *pscreen) { - // TODO - DBG("TODO"); + struct fd_screen *screen = fd_screen(pscreen); + + if (screen->pipe) + fd_pipe_del(screen->pipe); + + if (screen->dev) + fd_device_del(screen->dev); + + free(screen); } /* @@ -445,20 +452,29 @@ fd_screen_create(struct fd_device *dev) if (!screen) return NULL; - DBG(""); + pscreen = &screen->base; screen->dev = dev; // maybe this should be in context? screen->pipe = fd_pipe_new(screen->dev, FD_PIPE_3D); + if (!screen->pipe) { + DBG("could not create 3d pipe"); + goto fail; + } - fd_pipe_get_param(screen->pipe, FD_GMEM_SIZE, &val); + if (fd_pipe_get_param(screen->pipe, FD_GMEM_SIZE, &val)) { + DBG("could not get GMEM size"); + goto fail; + } screen->gmemsize_bytes = val; - fd_pipe_get_param(screen->pipe, FD_DEVICE_ID, &val); + if (fd_pipe_get_param(screen->pipe, FD_DEVICE_ID, &val)) { + DBG("could not get device-id"); + goto fail; + } screen->device_id = val; - pscreen = &screen->base; pscreen->destroy = fd_screen_destroy; pscreen->get_param = fd_screen_get_param; @@ -481,4 +497,8 @@ fd_screen_create(struct fd_device *dev) util_format_s3tc_init(); return pscreen; + +fail: + fd_screen_destroy(pscreen); + return NULL; }