Ticket #11051: xf86-video-ati-18.0.1-upstream_patches-2.patch

File xf86-video-ati-18.0.1-upstream_patches-2.patch, 140.6 KB (added by thomas, 6 years ago)

First one is garbage - try this one

  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/ati.c xf86-video-ati-18.0.1/src/ati.c
    old new  
    109109
    110110    device_iter = pci_slot_match_iterator_create(NULL);
    111111
    112     while ((device = pci_device_next(device_iter)) != NULL) {
     112    while ((device = pci_device_next(device_iter))) {
    113113        if (xf86IsPrimaryPci(device))
    114114            break;
    115115    }
     
    128128
    129129    device_iter = pci_slot_match_iterator_create(NULL);
    130130
    131     while ((device = pci_device_next(device_iter)) != NULL) {
     131    while ((device = pci_device_next(device_iter))) {
    132132        if (device->vendor_id == PCI_VENDOR_ATI) {
    133133            if (count == index)
    134134                return device;
  • src/drmmode_display.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/drmmode_display.c xf86-video-ati-18.0.1/src/drmmode_display.c
    old new  
    100100}
    101101
    102102
    103 /* Wait for the boolean condition to be FALSE */
    104 #define drmmode_crtc_wait_pending_event(drmmode_crtc, fd, condition) \
    105         do {} while ((condition) && \
    106                      drmHandleEvent(fd, &drmmode_crtc->drmmode->event_context) \
    107                      > 0);
    108 
    109 
    110103static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
    111104                                          int width, int height,
    112105                                          int depth, int bpp,
    113106                                          int pitch,
    114                                           struct radeon_bo *bo, struct radeon_surface *psurf)
     107                                          struct radeon_buffer *bo)
    115108{
    116109        RADEONInfoPtr info = RADEONPTR(pScrn);
    117110        ScreenPtr pScreen = pScrn->pScreen;
    118111        PixmapPtr pixmap;
    119         struct radeon_surface *surface;
    120         uint32_t tiling;
    121112
    122113        pixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth,
    123114                                          RADEON_CREATE_PIXMAP_SCANOUT);
     
    135126        if (!radeon_set_pixmap_bo(pixmap, bo))
    136127                goto fail;
    137128
    138         if (info->ChipFamily >= CHIP_FAMILY_R600) {
    139                 surface = radeon_get_pixmap_surface(pixmap);
    140                 if (surface && psurf)
    141                         *surface = *psurf;
    142                 else if (surface) {
    143                         memset(surface, 0, sizeof(struct radeon_surface));
    144                         surface->npix_x = width;
    145                         surface->npix_y = height;
    146                         surface->npix_z = 1;
    147                         surface->blk_w = 1;
    148                         surface->blk_h = 1;
    149                         surface->blk_d = 1;
    150                         surface->array_size = 1;
    151                         surface->last_level = 0;
    152                         surface->bpe = bpp / 8;
    153                         surface->nsamples = 1;
    154                         surface->flags = RADEON_SURF_SCANOUT;
    155                         /* we are requiring a recent enough libdrm version */
    156                         surface->flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
    157                         surface->flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
    158                         surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR_ALIGNED, MODE);
    159                         tiling = radeon_get_pixmap_tiling_flags(pixmap);
    160                         if (tiling & RADEON_TILING_MICRO) {
    161                                 surface->flags = RADEON_SURF_CLR(surface->flags, MODE);
    162                                 surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
    163                         }
    164                         if (tiling & RADEON_TILING_MACRO) {
    165                                 surface->flags = RADEON_SURF_CLR(surface->flags, MODE);
    166                                 surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
    167                         }
    168                         if (radeon_surface_best(info->surf_man, surface)) {
    169                                 goto fail;
    170                         }
    171                         if (radeon_surface_init(info->surf_man, surface)) {
    172                                 goto fail;
    173                         }
    174                 }
     129        if (info->surf_man && !info->use_glamor) {
     130                struct radeon_surface *surface = radeon_get_pixmap_surface(pixmap);
     131
     132                if (!radeon_surface_initialize(info, surface, width, height, bpp / 8,
     133                                               radeon_get_pixmap_tiling_flags(pixmap), 0))
     134                        goto fail;
    175135        }
    176136
    177137        if (!info->use_glamor ||
    178             radeon_glamor_create_textured_pixmap(pixmap,
    179                                                  radeon_get_pixmap_private(pixmap)))
     138            radeon_glamor_create_textured_pixmap(pixmap, bo))
    180139                return pixmap;
    181140
    182141fail:
     
    340299        if (drmmode_crtc->dpms_mode == DPMSModeOn && mode != DPMSModeOn) {
    341300                uint32_t seq;
    342301
    343                 drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
    344                                                 drmmode_crtc->flip_pending);
     302                radeon_drm_wait_pending_flip(crtc);
    345303
    346304                /*
    347305                 * On->Off transition: record the last vblank time,
     
    366324                                nominal_frame_rate /= pix_in_frame;
    367325                        drmmode_crtc->dpms_last_fps = nominal_frame_rate;
    368326                }
     327
     328                drmmode_crtc->dpms_mode = mode;
     329                radeon_drm_queue_handle_deferred(crtc);
    369330        } else if (drmmode_crtc->dpms_mode != DPMSModeOn && mode == DPMSModeOn) {
    370331                /*
    371332                 * Off->On transition: calculate and accumulate the
     
    383344                        drmmode_crtc->interpolated_vblanks += delta_seq;
    384345
    385346                }
     347
     348                drmmode_crtc->dpms_mode = DPMSModeOn;
    386349        }
    387         drmmode_crtc->dpms_mode = mode;
    388350}
    389351
    390352static void
     
    395357
    396358        /* Disable unused CRTCs */
    397359        if (!crtc->enabled || mode != DPMSModeOn) {
    398                 drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
    399                                                 drmmode_crtc->flip_pending);
     360                drmmode_do_crtc_dpms(crtc, DPMSModeOff);
    400361                drmModeSetCrtc(pRADEONEnt->fd, drmmode_crtc->mode_crtc->crtc_id,
    401362                               0, 0, 0, NULL, 0, NULL);
    402363                drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, NULL);
     
    412373        RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
    413374        RADEONInfoPtr info = RADEONPTR(pScrn);
    414375        PixmapPtr pixmap = info->fbcon_pixmap;
    415         struct radeon_bo *bo;
     376        struct radeon_buffer *bo;
    416377        drmModeFBPtr fbcon;
    417378        struct drm_gem_flink flink;
    418379
     
    420381            return pixmap;
    421382
    422383        fbcon = drmModeGetFB(pRADEONEnt->fd, fbcon_id);
    423         if (fbcon == NULL)
     384        if (!fbcon)
    424385                return NULL;
    425386
    426387        if (fbcon->depth != pScrn->depth ||
     
    435396                goto out_free_fb;
    436397        }
    437398
    438         bo = radeon_bo_open(drmmode->bufmgr, flink.name, 0, 0, 0, 0);
    439         if (bo == NULL) {
     399        bo = calloc(1, sizeof(struct radeon_buffer));
     400        if (!bo) {
    440401                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
    441                            "Couldn't allocate bo for fbcon handle\n");
     402                           "Couldn't allocate BO for fbcon handle\n");
     403                goto out_free_fb;
     404        }
     405        bo->ref_count = 1;
     406
     407        bo->bo.radeon = radeon_bo_open(drmmode->bufmgr, flink.name, 0, 0, 0, 0);
     408        if (!bo) {
     409                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
     410                           "Couldn't open BO for fbcon handle\n");
    442411                goto out_free_fb;
    443412        }
    444413
    445414        pixmap = drmmode_create_bo_pixmap(pScrn, fbcon->width, fbcon->height,
    446415                                          fbcon->depth, fbcon->bpp, fbcon->pitch,
    447                                           bo, NULL);
     416                                          bo);
    448417        info->fbcon_pixmap = pixmap;
    449         radeon_bo_unref(bo);
     418        radeon_buffer_unref(&bo);
    450419out_free_fb:
    451420        drmModeFreeFB(fbcon);
    452421        return pixmap;
     
    460429        /* XXX: The current GPUVM support in the kernel doesn't allow removing
    461430         * the virtual address range for this BO, so we need to keep around
    462431         * the pixmap to avoid breaking glamor with GPUVM
     432         *
     433         * Similarly, need to keep around the pixmap with current glamor, to
     434         * avoid issues due to a GEM handle lifetime conflict between us and
     435         * Mesa
    463436         */
    464         if (info->use_glamor && info->ChipFamily >= CHIP_FAMILY_CAYMAN)
     437        if (info->use_glamor &&
     438            (info->ChipFamily >= CHIP_FAMILY_CAYMAN ||
     439             xorgGetVersion() >= XORG_VERSION_NUMERIC(1,19,99,1,0)))
    465440                return;
    466441
    467442        if (info->fbcon_pixmap)
     
    529504                scanout->pixmap = NULL;
    530505        }
    531506
    532         if (scanout->bo) {
    533                 radeon_bo_unmap(scanout->bo);
    534                 radeon_bo_unref(scanout->bo);
    535                 scanout->bo = NULL;
    536         }
     507        radeon_buffer_unref(&scanout->bo);
    537508}
    538509
    539510void
     
    581552                                                 width, height,
    582553                                                 pScrn->depth,
    583554                                                 pScrn->bitsPerPixel,
    584                                                  pitch, scanout->bo, NULL);
     555                                                 pitch, scanout->bo);
    585556        if (!scanout->pixmap) {
    586557                ErrorF("failed to create CRTC scanout pixmap\n");
    587558                goto error;
     
    693664        Bool ret;
    694665
    695666#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,903,0)
    696         if (crtc->transformPresent || crtc->rotation != RR_Rotate_0)
    697             crtc->driverIsPerformingTransform = XF86DriverTransformOutput;
    698         else
    699             crtc->driverIsPerformingTransform = XF86DriverTransformNone;
     667        crtc->driverIsPerformingTransform = XF86DriverTransformOutput;
    700668#else
    701669        crtc->driverIsPerformingTransform = !crtc->transformPresent &&
    702                 crtc->rotation != RR_Rotate_0 &&
    703670                (crtc->rotation & 0xf) == RR_Rotate_0;
    704671#endif
    705672
     
    759726                                          gc, 0, 0, mode->HDisplay, mode->VDisplay,
    760727                                          0, 0);
    761728                        FreeScratchGC(gc);
    762                         radeon_cs_flush_indirect(scrn);
    763                         radeon_bo_wait(drmmode_crtc->scanout[0].bo);
     729                        radeon_finish(scrn, drmmode_crtc->scanout[0].bo);
    764730                }
    765731        }
    766732
     
    790756        if (drmmode_crtc->scanout[scanout_id].pixmap &&
    791757            (!drmmode_crtc->tear_free ||
    792758             drmmode_crtc->scanout[scanout_id ^ 1].pixmap)) {
    793                 RegionPtr region;
    794                 BoxPtr box;
     759                BoxRec extents = { .x1 = 0, .y1 = 0,
     760                                   .x2 = scrn->virtualX, .y2 = scrn->virtualY };
    795761
    796762                if (!drmmode_crtc->scanout_damage) {
    797763                        drmmode_crtc->scanout_damage =
     
    803769                                       drmmode_crtc->scanout_damage);
    804770                }
    805771
    806                 region = DamageRegion(drmmode_crtc->scanout_damage);
    807                 RegionUninit(region);
    808                 region->data = NULL;
    809                 box = RegionExtents(region);
    810                 box->x1 = 0;
    811                 box->y1 = 0;
    812                 box->x2 = max(box->x2, scrn->virtualX);
    813                 box->y2 = max(box->y2, scrn->virtualY);
    814 
    815772                *fb = radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap);
    816773                *x = *y = 0;
    817774
    818775                radeon_scanout_do_update(crtc, scanout_id,
    819776                                         screen->GetWindowPixmap(screen->root),
    820                                          *box);
    821                 radeon_bo_wait(drmmode_crtc->scanout[scanout_id].bo);
     777                                         extents);
     778                RegionEmpty(DamageRegion(drmmode_crtc->scanout_damage));
     779                radeon_finish(scrn, drmmode_crtc->scanout[scanout_id].bo);
    822780        }
    823781}
    824782
     
    922880                drmmode_crtc_update_tear_free(crtc);
    923881                if (drmmode_crtc->tear_free)
    924882                        scanout_id = drmmode_crtc->scanout_id;
    925 
    926                 drmmode_crtc_gamma_do_set(crtc, crtc->gamma_red, crtc->gamma_green,
    927                                           crtc->gamma_blue, crtc->gamma_size);
     883                else
     884                        drmmode_crtc->scanout_id = 0;
    928885
    929886                if (drmmode_crtc->prime_scanout_pixmap) {
    930887                        drmmode_crtc_prime_scanout_update(crtc, mode, scanout_id,
     
    947904                        fb = radeon_fb_create(pScrn, pRADEONEnt->fd,
    948905                                              pScrn->virtualX, pScrn->virtualY,
    949906                                              pScrn->displayWidth * info->pixel_bytes,
    950                                               info->front_bo->handle);
     907                                              info->front_buffer->bo.radeon->handle);
    951908                        /* Prevent refcnt of ad-hoc FBs from reaching 2 */
    952909                        drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, NULL);
    953910                        drmmode_crtc->fb = fb;
     
    957914                        goto done;
    958915                }
    959916
    960                 drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
    961                                                 drmmode_crtc->flip_pending);
     917                radeon_drm_wait_pending_flip(crtc);
    962918
    963919                if (!drmmode_set_mode(crtc, fb, mode, x, y))
    964920                        goto done;
     
    1010966
    1011967                if (drmmode_crtc->scanout[scanout_id].pixmap &&
    1012968                    fb != radeon_pixmap_get_fb(drmmode_crtc->
    1013                                                scanout[scanout_id].pixmap))
     969                                               scanout[scanout_id].pixmap)) {
     970                        radeon_drm_abort_entry(drmmode_crtc->scanout_update_pending);
     971                        drmmode_crtc->scanout_update_pending = 0;
    1014972                        drmmode_crtc_scanout_free(drmmode_crtc);
    1015                 else if (!drmmode_crtc->tear_free) {
     973                } else if (!drmmode_crtc->tear_free) {
    1016974                        drmmode_crtc_scanout_destroy(drmmode,
    1017975                                                     &drmmode_crtc->scanout[1]);
    1018976                }
    1019977        }
    1020978
     979        radeon_drm_queue_handle_deferred(crtc);
    1021980        return ret;
    1022981}
    1023982
     
    13981357        RADEONInfoPtr info = RADEONPTR(pScrn);
    13991358
    14001359        crtc = xf86CrtcCreate(pScrn, &info->drmmode_crtc_funcs);
    1401         if (crtc == NULL)
     1360        if (!crtc)
    14021361                return 0;
    14031362
    14041363        drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1);
     
    16801639    RADEONEntPtr pRADEONEnt = RADEONEntPriv(output->scrn);
    16811640    drmModePropertyPtr drmmode_prop, tearfree_prop;
    16821641    int i, j, err;
     1642    Atom name;
     1643
     1644    /* Create CONNECTOR_ID property */
     1645    name = MakeAtom("CONNECTOR_ID", 12, TRUE);
     1646    if (name != BAD_RESOURCE) {
     1647        INT32 value = mode_output->connector_id;
     1648
     1649        err = RRConfigureOutputProperty(output->randr_output, name,
     1650                                        FALSE, FALSE, TRUE, 1, &value);
     1651        if (err != Success) {
     1652            xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
     1653                       "RRConfigureOutputProperty error, %d\n", err);
     1654        }
     1655
     1656        err = RRChangeOutputProperty(output->randr_output, name,
     1657                                     XA_INTEGER, 32, PropModeReplace, 1,
     1658                                     &value, FALSE, FALSE);
     1659        if (err != Success) {
     1660            xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
     1661                       "RRChangeOutputProperty error, %d\n", err);
     1662        }
     1663    }
    16831664
    16841665    drmmode_output->props = calloc(mode_output->count_props + 1, sizeof(drmmode_prop_rec));
    16851666    if (!drmmode_output->props)
     
    17011682    /* Userspace-only property for TearFree */
    17021683    tearfree_prop = calloc(1, sizeof(*tearfree_prop));
    17031684    tearfree_prop->flags = DRM_MODE_PROP_ENUM;
    1704     strncpy(tearfree_prop->name, "TearFree", 8);
     1685    strcpy(tearfree_prop->name, "TearFree");
    17051686    tearfree_prop->count_enums = 3;
    17061687    tearfree_prop->enums = calloc(tearfree_prop->count_enums,
    17071688                                  sizeof(*tearfree_prop->enums));
    1708     strncpy(tearfree_prop->enums[0].name, "off", 3);
    1709     strncpy(tearfree_prop->enums[1].name, "on", 2);
     1689    strcpy(tearfree_prop->enums[0].name, "off");
     1690    strcpy(tearfree_prop->enums[1].name, "on");
    17101691    tearfree_prop->enums[1].value = 1;
    1711     strncpy(tearfree_prop->enums[2].name, "auto", 4);
     1692    strcpy(tearfree_prop->enums[2].name, "auto");
    17121693    tearfree_prop->enums[2].value = 2;
    17131694    drmmode_output->props[j].mode_prop = tearfree_prop;
    17141695    drmmode_output->props[j].value = info->tear_free;
     
    17761757    }
    17771758}
    17781759
     1760static void
     1761drmmode_output_set_tear_free(RADEONEntPtr pRADEONEnt,
     1762                             drmmode_output_private_ptr drmmode_output,
     1763                             xf86CrtcPtr crtc, int tear_free)
     1764{
     1765        if (drmmode_output->tear_free == tear_free)
     1766                return;
     1767
     1768        drmmode_output->tear_free = tear_free;
     1769
     1770        if (crtc) {
     1771                drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation,
     1772                                       crtc->x, crtc->y);
     1773        }
     1774}
     1775
    17791776static Bool
    17801777drmmode_output_set_property(xf86OutputPtr output, Atom property,
    17811778                RRPropertyValuePtr value)
     
    18161813            for (j = 0; j < p->mode_prop->count_enums; j++) {
    18171814                if (!strcmp(p->mode_prop->enums[j].name, name)) {
    18181815                    if (i == (drmmode_output->num_props - 1)) {
    1819                         if (drmmode_output->tear_free != j) {
    1820                             xf86CrtcPtr crtc = output->crtc;
    1821 
    1822                             drmmode_output->tear_free = j;
    1823                             if (crtc) {
    1824                                 drmmode_set_mode_major(crtc, &crtc->mode,
    1825                                                        crtc->rotation,
    1826                                                        crtc->x, crtc->y);
    1827                             }
    1828                         }
     1816                        drmmode_output_set_tear_free(pRADEONEnt, drmmode_output,
     1817                                                     output->crtc, j);
    18291818                    } else {
    18301819                        drmModeConnectorSetProperty(pRADEONEnt->fd,
    18311820                                                    drmmode_output->output_id,
     
    18531842    .create_resources = drmmode_output_create_resources,
    18541843    .set_property = drmmode_output_set_property,
    18551844    .get_property = drmmode_output_get_property,
    1856 #if 0
    1857 
    1858     .save = drmmode_crt_save,
    1859     .restore = drmmode_crt_restore,
    1860     .mode_fixup = drmmode_crt_mode_fixup,
    1861     .prepare = drmmode_output_prepare,
    1862     .mode_set = drmmode_crt_mode_set,
    1863     .commit = drmmode_output_commit,
    1864 #endif
    18651845    .detect = drmmode_output_detect,
    18661846    .mode_valid = drmmode_output_mode_valid,
    18671847
     
    20051985        drmModeEncoderPtr *kencoders = NULL;
    20061986        drmmode_output_private_ptr drmmode_output;
    20071987        drmModePropertyBlobPtr path_blob = NULL;
     1988#if XF86_CRTC_VERSION >= 8
     1989        Bool nonDesktop = FALSE;
     1990#endif
    20081991        char name[32];
    20091992        int i;
    20101993        const char *s;
     
    20151998
    20161999        path_blob = koutput_get_prop_blob(pRADEONEnt->fd, koutput, "PATH");
    20172000
     2001#if XF86_CRTC_VERSION >= 8
     2002        i = koutput_get_prop_idx(pRADEONEnt->fd, koutput, DRM_MODE_PROP_RANGE,
     2003                                 "non-desktop");
     2004        if (i >= 0)
     2005                nonDesktop = koutput->prop_values[i] != 0;
     2006#endif
     2007
    20182008        kencoders = calloc(sizeof(drmModeEncoderPtr), koutput->count_encoders);
    20192009        if (!kencoders) {
    20202010                goto out_free_encoders;
     
    20442034                        drmmode_output = output->driver_private;
    20452035                        drmmode_output->output_id = mode_res->connectors[num];
    20462036                        drmmode_output->mode_output = koutput;
     2037#if XF86_CRTC_VERSION >= 8
     2038                        output->non_desktop = nonDesktop;
     2039#endif
    20472040                        for (i = 0; i < koutput->count_encoders; i++)
    20482041                                drmModeFreeEncoder(kencoders[i]);
    20492042                        free(kencoders);
     
    20852078        output->interlaceAllowed = TRUE;
    20862079        output->doubleScanAllowed = TRUE;
    20872080        output->driver_private = drmmode_output;
     2081#if XF86_CRTC_VERSION >= 8
     2082        output->non_desktop = nonDesktop;
     2083#endif
    20882084       
    20892085        output->possible_crtcs = 0xffffffff;
    20902086        for (i = 0; i < koutput->count_encoders; i++) {
     
    22662262{
    22672263        xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
    22682264        RADEONInfoPtr info = RADEONPTR(scrn);
    2269         struct radeon_bo *old_front = NULL;
     2265        struct radeon_buffer *old_front = NULL;
    22702266        ScreenPtr   screen = xf86ScrnToScreen(scrn);
    22712267        int         i, pitch, old_width, old_height, old_pitch;
    2272         int aligned_height;
    2273         uint32_t screen_size;
     2268        int usage = CREATE_PIXMAP_USAGE_BACKING_PIXMAP;
    22742269        int cpp = info->pixel_bytes;
    2275         struct radeon_bo *front_bo;
    2276         struct radeon_surface surface;
    2277         struct radeon_surface *psurface;
    2278         uint32_t tiling_flags = 0, base_align;
     2270        uint32_t tiling_flags;
    22792271        PixmapPtr ppix = screen->GetScreenPixmap(screen);
    22802272        void *fb_shadow;
    22812273
    22822274        if (scrn->virtualX == width && scrn->virtualY == height)
    22832275                return TRUE;
    22842276
    2285         front_bo = info->front_bo;
    2286         radeon_cs_flush_indirect(scrn);
    2287 
    2288         if (front_bo)
    2289                 radeon_bo_wait(front_bo);
    2290 
    2291         if (info->allowColorTiling && !info->shadow_primary) {
    2292                 if (info->ChipFamily >= CHIP_FAMILY_R600) {
    2293                         if (info->allowColorTiling2D) {
    2294                                 tiling_flags |= RADEON_TILING_MACRO;
    2295                         } else {
    2296                                 tiling_flags |= RADEON_TILING_MICRO;
    2297                         }
    2298                 } else
    2299                         tiling_flags |= RADEON_TILING_MACRO;
     2277        if (width > xf86_config->maxWidth || height > xf86_config->maxHeight) {
     2278                xf86DrvMsg(scrn->scrnIndex, X_WARNING,
     2279                           "Xorg tried resizing screen to %dx%d, but maximum "
     2280                           "supported is %dx%d\n", width, height,
     2281                           xf86_config->maxWidth, xf86_config->maxHeight);
     2282                return FALSE;
    23002283        }
    23012284
    2302         pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(scrn, cpp, tiling_flags)) * cpp;
    2303         aligned_height = RADEON_ALIGN(height, drmmode_get_height_align(scrn, tiling_flags));
    2304         screen_size = RADEON_ALIGN(pitch * aligned_height, RADEON_GPU_PAGE_SIZE);
    2305         base_align = 4096;
    2306         if (info->ChipFamily >= CHIP_FAMILY_R600) {
    2307                 memset(&surface, 0, sizeof(struct radeon_surface));
    2308                 surface.npix_x = width;
    2309                 surface.npix_y = height;
    2310                 surface.npix_z = 1;
    2311                 surface.blk_w = 1;
    2312                 surface.blk_h = 1;
    2313                 surface.blk_d = 1;
    2314                 surface.array_size = 1;
    2315                 surface.last_level = 0;
    2316                 surface.bpe = cpp;
    2317                 surface.nsamples = 1;
    2318                 surface.flags = RADEON_SURF_SCANOUT;
    2319                 /* we are requiring a recent enough libdrm version */
    2320                 surface.flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
    2321                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
    2322                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR_ALIGNED, MODE);
    2323                 if (tiling_flags & RADEON_TILING_MICRO) {
    2324                         surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    2325                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
    2326                 }
    2327                 if (tiling_flags & RADEON_TILING_MACRO) {
    2328                         surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    2329                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
    2330                 }
    2331                 if (radeon_surface_best(info->surf_man, &surface)) {
    2332                         return FALSE;
    2333                 }
    2334                 if (radeon_surface_init(info->surf_man, &surface)) {
    2335                         return FALSE;
    2336                 }
    2337                 screen_size = surface.bo_size;
    2338                 base_align = surface.bo_alignment;
    2339                 pitch = surface.level[0].pitch_bytes;
    2340                 tiling_flags = 0;
    2341                 switch (surface.level[0].mode) {
    2342                 case RADEON_SURF_MODE_2D:
    2343                         tiling_flags |= RADEON_TILING_MACRO;
    2344                         tiling_flags |= surface.bankw << RADEON_TILING_EG_BANKW_SHIFT;
    2345                         tiling_flags |= surface.bankh << RADEON_TILING_EG_BANKH_SHIFT;
    2346                         tiling_flags |= surface.mtilea << RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT;
    2347                         if (surface.tile_split)
    2348                                 tiling_flags |= eg_tile_split(surface.tile_split)
    2349                                                 << RADEON_TILING_EG_TILE_SPLIT_SHIFT;
    2350                         break;
    2351                 case RADEON_SURF_MODE_1D:
    2352                         tiling_flags |= RADEON_TILING_MICRO;
    2353                         break;
    2354                 default:
    2355                         break;
    2356                 }
    2357                 info->front_surface = surface;
     2285        if (info->allowColorTiling && !info->shadow_primary) {
     2286                if (info->ChipFamily < CHIP_FAMILY_R600 || info->allowColorTiling2D)
     2287                        usage |= RADEON_CREATE_PIXMAP_TILING_MACRO;
     2288                else
     2289                        usage |= RADEON_CREATE_PIXMAP_TILING_MICRO;
    23582290        }
    23592291
    2360         xf86DrvMsg(scrn->scrnIndex, X_INFO,
    2361                    "Allocate new frame buffer %dx%d stride %d\n",
    2362                    width, height, pitch / cpp);
     2292        xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allocate new frame buffer %dx%d\n",
     2293                   width, height);
    23632294
    23642295        old_width = scrn->virtualX;
    23652296        old_height = scrn->virtualY;
    23662297        old_pitch = scrn->displayWidth;
    2367         old_front = info->front_bo;
     2298        old_front = info->front_buffer;
    23682299
    23692300        scrn->virtualX = width;
    23702301        scrn->virtualY = height;
    2371         scrn->displayWidth = pitch / cpp;
    23722302
    2373         info->front_bo = radeon_bo_open(info->bufmgr, 0, screen_size, base_align,
    2374                                         info->shadow_primary ?
    2375                                         RADEON_GEM_DOMAIN_GTT :
    2376                                         RADEON_GEM_DOMAIN_VRAM,
    2377                                         tiling_flags ? RADEON_GEM_NO_CPU_ACCESS : 0);
    2378         if (!info->front_bo)
     2303        info->front_buffer = radeon_alloc_pixmap_bo(scrn, scrn->virtualX,
     2304                                                    scrn->virtualY, scrn->depth,
     2305                                                    usage, scrn->bitsPerPixel,
     2306                                                    &pitch,
     2307                                                    &info->front_surface,
     2308                                                    &tiling_flags);
     2309        if (!info->front_buffer)
    23792310                goto fail;
    23802311
     2312        scrn->displayWidth = pitch / cpp;
     2313
     2314        if (!info->use_glamor) {
    23812315#if X_BYTE_ORDER == X_BIG_ENDIAN
    2382         switch (cpp) {
    2383         case 4:
    2384             tiling_flags |= RADEON_TILING_SWAP_32BIT;
    2385             break;
    2386         case 2:
    2387             tiling_flags |= RADEON_TILING_SWAP_16BIT;
    2388             break;
    2389         }
    2390         if (info->ChipFamily < CHIP_FAMILY_R600 &&
    2391             info->r600_shadow_fb && tiling_flags)
    2392             tiling_flags |= RADEON_TILING_SURFACE;
     2316                switch (cpp) {
     2317                case 4:
     2318                        tiling_flags |= RADEON_TILING_SWAP_32BIT;
     2319                        break;
     2320                case 2:
     2321                        tiling_flags |= RADEON_TILING_SWAP_16BIT;
     2322                        break;
     2323                }
     2324                if (info->ChipFamily < CHIP_FAMILY_R600 &&
     2325                    info->r600_shadow_fb && tiling_flags)
     2326                        tiling_flags |= RADEON_TILING_SURFACE;
    23932327#endif
    2394         if (tiling_flags)
    2395             radeon_bo_set_tiling(info->front_bo, tiling_flags, pitch);
     2328                if (tiling_flags)
     2329                        radeon_bo_set_tiling(info->front_buffer->bo.radeon, tiling_flags, pitch);
     2330        }
    23962331
    23972332        if (!info->r600_shadow_fb) {
    2398                 psurface = radeon_get_pixmap_surface(ppix);
    2399                 *psurface = info->front_surface;
     2333                if (info->surf_man && !info->use_glamor)
     2334                        *radeon_get_pixmap_surface(ppix) = info->front_surface;
    24002335                screen->ModifyPixmapHeader(ppix,
    24012336                                           width, height, -1, -1, pitch, NULL);
    24022337        } else {
    2403                 if (radeon_bo_map(info->front_bo, 1))
     2338                if (radeon_bo_map(info->front_buffer->bo.radeon, 1))
    24042339                        goto fail;
    2405                 fb_shadow = calloc(1, screen_size);
    2406                 if (fb_shadow == NULL)
     2340                fb_shadow = calloc(1, pitch * scrn->virtualY);
     2341                if (!fb_shadow)
    24072342                        goto fail;
    24082343                free(info->fb_shadow);
    24092344                info->fb_shadow = fb_shadow;
     
    24162351                radeon_glamor_create_screen_resources(scrn->pScreen);
    24172352
    24182353        if (!info->r600_shadow_fb) {
    2419                 if (!radeon_set_pixmap_bo(ppix, info->front_bo))
     2354                if (!radeon_set_pixmap_bo(ppix, info->front_buffer))
    24202355                        goto fail;
    24212356        }
    24222357
    24232358        radeon_pixmap_clear(ppix);
    2424         radeon_cs_flush_indirect(scrn);
    2425         radeon_bo_wait(info->front_bo);
     2359        radeon_finish(scrn, info->front_buffer);
    24262360
    24272361        for (i = 0; i < xf86_config->num_crtc; i++) {
    24282362                xf86CrtcPtr crtc = xf86_config->crtc[i];
     
    24342368                                       crtc->rotation, crtc->x, crtc->y);
    24352369        }
    24362370
    2437         if (old_front)
    2438                 radeon_bo_unref(old_front);
     2371        radeon_buffer_unref(&old_front);
    24392372
    2440         radeon_kms_update_vram_limit(scrn, screen_size);
     2373        radeon_kms_update_vram_limit(scrn, pitch * scrn->virtualY);
    24412374        return TRUE;
    24422375
    24432376 fail:
    2444         if (info->front_bo)
    2445                 radeon_bo_unref(info->front_bo);
    2446         info->front_bo = old_front;
     2377        radeon_buffer_unref(&info->front_buffer);
     2378        info->front_buffer = old_front;
    24472379        scrn->virtualX = old_width;
    24482380        scrn->virtualY = old_height;
    24492381        scrn->displayWidth = old_pitch;
     
    24512383        return FALSE;
    24522384}
    24532385
     2386static void
     2387drmmode_validate_leases(ScrnInfoPtr scrn)
     2388{
     2389#ifdef XF86_LEASE_VERSION
     2390        ScreenPtr screen = scrn->pScreen;
     2391        rrScrPrivPtr scr_priv = rrGetScrPriv(screen);
     2392        RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
     2393        drmModeLesseeListPtr lessees;
     2394        RRLeasePtr lease, next;
     2395        int l;
     2396
     2397        /* We can't talk to the kernel about leases when VT switched */
     2398        if (!scrn->vtSema)
     2399                return;
     2400
     2401        lessees = drmModeListLessees(pRADEONEnt->fd);
     2402        if (!lessees)
     2403                return;
     2404
     2405        xorg_list_for_each_entry_safe(lease, next, &scr_priv->leases, list) {
     2406                drmmode_lease_private_ptr lease_private = lease->devPrivate;
     2407
     2408                for (l = 0; l < lessees->count; l++) {
     2409                        if (lessees->lessees[l] == lease_private->lessee_id)
     2410                                break;
     2411                }
     2412
     2413                /* check to see if the lease has gone away */
     2414                if (l == lessees->count) {
     2415                        free(lease_private);
     2416                        lease->devPrivate = NULL;
     2417                        xf86CrtcLeaseTerminated(lease);
     2418                }
     2419        }
     2420
     2421        free(lessees);
     2422#endif
     2423}
     2424
     2425#ifdef XF86_LEASE_VERSION
     2426
     2427static int
     2428drmmode_create_lease(RRLeasePtr lease, int *fd)
     2429{
     2430        ScreenPtr screen = lease->screen;
     2431        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     2432        RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
     2433        drmmode_lease_private_ptr lease_private;
     2434        int noutput = lease->numOutputs;
     2435        int ncrtc = lease->numCrtcs;
     2436        uint32_t *objects;
     2437        size_t nobjects;
     2438        int lease_fd;
     2439        int c, o;
     2440        int i;
     2441
     2442        nobjects = ncrtc + noutput;
     2443        if (nobjects == 0 || nobjects > (SIZE_MAX / 4) ||
     2444            ncrtc > (SIZE_MAX - noutput))
     2445                return BadValue;
     2446
     2447        lease_private = calloc(1, sizeof (drmmode_lease_private_rec));
     2448        if (!lease_private)
     2449                return BadAlloc;
     2450
     2451        objects = malloc(nobjects * 4);
     2452        if (!objects) {
     2453                free(lease_private);
     2454                return BadAlloc;
     2455        }
     2456
     2457        i = 0;
     2458
     2459        /* Add CRTC ids */
     2460        for (c = 0; c < ncrtc; c++) {
     2461                xf86CrtcPtr crtc = lease->crtcs[c]->devPrivate;
     2462                drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     2463
     2464                objects[i++] = drmmode_crtc->mode_crtc->crtc_id;
     2465        }
     2466
     2467        /* Add connector ids */
     2468        for (o = 0; o < noutput; o++) {
     2469                xf86OutputPtr   output = lease->outputs[o]->devPrivate;
     2470                drmmode_output_private_ptr drmmode_output = output->driver_private;
     2471
     2472                objects[i++] = drmmode_output->mode_output->connector_id;
     2473        }
     2474
     2475        /* call kernel to create lease */
     2476        assert (i == nobjects);
     2477
     2478        lease_fd = drmModeCreateLease(pRADEONEnt->fd, objects, nobjects, 0,
     2479                                      &lease_private->lessee_id);
     2480
     2481        free(objects);
     2482
     2483        if (lease_fd < 0) {
     2484                free(lease_private);
     2485                return BadMatch;
     2486        }
     2487
     2488        lease->devPrivate = lease_private;
     2489
     2490        xf86CrtcLeaseStarted(lease);
     2491
     2492        *fd = lease_fd;
     2493        return Success;
     2494}
     2495
     2496static void
     2497drmmode_terminate_lease(RRLeasePtr lease)
     2498{
     2499        drmmode_lease_private_ptr lease_private = lease->devPrivate;
     2500        ScreenPtr screen = lease->screen;
     2501        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     2502        RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
     2503
     2504        if (drmModeRevokeLease(pRADEONEnt->fd, lease_private->lessee_id) == 0) {
     2505                free(lease_private);
     2506                lease->devPrivate = NULL;
     2507                xf86CrtcLeaseTerminated(lease);
     2508        }
     2509}
     2510
     2511#endif // XF86_LEASE_VERSION
     2512
    24542513static const xf86CrtcConfigFuncsRec drmmode_xf86crtc_config_funcs = {
    2455         drmmode_xf86crtc_resize
     2514        .resize = drmmode_xf86crtc_resize,
     2515#ifdef XF86_LEASE_VERSION
     2516        .create_lease = drmmode_create_lease,
     2517        .terminate_lease = drmmode_terminate_lease
     2518#endif
    24562519};
    24572520
    24582521static void
     
    24612524        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    24622525        RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
    24632526        drmmode_flipdata_ptr flipdata = event_data;
     2527        int crtc_id = drmmode_get_crtc_id(crtc);
     2528        struct drmmode_fb **fb = &flipdata->fb[crtc_id];
     2529
     2530        if (drmmode_crtc->flip_pending == *fb) {
     2531                drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
     2532                                     NULL);
     2533        }
     2534        drmmode_fb_reference(pRADEONEnt->fd, fb, NULL);
    24642535
    24652536        if (--flipdata->flip_count == 0) {
    24662537                if (!flipdata->fe_crtc)
    24672538                        flipdata->fe_crtc = crtc;
    24682539                flipdata->abort(flipdata->fe_crtc, flipdata->event_data);
    2469                 drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb, NULL);
    24702540                free(flipdata);
    24712541        }
    2472 
    2473         drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
    2474                              NULL);
    24752542}
    24762543
    24772544static void
     
    24802547        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    24812548        RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
    24822549        drmmode_flipdata_ptr flipdata = event_data;
     2550        int crtc_id = drmmode_get_crtc_id(crtc);
     2551        struct drmmode_fb **fb = &flipdata->fb[crtc_id];
    24832552
    24842553        /* Is this the event whose info shall be delivered to higher level? */
    24852554        if (crtc == flipdata->fe_crtc) {
     
    24882557                flipdata->fe_usec = usec;
    24892558        }
    24902559
    2491         drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb,
    2492                              flipdata->fb);
    2493         if (drmmode_crtc->tear_free ||
    2494             drmmode_crtc->flip_pending == flipdata->fb) {
     2560        if (drmmode_crtc->flip_pending == *fb) {
    24952561                drmmode_fb_reference(pRADEONEnt->fd,
    24962562                                     &drmmode_crtc->flip_pending, NULL);
    24972563        }
     2564        drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, *fb);
     2565        drmmode_fb_reference(pRADEONEnt->fd, fb, NULL);
    24982566
    24992567        if (--flipdata->flip_count == 0) {
    25002568                /* Deliver MSC & UST from reference/current CRTC to flip event
     
    25062574                else
    25072575                        flipdata->handler(crtc, frame, usec, flipdata->event_data);
    25082576
    2509                 drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb, NULL);
    25102577                free(flipdata);
    25112578        }
    25122579}
     
    25202587drm_wakeup_handler(pointer data, int err, pointer p)
    25212588#endif
    25222589{
    2523         ScrnInfoPtr scrn = data;
    2524         RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
    2525         RADEONInfoPtr info = RADEONPTR(scrn);
     2590        drmmode_ptr drmmode = data;
     2591        RADEONEntPtr pRADEONEnt = RADEONEntPriv(drmmode->scrn);
    25262592       
    25272593#if !HAVE_NOTIFY_FD
    25282594        fd_set *read_mask = p;
     
    25302596        if (err >= 0 && FD_ISSET(pRADEONEnt->fd, read_mask))
    25312597#endif
    25322598        {
    2533                 drmHandleEvent(pRADEONEnt->fd, &info->drmmode.event_context);
     2599                radeon_drm_handle_event(pRADEONEnt->fd, &drmmode->event_context);
    25342600        }
    25352601}
    25362602
     
    26632729
    26642730        xf86InitialConfiguration(pScrn, TRUE);
    26652731
    2666         drmmode->event_context.version = 2;
    2667         drmmode->event_context.vblank_handler = radeon_drm_queue_handler;
    2668         drmmode->event_context.page_flip_handler = radeon_drm_queue_handler;
    2669 
    26702732        pRADEONEnt->has_page_flip_target = drmmode_probe_page_flip_target(pRADEONEnt);
    26712733
    26722734        drmModeFreeResources(mode_res);
     
    26842746        info->drmmode_inited = TRUE;
    26852747        if (pRADEONEnt->fd_wakeup_registered != serverGeneration) {
    26862748#if HAVE_NOTIFY_FD
    2687                 SetNotifyFd(pRADEONEnt->fd, drm_notify_fd, X_NOTIFY_READ, pScrn);
     2749                SetNotifyFd(pRADEONEnt->fd, drm_notify_fd, X_NOTIFY_READ,
     2750                            &info->drmmode);
    26882751#else
    26892752                AddGeneralSocket(pRADEONEnt->fd);
    26902753                RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
    2691                                 drm_wakeup_handler, pScrn);
     2754                                               drm_wakeup_handler,
     2755                                               &info->drmmode);
    26922756#endif
    26932757                pRADEONEnt->fd_wakeup_registered = serverGeneration;
    26942758                pRADEONEnt->fd_wakeup_ref = 1;
     
    28532917                               Bool set_hw)
    28542918{
    28552919        xf86CrtcConfigPtr   config = XF86_CRTC_CONFIG_PTR(pScrn);
    2856         RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
    28572920        unsigned num_desired = 0, num_on = 0;
    28582921        int c;
    28592922
     
    28612924        if (set_hw) {
    28622925                for (c = 0; c < config->num_crtc; c++) {
    28632926                        xf86CrtcPtr crtc = config->crtc[c];
    2864                         drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    28652927
    28662928                        /* Skip disabled CRTCs */
    28672929                        if (crtc->enabled)
    28682930                                continue;
    28692931
    2870                         drmmode_do_crtc_dpms(crtc, DPMSModeOff);
    2871                         drmModeSetCrtc(pRADEONEnt->fd,
    2872                                        drmmode_crtc->mode_crtc->crtc_id,
    2873                                        0, 0, 0, NULL, 0, NULL);
    2874                         drmmode_fb_reference(pRADEONEnt->fd,
    2875                                              &drmmode_crtc->fb, NULL);
     2932                        drmmode_crtc_dpms(crtc, DPMSModeOff);
    28762933                }
    28772934        }
    28782935
     
    29282985                        } else {
    29292986                                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
    29302987                                           "Failed to set mode on CRTC %d\n", c);
     2988                                RRCrtcSet(crtc->randr_crtc, NULL, crtc->x, crtc->y,
     2989                                          crtc->rotation, 0, NULL);
    29312990                        }
    29322991                } else {
    29332992                        crtc->mode = crtc->desiredMode;
     
    29443003                return FALSE;
    29453004        }
    29463005
     3006        /* Validate leases on VT re-entry */
     3007        drmmode_validate_leases(pScrn);
     3008
    29473009        return TRUE;
    29483010}
    29493011
    29503012Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn)
    29513013{
    29523014    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
     3015    int i;
    29533016
    29543017    if (xf86_config->num_crtc) {
    29553018        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
     
    29583021            return FALSE;
    29593022
    29603023        /* All radeons support 10 bit CLUTs. They get bypassed at depth 30. */
    2961         if (pScrn->depth != 30 &&
    2962             !xf86HandleColormaps(pScreen, 256, 10,
    2963                                  NULL, NULL,
    2964                                  CMAP_PALETTED_TRUECOLOR
    2965 #if 0 /* This option messes up text mode! (eich@suse.de) */
    2966                                  | CMAP_LOAD_EVEN_IF_OFFSCREEN
    2967 #endif
    2968                                  | CMAP_RELOAD_ON_MODE_SWITCH))
    2969             return FALSE;
     3024        if (pScrn->depth != 30) {
     3025            if (!xf86HandleColormaps(pScreen, 256, 10, NULL, NULL,
     3026                                     CMAP_PALETTED_TRUECOLOR
     3027                                     | CMAP_RELOAD_ON_MODE_SWITCH))
     3028                return FALSE;
     3029
     3030            for (i = 0; i < xf86_config->num_crtc; i++) {
     3031                xf86CrtcPtr crtc = xf86_config->crtc[i];
     3032
     3033                drmmode_crtc_gamma_do_set(crtc, crtc->gamma_red,
     3034                                          crtc->gamma_green,
     3035                                          crtc->gamma_blue,
     3036                                          crtc->gamma_size);
     3037            }
     3038        }
    29703039    }
     3040
    29713041    return TRUE;
    29723042}
    29733043
     
    31033173                        changed = TRUE;
    31043174        }
    31053175
     3176        /* Check to see if a lessee has disappeared */
     3177        drmmode_validate_leases(scrn);
     3178
    31063179        if (changed && dixPrivateKeyRegistered(rrPrivKey)) {
    31073180#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,14,99,2,0)
    31083181                RRSetChanged(xf86ScrnToScreen(scrn));
     
    32033276        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
    32043277        xf86CrtcPtr crtc = NULL;
    32053278        drmmode_crtc_private_ptr drmmode_crtc = config->crtc[0]->driver_private;
    3206         int i;
    32073279        uint32_t flip_flags = flip_sync == FLIP_ASYNC ? DRM_MODE_PAGE_FLIP_ASYNC : 0;
    32083280        drmmode_flipdata_ptr flipdata;
     3281        Bool handle_deferred = FALSE;
    32093282        uintptr_t drm_queue_seq = 0;
     3283        struct drmmode_fb *fb;
     3284        int i = 0;
    32103285
    3211         flipdata = calloc(1, sizeof(drmmode_flipdata_rec));
     3286        flipdata = calloc(1, sizeof(*flipdata) + config->num_crtc *
     3287                          sizeof(flipdata->fb[0]));
    32123288        if (!flipdata) {
    32133289             xf86DrvMsg(scrn->scrnIndex, X_WARNING,
    32143290                        "flip queue: data alloc failed.\n");
    32153291             goto error;
    32163292        }
    32173293
    3218         drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb,
    3219                              radeon_pixmap_get_fb(new_front));
    3220         if (!flipdata->fb) {
     3294        fb = radeon_pixmap_get_fb(new_front);
     3295        if (!fb) {
    32213296                ErrorF("Failed to get FB for flip\n");
    32223297                goto error;
    32233298        }
     
    32383313        flipdata->fe_crtc = ref_crtc;
    32393314
    32403315        for (i = 0; i < config->num_crtc; i++) {
    3241                 struct drmmode_fb *fb = flipdata->fb;
    3242 
    32433316                crtc = config->crtc[i];
    32443317                drmmode_crtc = crtc->driver_private;
    32453318
     
    32753348                                goto next;
    32763349                        }
    32773350
    3278                         fb = radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap);
    3279                         if (!fb) {
     3351                        drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb[i],
     3352                                             radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap));
     3353                        if (!flipdata->fb[i]) {
    32803354                                ErrorF("Failed to get FB for TearFree flip\n");
    32813355                                goto error;
    32823356                        }
    32833357
    32843358                        radeon_scanout_do_update(crtc, scanout_id, new_front,
    32853359                                                 extents);
     3360                        radeon_cs_flush_indirect(crtc->scrn);
    32863361
    3287                         drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
    3288                                                         drmmode_crtc->scanout_update_pending);
     3362                        if (drmmode_crtc->scanout_update_pending) {
     3363                                radeon_drm_wait_pending_flip(crtc);
     3364                                handle_deferred = TRUE;
     3365                                radeon_drm_abort_entry(drmmode_crtc->scanout_update_pending);
     3366                                drmmode_crtc->scanout_update_pending = 0;
     3367                        }
     3368                } else {
     3369                        drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb[i], fb);
    32893370                }
    32903371
    32913372                if (crtc == ref_crtc) {
    32923373                        if (drmmode_page_flip_target_absolute(pRADEONEnt,
    32933374                                                              drmmode_crtc,
    3294                                                               fb->handle,
     3375                                                              flipdata->fb[i]->handle,
    32953376                                                              flip_flags,
    32963377                                                              drm_queue_seq,
    32973378                                                              target_msc) != 0)
     
    32993380                } else {
    33003381                        if (drmmode_page_flip_target_relative(pRADEONEnt,
    33013382                                                              drmmode_crtc,
    3302                                                               fb->handle,
     3383                                                              flipdata->fb[i]->handle,
    33033384                                                              flip_flags,
    33043385                                                              drm_queue_seq, 0) != 0)
    33053386                                goto flip_error;
     
    33113392                }
    33123393
    33133394        next:
    3314                 drmmode_fb_reference(pRADEONEnt->fd,
    3315                                      &drmmode_crtc->flip_pending, fb);
     3395                drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
     3396                                     flipdata->fb[i]);
    33163397                drm_queue_seq = 0;
    33173398        }
    33183399
     3400        if (handle_deferred)
     3401                radeon_drm_queue_handle_deferred(ref_crtc);
    33193402        if (flipdata->flip_count > 0)
    33203403                return TRUE;
    33213404
     
    33303413                drmmode_flip_abort(crtc, flipdata);
    33313414        else {
    33323415                abort(NULL, data);
    3333                 drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb, NULL);
    33343416                free(flipdata);
    33353417        }
    33363418
    33373419        xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Page flip failed: %s\n",
    33383420                   strerror(errno));
     3421        if (handle_deferred)
     3422                radeon_drm_queue_handle_deferred(ref_crtc);
    33393423        return FALSE;
    33403424}
  • src/drmmode_display.h

    diff -Naur xf86-video-ati-18.0.1.orig/src/drmmode_display.h xf86-video-ati-18.0.1/src/drmmode_display.h
    old new  
    5656} drmmode_rec, *drmmode_ptr;
    5757
    5858typedef struct {
    59   struct drmmode_fb *fb;
    6059  void *event_data;
    6160  int flip_count;
    6261  unsigned int fe_frame;
     
    6463  xf86CrtcPtr fe_crtc;
    6564  radeon_drm_handler_proc handler;
    6665  radeon_drm_abort_proc abort;
     66  struct drmmode_fb *fb[0];
    6767} drmmode_flipdata_rec, *drmmode_flipdata_ptr;
    6868
    6969struct drmmode_fb {
     
    7272};
    7373
    7474struct drmmode_scanout {
    75     struct radeon_bo *bo;
     75    struct radeon_buffer *bo;
    7676    PixmapPtr pixmap;
    7777    int width, height;
    7878};
     
    8888    Bool ignore_damage;
    8989    RegionRec scanout_last_region;
    9090    unsigned scanout_id;
    91     Bool scanout_update_pending;
     91    uintptr_t scanout_update_pending;
    9292    Bool tear_free;
    9393
    9494    PixmapPtr prime_scanout_pixmap;
     
    103103     * modeset)
    104104     */
    105105    Bool need_modeset;
     106    /* For keeping track of nested calls to drm_wait_pending_flip /
     107     * drm_queue_handle_deferred
     108     */
     109    int wait_flip_nesting_level;
    106110    /* A flip to this FB is pending for this CRTC */
    107111    struct drmmode_fb *flip_pending;
    108112    /* The FB currently being scanned out by this CRTC, if any */
    109113    struct drmmode_fb *fb;
    110 
    111 #ifdef HAVE_PRESENT_H
    112     /* Deferred processing of Present vblank event */
    113     uint64_t present_vblank_event_id;
    114     uint64_t present_vblank_usec;
    115     unsigned present_vblank_msc;
    116     Bool present_flip_expected;
    117 #endif
    118114} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
    119115
    120116typedef struct {
     
    139135    int tear_free;
    140136} drmmode_output_private_rec, *drmmode_output_private_ptr;
    141137
     138typedef struct {
     139    uint32_t lessee_id;
     140} drmmode_lease_private_rec, *drmmode_lease_private_ptr;
     141
    142142
    143143enum drmmode_flip_sync {
    144144    FLIP_VSYNC,
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/evergreen_exa.c xf86-video-ati-18.0.1/src/evergreen_exa.c
    old new  
    7171    if (!RADEONValidPM(pm, pPix->drawable.bitsPerPixel))
    7272        RADEON_FALLBACK(("invalid planemask\n"));
    7373
    74     dst.bo = radeon_get_pixmap_bo(pPix);
     74    dst.bo = radeon_get_pixmap_bo(pPix)->bo.radeon;
    7575    dst.tiling_flags = radeon_get_pixmap_tiling(pPix);
    7676    dst.surface = radeon_get_pixmap_surface(pPix);
    7777
     
    466466
    467467    accel_state->same_surface = FALSE;
    468468
    469     src_obj.bo = radeon_get_pixmap_bo(pSrc);
    470     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     469    src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
     470    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    471471    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    472472    src_obj.surface = radeon_get_pixmap_surface(pSrc);
    473473    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    474474    src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    475     if (radeon_get_pixmap_bo(pSrc) == radeon_get_pixmap_bo(pDst))
     475    if (src_obj.bo == dst_obj.bo)
    476476        accel_state->same_surface = TRUE;
    477477
    478478    src_obj.width = pSrc->drawable.width;
     
    511511        accel_state->copy_area_bo = radeon_bo_open(info->bufmgr, 0, size, 0,
    512512                                                   RADEON_GEM_DOMAIN_VRAM,
    513513                                                   0);
    514         if (accel_state->copy_area_bo == NULL)
     514        if (!accel_state->copy_area_bo)
    515515            RADEON_FALLBACK(("temp copy surface alloc failed\n"));
    516516
    517517        radeon_cs_space_add_persistent_bo(info->cs, accel_state->copy_area_bo,
     
    13011301        return FALSE;
    13021302
    13031303    if (pSrc) {
    1304         src_obj.bo = radeon_get_pixmap_bo(pSrc);
     1304        src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
    13051305        src_obj.surface = radeon_get_pixmap_surface(pSrc);
    13061306        src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    13071307        src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8);
     
    13111311        src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT;
    13121312    }
    13131313
    1314     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     1314    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    13151315    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    13161316    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    13171317    dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8);
     
    13251325
    13261326    if (pMaskPicture) {
    13271327        if (pMask) {
    1328             mask_obj.bo = radeon_get_pixmap_bo(pMask);
     1328            mask_obj.bo = radeon_get_pixmap_bo(pMask)->bo.radeon;
    13291329            mask_obj.tiling_flags = radeon_get_pixmap_tiling(pMask);
    13301330            mask_obj.pitch = exaGetPixmapPitch(pMask) / (pMask->drawable.bitsPerPixel / 8);
    13311331            mask_obj.surface = radeon_get_pixmap_surface(pMask);
     
    16731673        return FALSE;
    16741674
    16751675    driver_priv = exaGetPixmapDriverPrivate(pDst);
    1676     if (!driver_priv || !driver_priv->bo)
     1676    if (!driver_priv || !driver_priv->bo->bo.radeon)
    16771677        return FALSE;
    16781678
    16791679    /* If we know the BO won't be busy / in VRAM, don't bother with a scratch */
    1680     copy_dst = driver_priv->bo;
     1680    copy_dst = driver_priv->bo->bo.radeon;
    16811681    copy_pitch = pDst->devKind;
    16821682    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    1683         if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
     1683        if (!radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
    16841684            flush = FALSE;
    1685             if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain) &&
     1685            if (!radeon_bo_is_busy(driver_priv->bo->bo.radeon, &dst_domain) &&
    16861686                !(dst_domain & RADEON_GEM_DOMAIN_VRAM))
    16871687                goto copy;
    16881688        }
     
    16931693    base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0);
    16941694    size = scratch_pitch * height * (bpp / 8);
    16951695    scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0);
    1696     if (scratch == NULL) {
     1696    if (!scratch) {
    16971697        goto copy;
    16981698    }
    16991699
     
    17111711    dst_obj.height = pDst->drawable.height;
    17121712    dst_obj.bpp = bpp;
    17131713    dst_obj.domain = RADEON_GEM_DOMAIN_VRAM;
    1714     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     1714    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    17151715    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    17161716    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    17171717
     
    17391739    r = TRUE;
    17401740    size = w * bpp / 8;
    17411741    dst = copy_dst->ptr;
    1742     if (copy_dst == driver_priv->bo)
     1742    if (copy_dst == driver_priv->bo->bo.radeon)
    17431743        dst += y * copy_pitch + x * bpp / 8;
    17441744    for (i = 0; i < h; i++) {
    17451745        memcpy(dst + i * copy_pitch, src, size);
     
    17891789        return FALSE;
    17901790
    17911791    driver_priv = exaGetPixmapDriverPrivate(pSrc);
    1792     if (!driver_priv || !driver_priv->bo)
     1792    if (!driver_priv || !driver_priv->bo->bo.radeon)
    17931793        return FALSE;
    17941794
    17951795    /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */
    1796     copy_src = driver_priv->bo;
     1796    copy_src = driver_priv->bo->bo.radeon;
    17971797    copy_pitch = pSrc->devKind;
    17981798    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    1799         if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
    1800             src_domain = radeon_bo_get_src_domain(driver_priv->bo);
     1799        if (radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
     1800            src_domain = radeon_bo_get_src_domain(driver_priv->bo->bo.radeon);
    18011801            if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) ==
    18021802                (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM))
    18031803                src_domain = 0;
     
    18061806        }
    18071807
    18081808        if (!src_domain)
    1809             radeon_bo_is_busy(driver_priv->bo, &src_domain);
     1809            radeon_bo_is_busy(driver_priv->bo->bo.radeon, &src_domain);
    18101810
    18111811        if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM)
    18121812            goto copy;
     
    18211821    base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0);
    18221822    size = scratch_pitch * height * (bpp / 8);
    18231823    scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0);
    1824     if (scratch == NULL) {
     1824    if (!scratch) {
    18251825        goto copy;
    18261826    }
    18271827    radeon_cs_space_reset_bos(info->cs);
     
    18411841    src_obj.height = pSrc->drawable.height;
    18421842    src_obj.bpp = bpp;
    18431843    src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT;
    1844     src_obj.bo = radeon_get_pixmap_bo(pSrc);
     1844    src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
    18451845    src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    18461846    src_obj.surface = radeon_get_pixmap_surface(pSrc);
    18471847
     
    18831883    }
    18841884    r = TRUE;
    18851885    w *= bpp / 8;
    1886     if (copy_src == driver_priv->bo)
     1886    if (copy_src == driver_priv->bo->bo.radeon)
    18871887        size = y * copy_pitch + x * bpp / 8;
    18881888    else
    18891889        size = 0;
     
    19271927
    19281928    accel_state->shaders_bo = radeon_bo_open(info->bufmgr, 0, size, 0,
    19291929                                             RADEON_GEM_DOMAIN_VRAM, 0);
    1930     if (accel_state->shaders_bo == NULL) {
     1930    if (!accel_state->shaders_bo) {
    19311931        ErrorF("Allocating shader failed\n");
    19321932        return FALSE;
    19331933    }
     
    20462046    ScrnInfoPtr pScrn =  xf86ScreenToScrn(pScreen);
    20472047    RADEONInfoPtr info   = RADEONPTR(pScrn);
    20482048
    2049     if (info->accel_state->exa == NULL) {
     2049    if (!info->accel_state->exa) {
    20502050        xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map not set up\n");
    20512051        return FALSE;
    20522052    }
     
    20652065    info->accel_state->exa->MarkSync = EVERGREENMarkSync;
    20662066    info->accel_state->exa->WaitMarker = EVERGREENSync;
    20672067
    2068     info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap;
    20692068    info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap;
    20702069    info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen;
    20712070    info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS;
  • src/evergreen_state.h

    diff -Naur xf86-video-ati-18.0.1.orig/src/evergreen_state.h xf86-video-ati-18.0.1/src/evergreen_state.h
    old new  
    345345
    346346extern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index);
    347347extern void RADEONFinishAccess_CS(PixmapPtr pPix, int index);
    348 extern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align);
    349348extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
    350349                                    int depth, int usage_hint, int bitsPerPixel,
    351350                                    int *new_pitch);
    352351extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv);
    353 extern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix);
    354352extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix);
    355353extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p);
    356354extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle);
  • src/evergreen_textured_videofuncs.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/evergreen_textured_videofuncs.c xf86-video-ati-18.0.1/src/evergreen_textured_videofuncs.c
    old new  
    140140    CLEAR (vs_const_conf);
    141141    CLEAR (ps_const_conf);
    142142
    143     dst_obj.bo = radeon_get_pixmap_bo(pPixmap);
     143    dst_obj.bo = radeon_get_pixmap_bo(pPixmap)->bo.radeon;
    144144    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pPixmap);
    145145    dst_obj.surface = radeon_get_pixmap_surface(pPixmap);
    146146
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/r600_exa.c xf86-video-ati-18.0.1/src/r600_exa.c
    old new  
    150150    if (!RADEONValidPM(pm, pPix->drawable.bitsPerPixel))
    151151        RADEON_FALLBACK(("invalid planemask\n"));
    152152
    153     dst.bo = radeon_get_pixmap_bo(pPix);
     153    dst.bo = radeon_get_pixmap_bo(pPix)->bo.radeon;
    154154    dst.tiling_flags = radeon_get_pixmap_tiling(pPix);
    155155    dst.surface = radeon_get_pixmap_surface(pPix);
    156156
     
    534534
    535535    accel_state->same_surface = FALSE;
    536536
    537     src_obj.bo = radeon_get_pixmap_bo(pSrc);
    538     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     537    src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
     538    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    539539    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    540540    src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    541541    src_obj.surface = radeon_get_pixmap_surface(pSrc);
    542542    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    543     if (radeon_get_pixmap_bo(pSrc) == radeon_get_pixmap_bo(pDst))
     543    if (src_obj.bo == dst_obj.bo)
    544544        accel_state->same_surface = TRUE;
    545545
    546546    src_obj.width = pSrc->drawable.width;
     
    575575        accel_state->copy_area_bo = radeon_bo_open(info->bufmgr, 0, size, align,
    576576                                                   RADEON_GEM_DOMAIN_VRAM,
    577577                                                   0);
    578         if (accel_state->copy_area_bo == NULL)
     578        if (!accel_state->copy_area_bo)
    579579            RADEON_FALLBACK(("temp copy surface alloc failed\n"));
    580580       
    581581        radeon_cs_space_add_persistent_bo(info->cs, accel_state->copy_area_bo,
     
    13441344        return FALSE;
    13451345
    13461346    if (pSrc) {
    1347         src_obj.bo = radeon_get_pixmap_bo(pSrc);
     1347        src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
    13481348        src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    13491349        src_obj.surface = radeon_get_pixmap_surface(pSrc);
    13501350        src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8);
     
    13541354        src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT;
    13551355    }
    13561356
    1357     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     1357    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    13581358    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    13591359    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    13601360    dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8);
     
    13681368
    13691369    if (pMaskPicture) {
    13701370        if (pMask) {
    1371             mask_obj.bo = radeon_get_pixmap_bo(pMask);
     1371            mask_obj.bo = radeon_get_pixmap_bo(pMask)->bo.radeon;
    13721372            mask_obj.tiling_flags = radeon_get_pixmap_tiling(pMask);
    13731373            mask_obj.surface = radeon_get_pixmap_surface(pMask);
    13741374            mask_obj.pitch = exaGetPixmapPitch(pMask) / (pMask->drawable.bitsPerPixel / 8);
     
    17001700        return FALSE;
    17011701
    17021702    driver_priv = exaGetPixmapDriverPrivate(pDst);
    1703     if (!driver_priv || !driver_priv->bo)
     1703    if (!driver_priv || !driver_priv->bo->bo.radeon)
    17041704        return FALSE;
    17051705
    17061706    /* If we know the BO won't be busy / in VRAM, don't bother with a scratch */
    1707     copy_dst = driver_priv->bo;
     1707    copy_dst = driver_priv->bo->bo.radeon;
    17081708    copy_pitch = pDst->devKind;
    17091709    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    1710         if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
     1710        if (!radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
    17111711            flush = FALSE;
    1712             if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain) &&
     1712            if (!radeon_bo_is_busy(driver_priv->bo->bo.radeon, &dst_domain) &&
    17131713                !(dst_domain & RADEON_GEM_DOMAIN_VRAM))
    17141714                goto copy;
    17151715        }
     
    17231723    base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0);
    17241724    size = scratch_pitch * height * (bpp / 8);
    17251725    scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0);
    1726     if (scratch == NULL) {
     1726    if (!scratch) {
    17271727        goto copy;
    17281728    }
    17291729
     
    17411741    dst_obj.height = pDst->drawable.height;
    17421742    dst_obj.bpp = bpp;
    17431743    dst_obj.domain = RADEON_GEM_DOMAIN_VRAM;
    1744     dst_obj.bo = radeon_get_pixmap_bo(pDst);
     1744    dst_obj.bo = radeon_get_pixmap_bo(pDst)->bo.radeon;
    17451745    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst);
    17461746    dst_obj.surface = radeon_get_pixmap_surface(pDst);
    17471747
     
    17691769    r = TRUE;
    17701770    size = w * bpp / 8;
    17711771    dst = copy_dst->ptr;
    1772     if (copy_dst == driver_priv->bo)
     1772    if (copy_dst == driver_priv->bo->bo.radeon)
    17731773        dst += y * copy_pitch + x * bpp / 8;
    17741774    for (i = 0; i < h; i++) {
    17751775        memcpy(dst + i * copy_pitch, src, size);
     
    18191819        return FALSE;
    18201820
    18211821    driver_priv = exaGetPixmapDriverPrivate(pSrc);
    1822     if (!driver_priv || !driver_priv->bo)
     1822    if (!driver_priv || !driver_priv->bo->bo.radeon)
    18231823        return FALSE;
    18241824
    18251825    /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */
    1826     copy_src = driver_priv->bo;
     1826    copy_src = driver_priv->bo->bo.radeon;
    18271827    copy_pitch = pSrc->devKind;
    18281828    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    1829         if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
    1830             src_domain = radeon_bo_get_src_domain(driver_priv->bo);
     1829        if (radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
     1830            src_domain = radeon_bo_get_src_domain(driver_priv->bo->bo.radeon);
    18311831            if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) ==
    18321832                (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM))
    18331833                src_domain = 0;
     
    18361836        }
    18371837
    18381838        if (!src_domain)
    1839             radeon_bo_is_busy(driver_priv->bo, &src_domain);
     1839            radeon_bo_is_busy(driver_priv->bo->bo.radeon, &src_domain);
    18401840
    18411841        if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM)
    18421842            goto copy;
     
    18471847    base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0);
    18481848    size = scratch_pitch * height * (bpp / 8);
    18491849    scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0);
    1850     if (scratch == NULL) {
     1850    if (!scratch) {
    18511851        goto copy;
    18521852    }
    18531853    radeon_cs_space_reset_bos(info->cs);
     
    18671867    src_obj.height = pSrc->drawable.height;
    18681868    src_obj.bpp = bpp;
    18691869    src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT;
    1870     src_obj.bo = radeon_get_pixmap_bo(pSrc);
     1870    src_obj.bo = radeon_get_pixmap_bo(pSrc)->bo.radeon;
    18711871    src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
    18721872    src_obj.surface = radeon_get_pixmap_surface(pSrc);
    18731873
     
    19091909    }
    19101910    r = TRUE;
    19111911    w *= bpp / 8;
    1912     if (copy_src == driver_priv->bo)
     1912    if (copy_src == driver_priv->bo->bo.radeon)
    19131913        size = y * copy_pitch + x * bpp / 8;
    19141914    else
    19151915        size = 0;
     
    19601960
    19611961    accel_state->shaders_bo = radeon_bo_open(info->bufmgr, 0, size, 0,
    19621962                                             RADEON_GEM_DOMAIN_VRAM, 0);
    1963     if (accel_state->shaders_bo == NULL) {
     1963    if (!accel_state->shaders_bo) {
    19641964        ErrorF("Allocating shader failed\n");
    19651965        return FALSE;
    19661966    }
     
    20252025    ScrnInfoPtr pScrn =  xf86ScreenToScrn(pScreen);
    20262026    RADEONInfoPtr info   = RADEONPTR(pScrn);
    20272027
    2028     if (info->accel_state->exa == NULL) {
     2028    if (!info->accel_state->exa) {
    20292029        xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map not set up\n");
    20302030        return FALSE;
    20312031    }
     
    20442044    info->accel_state->exa->MarkSync = R600MarkSync;
    20452045    info->accel_state->exa->WaitMarker = R600Sync;
    20462046
    2047     info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap;
    20482047    info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap;
    20492048    info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen;
    20502049    info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS;
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/r600_state.h xf86-video-ati-18.0.1/src/r600_state.h
    old new  
    316316
    317317extern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index);
    318318extern void RADEONFinishAccess_CS(PixmapPtr pPix, int index);
    319 extern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align);
    320319extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
    321320                                    int depth, int usage_hint, int bitsPerPixel,
    322321                                    int *new_pitch);
    323322extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv);
    324 extern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix);
    325323extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix);
    326324extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p);
    327325extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle);
  • src/r600_textured_videofuncs.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/r600_textured_videofuncs.c xf86-video-ati-18.0.1/src/r600_textured_videofuncs.c
    old new  
    152152    CLEAR (vs_conf);
    153153    CLEAR (ps_conf);
    154154
    155     dst_obj.bo = radeon_get_pixmap_bo(pPixmap);
     155    dst_obj.bo = radeon_get_pixmap_bo(pPixmap)->bo.radeon;
    156156    dst_obj.tiling_flags = radeon_get_pixmap_tiling(pPixmap);
    157157    dst_obj.surface = radeon_get_pixmap_surface(pPixmap);
    158158
  • src/radeon_bo_helper.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_bo_helper.c xf86-video-ati-18.0.1/src/radeon_bo_helper.c
    old new  
    2828#include "radeon_glamor.h"
    2929#include "radeon_bo_gem.h"
    3030
     31
     32#ifdef USE_GLAMOR
     33
     34static uint32_t
     35radeon_get_gbm_format(int depth, int bitsPerPixel)
     36{
     37    switch (depth) {
     38#ifdef GBM_FORMAT_R8
     39    case 8:
     40        return GBM_FORMAT_R8;
     41#endif
     42    case 16:
     43        return GBM_FORMAT_RGB565;
     44    case 32:
     45        return GBM_FORMAT_ARGB8888;
     46    case 30:
     47        return GBM_FORMAT_XRGB2101010;
     48    case 24:
     49        if (bitsPerPixel == 32)
     50            return GBM_FORMAT_XRGB8888;
     51        /* fall through */
     52    default:
     53        ErrorF("%s: Unsupported depth/bpp %d/%d\n", __func__, depth,
     54               bitsPerPixel);
     55        return ~0U;
     56    }
     57}
     58
     59#endif /* USE_GLAMOR */
     60
     61
    3162static const unsigned MicroBlockTable[5][3][2] = {
    3263    /*linear  tiled   square-tiled */
    3364    {{32, 1}, {8, 4}, {0, 0}}, /*   8 bits per pixel */
     
    5990    }
    6091}
    6192
     93static unsigned eg_tile_split_opp(unsigned tile_split)
     94{
     95    switch (tile_split) {
     96        case 0:     tile_split = 64;    break;
     97        case 1:     tile_split = 128;   break;
     98        case 2:     tile_split = 256;   break;
     99        case 3:     tile_split = 512;   break;
     100        default:
     101        case 4:     tile_split = 1024;  break;
     102        case 5:     tile_split = 2048;  break;
     103        case 6:     tile_split = 4096;  break;
     104    }
     105    return tile_split;
     106}
     107
     108Bool
     109radeon_surface_initialize(RADEONInfoPtr info, struct radeon_surface *surface,
     110                          int width, int height, int cpp, uint32_t tiling_flags,
     111                          int usage_hint)
     112{
     113        memset(surface, 0, sizeof(struct radeon_surface));
     114
     115        surface->npix_x = width;
     116        /* need to align height to 8 for old kernel */
     117        surface->npix_y = RADEON_ALIGN(height, 8);
     118        surface->npix_z = 1;
     119        surface->blk_w = 1;
     120        surface->blk_h = 1;
     121        surface->blk_d = 1;
     122        surface->array_size = 1;
     123        surface->last_level = 0;
     124        surface->bpe = cpp;
     125        surface->nsamples = 1;
     126        if (height < 128) {
     127            /* disable 2d tiling for small surface to work around
     128             * the fact that ddx align height to 8 pixel for old
     129             * obscure reason i can't remember
     130             */
     131            tiling_flags &= ~RADEON_TILING_MACRO;
     132        }
     133
     134        surface->flags = RADEON_SURF_SCANOUT | RADEON_SURF_HAS_TILE_MODE_INDEX |
     135            RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
     136
     137        if (usage_hint & RADEON_CREATE_PIXMAP_SZBUFFER) {
     138            surface->flags |= RADEON_SURF_ZBUFFER;
     139            surface->flags |= RADEON_SURF_SBUFFER;
     140        }
     141
     142        if ((tiling_flags & RADEON_TILING_MACRO)) {
     143            surface->flags = RADEON_SURF_CLR(surface->flags, MODE);
     144            surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
     145        } else if ((tiling_flags & RADEON_TILING_MICRO)) {
     146            surface->flags = RADEON_SURF_CLR(surface->flags, MODE);
     147            surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
     148        } else
     149            surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR, MODE);
     150
     151        if (info->ChipFamily >= CHIP_FAMILY_CEDAR) {
     152            surface->bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) &
     153                RADEON_TILING_EG_BANKW_MASK;
     154            surface->bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) &
     155                RADEON_TILING_EG_BANKH_MASK;
     156            surface->tile_split = eg_tile_split_opp((tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) &
     157                                                    RADEON_TILING_EG_TILE_SPLIT_MASK);
     158            if (surface->flags & RADEON_SURF_SBUFFER) {
     159                surface->stencil_tile_split =
     160                    (tiling_flags >> RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT) &
     161                    RADEON_TILING_EG_STENCIL_TILE_SPLIT_MASK;
     162            }
     163            surface->mtilea = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) &
     164                RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
     165        }
     166
     167        if (radeon_surface_best(info->surf_man, surface))
     168            return FALSE;
     169
     170        if (radeon_surface_init(info->surf_man, surface))
     171            return FALSE;
     172
     173        return TRUE;
     174}
     175
    62176/* Calculate appropriate tiling and pitch for a pixmap and allocate a BO that
    63177 * can hold it.
    64178 */
    65 struct radeon_bo*
     179struct radeon_buffer *
    66180radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int height, int depth,
    67181                       int usage_hint, int bitsPerPixel, int *new_pitch,
    68182                       struct radeon_surface *new_surface, uint32_t *new_tiling)
     
    73187    int cpp = bitsPerPixel / 8;
    74188    uint32_t tiling = 0, flags = 0;
    75189    struct radeon_surface surface;
    76     struct radeon_bo *bo;
     190    struct radeon_buffer *bo;
    77191    int domain = RADEON_GEM_DOMAIN_VRAM;
     192
     193#ifdef USE_GLAMOR
     194    if (info->use_glamor &&
     195        !(usage_hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP &&
     196          info->shadow_primary)) {
     197        uint32_t bo_use = GBM_BO_USE_RENDERING;
     198        uint32_t gbm_format = radeon_get_gbm_format(depth, bitsPerPixel);
     199
     200        if (gbm_format == ~0U)
     201            return NULL;
     202
     203        bo = calloc(1, sizeof(struct radeon_buffer));
     204        if (!bo)
     205            return NULL;
     206
     207        bo->ref_count = 1;
     208
     209        if (bitsPerPixel == pScrn->bitsPerPixel)
     210            bo_use |= GBM_BO_USE_SCANOUT;
     211
     212        if ((usage_hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP &&
     213             info->shadow_primary) ||
     214            (usage_hint & 0xffff) == CREATE_PIXMAP_USAGE_SHARED)
     215            bo_use |= GBM_BO_USE_LINEAR;
     216
     217        bo->bo.gbm = gbm_bo_create(info->gbm, width, height, gbm_format, bo_use);
     218        if (!bo->bo.gbm) {
     219            free(bo);
     220            return NULL;
     221        }
     222
     223        bo->flags |= RADEON_BO_FLAGS_GBM;
     224
     225        if (new_pitch)
     226            *new_pitch = gbm_bo_get_stride(bo->bo.gbm);
     227
     228        return bo;
     229    }
     230#endif
     231
    78232    if (usage_hint) {
    79233        if (info->allowColorTiling) {
    80234            if (usage_hint & RADEON_CREATE_PIXMAP_TILING_MACRO)
     
    107261    pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(pScrn, cpp, tiling)) * cpp;
    108262    base_align = drmmode_get_base_align(pScrn, cpp, tiling);
    109263    size = RADEON_ALIGN(heighta * pitch, RADEON_GPU_PAGE_SIZE);
    110     memset(&surface, 0, sizeof(struct radeon_surface));
    111264
    112     if (info->ChipFamily >= CHIP_FAMILY_R600 && info->surf_man) {
    113                 if (width) {
    114                         surface.npix_x = width;
    115                         /* need to align height to 8 for old kernel */
    116                         surface.npix_y = RADEON_ALIGN(height, 8);
    117                         surface.npix_z = 1;
    118                         surface.blk_w = 1;
    119                         surface.blk_h = 1;
    120                         surface.blk_d = 1;
    121                         surface.array_size = 1;
    122                         surface.last_level = 0;
    123                         surface.bpe = cpp;
    124                         surface.nsamples = 1;
    125                         if (height < 128) {
    126                                 /* disable 2d tiling for small surface to work around
    127                                  * the fact that ddx align height to 8 pixel for old
    128                                  * obscure reason i can't remember
    129                                  */
    130                                 tiling &= ~RADEON_TILING_MACRO;
    131                         }
    132                         surface.flags = RADEON_SURF_SCANOUT;
    133                         /* we are requiring a recent enough libdrm version */
    134                         surface.flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
    135                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
    136                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR, MODE);
    137                         if ((tiling & RADEON_TILING_MICRO)) {
    138                                 surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    139                                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
    140                         }
    141                         if ((tiling & RADEON_TILING_MACRO)) {
    142                                 surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    143                                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
    144                         }
    145                         if (usage_hint & RADEON_CREATE_PIXMAP_SZBUFFER) {
    146                                 surface.flags |= RADEON_SURF_ZBUFFER;
    147                                 surface.flags |= RADEON_SURF_SBUFFER;
    148                         }
    149                         if (radeon_surface_best(info->surf_man, &surface)) {
    150                                 return NULL;
    151                         }
    152                         if (radeon_surface_init(info->surf_man, &surface)) {
    153                                 return NULL;
    154                         }
    155                         size = surface.bo_size;
    156                         base_align = surface.bo_alignment;
    157                         pitch = surface.level[0].pitch_bytes;
    158                         tiling = 0;
    159                         switch (surface.level[0].mode) {
    160                         case RADEON_SURF_MODE_2D:
    161                                 tiling |= RADEON_TILING_MACRO;
    162                                 tiling |= surface.bankw << RADEON_TILING_EG_BANKW_SHIFT;
    163                                 tiling |= surface.bankh << RADEON_TILING_EG_BANKH_SHIFT;
    164                                 tiling |= surface.mtilea << RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT;
    165                                 if (surface.tile_split)
    166                                         tiling |= eg_tile_split(surface.tile_split) << RADEON_TILING_EG_TILE_SPLIT_SHIFT;
    167                                 tiling |= eg_tile_split(surface.stencil_tile_split) << RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT;
    168                                 break;
    169                         case RADEON_SURF_MODE_1D:
    170                                 tiling |= RADEON_TILING_MICRO;
    171                                 break;
    172                         default:
    173                                 break;
    174                         }
    175                 }
     265    if (width && info->surf_man) {
     266        if (!radeon_surface_initialize(info, &surface, width, height, cpp,
     267                                       tiling, usage_hint))
     268            return NULL;
     269
     270        size = surface.bo_size;
     271        base_align = surface.bo_alignment;
     272        pitch = surface.level[0].pitch_bytes;
     273        tiling = 0;
     274        switch (surface.level[0].mode) {
     275        case RADEON_SURF_MODE_2D:
     276            tiling |= RADEON_TILING_MACRO;
     277            tiling |= surface.bankw << RADEON_TILING_EG_BANKW_SHIFT;
     278            tiling |= surface.bankh << RADEON_TILING_EG_BANKH_SHIFT;
     279            tiling |= surface.mtilea << RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT;
     280            if (surface.tile_split)
     281                tiling |= eg_tile_split(surface.tile_split) << RADEON_TILING_EG_TILE_SPLIT_SHIFT;
     282            if (surface.flags & RADEON_SURF_SBUFFER)
     283                tiling |= eg_tile_split(surface.stencil_tile_split) << RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT;
     284            break;
     285        case RADEON_SURF_MODE_1D:
     286            tiling |= RADEON_TILING_MICRO;
     287            break;
     288        default:
     289            break;
    176290        }
    177291
     292        if (new_surface)
     293            *new_surface = surface;
     294    }
     295
    178296    if (tiling)
    179297        flags |= RADEON_GEM_NO_CPU_ACCESS;
    180298
    181     bo = radeon_bo_open(info->bufmgr, 0, size, base_align,
    182                         domain, flags);
     299    bo = calloc(1, sizeof(struct radeon_buffer));
     300    if (!bo)
     301        return NULL;
     302
     303    bo->ref_count = 1;
     304    bo->bo.radeon = radeon_bo_open(info->bufmgr, 0, size, base_align,
     305                                   domain, flags);
    183306
    184     if (bo && tiling && radeon_bo_set_tiling(bo, tiling, pitch) == 0)
     307    if (bo && tiling && radeon_bo_set_tiling(bo->bo.radeon, tiling, pitch) == 0)
    185308        *new_tiling = tiling;
    186309
    187     *new_surface = surface;
    188310    *new_pitch = pitch;
    189311    return bo;
    190312}
    191313
     314
     315/* Flush and wait for the BO to become idle */
     316void
     317radeon_finish(ScrnInfoPtr scrn, struct radeon_buffer *bo)
     318{
     319    RADEONInfoPtr info = RADEONPTR(scrn);
     320
     321    if (info->use_glamor) {
     322        radeon_glamor_finish(scrn);
     323        return;
     324    }
     325
     326    radeon_cs_flush_indirect(scrn);
     327    radeon_bo_wait(bo->bo.radeon);
     328}
     329
     330
    192331/* Clear the pixmap contents to black */
    193332void
    194333radeon_pixmap_clear(PixmapPtr pixmap)
     
    213352/* Get GEM handle for the pixmap */
    214353Bool radeon_get_pixmap_handle(PixmapPtr pixmap, uint32_t *handle)
    215354{
    216     struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
     355    struct radeon_buffer *bo = radeon_get_pixmap_bo(pixmap);
    217356#ifdef USE_GLAMOR
    218357    ScreenPtr screen = pixmap->drawable.pScreen;
    219358    ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     
    221360    RADEONInfoPtr info = RADEONPTR(scrn);
    222361#endif
    223362
    224     if (bo) {
    225         *handle = bo->handle;
     363    if (bo && !(bo->flags & RADEON_BO_FLAGS_GBM)) {
     364        *handle = bo->bo.radeon->handle;
    226365        return TRUE;
    227366    }
    228367
     
    305444    return TRUE;
    306445}
    307446
    308 static unsigned eg_tile_split_opp(unsigned tile_split)
    309 {
    310     switch (tile_split) {
    311         case 0:     tile_split = 64;    break;
    312         case 1:     tile_split = 128;   break;
    313         case 2:     tile_split = 256;   break;
    314         case 3:     tile_split = 512;   break;
    315         default:
    316         case 4:     tile_split = 1024;  break;
    317         case 5:     tile_split = 2048;  break;
    318         case 6:     tile_split = 4096;  break;
    319     }
    320     return tile_split;
    321 }
    322 
    323447Bool radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
    324448                                      struct radeon_surface *surface)
    325449{
    326450    ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
    327451    RADEONInfoPtr info = RADEONPTR(pScrn);
    328     struct radeon_bo *bo;
     452    struct radeon_buffer *bo;
    329453    int ihandle = (int)(long)fd_handle;
    330454    uint32_t size = ppix->devKind * ppix->drawable.height;
    331455    Bool ret = FALSE;
    332456
    333     bo = radeon_gem_bo_open_prime(info->bufmgr, ihandle, size);
     457    bo = (struct radeon_buffer *)calloc(1, sizeof(struct radeon_buffer));
    334458    if (!bo)
    335         goto error;
     459        goto error;
    336460
    337     memset(surface, 0, sizeof(struct radeon_surface));
     461#ifdef USE_GLAMOR
     462    if (info->use_glamor) {
     463        struct gbm_import_fd_data data;
     464        uint32_t bo_use = GBM_BO_USE_RENDERING;
     465
     466        data.format = radeon_get_gbm_format(ppix->drawable.depth,
     467                                            ppix->drawable.bitsPerPixel);
     468        if (data.format == ~0U)
     469            goto error;
    338470
     471        bo->ref_count = 1;
     472
     473        data.fd = ihandle;
     474        data.width = ppix->drawable.width;
     475        data.height = ppix->drawable.height;
     476        data.stride = ppix->devKind;
     477
     478        if (ppix->drawable.bitsPerPixel == pScrn->bitsPerPixel)
     479            bo_use |= GBM_BO_USE_SCANOUT;
     480
     481        bo->bo.gbm = gbm_bo_import(info->gbm, GBM_BO_IMPORT_FD, &data, bo_use);
     482        if (!bo->bo.gbm)
     483            goto error;
     484
     485        bo->flags |= RADEON_BO_FLAGS_GBM;
     486
     487        if (!radeon_glamor_create_textured_pixmap(ppix, bo)) {
     488            radeon_buffer_unref(&bo);
     489            return FALSE;
     490        }
     491
     492        ret = radeon_set_pixmap_bo(ppix, bo);
     493        /* radeon_set_pixmap_bo increments ref_count if it succeeds */
     494        radeon_buffer_unref(&bo);
     495        return ret;
     496    }
     497#endif
     498
     499    bo->bo.radeon = radeon_gem_bo_open_prime(info->bufmgr, ihandle, size);
     500    if (!bo)
     501        goto error;
     502
     503    bo->ref_count = 1;
    339504    ret = radeon_set_pixmap_bo(ppix, bo);
    340505    if (!ret)
    341506        goto error;
    342507
    343     if (info->ChipFamily >= CHIP_FAMILY_R600 && info->surf_man) {
     508    if (surface) {
     509        struct radeon_exa_pixmap_priv *driver_priv;
    344510        uint32_t tiling_flags;
    345511
    346 #ifdef USE_GLAMOR
    347         if (info->use_glamor) {
    348             tiling_flags = radeon_get_pixmap_private(ppix)->tiling_flags;
    349         } else
    350 #endif
    351         {
    352             struct radeon_exa_pixmap_priv *driver_priv;
    353 
    354             driver_priv = exaGetPixmapDriverPrivate(ppix);
    355             tiling_flags = driver_priv->tiling_flags;
    356         }
     512        driver_priv = exaGetPixmapDriverPrivate(ppix);
     513        tiling_flags = driver_priv->tiling_flags;
    357514
    358         surface->npix_x = ppix->drawable.width;
    359         surface->npix_y = ppix->drawable.height;
    360         surface->npix_z = 1;
    361         surface->blk_w = 1;
    362         surface->blk_h = 1;
    363         surface->blk_d = 1;
    364         surface->array_size = 1;
    365         surface->bpe = ppix->drawable.bitsPerPixel / 8;
    366         surface->nsamples = 1;
    367         /* we are requiring a recent enough libdrm version */
    368         surface->flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
    369         surface->flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
    370         if (tiling_flags & RADEON_TILING_MACRO)
    371             surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
    372         else if (tiling_flags & RADEON_TILING_MICRO)
    373             surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
    374         else
    375             surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR_ALIGNED, MODE);
    376         surface->bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK;
    377         surface->bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK;
    378         surface->tile_split = eg_tile_split_opp((tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK);
    379         surface->stencil_tile_split = (tiling_flags >> RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_STENCIL_TILE_SPLIT_MASK;
    380         surface->mtilea = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
    381         if (radeon_surface_best(info->surf_man, surface)) {
    382             ret = FALSE;
    383             goto error;
    384         }
    385         if (radeon_surface_init(info->surf_man, surface)) {
     515        if (!radeon_surface_initialize(info, surface, ppix->drawable.width,
     516                                       ppix->drawable.height,
     517                                       ppix->drawable.bitsPerPixel / 8,
     518                                       tiling_flags, 0)) {
    386519            ret = FALSE;
    387520            goto error;
    388521        }
     522
    389523        /* we have to post hack the surface to reflect the actual size
    390524           of the shared pixmap */
    391525        surface->level[0].pitch_bytes = ppix->devKind;
     
    396530    close(ihandle);
    397531    /* we have a reference from the alloc and one from set pixmap bo,
    398532       drop one */
    399     radeon_bo_unref(bo);
     533    radeon_buffer_unref(&bo);
    400534    return ret;
    401535}
  • src/radeon_bo_helper.h

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_bo_helper.h xf86-video-ati-18.0.1/src/radeon_bo_helper.h
    old new  
    2323#ifndef RADEON_BO_HELPER_H
    2424#define RADEON_BO_HELPER_H 1
    2525
    26 extern struct radeon_bo*
     26#ifdef USE_GLAMOR
     27#include <gbm.h>
     28#endif
     29
     30#define RADEON_BO_FLAGS_GBM     0x1
     31
     32struct radeon_buffer {
     33        union {
     34#ifdef USE_GLAMOR
     35                struct gbm_bo *gbm;
     36#endif
     37                struct radeon_bo *radeon;
     38        } bo;
     39        uint32_t ref_count;
     40    uint32_t flags;
     41};
     42
     43extern struct radeon_buffer *
    2744radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int height, int depth,
    2845                       int usage_hint, int bitsPerPixel, int *new_pitch,
    2946                       struct radeon_surface *new_surface, uint32_t *new_tiling);
    3047
    3148extern void
     49radeon_finish(ScrnInfoPtr scrn, struct radeon_buffer *bo);
     50
     51extern void
    3252radeon_pixmap_clear(PixmapPtr pixmap);
    3353
    3454extern uint32_t
     
    5777        return drawable->pScreen->GetWindowPixmap((WindowPtr)drawable);
    5878}
    5979
     80static inline void
     81radeon_buffer_ref(struct radeon_buffer *buffer)
     82{
     83    buffer->ref_count++;
     84}
     85
     86static inline void
     87radeon_buffer_unref(struct radeon_buffer **buffer)
     88{
     89    struct radeon_buffer *buf = *buffer;
     90
     91    if (!buf)
     92        return;
     93
     94    if (buf->ref_count > 1) {
     95        buf->ref_count--;
     96        return;
     97    }
     98
     99#ifdef USE_GLAMOR
     100    if (buf->flags & RADEON_BO_FLAGS_GBM) {
     101        gbm_bo_destroy(buf->bo.gbm);
     102    } else
     103#endif
     104    {
     105        radeon_bo_unmap(buf->bo.radeon);
     106        radeon_bo_unref(buf->bo.radeon);
     107    }
     108
     109    free(buf);
     110    *buffer = NULL;
     111}
     112
    60113#endif /* RADEON_BO_HELPER_H */
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_dri2.c xf86-video-ati-18.0.1/src/radeon_dri2.c
    old new  
    7979static Bool
    8080radeon_get_flink_name(RADEONEntPtr pRADEONEnt, PixmapPtr pixmap, uint32_t *name)
    8181{
    82     struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
     82    struct radeon_buffer *bo = radeon_get_pixmap_bo(pixmap);
    8383    struct drm_gem_flink flink;
    8484
    85     if (bo)
    86         return radeon_gem_get_kernel_name(bo, name) == 0;
     85    if (bo && !(bo->flags & RADEON_BO_FLAGS_GBM) &&
     86        radeon_gem_get_kernel_name(bo->bo.radeon, name) == 0)
     87        return TRUE;
    8788
    8889    if (radeon_get_pixmap_handle(pixmap, &flink.handle)) {
    8990        if (drmIoctl(pRADEONEnt->fd, DRM_IOCTL_GEM_FLINK, &flink) != 0)
     
    233234                                          flags | RADEON_CREATE_PIXMAP_DRI2);
    234235    }
    235236
     237    if (!pixmap)
     238        return NULL;
     239
    236240    buffers = calloc(1, sizeof *buffers);
    237     if (buffers == NULL)
     241    if (!buffers)
    238242        goto error;
    239243
    240     if (pixmap) {
    241         if (!info->use_glamor) {
    242             info->exa_force_create = TRUE;
    243             exaMoveInPixmap(pixmap);
    244             info->exa_force_create = FALSE;
    245             if (exaGetPixmapDriverPrivate(pixmap) == NULL) {
    246                 /* this happen if pixmap is non accelerable */
    247                 goto error;
    248             }
    249         } else if (is_glamor_pixmap) {
    250             pixmap = radeon_glamor_set_pixmap_bo(drawable, pixmap);
    251             pixmap->refcnt++;
    252         }
    253 
    254         if (!radeon_get_flink_name(pRADEONEnt, pixmap, &buffers->name))
     244    if (!info->use_glamor) {
     245        info->exa_force_create = TRUE;
     246        exaMoveInPixmap(pixmap);
     247        info->exa_force_create = FALSE;
     248        if (!exaGetPixmapDriverPrivate(pixmap)) {
     249            /* this happen if pixmap is non accelerable */
    255250            goto error;
     251        }
     252    } else if (is_glamor_pixmap) {
     253        pixmap = radeon_glamor_set_pixmap_bo(drawable, pixmap);
     254        pixmap->refcnt++;
    256255    }
    257256
     257    if (!radeon_get_flink_name(pRADEONEnt, pixmap, &buffers->name))
     258        goto error;
     259
    258260    privates = calloc(1, sizeof(struct dri2_buffer_priv));
    259     if (privates == NULL)
     261    if (!privates)
    260262        goto error;
    261263
    262264    buffers->attachment = attachment;
    263     if (pixmap) {
    264         buffers->pitch = pixmap->devKind;
    265         buffers->cpp = cpp;
    266     }
     265    buffers->pitch = pixmap->devKind;
     266    buffers->cpp = cpp;
    267267    buffers->driverPrivate = privates;
    268268    buffers->format = format;
    269269    buffers->flags = 0; /* not tiled */
     
    275275
    276276error:
    277277    free(buffers);
    278     if (pixmap)
    279         (*pScreen->DestroyPixmap)(pixmap);
     278    (*pScreen->DestroyPixmap)(pixmap);
    280279    return NULL;
    281280}
    282281
     
    338337    Bool vsync;
    339338    Bool translate = FALSE;
    340339    int off_x = 0, off_y = 0;
    341     PixmapPtr dst_ppix;
    342340
    343     dst_ppix = dst_private->pixmap;
    344341    src_drawable = &src_private->pixmap->drawable;
    345342    dst_drawable = &dst_private->pixmap->drawable;
    346343
     
    357354            dst_drawable = DRI2UpdatePrime(drawable, dest_buffer);
    358355            if (!dst_drawable)
    359356                return;
    360             dst_ppix = (PixmapPtr)dst_drawable;
    361357            if (dst_drawable != drawable)
    362358                translate = TRUE;
    363359        } else
     
    381377    (*gc->funcs->ChangeClip) (gc, CT_REGION, copy_clip, 0);
    382378    ValidateGC(dst_drawable, gc);
    383379
    384     /* If this is a full buffer swap or frontbuffer flush, throttle on the
    385      * previous one
    386      */
    387     if (dst_private->attachment == DRI2BufferFrontLeft) {
    388         if (REGION_NUM_RECTS(region) == 1) {
    389             BoxPtr extents = REGION_EXTENTS(pScreen, region);
    390 
    391             if (extents->x1 == 0 && extents->y1 == 0 &&
    392                 extents->x2 == drawable->width &&
    393                 extents->y2 == drawable->height) {
    394                 struct radeon_bo *bo = radeon_get_pixmap_bo(dst_ppix);
    395 
    396                 if (bo)
    397                     radeon_bo_wait(bo);
    398             }
    399         }
    400     }
    401 
    402380    vsync = info->accel_state->vsync;
    403 
    404381    /* Driver option "SwapbuffersWait" defines if we vsync DRI2 copy-swaps. */
    405382    info->accel_state->vsync = info->swapBuffersWait;
    406383    info->accel_state->force = TRUE;
     
    743720{
    744721    struct dri2_buffer_priv *front_priv = front->driverPrivate;
    745722    struct dri2_buffer_priv *back_priv = back->driverPrivate;
    746     struct radeon_bo *front_bo, *back_bo;
    747     ScreenPtr screen;
    748     RADEONInfoPtr info;
     723    ScreenPtr screen = draw->pScreen;
     724    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen));
    749725    RegionRec region;
    750726    int tmp;
    751727
     
    760736    front->name = back->name;
    761737    back->name = tmp;
    762738
    763     /* Swap pixmap bos */
    764     front_bo = radeon_get_pixmap_bo(front_priv->pixmap);
    765     back_bo = radeon_get_pixmap_bo(back_priv->pixmap);
    766     radeon_set_pixmap_bo(front_priv->pixmap, back_bo);
    767     radeon_set_pixmap_bo(back_priv->pixmap, front_bo);
    768 
    769     /* Do we need to update the Screen? */
    770     screen = draw->pScreen;
    771     info = RADEONPTR(xf86ScreenToScrn(screen));
    772     if (front_bo == info->front_bo) {
    773         radeon_bo_ref(back_bo);
    774         radeon_bo_unref(info->front_bo);
    775         info->front_bo = back_bo;
    776         radeon_set_pixmap_bo(screen->GetScreenPixmap(screen), back_bo);
    777     }
     739    /* Swap pixmap privates */
     740#ifdef USE_GLAMOR
     741    if (info->use_glamor) {
     742        struct radeon_pixmap *front_pix, *back_pix;
     743
     744        front_pix = radeon_get_pixmap_private(front_priv->pixmap);
     745        back_pix = radeon_get_pixmap_private(back_priv->pixmap);
     746        radeon_set_pixmap_private(front_priv->pixmap, back_pix);
     747        radeon_set_pixmap_private(back_priv->pixmap, front_pix);
     748
     749        radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
     750    } else
     751#endif
     752    {
     753        struct radeon_exa_pixmap_priv driver_priv = *(struct radeon_exa_pixmap_priv*)
     754            exaGetPixmapDriverPrivate(front_priv->pixmap);
    778755
    779     radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
     756        *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(front_priv->pixmap) =
     757            *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap);
     758        *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap) =
     759            driver_priv;
     760    }
    780761
    781762    DamageRegionProcessPending(&front_priv->pixmap->drawable);
    782763}
     
    942923    xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE);
    943924
    944925    /* Drawable not displayed, make up a value */
    945     if (crtc == NULL) {
     926    if (!crtc) {
    946927        *ust = 0;
    947928        *msc = 0;
    948929        return TRUE;
     
    987968
    988969    scrn = crtc->scrn;
    989970    pRADEONEnt = RADEONEntPriv(scrn);
     971    drmmode_crtc = event_info->crtc->driver_private;
    990972    ret = drmmode_get_current_ust(pRADEONEnt->fd, &drm_now);
    991973    if (ret) {
    992974        xf86DrvMsg(scrn->scrnIndex, X_ERROR,
    993975                   "%s cannot get current time\n", __func__);
    994976        if (event_info->drm_queue_seq)
    995             radeon_drm_queue_handler(pRADEONEnt->fd, 0, 0, 0,
    996                                      (void*)event_info->drm_queue_seq);
     977            drmmode_crtc->drmmode->event_context.
     978                vblank_handler(pRADEONEnt->fd, 0, 0, 0,
     979                               (void*)event_info->drm_queue_seq);
    997980        else
    998981            radeon_dri2_frame_event_handler(crtc, 0, 0, data);
    999982        return 0;
     
    1002985     * calculate the frame number from current time
    1003986     * that would come from CRTC if it were running
    1004987     */
    1005     drmmode_crtc = event_info->crtc->driver_private;
    1006988    delta_t = drm_now - (CARD64)drmmode_crtc->dpms_last_ust;
    1007989    delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
    1008990    delta_seq /= 1000000;
    1009991    frame = (CARD64)drmmode_crtc->dpms_last_seq + delta_seq;
    1010992    if (event_info->drm_queue_seq)
    1011         radeon_drm_queue_handler(pRADEONEnt->fd, frame, drm_now / 1000000,
    1012                                  drm_now % 1000000,
    1013                                  (void*)event_info->drm_queue_seq);
     993        drmmode_crtc->drmmode->event_context.
     994            vblank_handler(pRADEONEnt->fd, frame, drm_now / 1000000,
     995                           drm_now % 1000000,
     996                           (void*)event_info->drm_queue_seq);
    1014997    else
    1015998        radeon_dri2_frame_event_handler(crtc, frame, drm_now, data);
    1016999    return 0;
     
    10531036    remainder &= 0xffffffff;
    10541037
    10551038    /* Drawable not visible, return immediately */
    1056     if (crtc == NULL)
     1039    if (!crtc)
    10571040        goto out_complete;
    10581041
    10591042    msc_delta = radeon_get_msc_delta(draw, crtc);
     
    12121195    radeon_dri2_ref_buffer(back);
    12131196
    12141197    /* either off-screen or CRTC not usable... just complete the swap */
    1215     if (crtc == NULL)
     1198    if (!crtc)
    12161199        goto blit_fallback;
    12171200
    12181201    msc_delta = radeon_get_msc_delta(draw, crtc);
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_dri3.c xf86-video-ati-18.0.1/src/radeon_dri3.c
    old new  
    169169
    170170                        if (priv) {
    171171                                radeon_set_pixmap_private(pixmap, priv);
     172                                pixmap->usage_hint |= RADEON_CREATE_PIXMAP_DRI2;
    172173                                return pixmap;
    173174                        }
    174175
     
    213214{
    214215        struct radeon_bo *bo;
    215216        int fd;
    216 
    217         bo = radeon_get_pixmap_bo(pixmap);
    218         if (!bo) {
    219217#ifdef USE_GLAMOR
    220                 ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
    221                 RADEONInfoPtr info = RADEONPTR(scrn);
     218        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     219        RADEONInfoPtr info = RADEONPTR(scrn);
    222220
    223                 if (info->use_glamor)
    224                         return glamor_fd_from_pixmap(screen, pixmap, stride, size);
     221        if (info->use_glamor)
     222                return glamor_fd_from_pixmap(screen, pixmap, stride, size);
    225223#endif
    226224
     225        bo = radeon_get_pixmap_bo(pixmap)->bo.radeon;
     226        if (!bo) {
    227227                exaMoveInPixmap(pixmap);
    228                 bo = radeon_get_pixmap_bo(pixmap);
     228                bo = radeon_get_pixmap_bo(pixmap)->bo.radeon;
    229229                if (!bo)
    230230                        return -1;
    231231        }
  • src/radeon_drm_queue.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_drm_queue.c xf86-video-ati-18.0.1/src/radeon_drm_queue.c
    old new  
    4040
    4141struct radeon_drm_queue_entry {
    4242    struct xorg_list list;
     43    uint64_t usec;
    4344    uint64_t id;
    4445    uintptr_t seq;
    4546    void *data;
     
    4748    xf86CrtcPtr crtc;
    4849    radeon_drm_handler_proc handler;
    4950    radeon_drm_abort_proc abort;
     51    unsigned int frame;
    5052};
    5153
    5254static int radeon_drm_queue_refcnt;
    5355static struct xorg_list radeon_drm_queue;
     56static struct xorg_list radeon_drm_flip_signalled;
     57static struct xorg_list radeon_drm_vblank_signalled;
    5458static uintptr_t radeon_drm_queue_seq;
    5559
    5660
    5761/*
    58  * Handle a DRM event
     62 * Process a DRM event
    5963 */
    60 void
    61 radeon_drm_queue_handler(int fd, unsigned int frame, unsigned int sec,
    62                          unsigned int usec, void *user_ptr)
     64static void
     65radeon_drm_queue_handle_one(struct radeon_drm_queue_entry *e)
    6366{
    64         uintptr_t seq = (uintptr_t)user_ptr;
    65         struct radeon_drm_queue_entry *e, *tmp;
     67    xorg_list_del(&e->list);
     68    if (e->handler) {
     69        e->handler(e->crtc, e->frame, e->usec, e->data);
     70    } else
     71        e->abort(e->crtc, e->data);
     72    free(e);
     73}
     74
     75static void
     76radeon_drm_queue_handler(struct xorg_list *signalled, unsigned int frame,
     77                         unsigned int sec, unsigned int usec, void *user_ptr)
     78{
     79    uintptr_t seq = (uintptr_t)user_ptr;
     80    struct radeon_drm_queue_entry *e, *tmp;
    6681
    67         xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
    68                 if (e->seq == seq) {
    69                         xorg_list_del(&e->list);
    70                         if (e->handler)
    71                                 e->handler(e->crtc, frame,
    72                                            (uint64_t)sec * 1000000 + usec,
    73                                            e->data);
    74                         else
    75                                 e->abort(e->crtc, e->data);
    76                         free(e);
    77                         break;
    78                 }
     82    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
     83        if (e->seq == seq) {
     84            if (!e->handler) {
     85                e->abort(e->crtc, e->data);
     86                break;
     87            }
     88
     89            xorg_list_del(&e->list);
     90            e->usec = (uint64_t)sec * 1000000 + usec;
     91            e->frame = frame;
     92            xorg_list_append(&e->list, signalled);
     93            break;
    7994        }
     95    }
     96}
     97
     98/*
     99 * Signal a DRM page flip event
     100 */
     101static void
     102radeon_drm_page_flip_handler(int fd, unsigned int frame, unsigned int sec,
     103                             unsigned int usec, void *user_ptr)
     104{
     105    radeon_drm_queue_handler(&radeon_drm_flip_signalled, frame, sec, usec,
     106                             user_ptr);
     107}
     108
     109/*
     110 * Signal a DRM vblank event
     111 */
     112static void
     113radeon_drm_vblank_handler(int fd, unsigned int frame, unsigned int sec,
     114                          unsigned int usec, void *user_ptr)
     115{
     116    radeon_drm_queue_handler(&radeon_drm_vblank_signalled, frame, sec, usec,
     117                             user_ptr);
     118}
     119
     120/*
     121 * Handle deferred DRM vblank events
     122 *
     123 * This function must be called after radeon_drm_wait_pending_flip, once
     124 * it's safe to attempt queueing a flip again
     125 */
     126void
     127radeon_drm_queue_handle_deferred(xf86CrtcPtr crtc)
     128{
     129    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     130    struct radeon_drm_queue_entry *e, *tmp;
     131
     132    if (drmmode_crtc->wait_flip_nesting_level == 0 ||
     133        --drmmode_crtc->wait_flip_nesting_level > 0)
     134        return;
     135
     136    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_vblank_signalled, list) {
     137        drmmode_crtc_private_ptr drmmode_crtc = e->crtc->driver_private;
     138
     139        if (drmmode_crtc->wait_flip_nesting_level == 0)
     140            radeon_drm_queue_handle_one(e);
     141    }
    80142}
    81143
    82144/*
     
    150212{
    151213    struct radeon_drm_queue_entry *e, *tmp;
    152214
     215    if (seq == RADEON_DRM_QUEUE_ERROR)
     216        return;
     217
     218    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_vblank_signalled, list) {
     219        if (e->seq == seq) {
     220            radeon_drm_abort_one(e);
     221            return;
     222        }
     223    }
     224
    153225    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
    154226        if (e->seq == seq) {
    155227            radeon_drm_abort_one(e);
     
    175247}
    176248
    177249/*
     250 * drmHandleEvent wrapper
     251 */
     252int
     253radeon_drm_handle_event(int fd, drmEventContext *event_context)
     254{
     255    struct radeon_drm_queue_entry *e, *tmp;
     256    int r;
     257
     258    r = drmHandleEvent(fd, event_context);
     259
     260    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_flip_signalled, list)
     261        radeon_drm_queue_handle_one(e);
     262
     263    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_vblank_signalled, list) {
     264        drmmode_crtc_private_ptr drmmode_crtc = e->crtc->driver_private;
     265
     266        if (drmmode_crtc->wait_flip_nesting_level == 0)
     267            radeon_drm_queue_handle_one(e);
     268    }
     269
     270    return r;
     271}
     272
     273/*
     274 * Wait for pending page flip on given CRTC to complete
     275 */
     276void radeon_drm_wait_pending_flip(xf86CrtcPtr crtc)
     277{
     278    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     279    RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
     280    struct radeon_drm_queue_entry *e, *tmp;
     281
     282    drmmode_crtc->wait_flip_nesting_level++;
     283
     284    xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_flip_signalled, list)
     285        radeon_drm_queue_handle_one(e);
     286
     287    while (drmmode_crtc->flip_pending
     288           && radeon_drm_handle_event(pRADEONEnt->fd,
     289                                          &drmmode_crtc->drmmode->event_context) > 0);
     290}
     291
     292/*
    178293 * Initialize the DRM event queue
    179294 */
    180295void
    181 radeon_drm_queue_init()
     296radeon_drm_queue_init(ScrnInfoPtr scrn)
    182297{
     298    RADEONInfoPtr info = RADEONPTR(scrn);
     299    drmmode_ptr drmmode = &info->drmmode;
     300
     301    drmmode->event_context.version = 2;
     302    drmmode->event_context.vblank_handler = radeon_drm_vblank_handler;
     303    drmmode->event_context.page_flip_handler = radeon_drm_page_flip_handler;
     304
    183305    if (radeon_drm_queue_refcnt++)
    184306        return;
    185307
    186308    xorg_list_init(&radeon_drm_queue);
     309    xorg_list_init(&radeon_drm_flip_signalled);
     310    xorg_list_init(&radeon_drm_vblank_signalled);
    187311}
    188312
    189313/*
  • src/radeon_drm_queue.h

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_drm_queue.h xf86-video-ati-18.0.1/src/radeon_drm_queue.h
    old new  
    4040                                        uint64_t usec, void *data);
    4141typedef void (*radeon_drm_abort_proc)(xf86CrtcPtr crtc, void *data);
    4242
    43 void radeon_drm_queue_handler(int fd, unsigned int frame,
    44                               unsigned int tv_sec, unsigned int tv_usec,
    45                               void *user_ptr);
     43void radeon_drm_queue_handle_deferred(xf86CrtcPtr crtc);
    4644uintptr_t radeon_drm_queue_alloc(xf86CrtcPtr crtc, ClientPtr client,
    4745                                 uint64_t id, void *data,
    4846                                 radeon_drm_handler_proc handler,
     
    5048void radeon_drm_abort_client(ClientPtr client);
    5149void radeon_drm_abort_entry(uintptr_t seq);
    5250void radeon_drm_abort_id(uint64_t id);
    53 void radeon_drm_queue_init();
     51int radeon_drm_handle_event(int fd, drmEventContext *event_context);
     52void radeon_drm_wait_pending_flip(xf86CrtcPtr crtc);
     53void radeon_drm_queue_init(ScrnInfoPtr scrn);
    5454void radeon_drm_queue_close(ScrnInfoPtr scrn);
    5555
    5656#endif /* _RADEON_DRM_QUEUE_H_ */
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_exa.c xf86-video-ati-18.0.1/src/radeon_exa.c
    old new  
    150150 */
    151151Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t)
    152152{
    153         if (t == NULL)
     153        if (!t)
    154154                return TRUE;
    155155        /* the shaders don't handle scaling either */
    156156        return t->matrix[2][0] == 0 && t->matrix[2][1] == 0 && t->matrix[2][2] == IntToxFixed(1);
     
    184184        return FALSE;
    185185
    186186    /* if we have more refs than just the BO then flush */
    187     if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
     187    if (radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
    188188        flush = TRUE;
    189189
    190190        if (can_fail) {
    191             possible_domains = radeon_bo_get_src_domain(driver_priv->bo);
     191            possible_domains = radeon_bo_get_src_domain(driver_priv->bo->bo.radeon);
    192192            if (possible_domains == RADEON_GEM_DOMAIN_VRAM)
    193193                return FALSE; /* use DownloadFromScreen */
    194194        }
     
    196196
    197197    /* if the BO might end up in VRAM, prefer DownloadFromScreen */
    198198    if (can_fail && (possible_domains & RADEON_GEM_DOMAIN_VRAM)) {
    199         radeon_bo_is_busy(driver_priv->bo, &current_domain);
     199        radeon_bo_is_busy(driver_priv->bo->bo.radeon, &current_domain);
    200200
    201201        if (current_domain & possible_domains) {
    202202            if (current_domain == RADEON_GEM_DOMAIN_VRAM)
     
    209209        radeon_cs_flush_indirect(pScrn);
    210210   
    211211    /* flush IB */
    212     ret = radeon_bo_map(driver_priv->bo, 1);
     212    ret = radeon_bo_map(driver_priv->bo->bo.radeon, 1);
    213213    if (ret) {
    214214      FatalError("failed to map pixmap %d\n", ret);
    215215      return FALSE;
    216216    }
    217217    driver_priv->bo_mapped = TRUE;
    218218
    219     pPix->devPrivate.ptr = driver_priv->bo->ptr;
     219    pPix->devPrivate.ptr = driver_priv->bo->bo.radeon->ptr;
    220220
    221221    return TRUE;
    222222}
     
    229229    if (!driver_priv || !driver_priv->bo_mapped)
    230230        return;
    231231
    232     radeon_bo_unmap(driver_priv->bo);
     232    radeon_bo_unmap(driver_priv->bo->bo.radeon);
    233233    driver_priv->bo_mapped = FALSE;
    234234    pPix->devPrivate.ptr = NULL;
    235235}
    236236
    237237
    238 void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align)
    239 {
    240     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    241     RADEONInfoPtr info = RADEONPTR(pScrn);
    242     struct radeon_exa_pixmap_priv *new_priv;
    243 
    244     if (size != 0 && !info->exa_force_create &&
    245         info->exa_pixmaps == FALSE)
    246         return NULL;
    247            
    248     new_priv = calloc(1, sizeof(struct radeon_exa_pixmap_priv));
    249     if (!new_priv)
    250         return NULL;
    251 
    252     if (size == 0)
    253         return new_priv;
    254 
    255     new_priv->bo = radeon_bo_open(info->bufmgr, 0, size, align,
    256                                   RADEON_GEM_DOMAIN_VRAM, 0);
    257     if (!new_priv->bo) {
    258         free(new_priv);
    259         ErrorF("Failed to alloc memory\n");
    260         return NULL;
    261     }
    262    
    263     return new_priv;
    264 
    265 }
    266 
    267238void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
    268239                             int depth, int usage_hint, int bitsPerPixel,
    269240                             int *new_pitch)
     
    306277    if (!driverPriv)
    307278      return;
    308279
    309     if (driver_priv->bo)
    310         radeon_bo_unref(driver_priv->bo);
     280    radeon_buffer_unref(&driver_priv->bo);
    311281    drmmode_fb_reference(pRADEONEnt->fd, &driver_priv->fb, NULL);
    312282    free(driverPriv);
    313283}
     
    316286{
    317287    struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(ppix);
    318288
    319     if (!radeon_share_pixmap_backing(driver_priv->bo, fd_handle))
     289    if (!radeon_share_pixmap_backing(driver_priv->bo->bo.radeon, fd_handle))
    320290        return FALSE;
    321291
    322292    driver_priv->shared = TRUE;
  • src/radeon_exa_funcs.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_exa_funcs.c xf86-video-ati-18.0.1/src/radeon_exa_funcs.c
    old new  
    138138    radeon_cs_space_reset_bos(info->cs);
    139139
    140140    driver_priv = exaGetPixmapDriverPrivate(pPix);
    141     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
     141    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     142                                      RADEON_GEM_DOMAIN_VRAM);
    142143
    143144    ret = radeon_cs_space_check(info->cs);
    144145    if (ret)
     
    146147
    147148    driver_priv = exaGetPixmapDriverPrivate(pPix);
    148149    if (driver_priv) {
    149         info->state_2d.dst_bo = driver_priv->bo;
     150        info->state_2d.dst_bo = driver_priv->bo->bo.radeon;
    150151        info->state_2d.dst_domain = driver_priv->shared ? RADEON_GEM_DOMAIN_GTT : RADEON_GEM_DOMAIN_VRAM;
    151152    }
    152153
     
    256257    radeon_cs_space_reset_bos(info->cs);
    257258
    258259    driver_priv = exaGetPixmapDriverPrivate(pSrc);
    259     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    260     info->state_2d.src_bo = driver_priv->bo;
     260    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon,
     261                                      RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
     262    info->state_2d.src_bo = driver_priv->bo->bo.radeon;
    261263
    262264    driver_priv = exaGetPixmapDriverPrivate(pDst);
    263     info->state_2d.dst_bo = driver_priv->bo;
     265    info->state_2d.dst_bo = driver_priv->bo->bo.radeon;
    264266    info->state_2d.dst_domain = driver_priv->shared ? RADEON_GEM_DOMAIN_GTT : RADEON_GEM_DOMAIN_VRAM;
    265     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, info->state_2d.dst_domain);
     267    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     268                                      info->state_2d.dst_domain);
    266269
    267270    ret = radeon_cs_space_check(info->cs);
    268271    if (ret)
     
    328331
    329332    if (src_bo && dst_bo) {
    330333        BEGIN_ACCEL_RELOC(6, 2);
    331     } else if (src_bo && dst_bo == NULL) {
     334    } else if (src_bo && !dst_bo) {
    332335        BEGIN_ACCEL_RELOC(6, 1);
    333336    } else {
    334337        BEGIN_RING(2*6);
     
    389392        return FALSE;
    390393
    391394    driver_priv = exaGetPixmapDriverPrivate(pDst);
    392     if (!driver_priv || !driver_priv->bo)
     395    if (!driver_priv || !driver_priv->bo->bo.radeon)
    393396        return FALSE;
    394397
    395398#if X_BYTE_ORDER == X_BIG_ENDIAN
     
    404407#endif
    405408
    406409    /* If we know the BO won't be busy / in VRAM, don't bother with a scratch */
    407     copy_dst = driver_priv->bo;
     410    copy_dst = driver_priv->bo->bo.radeon;
    408411    copy_pitch = pDst->devKind;
    409412    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    410         if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
     413        if (!radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
    411414            flush = FALSE;
    412             if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain) &&
     415            if (!radeon_bo_is_busy(driver_priv->bo->bo.radeon, &dst_domain) &&
    413416                !(dst_domain & RADEON_GEM_DOMAIN_VRAM))
    414417                goto copy;
    415418        }
     
    420423
    421424    size = scratch_pitch * h;
    422425    scratch = radeon_bo_open(info->bufmgr, 0, size, 0, RADEON_GEM_DOMAIN_GTT, 0);
    423     if (scratch == NULL) {
     426    if (!scratch) {
    424427        goto copy;
    425428    }
    426429    radeon_cs_space_reset_bos(info->cs);
     
    446449    r = TRUE;
    447450    size = w * bpp / 8;
    448451    dst = copy_dst->ptr;
    449     if (copy_dst == driver_priv->bo)
     452    if (copy_dst == driver_priv->bo->bo.radeon)
    450453        dst += y * copy_pitch + x * bpp / 8;
    451454    for (i = 0; i < h; i++) {
    452455        RADEONCopySwap(dst + i * copy_pitch, (uint8_t*)src, size, swap);
     
    458461        RADEONGetDatatypeBpp(pDst->drawable.bitsPerPixel, &datatype);
    459462        RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_offset);
    460463        RADEON_SWITCH_TO_2D();
    461         RADEONBlitChunk(pScrn, scratch, driver_priv->bo, datatype, scratch_pitch << 16,
     464        RADEONBlitChunk(pScrn, scratch, driver_priv->bo->bo.radeon, datatype, scratch_pitch << 16,
    462465                        dst_pitch_offset, 0, 0, x, y, w, h,
    463466                        RADEON_GEM_DOMAIN_GTT, RADEON_GEM_DOMAIN_VRAM);
    464467    }
     
    493496        return FALSE;
    494497
    495498    driver_priv = exaGetPixmapDriverPrivate(pSrc);
    496     if (!driver_priv || !driver_priv->bo)
     499    if (!driver_priv || !driver_priv->bo->bo.radeon)
    497500        return FALSE;
    498501
    499502#if X_BYTE_ORDER == X_BIG_ENDIAN
     
    508511#endif
    509512
    510513    /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */
    511     copy_src = driver_priv->bo;
     514    copy_src = driver_priv->bo->bo.radeon;
    512515    copy_pitch = pSrc->devKind;
    513516    if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) {
    514         if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) {
    515             src_domain = radeon_bo_get_src_domain(driver_priv->bo);
     517        if (radeon_bo_is_referenced_by_cs(driver_priv->bo->bo.radeon, info->cs)) {
     518            src_domain = radeon_bo_get_src_domain(driver_priv->bo->bo.radeon);
    516519            if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) ==
    517520                (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM))
    518521                src_domain = 0;
     
    521524        }
    522525
    523526        if (!src_domain)
    524             radeon_bo_is_busy(driver_priv->bo, &src_domain);
     527            radeon_bo_is_busy(driver_priv->bo->bo.radeon, &src_domain);
    525528
    526529        if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM)
    527530            goto copy;
    528531    }
    529532    size = scratch_pitch * h;
    530533    scratch = radeon_bo_open(info->bufmgr, 0, size, 0, RADEON_GEM_DOMAIN_GTT, 0);
    531     if (scratch == NULL) {
     534    if (!scratch) {
    532535        goto copy;
    533536    }
    534537    radeon_cs_space_reset_bos(info->cs);
     
    541544    RADEONGetDatatypeBpp(pSrc->drawable.bitsPerPixel, &datatype);
    542545    RADEONGetPixmapOffsetPitch(pSrc, &src_pitch_offset);
    543546    RADEON_SWITCH_TO_2D();
    544     RADEONBlitChunk(pScrn, driver_priv->bo, scratch, datatype, src_pitch_offset,
    545                     scratch_pitch << 16, x, y, 0, 0, w, h,
     547    RADEONBlitChunk(pScrn, driver_priv->bo->bo.radeon, scratch, datatype,
     548                    src_pitch_offset, scratch_pitch << 16, x, y, 0, 0, w, h,
    546549                    RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT,
    547550                    RADEON_GEM_DOMAIN_GTT);
    548551    copy_src = scratch;
     
    561564    }
    562565    r = TRUE;
    563566    w *= bpp / 8;
    564     if (copy_src == driver_priv->bo)
     567    if (copy_src == driver_priv->bo->bo.radeon)
    565568        size = y * copy_pitch + x * bpp / 8;
    566569    else
    567570        size = 0;
     
    581584{
    582585    RINFO_FROM_SCREEN(pScreen);
    583586
    584     if (info->accel_state->exa == NULL) {
     587    if (!info->accel_state->exa) {
    585588        xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map not set up\n");
    586589        return FALSE;
    587590    }
     
    638641    }
    639642#endif
    640643
    641     info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap;
    642644    info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap;
    643645    info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen;
    644646    info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS;
  • src/radeon_exa_render.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_exa_render.c xf86-video-ati-18.0.1/src/radeon_exa_render.c
    old new  
    630630        return FALSE;
    631631    pp_cntl = RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE;
    632632
    633     if (pMask != NULL) {
     633    if (pMask) {
    634634        if (!R100TextureSetup(pMaskPicture, pMask, 1))
    635635            return FALSE;
    636636        pp_cntl |= RADEON_TEX_1_ENABLE;
     
    992992        return FALSE;
    993993    pp_cntl = RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE;
    994994
    995     if (pMask != NULL) {
     995    if (pMask) {
    996996        if (!R200TextureSetup(pMaskPicture, pMask, 1))
    997997            return FALSE;
    998998        pp_cntl |= RADEON_TEX_1_ENABLE;
     
    14841484        return FALSE;
    14851485    txenable = R300_TEX_0_ENABLE;
    14861486
    1487     if (pMask != NULL) {
     1487    if (pMask) {
    14881488        if (!R300TextureSetup(pMaskPicture, pMask, 1))
    14891489            return FALSE;
    14901490        txenable |= R300_TEX_1_ENABLE;
  • src/radeon_exa_shared.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_exa_shared.c xf86-video-ati-18.0.1/src/radeon_exa_shared.c
    old new  
    129129    struct radeon_bo *bo;
    130130    exaMoveInPixmap(pPix);
    131131
    132     bo = radeon_get_pixmap_bo(pPix);
     132    bo = radeon_get_pixmap_bo(pPix)->bo.radeon;
    133133
    134134    if (radeon_bo_map(bo, 1)) {
    135135        pScreen->DestroyPixmap(pPix);
  • src/radeon_exa_shared.h

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_exa_shared.h xf86-video-ati-18.0.1/src/radeon_exa_shared.h
    old new  
    6666{
    6767    struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
    6868
    69     radeon_cs_space_add_persistent_bo(cs, driver_priv->bo, read_domains, write_domain);
     69    radeon_cs_space_add_persistent_bo(cs, driver_priv->bo->bo.radeon,
     70                                      read_domains, write_domain);
    7071}
    7172
    7273extern void radeon_ib_discard(ScrnInfoPtr pScrn);
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_glamor.c xf86-video-ati-18.0.1/src/radeon_glamor.c
    old new  
    5050Bool
    5151radeon_glamor_create_screen_resources(ScreenPtr screen)
    5252{
     53        PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen);
    5354        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
    5455        RADEONInfoPtr info = RADEONPTR(scrn);
    5556
     
    6162                return FALSE;
    6263#endif
    6364
    64         if (!glamor_egl_create_textured_screen(screen,
    65                                                info->front_bo->handle,
    66                                                scrn->displayWidth *
    67                                                info->pixel_bytes))
    68                 return FALSE;
    69 
    70         return TRUE;
     65        return radeon_glamor_create_textured_pixmap(screen_pixmap,
     66                                                    info->front_buffer);
    7167}
    7268
    7369
     
    136132        }
    137133#endif
    138134
     135        info->gbm = gbm_create_device(pRADEONEnt->fd);
     136        if (!info->gbm) {
     137                xf86DrvMsg(scrn->scrnIndex, X_ERROR,
     138                           "gbm_create_device returned NULL\n");
     139                return FALSE;
     140        }
     141
    139142        /* Load glamor module */
    140143        if ((glamor_module = xf86LoadSubModule(scrn, GLAMOR_EGL_MODULE_NAME))) {
    141144                version = xf86GetModuleVersion(glamor_module);
     
    164167}
    165168
    166169Bool
    167 radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_pixmap *priv)
     170radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_buffer *bo)
    168171{
    169         return glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle,
    170                                                  pixmap->devKind);
     172        ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
     173        RADEONInfoPtr info = RADEONPTR(scrn);
     174
     175        if (!info->use_glamor)
     176                return TRUE;
     177
     178        if (bo->flags & RADEON_BO_FLAGS_GBM) {
     179                return glamor_egl_create_textured_pixmap_from_gbm_bo(pixmap,
     180                                                                     bo->bo.gbm
     181#if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(1,19,99,903,0)
     182                                                                     , FALSE
     183#endif
     184                                                                     );
     185        } else {
     186                return glamor_egl_create_textured_pixmap(pixmap,
     187                                                         bo->bo.radeon->handle,
     188                                                         pixmap->devKind);
     189        }
    171190}
    172191
    173192static Bool radeon_glamor_destroy_pixmap(PixmapPtr pixmap)
     
    179198#endif
    180199
    181200        if (pixmap->refcnt == 1) {
    182                 if (pixmap->devPrivate.ptr) {
    183                         struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
    184 
    185                         if (bo)
    186                                 radeon_bo_unmap(bo);
    187                 }
    188 
    189201#ifdef HAVE_GLAMOR_EGL_DESTROY_TEXTURED_PIXMAP
    190202                glamor_egl_destroy_textured_pixmap(pixmap);
    191203#endif
     
    214226        struct radeon_pixmap *priv;
    215227        PixmapPtr pixmap, new_pixmap = NULL;
    216228
     229        if (!xf86GetPixFormat(scrn, depth))
     230                return NULL;
     231
    217232        if (!RADEON_CREATE_PIXMAP_SHARED(usage)) {
    218233                if (info->shadow_primary) {
    219234                        if (usage != CREATE_PIXMAP_USAGE_BACKING_PIXMAP)
     
    242257                int stride;
    243258
    244259                priv = calloc(1, sizeof (struct radeon_pixmap));
    245                 if (priv == NULL)
     260                if (!priv)
    246261                        goto fallback_pixmap;
    247262
    248263                priv->bo = radeon_alloc_pixmap_bo(scrn, w, h, depth, usage,
    249264                                                  pixmap->drawable.bitsPerPixel,
    250                                                   &stride,
    251                                                   &priv->surface,
     265                                                  &stride, NULL,
    252266                                                  &priv->tiling_flags);
    253267                if (!priv->bo)
    254268                        goto fallback_priv;
     
    257271
    258272                screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, stride, NULL);
    259273
    260                 if (!radeon_glamor_create_textured_pixmap(pixmap, priv))
     274                if (!radeon_glamor_create_textured_pixmap(pixmap, priv->bo))
    261275                        goto fallback_glamor;
    262276
    263277                pixmap->devPrivate.ptr = NULL;
     
    287301         * afterwards.
    288302         */
    289303        new_pixmap = glamor_create_pixmap(screen, w, h, depth, usage);
    290         radeon_bo_unref(priv->bo);
     304        radeon_buffer_unref(&priv->bo);
    291305fallback_priv:
    292306        free(priv);
    293307fallback_pixmap:
     
    388402{
    389403        ScreenPtr screen = pixmap->drawable.pScreen;
    390404        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
    391         struct radeon_surface surface;
    392         struct radeon_pixmap *priv;
    393405
    394         if (!radeon_set_shared_pixmap_backing(pixmap, handle, &surface))
     406        if (!radeon_set_shared_pixmap_backing(pixmap, handle, NULL))
    395407                return FALSE;
    396408
    397         priv = radeon_get_pixmap_private(pixmap);
    398         priv->surface = surface;
    399 
    400         if (!radeon_glamor_create_textured_pixmap(pixmap, priv)) {
     409        if (!radeon_glamor_create_textured_pixmap(pixmap,
     410                                                  radeon_get_pixmap_bo(pixmap))) {
    401411                xf86DrvMsg(scrn->scrnIndex, X_ERROR,
    402412                           "Failed to get PRIME drawable for glamor pixmap.\n");
    403413                return FALSE;
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_glamor.h xf86-video-ati-18.0.1/src/radeon_glamor.h
    old new  
    3333
    3434#ifdef USE_GLAMOR
    3535
     36#ifndef HAVE_GLAMOR_FINISH
     37#include <GL/gl.h>
     38#endif
     39
     40#include <gbm.h>
     41
    3642#define GLAMOR_FOR_XORG  1
    3743#include <glamor.h>
    3844
     
    6571Bool radeon_glamor_create_screen_resources(ScreenPtr screen);
    6672void radeon_glamor_free_screen(int scrnIndex, int flags);
    6773
    68 Bool radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_pixmap *priv);
     74Bool radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_buffer *bo);
    6975void radeon_glamor_exchange_buffers(PixmapPtr src, PixmapPtr dst);
    7076PixmapPtr radeon_glamor_set_pixmap_bo(DrawablePtr drawable, PixmapPtr pixmap);
    7177
    7278XF86VideoAdaptorPtr radeon_glamor_xv_init(ScreenPtr pScreen, int num_adapt);
    7379
     80static inline void
     81radeon_glamor_finish(ScrnInfoPtr scrn)
     82{
     83        RADEONInfoPtr info = RADEONPTR(scrn);
     84
     85#if HAVE_GLAMOR_FINISH
     86        glamor_finish(scrn->pScreen);
     87#else
     88        glamor_block_handler(scrn->pScreen);
     89        glFinish();
     90#endif
     91
     92        info->gpu_flushed++;
     93}
     94
    7495#else
    7596
    7697static inline Bool radeon_glamor_pre_init(ScrnInfoPtr scrn) { return FALSE; }
     
    79100static inline Bool radeon_glamor_create_screen_resources(ScreenPtr screen) { return FALSE; }
    80101static inline void radeon_glamor_free_screen(int scrnIndex, int flags) { }
    81102
    82 static inline Bool radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_pixmap *priv) { return TRUE; }
     103static inline Bool radeon_glamor_create_textured_pixmap(PixmapPtr pixmap, struct radeon_buffer *bo) { return TRUE; }
    83104
    84105static inline void radeon_glamor_exchange_buffers(PixmapPtr src, PixmapPtr dst) {}
    85106static inline PixmapPtr radeon_glamor_set_pixmap_bo(DrawablePtr drawable, PixmapPtr pixmap) { return pixmap; }
     
    87108static inline struct radeon_pixmap *radeon_get_pixmap_private(PixmapPtr pixmap) { return NULL; }
    88109
    89110static inline XF86VideoAdaptorPtr radeon_glamor_xv_init(ScreenPtr pScreen, int num_adapt) { return NULL; }
     111
     112static inline void radeon_glamor_finish(ScrnInfoPtr pScrn) { }
     113
    90114#endif
    91115
    92116#endif /* RADEON_GLAMOR_H */
  • src/radeon_glamor_wrappers.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_glamor_wrappers.c xf86-video-ati-18.0.1/src/radeon_glamor_wrappers.c
    old new  
    5555                                 PixmapPtr pixmap, struct radeon_pixmap *priv,
    5656                                 Bool need_sync)
    5757{
    58         struct radeon_bo *bo = priv->bo;
     58        struct radeon_buffer *bo = priv->bo;
    5959        int ret;
    6060
    61         /* When falling back to swrast, flush all pending operations */
    62         if (need_sync) {
    63                 glamor_block_handler(scrn->pScreen);
    64                 info->gpu_flushed++;
    65         }
    66 
    6761        if (!pixmap->devPrivate.ptr) {
    68                 ret = radeon_bo_map(bo, 1);
     62                /* When falling back to swrast, flush all pending operations */
     63                if (need_sync) {
     64                        glamor_block_handler(scrn->pScreen);
     65                        info->gpu_flushed++;
     66                }
     67
     68                ret = radeon_bo_map(bo->bo.radeon, 1);
    6969                if (ret) {
    7070                        xf86DrvMsg(scrn->scrnIndex, X_WARNING,
    7171                                   "%s: bo map (tiling_flags %d) failed: %s\n",
     
    7575                        return FALSE;
    7676                }
    7777
    78                 pixmap->devPrivate.ptr = bo->ptr;
    79                 info->gpu_synced = info->gpu_flushed;
    80         } else if (need_sync) {
    81                 radeon_bo_wait(bo);
    82                 info->gpu_synced = info->gpu_flushed;
    83         }
     78                pixmap->devPrivate.ptr = bo->bo.radeon->ptr;
     79        } else if (need_sync)
     80                radeon_finish(scrn, bo);
     81
     82        info->gpu_synced = info->gpu_flushed;
    8483
    8584        return TRUE;
    8685}
     
    133132static Bool
    134133radeon_glamor_prepare_access_gpu(struct radeon_pixmap *priv)
    135134{
    136         return priv != NULL;
     135        return !!priv;
    137136}
    138137
    139138static void
     
    202201        PixmapPtr pixmap;
    203202        struct radeon_pixmap *priv;
    204203
    205         if (picture->pDrawable == NULL)
     204        if (!picture->pDrawable)
    206205                return TRUE;
    207206
    208207        pixmap = get_drawable_pixmap(picture->pDrawable);
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon.h xf86-video-ati-18.0.1/src/radeon.h
    old new  
    8383#include "radeon_dri2.h"
    8484#include "drmmode_display.h"
    8585#include "radeon_surface.h"
     86#include "radeon_bo_helper.h"
    8687
    8788                                /* Render support */
    8889#ifdef RENDER
     
    300301#define CURSOR_WIDTH_CIK        128
    301302#define CURSOR_HEIGHT_CIK       128
    302303
    303 
    304304#ifdef USE_GLAMOR
    305305
    306306struct radeon_pixmap {
    307         struct radeon_surface surface;
    308 
    309307        uint_fast32_t gpu_read;
    310308        uint_fast32_t gpu_write;
    311309
    312         struct radeon_bo *bo;
     310        struct radeon_buffer *bo;
    313311        struct drmmode_fb *fb;
    314312
    315313        uint32_t tiling_flags;
     
    335333
    336334
    337335struct radeon_exa_pixmap_priv {
    338     struct radeon_bo *bo;
     336    struct radeon_buffer *bo;
    339337    struct drmmode_fb *fb;
    340338    uint32_t tiling_flags;
    341339    struct radeon_surface surface;
     
    569567
    570568    void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB
    571569    struct radeon_2d_state state_2d;
    572     struct radeon_bo *front_bo;
     570    struct radeon_buffer *front_buffer;
    573571    struct radeon_bo_manager *bufmgr;
    574572    struct radeon_cs_manager *csm;
    575573    struct radeon_cs *cs;
     
    608606    unsigned hwcursor_disabled;
    609607
    610608#ifdef USE_GLAMOR
     609    struct gbm_device *gbm;
     610
    611611    struct {
    612612        CreateGCProcPtr SavedCreateGC;
    613613        RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int,
     
    645645extern int radeon_cs_space_remaining(ScrnInfoPtr pScrn);
    646646
    647647/* radeon_bo_helper.c */
     648extern Bool
     649radeon_surface_initialize(RADEONInfoPtr info, struct radeon_surface *surface,
     650                          int width, int height, int cpp, uint32_t tiling_flags,
     651                          int usage_hint);
     652
    648653extern Bool radeon_get_pixmap_handle(PixmapPtr pixmap, uint32_t *handle);
    649654
    650655/* radeon_commonfuncs.c */
     
    703708
    704709static inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix)
    705710{
    706 #ifdef USE_GLAMOR
    707     RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
     711    struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
    708712
    709     if (info->use_glamor) {
    710         struct radeon_pixmap *priv;
    711         priv = radeon_get_pixmap_private(pPix);
    712         return priv ? &priv->surface : NULL;
    713     } else
    714 #endif
    715     {
    716         struct radeon_exa_pixmap_priv *driver_priv;
    717         driver_priv = exaGetPixmapDriverPrivate(pPix);
    718         return &driver_priv->surface;
    719     }
    720 
    721     return NULL;
     713    return &driver_priv->surface;
    722714}
    723715
    724716uint32_t radeon_get_pixmap_tiling(PixmapPtr pPix);
    725717
    726 static inline Bool radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
     718static inline Bool radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_buffer *bo)
    727719{
    728720    ScrnInfoPtr scrn = xf86ScreenToScrn(pPix->drawable.pScreen);
    729721    RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
     
    734726        struct radeon_pixmap *priv;
    735727
    736728        priv = radeon_get_pixmap_private(pPix);
    737         if (priv == NULL && bo == NULL)
     729        if (!priv && !bo)
    738730            return TRUE;
    739731
    740732        if (priv) {
     
    742734                if (priv->bo == bo)
    743735                    return TRUE;
    744736
    745                 radeon_bo_unref(priv->bo);
     737                radeon_buffer_unref(&priv->bo);
     738                priv->handle_valid = FALSE;
    746739            }
    747740
    748741            drmmode_fb_reference(pRADEONEnt->fd, &priv->fb, NULL);
     
    754747        }
    755748
    756749        if (bo) {
    757             uint32_t pitch;
    758 
    759750            if (!priv) {
    760751                priv = calloc(1, sizeof (struct radeon_pixmap));
    761752                if (!priv)
    762753                    return FALSE;
    763754            }
    764755
    765             radeon_bo_ref(bo);
     756            radeon_buffer_ref(bo);
    766757            priv->bo = bo;
    767 
    768             radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch);
    769758        }
    770759
    771760        radeon_set_pixmap_private(pPix, priv);
     761        radeon_get_pixmap_tiling_flags(pPix);
    772762        return TRUE;
    773763    } else
    774764#endif /* USE_GLAMOR */
     
    779769        if (driver_priv) {
    780770            uint32_t pitch;
    781771
    782             if (driver_priv->bo)
    783                 radeon_bo_unref(driver_priv->bo);
    784 
     772            radeon_buffer_unref(&driver_priv->bo);
    785773            drmmode_fb_reference(pRADEONEnt->fd, &driver_priv->fb, NULL);
    786774
    787             radeon_bo_ref(bo);
     775            radeon_buffer_ref(bo);
    788776            driver_priv->bo = bo;
    789777
    790             radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch);
     778            radeon_bo_get_tiling(bo->bo.radeon, &driver_priv->tiling_flags,
     779                                 &pitch);
    791780            return TRUE;
    792781        }
    793782
     
    795784    }
    796785}
    797786
    798 static inline struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix)
     787static inline struct radeon_buffer *radeon_get_pixmap_bo(PixmapPtr pPix)
    799788{
    800789#ifdef USE_GLAMOR
    801790    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
     
    905894    return *fb_ptr;
    906895}
    907896
     897
    908898#define CP_PACKET0(reg, n)                                              \
    909899        (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
    910900#define CP_PACKET1(reg0, reg1)                                          \
     
    10131003#define EMIT_OFFSET(reg, value, pPix, rd, wd) do {              \
    10141004    driver_priv = exaGetPixmapDriverPrivate(pPix);              \
    10151005    OUT_RING_REG((reg), (value));                               \
    1016     OUT_RING_RELOC(driver_priv->bo, (rd), (wd));                        \
     1006    OUT_RING_RELOC(driver_priv->bo->bo.radeon, (rd), (wd));     \
    10171007    } while(0)
    10181008
    10191009#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0)
     
    10271017#define EMIT_COLORPITCH(reg, value, pPix) do {                  \
    10281018    driver_priv = exaGetPixmapDriverPrivate(pPix);                      \
    10291019    OUT_RING_REG((reg), value);                                 \
    1030     OUT_RING_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);         \
     1020    OUT_RING_RELOC(driver_priv->bo->bo.radeon, 0, RADEON_GEM_DOMAIN_VRAM);      \
    10311021} while(0)
    10321022
    10331023static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_kms.c xf86-video-ati-18.0.1/src/radeon_kms.c
    old new  
    212212            info->accel_state = NULL;
    213213        }
    214214
     215#ifdef USE_GLAMOR
     216        if (info->gbm)
     217            gbm_device_destroy(info->gbm);
     218#endif
     219
    215220        pEnt = info->pEnt;
    216221        free(pScrn->driverPrivate);
    217222        pScrn->driverPrivate = NULL;
     
    254259    stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8;
    255260    *size = stride;
    256261
    257     return ((uint8_t *)info->front_bo->ptr + row * stride + offset);
     262    return ((uint8_t *)info->front_buffer->bo.radeon->ptr + row * stride + offset);
    258263}
    259264
    260265static void
     
    326331    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    327332    RADEONInfoPtr  info   = RADEONPTR(pScrn);
    328333    PixmapPtr pixmap;
    329     struct radeon_surface *surface;
    330334
    331335    pScreen->CreateScreenResources = info->CreateScreenResources;
    332336    if (!(*pScreen->CreateScreenResources)(pScreen))
     
    360364    }
    361365
    362366    if (info->dri2.enabled || info->use_glamor) {
    363         if (info->front_bo) {
     367        if (info->front_buffer) {
    364368            PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen);
    365             if (!radeon_set_pixmap_bo(pPix, info->front_bo))
     369            if (!radeon_set_pixmap_bo(pPix, info->front_buffer))
    366370                return FALSE;
    367             surface = radeon_get_pixmap_surface(pPix);
    368             if (surface) {
    369                 *surface = info->front_surface;
    370             }
     371
     372            if (info->surf_man && !info->use_glamor)
     373                *radeon_get_pixmap_surface(pPix) = info->front_surface;
    371374        }
    372375    }
    373376
     
    523526    RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
    524527    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    525528
    526     drmmode_crtc->scanout_update_pending = FALSE;
     529    drmmode_crtc->scanout_update_pending = 0;
    527530    drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
    528531                         NULL);
    529532}
     
    538541    drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb,
    539542                         drmmode_crtc->flip_pending);
    540543    radeon_scanout_flip_abort(crtc, event_data);
    541 
    542 #ifdef HAVE_PRESENT_H
    543     if (drmmode_crtc->present_vblank_event_id) {
    544         present_event_notify(drmmode_crtc->present_vblank_event_id,
    545                              drmmode_crtc->present_vblank_usec,
    546                              drmmode_crtc->present_vblank_msc);
    547         drmmode_crtc->present_vblank_event_id = 0;
    548     }
    549 #endif
    550544}
    551545
    552546
     
    608602{
    609603    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    610604
    611     drmmode_crtc->scanout_update_pending = FALSE;
     605    drmmode_crtc->scanout_update_pending = 0;
    612606}
    613607
    614608void
     
    636630{
    637631    ScreenPtr master_screen = radeon_dirty_master(dirty);
    638632
    639     return master_screen->SyncSharedPixmap != NULL;
     633    return !!master_screen->SyncSharedPixmap;
    640634}
    641635
    642636static Bool
     
    644638{
    645639    ScreenPtr slave_screen = dirty->slave_dst->drawable.pScreen;
    646640
    647     return slave_screen->SyncSharedPixmap != NULL;
     641    return !!slave_screen->SyncSharedPixmap;
    648642}
    649643
    650644static void
     
    749743    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    750744
    751745    radeon_prime_scanout_do_update(crtc, 0);
    752     drmmode_crtc->scanout_update_pending = FALSE;
     746    drmmode_crtc->scanout_update_pending = 0;
    753747}
    754748
    755749static void
     
    790784        return;
    791785    }
    792786
    793     drmmode_crtc->scanout_update_pending = TRUE;
     787    drmmode_crtc->scanout_update_pending = drm_queue_seq;
    794788}
    795789
    796790static void
     
    848842    }
    849843
    850844    drmmode_crtc->scanout_id = scanout_id;
    851     drmmode_crtc->scanout_update_pending = TRUE;
     845    drmmode_crtc->scanout_update_pending = drm_queue_seq;
    852846}
    853847
    854848static void
     
    987981        FreeScratchGC(gc);
    988982    }
    989983
    990     radeon_cs_flush_indirect(scrn);
    991 
    992984    info->accel_state->force = force;
    993985
    994986    return TRUE;
     
    999991{
    1000992    drmmode_crtc_private_ptr drmmode_crtc = event_data;
    1001993
    1002     drmmode_crtc->scanout_update_pending = FALSE;
     994    drmmode_crtc->scanout_update_pending = 0;
    1003995}
    1004996
    1005997static void
     
    10151007        drmmode_crtc->dpms_mode == DPMSModeOn) {
    10161008        if (radeon_scanout_do_update(crtc, drmmode_crtc->scanout_id,
    10171009                                     screen->GetWindowPixmap(screen->root),
    1018                                      region->extents))
     1010                                     region->extents)) {
     1011            radeon_cs_flush_indirect(crtc->scrn);
    10191012            RegionEmpty(region);
     1013        }
    10201014    }
    10211015
    10221016    radeon_scanout_update_abort(crtc, event_data);
     
    10741068        return;
    10751069    }
    10761070
    1077     drmmode_crtc->scanout_update_pending = TRUE;
     1071    drmmode_crtc->scanout_update_pending = drm_queue_seq;
    10781072}
    10791073
    10801074static void
     
    10981092                                  pScreen->GetWindowPixmap(pScreen->root),
    10991093                                  region->extents))
    11001094        return;
     1095
     1096    radeon_cs_flush_indirect(scrn);
    11011097    RegionEmpty(region);
    11021098
    11031099    drm_queue_seq = radeon_drm_queue_alloc(xf86_crtc,
     
    11391135    }
    11401136
    11411137    drmmode_crtc->scanout_id = scanout_id;
    1142     drmmode_crtc->scanout_update_pending = TRUE;
     1138    drmmode_crtc->scanout_update_pending = drm_queue_seq;
    11431139}
    11441140
    11451141static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
     
    11621158            xf86CrtcPtr crtc = xf86_config->crtc[c];
    11631159            drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    11641160
     1161            if (drmmode_crtc->rotate.pixmap)
     1162                continue;
     1163
    11651164            if (drmmode_crtc->tear_free)
    11661165                radeon_scanout_flip(pScreen, info, crtc);
    11671166            else if (drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap)
     
    16811680    pScreen->WindowExposures(pWin, pRegion);
    16821681#endif
    16831682
    1684     radeon_cs_flush_indirect(pScrn);
    1685     radeon_bo_wait(info->front_bo);
     1683    radeon_finish(pScrn, info->front_buffer);
    16861684    drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE);
    16871685}
    16881686
     
    17621760    info->dri2.available = FALSE;
    17631761    info->dri2.enabled = FALSE;
    17641762    info->dri2.pKernelDRMVersion = drmGetVersion(pRADEONEnt->fd);
    1765     if (info->dri2.pKernelDRMVersion == NULL) {
     1763    if (!info->dri2.pKernelDRMVersion) {
    17661764        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
    17671765                   "RADEONDRIGetVersion failed to get the DRM version\n");
    17681766        return FALSE;
     
    17821780        return FALSE;
    17831781    }
    17841782
    1785     radeon_drm_queue_init();
     1783    radeon_drm_queue_init(pScrn);
    17861784
    17871785    info->allowColorTiling2D = FALSE;
    17881786
     
    19171915            xf86OutputPtr output = xf86_config->output[i];
    19181916
    19191917            /* XXX: double check crtc mode */
    1920             if ((output->probed_modes != NULL) && (output->crtc == NULL))
     1918            if (output->probed_modes && !output->crtc)
    19211919                output->crtc = xf86_config->crtc[0];
    19221920        }
    19231921    }
     
    19801978        if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE;
    19811979    }
    19821980
    1983     if (pScrn->modes == NULL
     1981    if (!pScrn->modes
    19841982#ifdef XSERVER_PLATFORM_BUS
    19851983        && !pScrn->is_gpu
    19861984#endif
     
    20912089    unblank = xf86IsUnblank(mode);
    20922090    if (unblank) SetTimeSinceLastInputEvent();
    20932091
    2094     if ((pScrn != NULL) && pScrn->vtSema) {
     2092    if (pScrn && pScrn->vtSema) {
    20952093        if (unblank)
    20962094            RADEONUnblank(pScrn);
    20972095        else
     
    22282226    if (info->r600_shadow_fb == FALSE)
    22292227        info->directRenderingEnabled = radeon_dri2_screen_init(pScreen);
    22302228
    2231     info->surf_man = radeon_surface_manager_new(pRADEONEnt->fd);
     2229    if (info->ChipFamily >= CHIP_FAMILY_R600) {
     2230        info->surf_man = radeon_surface_manager_new(pRADEONEnt->fd);
     2231
     2232        if (!info->surf_man) {
     2233            xf86DrvMsg(pScreen->myNum, X_ERROR,
     2234                       "Failed to initialize surface manager\n");
     2235            return FALSE;
     2236        }
     2237    }
     2238
    22322239    if (!info->bufmgr)
    22332240        info->bufmgr = radeon_bo_manager_gem_ctor(pRADEONEnt->fd);
    22342241    if (!info->bufmgr) {
     
    22612268        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "radeon_setup_kernel_mem failed\n");
    22622269        return FALSE;
    22632270    }
    2264     front_ptr = info->front_bo->ptr;
     2271
     2272    if (!(info->front_buffer->flags & RADEON_BO_FLAGS_GBM))
     2273        front_ptr = info->front_buffer->bo.radeon->ptr;
     2274    else
     2275        front_ptr = NULL;
    22652276
    22662277    if (info->r600_shadow_fb) {
    22672278        info->fb_shadow = calloc(1,
    22682279                                 pScrn->displayWidth * pScrn->virtualY *
    22692280                                 ((pScrn->bitsPerPixel + 7) >> 3));
    2270         if (info->fb_shadow == NULL) {
     2281        if (!info->fb_shadow) {
    22712282            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
    22722283                       "Failed to allocate shadow framebuffer\n");
    22732284            return FALSE;
     
    24702481    if (info->r600_shadow_fb) {
    24712482        int base_align = drmmode_get_base_align(pScrn, info->pixel_bytes, 0);
    24722483        struct radeon_bo *front_bo = radeon_bo_open(info->bufmgr, 0,
    2473                                                     info->front_bo->size,
     2484                                                    pScrn->displayWidth *
     2485                                                    info->pixel_bytes *
     2486                                                    pScrn->virtualY,
    24742487                                                    base_align,
    24752488                                                    RADEON_GEM_DOMAIN_VRAM, 0);
    24762489
    24772490        if (front_bo) {
    24782491            if (radeon_bo_map(front_bo, 1) == 0) {
    24792492                memset(front_bo->ptr, 0, front_bo->size);
    2480                 radeon_bo_unref(info->front_bo);
    2481                 info->front_bo = front_bo;
     2493                radeon_bo_unref(info->front_buffer->bo.radeon);
     2494                info->front_buffer->bo.radeon = front_bo;
    24822495            } else {
    24832496                radeon_bo_unref(front_bo);
    24842497                front_bo = NULL;
     
    25762589                    radeon_pixmap_get_fb(black_scanout.pixmap);
    25772590
    25782591                radeon_pixmap_clear(black_scanout.pixmap);
    2579                 radeon_cs_flush_indirect(pScrn);
    2580                 radeon_bo_wait(black_scanout.bo);
     2592                radeon_finish(pScrn, black_scanout.bo);
    25812593
    25822594                for (i = 0; i < xf86_config->num_crtc; i++) {
    25832595                    crtc = xf86_config->crtc[i];
     
    26262638
    26272639        pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen), None, pRADEONEnt);
    26282640    } else {
    2629         memset(info->front_bo->ptr, 0, info->front_bo->size);
     2641        memset(info->front_buffer->bo.radeon->ptr, 0,
     2642               pScrn->displayWidth * info->pixel_bytes * pScrn->virtualY);
    26302643    }
    26312644
    26322645    TimerSet(NULL, 0, 1000, cleanup_black_fb, pScreen);
     
    26642677    RADEONInfoPtr info = RADEONPTR(pScrn);
    26652678    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
    26662679    int cpp = info->pixel_bytes;
    2667     uint32_t screen_size;
    2668     int pitch, base_align;
     2680    int pitch;
    26692681    uint32_t tiling_flags = 0;
    2670     struct radeon_surface surface;
    26712682
    2672     if (info->accel_state->exa != NULL) {
     2683    if (info->accel_state->exa) {
    26732684        xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map already initialized\n");
    26742685        return FALSE;
    26752686    }
    26762687    if (!info->use_glamor && info->r600_shadow_fb == FALSE) {
    26772688        info->accel_state->exa = exaDriverAlloc();
    2678         if (info->accel_state->exa == NULL) {
     2689        if (!info->accel_state->exa) {
    26792690            xf86DrvMsg(pScreen->myNum, X_ERROR, "exaDriverAlloc failed\n");
    26802691            return FALSE;
    26812692        }
    26822693    }
    26832694
    2684     if (info->allowColorTiling && !info->shadow_primary) {
    2685         if (info->ChipFamily >= CHIP_FAMILY_R600) {
    2686                 if (info->allowColorTiling2D) {
    2687                         tiling_flags |= RADEON_TILING_MACRO;
    2688                 } else {
    2689                         tiling_flags |= RADEON_TILING_MICRO;
    2690                 }
    2691         } else
    2692             tiling_flags |= RADEON_TILING_MACRO;
    2693     }
    2694     pitch = RADEON_ALIGN(pScrn->virtualX, drmmode_get_pitch_align(pScrn, cpp, tiling_flags)) * cpp;
    2695     screen_size = RADEON_ALIGN(pScrn->virtualY, drmmode_get_height_align(pScrn, tiling_flags)) * pitch;
    2696     base_align = drmmode_get_base_align(pScrn, cpp, tiling_flags);
    2697         if (info->ChipFamily >= CHIP_FAMILY_R600) {
    2698                 if(!info->surf_man) {
    2699                         xf86DrvMsg(pScreen->myNum, X_ERROR,
    2700                                    "failed to initialise surface manager\n");
    2701                         return FALSE;
    2702                 }
    2703                 memset(&surface, 0, sizeof(struct radeon_surface));
    2704                 surface.npix_x = pScrn->virtualX;
    2705                 surface.npix_y = pScrn->virtualY;
    2706                 surface.npix_z = 1;
    2707                 surface.blk_w = 1;
    2708                 surface.blk_h = 1;
    2709                 surface.blk_d = 1;
    2710                 surface.array_size = 1;
    2711                 surface.last_level = 0;
    2712                 surface.bpe = cpp;
    2713                 surface.nsamples = 1;
    2714                 surface.flags = RADEON_SURF_SCANOUT;
    2715                 /* we are requiring a recent enough libdrm version */
    2716                 surface.flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
    2717                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
    2718                 surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR_ALIGNED, MODE);
    2719                 if (tiling_flags & RADEON_TILING_MICRO) {
    2720                         surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    2721                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
    2722                 }
    2723                 if (tiling_flags & RADEON_TILING_MACRO) {
    2724                         surface.flags = RADEON_SURF_CLR(surface.flags, MODE);
    2725                         surface.flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
    2726                 }
    2727                 if (radeon_surface_best(info->surf_man, &surface)) {
    2728                         xf86DrvMsg(pScreen->myNum, X_ERROR,
    2729                                    "radeon_surface_best failed\n");
    2730                         return FALSE;
    2731                 }
    2732                 if (radeon_surface_init(info->surf_man, &surface)) {
    2733                         xf86DrvMsg(pScreen->myNum, X_ERROR,
    2734                                    "radeon_surface_init failed\n");
    2735                         return FALSE;
    2736                 }
    2737                 pitch = surface.level[0].pitch_bytes;
    2738                 screen_size = surface.bo_size;
    2739                 base_align = surface.bo_alignment;
    2740                 tiling_flags = 0;
    2741                 switch (surface.level[0].mode) {
    2742                 case RADEON_SURF_MODE_2D:
    2743                         tiling_flags |= RADEON_TILING_MACRO;
    2744                         tiling_flags |= surface.bankw << RADEON_TILING_EG_BANKW_SHIFT;
    2745                         tiling_flags |= surface.bankh << RADEON_TILING_EG_BANKH_SHIFT;
    2746                         tiling_flags |= surface.mtilea << RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT;
    2747                         if (surface.tile_split)
    2748                                 tiling_flags |= eg_tile_split(surface.tile_split)
    2749                                                 << RADEON_TILING_EG_TILE_SPLIT_SHIFT;
    2750                         break;
    2751                 case RADEON_SURF_MODE_1D:
    2752                         tiling_flags |= RADEON_TILING_MICRO;
    2753                         break;
    2754                 default:
    2755                         break;
    2756                 }
    2757                 info->front_surface = surface;
    2758         }
    27592695    {
    27602696        int cursor_size;
    27612697        int c;
     
    27642700        cursor_size = RADEON_ALIGN(cursor_size, RADEON_GPU_PAGE_SIZE);
    27652701        for (c = 0; c < xf86_config->num_crtc; c++) {
    27662702            /* cursor objects */
    2767             if (info->cursor_bo[c] == NULL) {
     2703            if (!info->cursor_bo[c]) {
    27682704                info->cursor_bo[c] = radeon_bo_open(info->bufmgr, 0,
    27692705                                                    cursor_size, 0,
    27702706                                                    RADEON_GEM_DOMAIN_VRAM, 0);
     
    27822718        }
    27832719    }
    27842720
    2785     screen_size = RADEON_ALIGN(screen_size, RADEON_GPU_PAGE_SIZE);
     2721    if (!info->front_buffer) {
     2722        int usage = CREATE_PIXMAP_USAGE_BACKING_PIXMAP;
     2723
     2724        if (info->allowColorTiling && !info->shadow_primary) {
     2725            if (info->ChipFamily < CHIP_FAMILY_R600 || info->allowColorTiling2D)
     2726                usage |= RADEON_CREATE_PIXMAP_TILING_MACRO;
     2727            else
     2728                usage |= RADEON_CREATE_PIXMAP_TILING_MICRO;
     2729        }
     2730
     2731        info->front_buffer = radeon_alloc_pixmap_bo(pScrn, pScrn->virtualX,
     2732                                                    pScrn->virtualY,
     2733                                                    pScrn->depth,
     2734                                                    usage,
     2735                                                    pScrn->bitsPerPixel,
     2736                                                    &pitch,
     2737                                                    &info->front_surface,
     2738                                                    &tiling_flags);
    27862739
    2787     if (info->front_bo == NULL) {
    2788         info->front_bo = radeon_bo_open(info->bufmgr, 0, screen_size,
    2789                                         base_align,
    2790                                         info->shadow_primary ?
    2791                                         RADEON_GEM_DOMAIN_GTT :
    2792                                         RADEON_GEM_DOMAIN_VRAM,
    2793                                         tiling_flags ? RADEON_GEM_NO_CPU_ACCESS : 0);
    27942740        if (info->r600_shadow_fb == TRUE) {
    2795             if (radeon_bo_map(info->front_bo, 1)) {
     2741            if (radeon_bo_map(info->front_buffer->bo.radeon, 1)) {
    27962742                ErrorF("Failed to map cursor buffer memory\n");
    27972743            }
    27982744        }
     2745
     2746        if (!info->use_glamor) {
    27992747#if X_BYTE_ORDER == X_BIG_ENDIAN
    2800         switch (cpp) {
    2801         case 4:
    2802             tiling_flags |= RADEON_TILING_SWAP_32BIT;
    2803             break;
    2804         case 2:
    2805             tiling_flags |= RADEON_TILING_SWAP_16BIT;
    2806             break;
    2807         }
    2808         if (info->ChipFamily < CHIP_FAMILY_R600 &&
    2809             info->r600_shadow_fb && tiling_flags)
    2810             tiling_flags |= RADEON_TILING_SURFACE;
     2748            switch (cpp) {
     2749            case 4:
     2750                tiling_flags |= RADEON_TILING_SWAP_32BIT;
     2751                break;
     2752            case 2:
     2753                tiling_flags |= RADEON_TILING_SWAP_16BIT;
     2754                break;
     2755            }
     2756            if (info->ChipFamily < CHIP_FAMILY_R600 &&
     2757                info->r600_shadow_fb && tiling_flags)
     2758                tiling_flags |= RADEON_TILING_SURFACE;
    28112759#endif
    2812         if (tiling_flags)
    2813             radeon_bo_set_tiling(info->front_bo, tiling_flags, pitch);
     2760            if (tiling_flags)
     2761                radeon_bo_set_tiling(info->front_buffer->bo.radeon, tiling_flags, pitch);
     2762        }
    28142763    }
    28152764
    28162765    pScrn->displayWidth = pitch / cpp;
    28172766
    2818     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Front buffer size: %dK\n", info->front_bo->size/1024);
    2819     radeon_kms_update_vram_limit(pScrn, screen_size);
     2767    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Front buffer size: %dK\n",
     2768               pitch * pScrn->virtualY / 1024);
     2769    radeon_kms_update_vram_limit(pScrn, pitch * pScrn->virtualY);
    28202770    return TRUE;
    28212771}
    28222772
     
    28282778    int c;
    28292779
    28302780    for (c = 0; c < xf86_config->num_crtc; c++) {
    2831         if (info->cursor_bo[c] != NULL) {
     2781        if (info->cursor_bo[c])
    28322782            new_fb_size += (64 * 4 * 64);
    2833         }
    28342783    }
    28352784
    28362785    remain_size_bytes = info->vram_size - new_fb_size;
  • src/radeon_present.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_present.c xf86-video-ati-18.0.1/src/radeon_present.c
    old new  
    5252
    5353struct radeon_present_vblank_event {
    5454    uint64_t event_id;
    55     Bool vblank_for_flip;
    5655    Bool unflip;
    5756};
    5857
     
    110109    if (r <= 0)
    111110        return 0;
    112111
    113     return drmHandleEvent(pRADEONEnt->fd, &drmmode->event_context) >= 0;
     112    return radeon_drm_handle_event(pRADEONEnt->fd, &drmmode->event_context) >= 0;
    114113}
    115114
    116115/*
     
    120119radeon_present_vblank_handler(xf86CrtcPtr crtc, unsigned int msc,
    121120                              uint64_t usec, void *data)
    122121{
    123     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
    124122    struct radeon_present_vblank_event *event = data;
    125123
    126     if (event->vblank_for_flip &&
    127         drmmode_crtc->tear_free &&
    128         drmmode_crtc->scanout_update_pending) {
    129         if (drmmode_crtc->present_vblank_event_id != 0) {
    130             xf86DrvMsg(crtc->scrn->scrnIndex, X_WARNING,
    131                        "Need to handle previously deferred vblank event\n");
    132             present_event_notify(drmmode_crtc->present_vblank_event_id,
    133                                  drmmode_crtc->present_vblank_usec,
    134                                  drmmode_crtc->present_vblank_msc);
    135         }
    136 
    137         drmmode_crtc->present_vblank_event_id = event->event_id;
    138         drmmode_crtc->present_vblank_msc = msc;
    139         drmmode_crtc->present_vblank_usec = usec;
    140     } else
    141         present_event_notify(event->event_id, usec, msc);
    142 
     124    present_event_notify(event->event_id, usec, msc);
    143125    free(event);
    144126}
    145127
     
    162144radeon_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
    163145{
    164146    xf86CrtcPtr xf86_crtc = crtc->devPrivate;
    165     drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private;
    166147    ScreenPtr screen = crtc->pScreen;
    167148    struct radeon_present_vblank_event *event;
    168149    uintptr_t drm_queue_seq;
     
    171152    if (!event)
    172153        return BadAlloc;
    173154    event->event_id = event_id;
    174     event->vblank_for_flip = drmmode_crtc->present_flip_expected;
    175     drmmode_crtc->present_flip_expected = FALSE;
    176155
    177156    drm_queue_seq = radeon_drm_queue_alloc(xf86_crtc,
    178157                                           RADEON_DRM_QUEUE_CLIENT_DEFAULT,
     
    272251              Bool sync_flip)
    273252{
    274253    xf86CrtcPtr xf86_crtc = crtc->devPrivate;
    275     drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private;
    276254    ScreenPtr screen = window->drawable.pScreen;
    277255    ScrnInfoPtr scrn = xf86_crtc->scrn;
    278256    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
     
    281259    int num_crtcs_on;
    282260    int i;
    283261
    284     drmmode_crtc->present_flip_expected = FALSE;
    285 
    286262    if (!scrn->vtSema)
    287263        return FALSE;
    288264
     
    313289    if (num_crtcs_on == 0)
    314290        return FALSE;
    315291
    316     drmmode_crtc->present_flip_expected = TRUE;
    317292    return TRUE;
    318293}
    319294
     
    354329                   PixmapPtr pixmap, Bool sync_flip)
    355330{
    356331    xf86CrtcPtr xf86_crtc = crtc->devPrivate;
    357     drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private;
    358332    ScreenPtr screen = crtc->pScreen;
    359333    ScrnInfoPtr scrn = xf86_crtc->scrn;
    360334    RADEONInfoPtr info = RADEONPTR(scrn);
     
    362336    Bool ret = FALSE;
    363337
    364338    if (!radeon_present_check_flip(crtc, screen->root, pixmap, sync_flip))
    365         goto out;
     339        return ret;
    366340
    367341    event = calloc(1, sizeof(struct radeon_present_vblank_event));
    368342    if (!event)
    369         goto out;
     343        return ret;
    370344
    371345    event->event_id = event_id;
    372346
     
    383357    else
    384358        info->drmmode.present_flipping = TRUE;
    385359
    386  out:
    387     drmmode_crtc->present_flip_expected = FALSE;
    388360    return ret;
    389361}
    390362
     
    404376        FLIP_ASYNC : FLIP_VSYNC;
    405377    int i;
    406378
    407     radeon_cs_flush_indirect(scrn);
    408 
    409379    if (!radeon_present_check_unflip(scrn))
    410380        goto modeset;
    411381
     
    424394        return;
    425395
    426396modeset:
    427     radeon_bo_wait(info->front_bo);
     397    radeon_finish(scrn, info->front_buffer);
    428398    for (i = 0; i < config->num_crtc; i++) {
    429399        xf86CrtcPtr crtc = config->crtc[i];
    430400        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_probe.c xf86-video-ati-18.0.1/src/radeon_probe.c
    old new  
    278278}
    279279#endif
    280280
    281 _X_EXPORT DriverRec RADEON =
     281DriverRec RADEON =
    282282{
    283283    RADEON_VERSION_CURRENT,
    284284    RADEON_DRIVER_NAME,
  • src/radeon_textured_video.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_textured_video.c xf86-video-ati-18.0.1/src/radeon_textured_video.c
    old new  
    153153static void
    154154RADEONFreeVideoMemory(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
    155155{
    156     if (pPriv->video_memory != NULL) {
     156    if (pPriv->video_memory) {
    157157        radeon_bo_unref(pPriv->video_memory);
    158158        pPriv->video_memory = NULL;
    159159
     
    312312        RADEONFreeVideoMemory(pScrn, pPriv);
    313313    }
    314314
    315     if (pPriv->video_memory == NULL) {
     315    if (!pPriv->video_memory) {
    316316      Bool ret;
    317317      ret = radeon_allocate_video_bo(pScrn,
    318318                                     &pPriv->video_memory,
     
    329329
    330330    /* Bicubic filter loading */
    331331    if (pPriv->bicubic_enabled) {
    332         if (info->bicubic_bo == NULL)
     332        if (!info->bicubic_bo)
    333333            pPriv->bicubic_enabled = FALSE;
    334334    }
    335335
     
    725725{
    726726    RADEONInfoPtr    info = RADEONPTR(pScrn);
    727727
    728     if (info->bicubic_memory != NULL) {
     728    if (info->bicubic_memory) {
    729729        radeon_bo_unref(info->bicubic_memory);
    730730        info->bicubic_memory = NULL;
    731731    }
     
    827827
    828828    adapt = calloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports *
    829829                   (sizeof(RADEONPortPrivRec) + sizeof(DevUnion)));
    830     if (adapt == NULL)
     830    if (!adapt)
    831831        return NULL;
    832832
    833833    xvBicubic         = MAKE_ATOM("XV_BICUBIC");
  • src/radeon_textured_videofuncs.c

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_textured_videofuncs.c xf86-video-ati-18.0.1/src/radeon_textured_videofuncs.c
    old new  
    6363    radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    6464
    6565    if (pPriv->bicubic_enabled)
    66         radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
     66        radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo,
     67                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    6768
    6869    driver_priv = exaGetPixmapDriverPrivate(pPixmap);
    69     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
     70    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     71                                      RADEON_GEM_DOMAIN_VRAM);
    7072
    7173    ret = radeon_cs_space_check(info->cs);
    7274    if (ret) {
     
    433435    radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    434436
    435437    if (pPriv->bicubic_enabled)
    436         radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
     438        radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo,
     439                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    437440
    438441    driver_priv = exaGetPixmapDriverPrivate(pPixmap);
    439     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
     442    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     443                                      RADEON_GEM_DOMAIN_VRAM);
    440444
    441445    ret = radeon_cs_space_check(info->cs);
    442446    if (ret) {
     
    958962    radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    959963
    960964    if (pPriv->bicubic_enabled)
    961         radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
     965        radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo,
     966                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    962967
    963968    driver_priv = exaGetPixmapDriverPrivate(pPixmap);
    964     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
     969    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     970                                      RADEON_GEM_DOMAIN_VRAM);
    965971
    966972    ret = radeon_cs_space_check(info->cs);
    967973    if (ret) {
     
    23762382    radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    23772383
    23782384    if (pPriv->bicubic_enabled)
    2379         radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
     2385        radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo,
     2386                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
    23802387   
    23812388    driver_priv = exaGetPixmapDriverPrivate(pPixmap);
    2382     radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
     2389    radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo->bo.radeon, 0,
     2390                                      RADEON_GEM_DOMAIN_VRAM);
    23832391
    23842392    ret = radeon_cs_space_check(info->cs);
    23852393    if (ret) {
  • xf86-video-ati-18.0.1

    diff -Naur xf86-video-ati-18.0.1.orig/src/radeon_video.c xf86-video-ati-18.0.1/src/radeon_video.c
    old new  
    144144
    145145    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
    146146    newAdaptors = malloc((num_adaptors + 2) * sizeof(*newAdaptors));
    147     if (newAdaptors == NULL)
     147    if (!newAdaptors)
    148148        return;
    149149
    150150    memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr));
     
    152152
    153153    if (info->use_glamor) {
    154154        texturedAdaptor = radeon_glamor_xv_init(pScreen, 16);
    155         if (texturedAdaptor != NULL) {
     155        if (texturedAdaptor) {
    156156            adaptors[num_adaptors++] = texturedAdaptor;
    157157            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Set up textured video (glamor)\n");
    158158        } else
     
    161161        || (info->directRenderingEnabled)
    162162        ) {
    163163        texturedAdaptor = RADEONSetupImageTexturedVideo(pScreen);
    164         if (texturedAdaptor != NULL) {
     164        if (texturedAdaptor) {
    165165            adaptors[num_adaptors++] = texturedAdaptor;
    166166            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Set up textured video\n");
    167167        } else