diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 25 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.h | 1 | ||||
-rw-r--r-- | src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c | 12 |
4 files changed, 32 insertions, 8 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 3218eb61a15..e25d14e23c4 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -250,7 +250,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: return 0; case PIPE_CAP_FAKE_SW_MSAA: - return 1; + return 1; } /* should only get here on unhandled cases */ debug_printf("Unexpected PIPE_CAP %d query\n", param); diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index f70b723a07b..ef192e36f7a 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -322,7 +322,11 @@ dri2_allocate_buffer(__DRIscreen *sPriv, } memset(&whandle, 0, sizeof(whandle)); - whandle.type = DRM_API_HANDLE_TYPE_SHARED; + if (screen->can_share_buffer) + whandle.type = DRM_API_HANDLE_TYPE_SHARED; + else + whandle.type = DRM_API_HANDLE_TYPE_KMS; + screen->base.screen->resource_get_handle(screen->base.screen, buffer->resource, &whandle); @@ -501,10 +505,12 @@ dri2_allocate_textures(struct dri_context *ctx, templ.height0 = dri_drawable->h; templ.format = format; templ.bind = bind; - whandle.type = DRM_API_HANDLE_TYPE_SHARED; whandle.handle = buf->name; whandle.stride = buf->pitch; - + if (screen->can_share_buffer) + whandle.type = DRM_API_HANDLE_TYPE_SHARED; + else + whandle.type = DRM_API_HANDLE_TYPE_KMS; drawable->textures[statt] = screen->base.screen->resource_from_handle(screen->base.screen, &templ, &whandle); @@ -1186,9 +1192,17 @@ dri2_destroy_image(__DRIimage *img) FREE(img); } +static int +dri2_get_capabilities(__DRIscreen *_screen) +{ + struct dri_screen *screen = dri_screen(_screen); + + return (screen->can_share_buffer ? __DRI_IMAGE_CAP_GLOBAL_NAMES : 0); +} + /* The extension is modified during runtime if DRI_PRIME is detected */ static __DRIimageExtension dri2ImageExtension = { - .base = { __DRI_IMAGE, 9 }, + .base = { __DRI_IMAGE, 10 }, .createImageFromName = dri2_create_image_from_name, .createImageFromRenderbuffer = dri2_create_image_from_renderbuffer, @@ -1203,6 +1217,7 @@ static __DRIimageExtension dri2ImageExtension = { .createImageFromFds = NULL, .createImageFromDmaBufs = NULL, .blitImage = dri2_blit_image, + .getCapabilities = dri2_get_capabilities, }; /* @@ -1282,6 +1297,7 @@ dri2_init_screen(__DRIscreen * sPriv) if (!configs) goto fail; + screen->can_share_buffer = true; screen->auto_fake_front = dri_with_format(sPriv); screen->broken_invalidate = !sPriv->dri2.useInvalidate; screen->lookup_egl_image = dri2_lookup_egl_image; @@ -1327,6 +1343,7 @@ dri_kms_init_screen(__DRIscreen * sPriv) if (!configs) goto fail; + screen->can_share_buffer = false; screen->auto_fake_front = dri_with_format(sPriv); screen->broken_invalidate = !sPriv->dri2.useInvalidate; screen->lookup_egl_image = dri2_lookup_egl_image; diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h index 993ad2abe09..07c989807f3 100644 --- a/src/gallium/state_trackers/dri/dri_screen.h +++ b/src/gallium/state_trackers/dri/dri_screen.h @@ -70,6 +70,7 @@ struct dri_screen /* drm */ int fd; + boolean can_share_buffer; struct pipe_loader_device *dev; diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c index e21c4c2627a..c9934bb07fa 100644 --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c @@ -231,6 +231,8 @@ kms_sw_displaytarget_from_handle(struct sw_winsys *ws, struct kms_sw_winsys *kms_sw = kms_sw_winsys(ws); struct kms_sw_displaytarget *kms_sw_dt; + assert(whandle->type == DRM_API_HANDLE_TYPE_KMS); + LIST_FOR_EACH_ENTRY(kms_sw_dt, &kms_sw->bo_list, link) { if (kms_sw_dt->handle == whandle->handle) { kms_sw_dt->ref_count++; @@ -253,9 +255,13 @@ kms_sw_displaytarget_get_handle(struct sw_winsys *winsys, { struct kms_sw_displaytarget *kms_sw_dt = kms_sw_displaytarget(dt); - assert(whandle->type == DRM_API_HANDLE_TYPE_SHARED); - whandle->handle = kms_sw_dt->handle; - whandle->stride = kms_sw_dt->stride; + if (whandle->type == DRM_API_HANDLE_TYPE_KMS) { + whandle->handle = kms_sw_dt->handle; + whandle->stride = kms_sw_dt->stride; + } else { + whandle->handle = 0; + whandle->stride = 0; + } return TRUE; } |