summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-08 08:33:10 +0100
committerDave Airlie <airlied@redhat.com>2012-06-26 11:45:02 +0100
commita2ad0b6ce957481ca5fa220340554cbc8fa54dc9 (patch)
treef36ca793a9dff20cc7db1ab263b25ebe929f0748
parentc2f7048bcb570ddfd1c898321aed1af1e3a9276c (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.h30
-rw-r--r--src/intel_display.c121
-rw-r--r--src/intel_dri.c116
-rw-r--r--src/intel_driver.c110
-rw-r--r--src/intel_hwmc.c4
-rw-r--r--src/intel_module.c40
-rw-r--r--src/intel_uxa.c95
-rw-r--r--src/intel_video.c6
-rw-r--r--src/legacy/i810/i810_dga.c8
-rw-r--r--src/legacy/i810/i810_driver.c10
-rw-r--r--src/legacy/i810/i810_video.c2
-rw-r--r--uxa/Makefile.am2
-rw-r--r--uxa/uxa-glyphs.c9
-rw-r--r--uxa/uxa-priv.h2
-rw-r--r--uxa/uxa.c18
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(&region, &box, 1);
+ DamageRegionAppend(pDraw, &region);
+ DamageRegionProcessPending(pDraw);
+ RegionUninit(&region);
+}
/*
* 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;
diff --git a/uxa/uxa.c b/uxa/uxa.c
index b4a1da61..b11d18d6 100644
--- a/uxa/uxa.c
+++ b/uxa/uxa.c
@@ -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);