diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-08 08:33:10 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-06-26 11:45:02 +0100 |
commit | a2ad0b6ce957481ca5fa220340554cbc8fa54dc9 (patch) | |
tree | f36ca793a9dff20cc7db1ab263b25ebe929f0748 | |
parent | c2f7048bcb570ddfd1c898321aed1af1e3a9276c (diff) |
WIP drvmodevl3
dirty pixmap tracking
intel: WIP
use Y tiling for pcopy engine
Revert "use Y tiling for pcopy engine"
This reverts commit ad7a7905195aaa1895bea1a67e34b4a8a9a41724.
new X api
new provider api
intel: port to new pixmap tracking
intel: damage drawable on pageflipt
drop unusued code
rename slave->scanout
intel_dri: drop code that shouldn't be here
add set front pixmap for dri2
intel: create a new backing bo for a pixmap that is tiled
intel drop front pixmap experiment
intel: fixup for new dri2 interfaces
-rw-r--r-- | src/intel.h | 30 | ||||
-rw-r--r-- | src/intel_display.c | 121 | ||||
-rw-r--r-- | src/intel_dri.c | 116 | ||||
-rw-r--r-- | src/intel_driver.c | 110 | ||||
-rw-r--r-- | src/intel_hwmc.c | 4 | ||||
-rw-r--r-- | src/intel_module.c | 40 | ||||
-rw-r--r-- | src/intel_uxa.c | 95 | ||||
-rw-r--r-- | src/intel_video.c | 6 | ||||
-rw-r--r-- | src/legacy/i810/i810_dga.c | 8 | ||||
-rw-r--r-- | src/legacy/i810/i810_driver.c | 10 | ||||
-rw-r--r-- | src/legacy/i810/i810_video.c | 2 | ||||
-rw-r--r-- | uxa/Makefile.am | 2 | ||||
-rw-r--r-- | uxa/uxa-glyphs.c | 9 | ||||
-rw-r--r-- | uxa/uxa-priv.h | 2 | ||||
-rw-r--r-- | uxa/uxa.c | 18 |
15 files changed, 432 insertions, 141 deletions
diff --git a/src/intel.h b/src/intel.h index f806aea8..221472cf 100644 --- a/src/intel.h +++ b/src/intel.h @@ -166,6 +166,7 @@ typedef struct intel_screen_private { void *modes; drm_intel_bo *front_buffer, *back_buffer; + drm_intel_bo *slave_front_buffer; PixmapPtr back_pixmap; unsigned int back_name; long front_pitch, front_tiling; @@ -334,7 +335,7 @@ typedef struct intel_screen_private { Bool needs_flush; Bool use_shadow; - struct _DRI2FrameEvent *pending_flip[2]; + struct _intelDRI2FrameEvent *pending_flip[2]; /* Broken-out options. */ OptionInfoPtr Options; @@ -370,11 +371,11 @@ extern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crt extern int intel_crtc_id(xf86CrtcPtr crtc); extern int intel_output_dpms_status(xf86OutputPtr output); -enum DRI2FrameEventType { - DRI2_SWAP, - DRI2_SWAP_CHAIN, - DRI2_FLIP, - DRI2_WAITMSC, +enum intelDRI2FrameEventType { + INTEL_DRI2_SWAP, + INTEL_DRI2_SWAP_CHAIN, + INTEL_DRI2_FLIP, + INTEL_DRI2_WAITMSC, }; #if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,7,99,3,0) @@ -382,12 +383,12 @@ typedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type, CARD64 ust, CARD64 msc, CARD64 sbc); #endif -typedef struct _DRI2FrameEvent { +typedef struct _intelDRI2FrameEvent { struct intel_screen_private *intel; XID drawable_id; ClientPtr client; - enum DRI2FrameEventType type; + enum intelDRI2FrameEventType type; int frame; int pipe; @@ -400,11 +401,11 @@ typedef struct _DRI2FrameEvent { DRI2BufferPtr back; struct _DRI2FrameEvent *chain; -} DRI2FrameEventRec, *DRI2FrameEventPtr; +} intelDRI2FrameEventRec, *intelDRI2FrameEventPtr; extern Bool intel_do_pageflip(intel_screen_private *intel, dri_bo *new_front, - DRI2FrameEventPtr flip_info, int ref_crtc_hw_id); + intelDRI2FrameEventPtr flip_info, int ref_crtc_hw_id); static inline intel_screen_private * intel_get_screen_private(ScrnInfoPtr scrn) @@ -438,9 +439,14 @@ extern xf86CrtcPtr intel_covering_crtc(ScrnInfoPtr scrn, BoxPtr box, Bool I830DRI2ScreenInit(ScreenPtr pScreen); void I830DRI2CloseScreen(ScreenPtr pScreen); void I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, DRI2FrameEventPtr flip_info); + unsigned int tv_usec, intelDRI2FrameEventPtr flip_info); void I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, DRI2FrameEventPtr flip_info); + unsigned int tv_usec, intelDRI2FrameEventPtr flip_info); + +void I830DRI2FrameEventHandlerPixmap(unsigned int frame, unsigned int tv_sec, + unsigned int tv_usec, void *event_data); +void I830DRI2FlipEventHandlerPixmap(unsigned int frame, unsigned int tv_sec, + unsigned int tv_usec, void *event_data); extern Bool intel_crtc_on(xf86CrtcPtr crtc); int intel_crtc_to_pipe(xf86CrtcPtr crtc); diff --git a/src/intel_display.c b/src/intel_display.c index abdc372e..e2ee1855 100644 --- a/src/intel_display.c +++ b/src/intel_display.c @@ -55,7 +55,7 @@ struct intel_mode { int cpp; drmEventContext event_context; - DRI2FrameEventPtr flip_info; + intelDRI2FrameEventPtr flip_info; int old_fb_id; int flip_count; unsigned int fe_frame; @@ -82,6 +82,8 @@ struct intel_crtc { uint32_t rotate_fb_id; xf86CrtcPtr crtc; struct list link; + PixmapPtr scanout_pixmap; + uint32_t scanout_fb_id; }; struct intel_property { @@ -340,6 +342,7 @@ intel_crtc_apply(xf86CrtcPtr crtc) ScrnInfoPtr scrn = crtc->scrn; struct intel_crtc *intel_crtc = crtc->driver_private; struct intel_mode *mode = intel_crtc->mode; + intel_screen_private *intel = intel_get_screen_private(scrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); uint32_t *output_ids; int output_count = 0; @@ -363,13 +366,15 @@ intel_crtc_apply(xf86CrtcPtr crtc) output_count++; } + if (!intel_crtc->scanout_fb_id) { #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,5,99,0,0) - if (!xf86CrtcRotate(crtc, mode, rotation)) - goto done; + if (!xf86CrtcRotate(crtc, mode, rotation)) + goto done; #else - if (!xf86CrtcRotate(crtc)) - goto done; + if (!xf86CrtcRotate(crtc)) + goto done; #endif + } #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,0,0,0) crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, @@ -383,7 +388,12 @@ intel_crtc_apply(xf86CrtcPtr crtc) fb_id = intel_crtc->rotate_fb_id; x = 0; y = 0; + } else if (intel_crtc->scanout_fb_id && intel_crtc->scanout_pixmap->drawable.width >= crtc->mode.HDisplay && intel_crtc->scanout_pixmap->drawable.height >= crtc->mode.VDisplay) { + fb_id = intel_crtc->scanout_fb_id; + x = 0; + y = 0; } + ret = drmModeSetCrtc(mode->fd, crtc_id(intel_crtc), fb_id, x, y, output_ids, output_count, &intel_crtc->kmode); @@ -646,6 +656,40 @@ intel_crtc_destroy(xf86CrtcPtr crtc) crtc->driver_private = NULL; } +static Bool +intel_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix) +{ + struct intel_crtc *intel_crtc = crtc->driver_private; + ScrnInfoPtr scrn = crtc->scrn; + intel_screen_private *intel = intel_get_screen_private(scrn); + dri_bo *bo; + int ret; + + if (ppix == intel_crtc->scanout_pixmap) + return TRUE; + + if (!ppix) { + intel_crtc->scanout_pixmap = NULL; + if (intel_crtc->scanout_fb_id) { + drmModeRmFB(intel->drmSubFD, intel_crtc->scanout_fb_id); + intel_crtc->scanout_fb_id = 0; + } + return TRUE; + } + + bo = intel_get_pixmap_bo(ppix); + if (intel->front_buffer) { + ErrorF("have front buffer\n"); + } + + intel_crtc->scanout_pixmap = ppix; + ret = drmModeAddFB(intel->drmSubFD, ppix->drawable.width, + ppix->drawable.height, ppix->drawable.depth, + ppix->drawable.bitsPerPixel, ppix->devKind, + bo->handle, &intel_crtc->scanout_fb_id); + return TRUE; +} + static const xf86CrtcFuncsRec intel_crtc_funcs = { .dpms = intel_crtc_dpms, .set_mode_major = intel_crtc_set_mode_major, @@ -659,6 +703,7 @@ static const xf86CrtcFuncsRec intel_crtc_funcs = { .shadow_destroy = intel_crtc_shadow_destroy, .gamma_set = intel_crtc_gamma_set, .destroy = intel_crtc_destroy, + .set_scanout_pixmap = intel_set_scanout_pixmap, }; static void @@ -1250,6 +1295,15 @@ static const xf86OutputFuncsRec intel_output_funcs = { .destroy = intel_output_destroy }; +static void +intel_provider_destroy(xf86ProviderPtr provider) +{ +} + +static const xf86ProviderFuncsRec intel_provider_funcs = { + .destroy = intel_provider_destroy +}; + static const int subpixel_conv_table[7] = { 0, SubPixelUnknown, @@ -1437,7 +1491,7 @@ fail: Bool intel_do_pageflip(intel_screen_private *intel, dri_bo *new_front, - DRI2FrameEventPtr flip_info, int ref_crtc_hw_id) + intelDRI2FrameEventPtr flip_info, int ref_crtc_hw_id) { ScrnInfoPtr scrn = intel->scrn; xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); @@ -1562,6 +1616,44 @@ intel_page_flip_handler(int fd, unsigned int frame, unsigned int tv_sec, } static void +intel_pixmap_vblank_handler(int fd, unsigned int frame, unsigned int tv_sec, + unsigned int tv_usec, void *event) +{ + I830DRI2FrameEventHandlerPixmap(frame, tv_sec, tv_usec, event); +} + +static void +intel_pixmap_page_flip_handler(int fd, unsigned int frame, unsigned int tv_sec, + unsigned int tv_usec, void *event_data) +{ + struct intel_pageflip *flip = event_data; + struct intel_mode *mode = flip->mode; + + /* Is this the event whose info shall be delivered to higher level? */ + if (flip->dispatch_me) { + /* Yes: Cache msc, ust for later delivery. */ + mode->fe_frame = frame; + mode->fe_tv_sec = tv_sec; + mode->fe_tv_usec = tv_usec; + } + free(flip); + + /* Last crtc completed flip? */ + mode->flip_count--; + if (mode->flip_count > 0) + return; + + /* Release framebuffer */ + drmModeRmFB(mode->fd, mode->old_fb_id); + + if (mode->flip_info == NULL) + return; + + /* Deliver cached msc, ust from reference crtc to flip event handler */ + I830DRI2FlipEventHandlerPixmap(mode->fe_frame, mode->fe_tv_sec, + mode->fe_tv_usec, mode->flip_info); +} +static void drm_wakeup_handler(pointer data, int err, pointer p) { struct intel_mode *mode; @@ -1578,6 +1670,7 @@ drm_wakeup_handler(pointer data, int err, pointer p) Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp) { + // ScreenPtr pScreen = xf86ScrnToScreen(scrn); intel_screen_private *intel = intel_get_screen_private(scrn); struct drm_i915_getparam gp; struct intel_mode *mode; @@ -1612,6 +1705,11 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp) for (i = 0; i < mode->mode_res->count_connectors; i++) intel_output_init(scrn, mode, i); + { + xf86ProviderPtr provider; + provider = xf86ProviderCreate(scrn, &intel_provider_funcs, + "Intel"); + } xf86InitialConfiguration(scrn, TRUE); has_flipping = 0; @@ -1625,8 +1723,15 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp) intel->use_pageflipping = TRUE; mode->event_context.version = DRM_EVENT_CONTEXT_VERSION; - mode->event_context.vblank_handler = intel_vblank_handler; - mode->event_context.page_flip_handler = intel_page_flip_handler; + + if (!scrn->is_gpu) { + mode->event_context.vblank_handler = intel_vblank_handler; + mode->event_context.page_flip_handler = intel_page_flip_handler; + } + else { + mode->event_context.vblank_handler = intel_pixmap_vblank_handler; + mode->event_context.page_flip_handler = intel_pixmap_page_flip_handler; + } } intel->modes = mode; diff --git a/src/intel_dri.c b/src/intel_dri.c index a5ed5453..73ffcd53 100644 --- a/src/intel_dri.c +++ b/src/intel_dri.c @@ -94,10 +94,10 @@ static uint32_t pixmap_flink(PixmapPtr pixmap) return name; } -static PixmapPtr get_front_buffer(DrawablePtr drawable) +static PixmapPtr get_front_buffer(DrawablePtr drawable, int width, int height) { ScreenPtr screen = drawable->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); PixmapPtr pixmap; @@ -108,8 +108,8 @@ static PixmapPtr get_front_buffer(DrawablePtr drawable) pixmap = fbCreatePixmap(screen, 0, 0, drawable->depth, 0); if (pixmap) { screen->ModifyPixmapHeader(pixmap, - drawable->width, - drawable->height, + width, + height, 0, 0, intel->front_pitch, intel->front_buffer->virtual); @@ -130,7 +130,7 @@ static PixmapPtr get_front_buffer(DrawablePtr drawable) static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap) { ScreenPtr screen = drawable->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); PixmapPtr old = get_drawable_pixmap(drawable); struct intel_pixmap *priv = intel_get_pixmap_private(pixmap); GCPtr gc; @@ -258,7 +258,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments, int count) { ScreenPtr screen = drawable->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); DRI2BufferPtr buffers; I830DRI2BufferPrivatePtr privates; @@ -279,7 +279,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments, for (i = 0; i < count; i++) { pixmap = NULL; if (attachments[i] == DRI2BufferFrontLeft) { - pixmap = get_front_buffer(drawable); + pixmap = get_front_buffer(drawable, drawable->width, drawable->height); if (pixmap && intel_get_pixmap_private(pixmap) == NULL) { is_glamor_pixmap = TRUE; @@ -381,11 +381,11 @@ I830DRI2DestroyBuffers(DrawablePtr drawable, DRI2BufferPtr buffers, int count) #else static DRI2Buffer2Ptr -I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment, - unsigned int format) +I830DRI2CreateBuffer2(DrawablePtr drawable, unsigned int attachment, + unsigned int format, int prime_id, int width, int height) { ScreenPtr screen = drawable->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); DRI2Buffer2Ptr buffer; I830DRI2BufferPrivatePtr privates; @@ -403,7 +403,7 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment, pixmap = NULL; if (attachment == DRI2BufferFrontLeft) { - pixmap = get_front_buffer(drawable); + pixmap = get_front_buffer(drawable, width, height); if (pixmap && intel_get_pixmap_private(pixmap) == NULL) { is_glamor_pixmap = TRUE; @@ -414,8 +414,8 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment, if (pixmap == NULL) { unsigned int hint = INTEL_CREATE_PIXMAP_DRI2; - int pixmap_width = drawable->width; - int pixmap_height = drawable->height; + int pixmap_width = width; + int pixmap_height = height; int pixmap_cpp = (format != 0) ? format : drawable->depth; if (intel->tiling & INTEL_TILING_3D) { @@ -509,6 +509,14 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment, return buffer; } +static DRI2Buffer2Ptr +I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment, + unsigned int format) +{ + return I830DRI2CreateBuffer2(drawable, attachment, format, 0, + drawable->width, drawable->height); +} + static void I830DRI2DestroyBuffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer) { @@ -534,7 +542,7 @@ I830DRI2CopyRegion(DrawablePtr drawable, RegionPtr pRegion, I830DRI2BufferPrivatePtr srcPrivate = sourceBuffer->driverPrivate; I830DRI2BufferPrivatePtr dstPrivate = destBuffer->driverPrivate; ScreenPtr screen = drawable->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); DrawablePtr src = (sourceBuffer->attachment == DRI2BufferFrontLeft) ? drawable : &srcPrivate->pixmap->drawable; @@ -687,7 +695,7 @@ static int I830DRI2DrawablePipe(DrawablePtr pDraw) { ScreenPtr pScreen = pDraw->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); BoxRec box, crtcbox; xf86CrtcPtr crtc; int pipe = -1; @@ -746,9 +754,9 @@ i830_dri2_frame_event_client_gone(void *data, XID id) struct i830_dri2_resource *resource = data; while (!list_is_empty(&resource->list)) { - DRI2FrameEventPtr info = + intelDRI2FrameEventPtr info = list_first_entry(&resource->list, - DRI2FrameEventRec, + intelDRI2FrameEventRec, client_resource); list_del(&info->client_resource); @@ -765,9 +773,9 @@ i830_dri2_frame_event_drawable_gone(void *data, XID id) struct i830_dri2_resource *resource = data; while (!list_is_empty(&resource->list)) { - DRI2FrameEventPtr info = + intelDRI2FrameEventPtr info = list_first_entry(&resource->list, - DRI2FrameEventRec, + intelDRI2FrameEventRec, drawable_resource); list_del(&info->drawable_resource); @@ -811,7 +819,7 @@ get_client_id(ClientPtr client) * client exits while the swap is pending */ static Bool -i830_dri2_add_frame_event(DRI2FrameEventPtr info) +i830_dri2_add_frame_event(intelDRI2FrameEventPtr info) { struct i830_dri2_resource *resource; @@ -834,7 +842,7 @@ i830_dri2_add_frame_event(DRI2FrameEventPtr info) } static void -i830_dri2_del_frame_event(DrawablePtr drawable, DRI2FrameEventPtr info) +i830_dri2_del_frame_event(DrawablePtr drawable, intelDRI2FrameEventPtr info) { list_del(&info->client_resource); list_del(&info->drawable_resource); @@ -885,6 +893,7 @@ I830DRI2ExchangeBuffers(struct intel_screen_private *intel, DRI2BufferPtr front, dri_bo_unreference (intel->front_buffer); intel->front_buffer = new_front->bo; dri_bo_reference (intel->front_buffer); + } static PixmapPtr @@ -919,6 +928,20 @@ intel_glamor_create_back_pixmap(ScreenPtr screen, return back_pixmap; } +static void intel_damage_complete_drawable(DrawablePtr pDraw) +{ + BoxRec box; + RegionRec region; + + box.x1 = 0; + box.x2 = pDraw->width; + box.y1 = 0; + box.y2 = pDraw->height; + RegionInit(®ion, &box, 1); + DamageRegionAppend(pDraw, ®ion); + DamageRegionProcessPending(pDraw); + RegionUninit(®ion); +} /* * Our internal swap routine takes care of actually exchanging, blitting, or * flipping buffers as necessary. @@ -926,7 +949,7 @@ intel_glamor_create_back_pixmap(ScreenPtr screen, static Bool I830DRI2ScheduleFlip(struct intel_screen_private *intel, DrawablePtr draw, - DRI2FrameEventPtr info) + intelDRI2FrameEventPtr info) { I830DRI2BufferPrivatePtr priv = info->back->driverPrivate; drm_intel_bo *new_back, *old_back; @@ -938,8 +961,9 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel, info, info->pipe)) return FALSE; - info->type = DRI2_SWAP; + info->type = INTEL_DRI2_SWAP; I830DRI2ExchangeBuffers(intel, info->front, info->back); + intel_damage_complete_drawable(draw); return TRUE; } @@ -995,7 +1019,7 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel, intel->back_buffer = new_back; return FALSE; } - info->type = DRI2_SWAP_CHAIN; + info->type = INTEL_DRI2_SWAP_CHAIN; intel->pending_flip[info->pipe] = info; priv = info->front->driverPrivate; @@ -1016,6 +1040,7 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel, /* Then flip DRI2 pointers and update the screen pixmap */ I830DRI2ExchangeBuffers(intel, info->front, info->back); + intel_damage_complete_drawable(draw); DRI2SwapComplete(info->client, draw, 0, 0, 0, DRI2_EXCHANGE_COMPLETE, info->event_complete, @@ -1069,7 +1094,7 @@ can_exchange(DrawablePtr drawable, DRI2BufferPtr front, DRI2BufferPtr back) } void I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, DRI2FrameEventPtr swap_info) + unsigned int tv_usec, intelDRI2FrameEventPtr swap_info) { intel_screen_private *intel = swap_info->intel; DrawablePtr drawable; @@ -1087,14 +1112,14 @@ void I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, switch (swap_info->type) { - case DRI2_FLIP: + case INTEL_DRI2_FLIP: /* If we can still flip... */ if (can_exchange(drawable, swap_info->front, swap_info->back) && I830DRI2ScheduleFlip(intel, drawable, swap_info)) return; /* else fall through to exchange/blit */ - case DRI2_SWAP: { + case INTEL_DRI2_SWAP: { BoxRec box; RegionRec region; @@ -1112,7 +1137,7 @@ void I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, swap_info->event_data); break; } - case DRI2_WAITMSC: + case INTEL_DRI2_WAITMSC: if (swap_info->client) DRI2WaitMSCComplete(swap_info->client, drawable, frame, tv_sec, tv_usec); @@ -1128,11 +1153,11 @@ void I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec, } void I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, DRI2FrameEventPtr flip_info) + unsigned int tv_usec, intelDRI2FrameEventPtr flip_info) { struct intel_screen_private *intel = flip_info->intel; DrawablePtr drawable; - DRI2FrameEventPtr chain; + intelDRI2FrameEventPtr chain; drawable = NULL; if (flip_info->drawable_id) @@ -1142,7 +1167,7 @@ void I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, /* We assume our flips arrive in order, so we don't check the frame */ switch (flip_info->type) { - case DRI2_SWAP: + case INTEL_DRI2_SWAP: if (!drawable) break; @@ -1172,7 +1197,7 @@ void I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec, flip_info->event_data); break; - case DRI2_SWAP_CHAIN: + case INTEL_DRI2_SWAP_CHAIN: assert(intel->pending_flip[flip_info->pipe] == flip_info); intel->pending_flip[flip_info->pipe] = NULL; @@ -1244,12 +1269,12 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, CARD64 remainder, DRI2SwapEventPtr func, void *data) { ScreenPtr screen = draw->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); drmVBlank vbl; int ret, pipe = I830DRI2DrawablePipe(draw), flip = 0; - DRI2FrameEventPtr swap_info = NULL; - enum DRI2FrameEventType swap_type = DRI2_SWAP; + intelDRI2FrameEventPtr swap_info = NULL; + enum intelDRI2FrameEventType swap_type = INTEL_DRI2_SWAP; CARD64 current_msc; BoxRec box; RegionRec region; @@ -1264,7 +1289,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, divisor &= 0xffffffff; remainder &= 0xffffffff; - swap_info = calloc(1, sizeof(DRI2FrameEventRec)); + swap_info = calloc(1, sizeof(intelDRI2FrameEventRec)); if (!swap_info) goto blit_fallback; @@ -1303,7 +1328,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, /* Flips need to be submitted one frame before */ if (can_exchange(draw, front, back)) { - swap_type = DRI2_FLIP; + swap_type = INTEL_DRI2_FLIP; flip = 1; } @@ -1431,7 +1456,7 @@ static int I830DRI2GetMSC(DrawablePtr draw, CARD64 *ust, CARD64 *msc) { ScreenPtr screen = draw->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); drmVBlank vbl; int ret, pipe = I830DRI2DrawablePipe(draw); @@ -1480,7 +1505,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc, ScreenPtr screen = draw->pScreen; ScrnInfoPtr scrn = xf86Screens[screen->myNum]; intel_screen_private *intel = intel_get_screen_private(scrn); - DRI2FrameEventPtr wait_info; + intelDRI2FrameEventPtr wait_info; drmVBlank vbl; int ret, pipe = I830DRI2DrawablePipe(draw); CARD64 current_msc; @@ -1495,14 +1520,14 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc, if (pipe == -1) goto out_complete; - wait_info = calloc(1, sizeof(DRI2FrameEventRec)); + wait_info = calloc(1, sizeof(intelDRI2FrameEventRec)); if (!wait_info) goto out_complete; wait_info->intel = intel; wait_info->drawable_id = draw->id; wait_info->client = client; - wait_info->type = DRI2_WAITMSC; + wait_info->type = INTEL_DRI2_WAITMSC; if (!i830_dri2_add_frame_event(wait_info)) { free(wait_info); @@ -1611,12 +1636,13 @@ out_complete: return TRUE; } + static int dri2_server_generation; #endif Bool I830DRI2ScreenInit(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); DRI2InfoRec info; int dri2_major = 1; @@ -1696,6 +1722,12 @@ Bool I830DRI2ScreenInit(ScreenPtr screen) } #endif +#if DRI2INFOREC_VERSION >= 8 + info.version = 8; + info.CreateBuffer2 = NULL; + info.DestroyBuffer2 = NULL; + info.CopyRegion2 = NULL; +#endif return DRI2ScreenInit(screen, &info); } diff --git a/src/intel_driver.c b/src/intel_driver.c index 4265de82..6da0e8f8 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -132,9 +132,9 @@ static OptionInfoRec I830Options[] = { }; /* *INDENT-ON* */ -static void i830AdjustFrame(int scrnIndex, int x, int y, int flags); -static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen); -static Bool I830EnterVT(int scrnIndex, int flags); +static void i830AdjustFrame(ScrnInfoPtr scrn, int x, int y); +static Bool I830CloseScreen(ScreenPtr screen); +static Bool I830EnterVT(ScrnInfoPtr scrn); /* temporary */ extern void xf86SetCursor(ScreenPtr screen, CursorPtr pCurs, int x, int y); @@ -217,7 +217,7 @@ I830LoadPalette(ScrnInfoPtr scrn, int numColors, int *indices, */ static Bool i830CreateScreenResources(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); screen->CreateScreenResources = intel->CreateScreenResources; @@ -555,8 +555,7 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) intel->pEnt = pEnt; scrn->displayWidth = 640; /* default it */ - - if (intel->pEnt->location.type != BUS_PCI) + if (intel->pEnt->location.type != BUS_PCI && intel->pEnt->location.type != BUS_PLATFORM) return FALSE; intel->PciInfo = xf86GetPciInfoForEntity(intel->pEnt->index); @@ -736,16 +735,58 @@ void IntelEmitInvarientState(ScrnInfoPtr scrn) I915EmitInvarientState(scrn); } +static Bool +redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + RegionRec pixregion; + int was_blocked; + + PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap); + + PixmapSyncDirtyHelper(dirty, &pixregion); + intel_batch_submit(scrn); + was_blocked = xf86BlockSIGIO(); + { + drm_intel_bo *bo = intel_get_pixmap_bo(dirty->slave_dst->master_pixmap); + drm_intel_bo_map(bo, FALSE); + drm_intel_bo_unmap(bo); + } + xf86UnblockSIGIO(was_blocked); + DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); + RegionUninit(&pixregion); + return 0; +} + static void -I830BlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) +intel_dirty_update(ScreenPtr screen) { - ScreenPtr screen = screenInfo.screens[i]; - ScrnInfoPtr scrn = xf86Screens[i]; + RegionPtr region; + PixmapDirtyUpdatePtr ent; + + if (xorg_list_is_empty(&screen->pixmap_dirty_list)) + return; + + xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) { + region = DamageRegion(ent->damage); + if (RegionNotEmpty(region)) { + redisplay_dirty(screen, ent); + DamageEmpty(ent->damage); + } + } +} + +static void +I830BlockHandler(ScreenPtr screen, pointer pTimeout, pointer pReadmask) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); + intel_dirty_update(screen); + screen->BlockHandler = intel->BlockHandler; - (*screen->BlockHandler) (i, blockData, pTimeout, pReadmask); + (*screen->BlockHandler) (screen, pTimeout, pReadmask); intel->BlockHandler = screen->BlockHandler; screen->BlockHandler = I830BlockHandler; @@ -917,9 +958,9 @@ I830UeventFini(ScrnInfoPtr scrn) #endif /* HAVE_UDEV */ static Bool -I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) +I830ScreenInit(ScreenPtr screen, int argc, char **argv) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); VisualPtr visual; #ifdef INTEL_XVMC @@ -967,7 +1008,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) scrn->displayWidth, scrn->bitsPerPixel)) return FALSE; - if (scrn->bitsPerPixel > 8) { + if (!screen->isGPU && scrn->bitsPerPixel > 8) { /* Fixup RGB ordering */ visual = screen->visuals + screen->numVisuals; while (--visual >= screen->visuals) { @@ -1014,6 +1055,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) intel->BlockHandler = screen->BlockHandler; screen->BlockHandler = I830BlockHandler; + screen->StartPixmapTracking = PixmapStartDirtyTracking; + screen->StopPixmapTracking = PixmapStopDirtyTracking; + if (!AddCallback(&FlushCallback, intel_flush_callback, scrn)) return FALSE; @@ -1087,16 +1131,15 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) * later memory should be bound when allocating, e.g rotate_mem */ scrn->vtSema = TRUE; - return I830EnterVT(scrnIndex, 0); + return I830EnterVT(scrn); } -static void i830AdjustFrame(int scrnIndex, int x, int y, int flags) +static void i830AdjustFrame(ScrnInfoPtr scrn, int x, int y) { } -static void I830FreeScreen(int scrnIndex, int flags) +static void I830FreeScreen(ScrnInfoPtr scrn) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; intel_screen_private *intel = intel_get_screen_private(scrn); if (intel) { @@ -1109,9 +1152,8 @@ static void I830FreeScreen(int scrnIndex, int flags) } } -static void I830LeaveVT(int scrnIndex, int flags) +static void I830LeaveVT(ScrnInfoPtr scrn) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; intel_screen_private *intel = intel_get_screen_private(scrn); int ret; @@ -1128,9 +1170,8 @@ static void I830LeaveVT(int scrnIndex, int flags) /* * This gets called when gaining control of the VT, and from ScreenInit(). */ -static Bool I830EnterVT(int scrnIndex, int flags) +static Bool I830EnterVT(ScrnInfoPtr scrn) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; intel_screen_private *intel = intel_get_screen_private(scrn); int ret; @@ -1147,16 +1188,14 @@ static Bool I830EnterVT(int scrnIndex, int flags) return TRUE; } -static Bool I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +static Bool I830SwitchMode(ScrnInfoPtr scrn, DisplayModePtr mode) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; - return xf86SetSingleMode(scrn, mode, RR_Rotate_0); } -static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen) +static Bool I830CloseScreen(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); #if HAVE_UDEV @@ -1164,7 +1203,7 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen) #endif if (scrn->vtSema == TRUE) { - I830LeaveVT(scrnIndex, 0); + I830LeaveVT(scrn); } DeleteCallback(&FlushCallback, intel_flush_callback, scrn); @@ -1221,7 +1260,7 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen) i965_free_video(scrn); screen->CloseScreen = intel->CloseScreen; - (*screen->CloseScreen) (scrnIndex, screen); + (*screen->CloseScreen) (screen); if (intel->directRenderingOpen && intel->directRenderingType == DRI_DRI2) { @@ -1229,18 +1268,18 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen) I830DRI2CloseScreen(screen); } - xf86GARTCloseScreen(scrnIndex); + xf86GARTCloseScreen(scrn->scrnIndex); scrn->vtSema = FALSE; return TRUE; } static ModeStatus -I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) +I830ValidMode(ScrnInfoPtr scrn, DisplayModePtr mode, Bool verbose, int flags) { if (mode->Flags & V_INTERLACE) { if (verbose) { - xf86DrvMsg(scrnIndex, X_PROBED, + xf86DrvMsg(scrn->scrnIndex, X_PROBED, "Removing interlaced mode \"%s\"\n", mode->name); } @@ -1261,9 +1300,8 @@ I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) * DoApmEvent() in common/xf86PM.c, including if we want to see events other * than suspend/resume. */ -static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo) +static Bool I830PMEvent(ScrnInfoPtr scrn, pmEvent event, Bool undo) { - ScrnInfoPtr scrn = xf86Screens[scrnIndex]; intel_screen_private *intel = intel_get_screen_private(scrn); switch (event) { @@ -1273,12 +1311,12 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo) case XF86_APM_SYS_STANDBY: case XF86_APM_USER_STANDBY: if (!undo && !intel->suspended) { - scrn->LeaveVT(scrnIndex, 0); + scrn->LeaveVT(scrn); intel->suspended = TRUE; sleep(SUSPEND_SLEEP); } else if (undo && intel->suspended) { sleep(RESUME_SLEEP); - scrn->EnterVT(scrnIndex, 0); + scrn->EnterVT(scrn); intel->suspended = FALSE; } break; @@ -1287,7 +1325,7 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo) case XF86_APM_CRITICAL_RESUME: if (intel->suspended) { sleep(RESUME_SLEEP); - scrn->EnterVT(scrnIndex, 0); + scrn->EnterVT(scrn); intel->suspended = FALSE; /* * Turn the screen saver off when resuming. This seems to be diff --git a/src/intel_hwmc.c b/src/intel_hwmc.c index d6267256..88d01f3e 100644 --- a/src/intel_hwmc.c +++ b/src/intel_hwmc.c @@ -189,7 +189,7 @@ static XF86MCSurfaceInfoPtr surface_info_vld[] = { /* check chip type and load xvmc driver */ Bool intel_xvmc_adaptor_init(ScreenPtr pScreen) { - ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); static XF86MCAdaptorRec *pAdapt; char *name; @@ -237,7 +237,7 @@ Bool intel_xvmc_adaptor_init(ScreenPtr pScreen) pAdapt->surfaces = surface_info_i965; } - if (xf86XvMCScreenInit(pScreen, 1, &pAdapt)) { + if (0 && xf86XvMCScreenInit(pScreen, 1, &pAdapt)) { xf86DrvMsg(scrn->scrnIndex, X_INFO, "[XvMC] %s driver initialized.\n", name); diff --git a/src/intel_module.c b/src/intel_module.c index c6f94f5b..cfb8b2a7 100644 --- a/src/intel_module.c +++ b/src/intel_module.c @@ -32,7 +32,7 @@ #include <xf86_OSproc.h> #include <xf86cmap.h> #include <xf86drmMode.h> - +#include <xf86platformBus.h> #include <xorgVersion.h> #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,6,99,0,0) @@ -258,6 +258,7 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn, xorgHWFlags *flag; switch (op) { + case GET_REQUIRED_HW_INTERFACES: flag = (CARD32*)ptr; #ifdef KMS_ONLY @@ -367,6 +368,40 @@ static Bool intel_pci_probe(DriverPtr driver, return scrn != NULL; } +static Bool +intel_platform_probe(DriverPtr driver, + int entity_num, int flags, + struct xf86_platform_device *dev, + uintptr_t match_data) +{ + ScrnInfoPtr scrn = NULL; + int scr_flags = 0; + char *path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH); + + if (!dev->pdev) + return FALSE; + + if (flags & PLATFORM_PROBE_GPU_SCREEN) + scr_flags = XF86_ALLOCATE_GPU_SCREEN; + + chipset_info = (void *)match_data; + + scrn = xf86AllocateScreen(driver, scr_flags); + xf86AddEntityToScreen(scrn, entity_num); + + scrn->driverVersion = INTEL_VERSION; + scrn->driverName = INTEL_DRIVER_NAME; + scrn->name = INTEL_NAME; + scrn->Probe = NULL; + intel_init_scrn(scrn); + scrn->roles = RR_Role_Master | RR_Role_Slave_Output; + scrn->abilities = RR_Ability_Offload_Slaves | RR_Ability_Output_Slaves; + + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "using drv %s\n", path ? path : "Default device"); + return scrn != NULL; +} + #ifdef XFree86LOADER static MODULESETUPPROTO(intel_setup); @@ -417,7 +452,8 @@ static DriverRec intel = { 0, intel_driver_func, intel_device_match, - intel_pci_probe + intel_pci_probe, + intel_platform_probe }; static pointer intel_setup(pointer module, diff --git a/src/intel_uxa.c b/src/intel_uxa.c index 0b1a3696..39bccc0a 100644 --- a/src/intel_uxa.c +++ b/src/intel_uxa.c @@ -160,7 +160,7 @@ intel_uxa_pixmap_compute_size(PixmapPtr pixmap, int *stride, unsigned usage) { - ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); int pitch, size; @@ -241,7 +241,7 @@ intel_uxa_pixmap_compute_size(PixmapPtr pixmap, static Bool intel_uxa_check_solid(DrawablePtr drawable, int alu, Pixel planemask) { - ScrnInfoPtr scrn = xf86Screens[drawable->pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(drawable->pScreen); if (!UXA_PM_IS_SOLID(drawable, planemask)) { intel_debug_fallback(scrn, "planemask is not solid\n"); @@ -266,7 +266,7 @@ intel_uxa_check_solid(DrawablePtr drawable, int alu, Pixel planemask) static Bool intel_uxa_prepare_solid(PixmapPtr pixmap, int alu, Pixel planemask, Pixel fg) { - ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); drm_intel_bo *bo_table[] = { NULL, /* batch_bo */ @@ -299,7 +299,7 @@ intel_uxa_prepare_solid(PixmapPtr pixmap, int alu, Pixel planemask, Pixel fg) static void intel_uxa_solid(PixmapPtr pixmap, int x1, int y1, int x2, int y2) { - ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); unsigned long pitch; uint32_t cmd; @@ -353,7 +353,7 @@ static Bool intel_uxa_check_copy(PixmapPtr source, PixmapPtr dest, int alu, Pixel planemask) { - ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen); if (!UXA_PM_IS_SOLID(&source->drawable, planemask)) { intel_debug_fallback(scrn, "planemask is not solid"); @@ -385,7 +385,7 @@ static Bool intel_uxa_prepare_copy(PixmapPtr source, PixmapPtr dest, int xdir, int ydir, int alu, Pixel planemask) { - ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); drm_intel_bo *bo_table[] = { NULL, /* batch_bo */ @@ -417,7 +417,7 @@ static void intel_uxa_copy(PixmapPtr dest, int src_x1, int src_y1, int dst_x1, int dst_y1, int w, int h) { - ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); uint32_t cmd; int dst_x2, dst_y2, src_x2, src_y2; @@ -501,7 +501,7 @@ intel_uxa_copy(PixmapPtr dest, int src_x1, int src_y1, int dst_x1, static void intel_uxa_done(PixmapPtr pixmap) { - ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); if (IS_GEN6(intel) || IS_GEN7(intel)) { @@ -523,7 +523,7 @@ static void intel_uxa_done(PixmapPtr pixmap) */ static void i830_done_composite(PixmapPtr dest) { - ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); if (intel->vertex_flush) @@ -682,7 +682,7 @@ static Bool intel_uxa_pixmap_is_offscreen(PixmapPtr pixmap) static Bool intel_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access) { - ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); intel_screen_private *intel = intel_get_screen_private(scrn); struct intel_pixmap *priv = intel_get_pixmap_private(pixmap); dri_bo *bo = priv->bo; @@ -787,7 +787,7 @@ static Bool intel_uxa_put_image(PixmapPtr pixmap, w == pixmap->drawable.width && h == pixmap->drawable.height) { - intel_screen_private *intel = intel_get_screen_private(xf86Screens[screen->myNum]); + intel_screen_private *intel = intel_get_screen_private(xf86ScreenToScrn(screen)); uint32_t tiling = priv->tiling; int size, stride; dri_bo *bo; @@ -932,7 +932,7 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap, FreeScratchGC(gc); - intel_batch_submit(xf86Screens[screen->myNum]); + intel_batch_submit(xf86ScreenToScrn(screen)); x = y = 0; pixmap = scratch; @@ -1008,7 +1008,7 @@ static PixmapPtr intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth, unsigned usage) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); struct intel_pixmap *priv; PixmapPtr pixmap, new_pixmap = NULL; @@ -1046,7 +1046,7 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth, tiling = I915_TILING_X; if (usage & INTEL_CREATE_PIXMAP_TILING_Y) tiling = I915_TILING_Y; - if (usage == UXA_CREATE_PIXMAP_FOR_MAP || usage & INTEL_CREATE_PIXMAP_TILING_NONE) + if (usage == UXA_CREATE_PIXMAP_FOR_MAP || usage & INTEL_CREATE_PIXMAP_TILING_NONE || usage == CREATE_PIXMAP_USAGE_SHARED) tiling = I915_TILING_NONE; /* if tiling is off force to none */ @@ -1146,7 +1146,7 @@ static Bool intel_uxa_destroy_pixmap(PixmapPtr pixmap) Bool intel_uxa_create_screen_resources(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); dri_bo *bo = intel->front_buffer; @@ -1176,6 +1176,66 @@ Bool intel_uxa_create_screen_resources(ScreenPtr screen) return TRUE; } +static Bool +intel_uxa_share_pixmap_backing(PixmapPtr ppix, int *fd_handle) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(ppix->drawable.pScreen); + intel_screen_private *intel = intel_get_screen_private(scrn); + struct intel_pixmap *priv = intel_get_pixmap_private(ppix); + unsigned int size, tiling, swizzle; + dri_bo *bo = intel_get_pixmap_bo(ppix), *newbo; + int stride; + + if (drm_intel_bo_references(intel->batch_bo, bo)) + intel_batch_submit(intel->scrn); + + drm_intel_bo_get_tiling(bo, &tiling, &swizzle); + fprintf(stderr,"tiling %x swizzle %x\n", tiling, swizzle); + + if (tiling == I915_TILING_X) { + tiling = I915_TILING_NONE; + + size = intel_uxa_pixmap_compute_size(ppix, ppix->drawable.width, ppix->drawable.height, &tiling, &stride, INTEL_CREATE_PIXMAP_DRI2); + + newbo = drm_intel_bo_alloc_for_render(intel->bufmgr, + "pixmap", + size, 0); + + if (tiling != I915_TILING_NONE) + drm_intel_bo_set_tiling(newbo, &tiling, stride); + priv->stride = stride; + priv->tiling = tiling; + intel_set_pixmap_bo(ppix, newbo); + + ppix->drawable.pScreen->ModifyPixmapHeader(ppix, ppix->drawable.width, + ppix->drawable.height, 0, 0, + stride, NULL); + bo = newbo; + } + drm_intel_bo_get_tiling(bo, &tiling, &swizzle); + fprintf(stderr,"tiling %x swizzle %x\n", tiling, swizzle); + drm_intel_bufmgr_gem_set_bo_prime(bo, fd_handle); + return TRUE; +} + +static Bool +intel_uxa_set_shared_pixmap_backing(PixmapPtr ppix, int fd_handle) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(ppix->drawable.pScreen); + intel_screen_private *intel = intel_get_screen_private(scrn); + struct intel_pixmap *priv = intel_get_pixmap_private(ppix); + dri_bo *bo; + + /* force untiled for now */ + bo = drm_intel_bufmgr_gem_get_bo_prime(intel->bufmgr, fd_handle, 0); + if (!bo) + return FALSE; + + intel_set_pixmap_bo(ppix, bo); + close(fd_handle); + return TRUE; +} + static void intel_limits_init(intel_screen_private *intel) { @@ -1230,7 +1290,7 @@ intel_limits_init(intel_screen_private *intel) Bool intel_uxa_init(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); #if HAS_DIXREGISTERPRIVATEKEY @@ -1325,6 +1385,9 @@ Bool intel_uxa_init(ScreenPtr screen) screen->CreatePixmap = intel_uxa_create_pixmap; screen->DestroyPixmap = intel_uxa_destroy_pixmap; + screen->SharePixmapBacking = intel_uxa_share_pixmap_backing; + screen->SetSharedPixmapBacking = intel_uxa_set_shared_pixmap_backing; + if (!uxa_driver_init(screen, intel->uxa_driver)) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "UXA initialization failed\n"); diff --git a/src/intel_video.c b/src/intel_video.c index 0834bb23..acff7ba8 100644 --- a/src/intel_video.c +++ b/src/intel_video.c @@ -327,7 +327,7 @@ intel_overlay_put_image(intel_screen_private *intel, void I830InitVideo(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL; @@ -391,7 +391,7 @@ void I830InitVideo(ScreenPtr screen) adaptors[num_adaptors++] = overlayAdaptor; if (num_adaptors) { - xf86XVScreenInit(screen, adaptors, num_adaptors); +// xf86XVScreenInit(screen, adaptors, num_adaptors); } else { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Disabling Xv because no adaptors could be initialized.\n"); @@ -516,7 +516,7 @@ static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr screen) static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); XF86VideoAdaptorPtr adapt; intel_adaptor_private *adaptor_privs; diff --git a/src/legacy/i810/i810_dga.c b/src/legacy/i810/i810_dga.c index 44181c65..bb2a3e83 100644 --- a/src/legacy/i810/i810_dga.c +++ b/src/legacy/i810/i810_dga.c @@ -148,8 +148,8 @@ I810_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) if (!pMode) { /* restore the original mode */ if (pI810->DGAactive) { pScrn->currentMode = I810SavedDGAModes[index]; - pScrn->SwitchMode(index, pScrn->currentMode, 0); - pScrn->AdjustFrame(index, 0, 0, 0); + pScrn->SwitchMode(pScrn, pScrn->currentMode); + pScrn->AdjustFrame(pScrn, 0, 0); pI810->DGAactive = FALSE; } } else { @@ -158,7 +158,7 @@ I810_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) pI810->DGAactive = TRUE; } - pScrn->SwitchMode(index, pMode->mode, 0); + pScrn->SwitchMode(pScrn, pMode->mode); } return TRUE; @@ -178,7 +178,7 @@ I810_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) I810Ptr pI810 = I810PTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); - pScrn->AdjustFrame(pScrn->pScreen->myNum, x, y, flags); + pScrn->AdjustFrame(pScrn, x, y); /* wait for retrace */ while ((hwp->readST01(hwp) & 0x08)) ; diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c index 02da5744..f56c7149 100644 --- a/src/legacy/i810/i810_driver.c +++ b/src/legacy/i810/i810_driver.c @@ -82,7 +82,7 @@ static Bool I810ScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv); static Bool I810EnterVT(int scrnIndex, int flags); static void I810LeaveVT(int scrnIndex, int flags); -static Bool I810CloseScreen(int scrnIndex, ScreenPtr pScreen); +static Bool I810CloseScreen(ScreenPtr pScreen); static Bool I810SaveScreen(ScreenPtr pScreen, Bool unblank); static void I810FreeScreen(int scrnIndex, int flags); static void I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, @@ -1957,9 +1957,9 @@ I810LeaveVT(int scrnIndex, int flags) } static Bool -I810CloseScreen(int scrnIndex, ScreenPtr pScreen) +I810CloseScreen(ScreenPtr pScreen) { - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); vgaHWPtr hwp = VGAHWPTR(pScrn); I810Ptr pI810 = I810PTR(pScrn); XAAInfoRecPtr infoPtr = pI810->AccelInfoRec; @@ -2015,14 +2015,14 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen) /* Need to actually close the gart fd, or the unbound memory will just sit * around. Will prevent the Xserver from recycling. */ - xf86GARTCloseScreen(scrnIndex); + xf86GARTCloseScreen(pScrn->scrnIndex); free(pI810->LpRing); pI810->LpRing = NULL; pScrn->vtSema = FALSE; pScreen->CloseScreen = pI810->CloseScreen; - return (*pScreen->CloseScreen) (scrnIndex, pScreen); + return (*pScreen->CloseScreen) (pScreen); } static void diff --git a/src/legacy/i810/i810_video.c b/src/legacy/i810/i810_video.c index a0e6acd6..1eec6c63 100644 --- a/src/legacy/i810/i810_video.c +++ b/src/legacy/i810/i810_video.c @@ -1159,7 +1159,7 @@ I810BlockHandler ( pScreen->BlockHandler = pI810->BlockHandler; - (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); + //(*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); pScreen->BlockHandler = I810BlockHandler; diff --git a/uxa/Makefile.am b/uxa/Makefile.am index 9763637a..5edce140 100644 --- a/uxa/Makefile.am +++ b/uxa/Makefile.am @@ -4,7 +4,7 @@ noinst_LTLIBRARIES = libuxa.la # built (in hw/xfree86/os-support/solaris) until after UXA is built SOLARIS_ASM_CFLAGS="" -AM_CFLAGS = $(CWARNFLAGS) $(XORG_CFLAGS) +AM_CFLAGS = $(CWARNFLAGS) $(XORG_CFLAGS) @XORG_CFLAGS@ if GLAMOR AM_CFLAGS += @LIBGLAMOR_CFLAGS@ diff --git a/uxa/uxa-glyphs.c b/uxa/uxa-glyphs.c index 921b99c9..7db094b4 100644 --- a/uxa/uxa-glyphs.c +++ b/uxa/uxa-glyphs.c @@ -235,7 +235,7 @@ uxa_glyph_cache_upload_glyph(ScreenPtr screen, GlyphPtr glyph, int x, int y) { - PicturePtr pGlyphPicture = GlyphPicture(glyph)[screen->myNum]; + PicturePtr pGlyphPicture = GetGlyphPicture(glyph, screen); PixmapPtr pGlyphPixmap = (PixmapPtr) pGlyphPicture->pDrawable; PixmapPtr pCachePixmap = (PixmapPtr) cache->picture->pDrawable; PixmapPtr scratch; @@ -449,7 +449,6 @@ uxa_check_glyphs(CARD8 op, INT16 xSrc, INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs) { - int screen = dst->pDrawable->pScreen->myNum; pixman_image_t *image; PixmapPtr scratch; PicturePtr mask; @@ -513,7 +512,7 @@ uxa_check_glyphs(CARD8 op, n = list->len; while (n--) { GlyphPtr glyph = *glyphs++; - PicturePtr g = GlyphPicture(glyph)[screen]; + PicturePtr g = GetGlyphPicture(glyph, dst->pDrawable->pScreen); if (g) { if (maskFormat) { CompositePicture(PictOpAdd, g, NULL, mask, @@ -579,7 +578,7 @@ static PicturePtr uxa_glyph_cache(ScreenPtr screen, GlyphPtr glyph, int *out_x, int *out_y) { uxa_screen_t *uxa_screen = uxa_get_screen(screen); - PicturePtr glyph_picture = GlyphPicture(glyph)[screen->myNum]; + PicturePtr glyph_picture = GetGlyphPicture(glyph, screen); uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[PICT_FORMAT_RGB(glyph_picture->format) != 0]; struct uxa_glyph *priv = NULL; int size, mask, pos, s; @@ -796,7 +795,7 @@ uxa_glyphs_via_mask(CARD8 op, this_atlas = uxa_glyph_cache(screen, glyph, &src_x, &src_y); if (this_atlas == NULL) { /* no cache for this glyph */ - this_atlas = GlyphPicture(glyph)[screen->myNum]; + this_atlas = GetGlyphPicture(glyph, screen); src_x = src_y = 0; } } diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h index b24ec4ff..5a566dfe 100644 --- a/uxa/uxa-priv.h +++ b/uxa/uxa-priv.h @@ -109,7 +109,7 @@ typedef struct { #define UXA_NUM_SOLID_CACHE 16 -typedef void (*EnableDisableFBAccessProcPtr) (int, Bool); +typedef void (*EnableDisableFBAccessProcPtr) (ScrnInfoPtr, Bool); typedef struct { uxa_driver_t *info; CreateGCProcPtr SavedCreateGC; @@ -359,14 +359,25 @@ void uxa_set_force_fallback(ScreenPtr screen, Bool value) uxa_screen->force_fallback = value; } +static miCopyProc +uxa_get_copy_area_function(PixmapPtr pSrc, PixmapPtr pDst) +{ + uxa_screen_t *uxa_screen = uxa_get_screen(pDst->drawable.pScreen); + + if (uxa_screen->force_fallback) { +// return uxa_check_copy_n_to_n; + } + return uxa_copy_n_to_n; +} + /** * uxa_close_screen() unwraps its wrapped screen functions and tears down UXA's * screen private, before calling down to the next CloseSccreen. */ -static Bool uxa_close_screen(int i, ScreenPtr pScreen) +static Bool uxa_close_screen(ScreenPtr pScreen) { uxa_screen_t *uxa_screen = uxa_get_screen(pScreen); - ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; + ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); #endif @@ -418,7 +429,7 @@ static Bool uxa_close_screen(int i, ScreenPtr pScreen) free(uxa_screen); - return (*pScreen->CloseScreen) (i, pScreen); + return (*pScreen->CloseScreen) (pScreen); } /** @@ -528,6 +539,7 @@ Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver) uxa_screen->SavedBitmapToRegion = screen->BitmapToRegion; screen->BitmapToRegion = uxa_bitmap_to_region; + //screen->GetCopyAreaFunction = uxa_get_copy_area_function; #ifdef RENDER { PictureScreenPtr ps = GetPictureScreenIfSet(screen); |