X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fxa%2Fxa_tracker.c;h=0909044fb91ee0be5664d6f282252213bd252fd2;hb=21be5c8edd3ad156f6cbfbceb96e7939716d9f2c;hp=f09baed1d849539a6b5c154e8d69228e2e66b591;hpb=82db518f1519cec9e3842f23455a105e2006afbd;p=mesa.git diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index f09baed1d84..0909044fb91 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -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,15 +167,11 @@ 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 fd = -1; if (!xa) return NULL; - if (drm_fd < 0 || (fd = dup(drm_fd)) < 0) - goto out_no_fd; - - if (pipe_loader_drm_probe_fd(&xa->dev, fd)) + if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd)) xa->screen = pipe_loader_create_screen(xa->dev); if (!xa->screen) @@ -195,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; @@ -212,9 +223,7 @@ xa_tracker_create(int drm_fd) out_no_screen: if (xa->dev) pipe_loader_release(&xa->dev, 1); - fd = -1; - out_no_fd: - close(fd); + free(xa); return NULL; } @@ -226,6 +235,7 @@ xa_tracker_destroy(struct xa_tracker *xa) xa_context_destroy(xa->default_ctx); xa->screen->destroy(xa->screen); pipe_loader_release(&xa->dev, 1); + /* CHECK: The XA API user preserves ownership of the original fd */ free(xa); } @@ -299,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; @@ -310,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; } } @@ -363,7 +373,7 @@ surface_create(struct xa_tracker *xa, if (whandle) srf->tex = xa->screen->resource_from_handle(xa->screen, template, whandle, - PIPE_HANDLE_USAGE_READ_WRITE); + PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE); else srf->tex = xa->screen->resource_create(xa->screen, template); if (!srf->tex) @@ -403,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); } @@ -469,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; @@ -549,8 +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, - PIPE_HANDLE_USAGE_READ_WRITE); + 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;