st/xa: Fix a memory leak
[mesa.git] / src / gallium / state_trackers / xa / xa_tracker.c
index 4fdbdc96ae6b6ac151aa1aae7d0266ef36f7cf5a..0909044fb91ee0be5664d6f282252213bd252fd2 100644 (file)
@@ -89,6 +89,15 @@ xa_get_pipe_format(struct xa_tracker *xa, enum xa_formats xa_format)
     fdesc.xa_format = xa_format;
 
     switch (xa_format) {
+    case xa_format_a8:
+        if (xa->screen->is_format_supported(xa->screen, PIPE_FORMAT_R8_UNORM,
+                                            PIPE_TEXTURE_2D, 0, 0,
+                                            stype_bind[xa_type_a] |
+                                            PIPE_BIND_RENDER_TARGET))
+            fdesc.format = PIPE_FORMAT_R8_UNORM;
+        else
+            fdesc.format = PIPE_FORMAT_L8_UNORM;
+       break;
     case xa_format_a8r8g8b8:
        fdesc.format = PIPE_FORMAT_B8G8R8A8_UNORM;
        break;
@@ -101,15 +110,21 @@ xa_get_pipe_format(struct xa_tracker *xa, enum xa_formats xa_format)
     case xa_format_x1r5g5b5:
        fdesc.format = PIPE_FORMAT_B5G5R5A1_UNORM;
        break;
-    case xa_format_a8:
-        if (xa->screen->is_format_supported(xa->screen, PIPE_FORMAT_R8_UNORM,
-                                            PIPE_TEXTURE_2D, 0,
-                                            stype_bind[xa_type_a] |
-                                            PIPE_BIND_RENDER_TARGET))
-            fdesc.format = PIPE_FORMAT_R8_UNORM;
-        else
-            fdesc.format = PIPE_FORMAT_L8_UNORM;
-       break;
+    case xa_format_a4r4g4b4:
+        fdesc.format = PIPE_FORMAT_B4G4R4A4_UNORM;
+        break;
+    case xa_format_a2b10g10r10:
+        fdesc.format = PIPE_FORMAT_R10G10B10A2_UNORM;
+        break;
+    case xa_format_x2b10g10r10:
+        fdesc.format = PIPE_FORMAT_R10G10B10X2_UNORM;
+        break;
+    case xa_format_b8g8r8a8:
+        fdesc.format = PIPE_FORMAT_A8R8G8B8_UNORM;
+        break;
+    case xa_format_b8g8r8x8:
+        fdesc.format = PIPE_FORMAT_X8R8G8B8_UNORM;
+        break;
     case xa_format_z24:
        fdesc.format = PIPE_FORMAT_Z24X8_UNORM;
        break;
@@ -133,7 +148,7 @@ xa_get_pipe_format(struct xa_tracker *xa, enum xa_formats xa_format)
        break;
     case xa_format_yuv8:
         if (xa->screen->is_format_supported(xa->screen, PIPE_FORMAT_R8_UNORM,
-                                            PIPE_TEXTURE_2D, 0,
+                                            PIPE_TEXTURE_2D, 0, 0,
                                             stype_bind[xa_type_yuv_component]))
             fdesc.format = PIPE_FORMAT_R8_UNORM;
         else
@@ -152,21 +167,13 @@ xa_tracker_create(int drm_fd)
     struct xa_tracker *xa = calloc(1, sizeof(struct xa_tracker));
     enum xa_surface_type stype;
     unsigned int num_formats;
-    int loader_fd;
 
     if (!xa)
        return NULL;
 
-#if GALLIUM_STATIC_TARGETS
-    xa->screen = dd_create_screen(drm_fd);
-    (void) loader_fd; /* silence unused var warning */
-#else
-    loader_fd = dup(drm_fd);
-    if (loader_fd == -1)
-        return NULL;
-    if (pipe_loader_drm_probe_fd(&xa->dev, loader_fd))
-       xa->screen = pipe_loader_create_screen(xa->dev, PIPE_SEARCH_DIR);
-#endif
+    if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd))
+       xa->screen = pipe_loader_create_screen(xa->dev);
+
     if (!xa->screen)
        goto out_no_screen;
 
@@ -199,7 +206,7 @@ xa_tracker_create(int drm_fd)
                 xa_get_pipe_format(xa, xa_format);
 
            if (xa->screen->is_format_supported(xa->screen, fdesc.format,
-                                               PIPE_TEXTURE_2D, 0, bind)) {
+                                               PIPE_TEXTURE_2D, 0, 0, bind)) {
                if (xa->format_map[stype][0] == 0)
                    xa->format_map[stype][0] = num_formats;
                xa->format_map[stype][1] = num_formats;
@@ -214,10 +221,9 @@ xa_tracker_create(int drm_fd)
  out_no_pipe:
     xa->screen->destroy(xa->screen);
  out_no_screen:
-#if !GALLIUM_STATIC_TARGETS
     if (xa->dev)
        pipe_loader_release(&xa->dev, 1);
-#endif
+
     free(xa);
     return NULL;
 }
@@ -228,9 +234,8 @@ xa_tracker_destroy(struct xa_tracker *xa)
     free(xa->supported_formats);
     xa_context_destroy(xa->default_ctx);
     xa->screen->destroy(xa->screen);
-#if !GALLIUM_STATIC_TARGETS
     pipe_loader_release(&xa->dev, 1);
-#endif
+    /* CHECK: The XA API user preserves ownership of the original fd */
     free(xa);
 }
 
@@ -304,7 +309,7 @@ xa_format_check_supported(struct xa_tracker *xa,
        bind |= PIPE_BIND_SCANOUT;
 
     if (!xa->screen->is_format_supported(xa->screen, fdesc.format,
-                                        PIPE_TEXTURE_2D, 0, bind))
+                                        PIPE_TEXTURE_2D, 0, 0, bind))
        return -XA_ERR_INVAL;
 
     return XA_ERR_NONE;
@@ -315,12 +320,12 @@ handle_type(enum xa_handle_type type)
 {
     switch (type) {
     case xa_handle_type_kms:
-       return DRM_API_HANDLE_TYPE_KMS;
+       return WINSYS_HANDLE_TYPE_KMS;
     case xa_handle_type_fd:
-        return DRM_API_HANDLE_TYPE_FD;
+        return WINSYS_HANDLE_TYPE_FD;
     case xa_handle_type_shared:
     default:
-       return DRM_API_HANDLE_TYPE_SHARED;
+       return WINSYS_HANDLE_TYPE_SHARED;
     }
 }
 
@@ -367,7 +372,8 @@ surface_create(struct xa_tracker *xa,
        template->bind |= PIPE_BIND_SCANOUT;
 
     if (whandle)
-       srf->tex = xa->screen->resource_from_handle(xa->screen, template, whandle);
+       srf->tex = xa->screen->resource_from_handle(xa->screen, template, whandle,
+                                                    PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE);
     else
        srf->tex = xa->screen->resource_create(xa->screen, template);
     if (!srf->tex)
@@ -407,7 +413,7 @@ xa_surface_from_handle(struct xa_tracker *xa,
                  uint32_t handle, uint32_t stride)
 {
     return xa_surface_from_handle2(xa, width, height, depth, stype, xa_format,
-                                   DRM_API_HANDLE_TYPE_SHARED, flags, handle,
+                                   WINSYS_HANDLE_TYPE_SHARED, flags, handle,
                                    stride);
 }
 
@@ -473,7 +479,7 @@ xa_surface_redefine(struct xa_surface *srf,
            return -XA_ERR_INVAL;
 
        if (!xa->screen->is_format_supported(xa->screen, fdesc.format,
-                                            PIPE_TEXTURE_2D, 0,
+                                            PIPE_TEXTURE_2D, 0, 0,
                                             template->bind |
                                             PIPE_BIND_RENDER_TARGET))
            return -XA_ERR_INVAL;
@@ -553,7 +559,9 @@ xa_surface_handle(struct xa_surface *srf,
 
     memset(&whandle, 0, sizeof(whandle));
     whandle.type = handle_type(type);
-    res = screen->resource_get_handle(screen, srf->tex, &whandle);
+    res = screen->resource_get_handle(screen, srf->xa->default_ctx->pipe,
+                                      srf->tex, &whandle,
+                                      PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE);
     if (!res)
        return -XA_ERR_INVAL;