modesetting: Create a drmmode_bo wrapper; use it for front_bo.
This code is going to be extended to support GBM BOs soon. This small abstraction removes a lot of direct dumb_bo access, so we can add that support in one place, rather than putting conditionals at every pitch/handle/etc access. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Tested-by: Jason Ekstrand <jason.ekstrand@intel.com> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
		
							parent
							
								
									c6388964b0
								
							
						
					
					
						commit
						980535757d
					
				| 
						 | 
				
			
			@ -861,7 +861,7 @@ msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
 | 
			
		|||
    stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8;
 | 
			
		||||
    *size = stride;
 | 
			
		||||
 | 
			
		||||
    return ((uint8_t *) ms->drmmode.front_bo->ptr + row * stride + offset);
 | 
			
		||||
    return ((uint8_t *) ms->drmmode.front_bo.dumb->ptr + row * stride + offset);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,40 @@
 | 
			
		|||
#include "glamor.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
drmmode_bo_destroy(drmmode_ptr drmmode, drmmode_bo *bo)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (bo->dumb) {
 | 
			
		||||
        ret = dumb_bo_destroy(drmmode->fd, bo->dumb);
 | 
			
		||||
        if (ret == 0)
 | 
			
		||||
            bo->dumb = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t
 | 
			
		||||
drmmode_bo_get_pitch(drmmode_bo *bo)
 | 
			
		||||
{
 | 
			
		||||
    return bo->dumb->pitch;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t
 | 
			
		||||
drmmode_bo_get_handle(drmmode_bo *bo)
 | 
			
		||||
{
 | 
			
		||||
    return bo->dumb->handle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
drmmode_create_bo(drmmode_ptr drmmode, drmmode_bo *bo,
 | 
			
		||||
                  unsigned width, unsigned height, unsigned bpp)
 | 
			
		||||
{
 | 
			
		||||
    bo->dumb = dumb_bo_create(drmmode->fd, width, height, bpp);
 | 
			
		||||
    return bo->dumb != NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
drmmode_SetSlaveBO(PixmapPtr ppix,
 | 
			
		||||
                   drmmode_ptr drmmode, int fd_handle, int pitch, int size)
 | 
			
		||||
| 
						 | 
				
			
			@ -213,8 +247,9 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 | 
			
		|||
        ret = drmModeAddFB(drmmode->fd,
 | 
			
		||||
                           pScrn->virtualX, height,
 | 
			
		||||
                           pScrn->depth, pScrn->bitsPerPixel,
 | 
			
		||||
                           drmmode->front_bo->pitch,
 | 
			
		||||
                           drmmode->front_bo->handle, &drmmode->fb_id);
 | 
			
		||||
                           drmmode_bo_get_pitch(&drmmode->front_bo),
 | 
			
		||||
                           drmmode_bo_get_handle(&drmmode->front_bo),
 | 
			
		||||
                           &drmmode->fb_id);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            ErrorF("failed to add fb %d\n", ret);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
| 
						 | 
				
			
			@ -1080,7 +1115,7 @@ drmmode_glamor_handle_new_screen_pixmap(drmmode_ptr drmmode)
 | 
			
		|||
        return TRUE;
 | 
			
		||||
 | 
			
		||||
    if (!glamor_egl_create_textured_screen(screen,
 | 
			
		||||
                                           drmmode->front_bo->handle,
 | 
			
		||||
                                           drmmode_bo_get_handle(&drmmode->front_bo),
 | 
			
		||||
                                           scrn->displayWidth *
 | 
			
		||||
                                           scrn->bitsPerPixel / 8)) {
 | 
			
		||||
        xf86DrvMsg(scrn->scrnIndex, X_ERROR,
 | 
			
		||||
| 
						 | 
				
			
			@ -1100,7 +1135,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 | 
			
		|||
    drmmode_crtc_private_ptr
 | 
			
		||||
        drmmode_crtc = xf86_config->crtc[0]->driver_private;
 | 
			
		||||
    drmmode_ptr drmmode = drmmode_crtc->drmmode;
 | 
			
		||||
    struct dumb_bo *old_front = NULL;
 | 
			
		||||
    drmmode_bo old_front;
 | 
			
		||||
    Bool ret;
 | 
			
		||||
    ScreenPtr screen = xf86ScrnToScreen(scrn);
 | 
			
		||||
    uint32_t old_fb_id;
 | 
			
		||||
| 
						 | 
				
			
			@ -1122,16 +1157,15 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 | 
			
		|||
 | 
			
		||||
    old_width = scrn->virtualX;
 | 
			
		||||
    old_height = scrn->virtualY;
 | 
			
		||||
    old_pitch = drmmode->front_bo->pitch;
 | 
			
		||||
    old_pitch = drmmode_bo_get_pitch(&drmmode->front_bo);
 | 
			
		||||
    old_fb_id = drmmode->fb_id;
 | 
			
		||||
    old_front = drmmode->front_bo;
 | 
			
		||||
 | 
			
		||||
    drmmode->front_bo =
 | 
			
		||||
        dumb_bo_create(drmmode->fd, width, height, scrn->bitsPerPixel);
 | 
			
		||||
    if (!drmmode->front_bo)
 | 
			
		||||
    if (!drmmode_create_bo(drmmode, &drmmode->front_bo,
 | 
			
		||||
                           width, height, scrn->bitsPerPixel))
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    pitch = drmmode->front_bo->pitch;
 | 
			
		||||
    pitch = drmmode_bo_get_pitch(&drmmode->front_bo);
 | 
			
		||||
 | 
			
		||||
    scrn->virtualX = width;
 | 
			
		||||
    scrn->virtualY = height;
 | 
			
		||||
| 
						 | 
				
			
			@ -1139,7 +1173,8 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 | 
			
		|||
 | 
			
		||||
    ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth,
 | 
			
		||||
                       scrn->bitsPerPixel, pitch,
 | 
			
		||||
                       drmmode->front_bo->handle, &drmmode->fb_id);
 | 
			
		||||
                       drmmode_bo_get_handle(&drmmode->front_bo),
 | 
			
		||||
                       &drmmode->fb_id);
 | 
			
		||||
    if (ret)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1174,14 +1209,13 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 | 
			
		|||
 | 
			
		||||
    if (old_fb_id) {
 | 
			
		||||
        drmModeRmFB(drmmode->fd, old_fb_id);
 | 
			
		||||
        dumb_bo_destroy(drmmode->fd, old_front);
 | 
			
		||||
        drmmode_bo_destroy(drmmode, &old_front);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
 fail:
 | 
			
		||||
    if (drmmode->front_bo)
 | 
			
		||||
        dumb_bo_destroy(drmmode->fd, drmmode->front_bo);
 | 
			
		||||
    drmmode_bo_destroy(drmmode, &drmmode->front_bo);
 | 
			
		||||
    drmmode->front_bo = old_front;
 | 
			
		||||
    scrn->virtualX = old_width;
 | 
			
		||||
    scrn->virtualY = old_height;
 | 
			
		||||
| 
						 | 
				
			
			@ -1467,10 +1501,9 @@ drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 | 
			
		|||
    width = pScrn->virtualX;
 | 
			
		||||
    height = pScrn->virtualY;
 | 
			
		||||
 | 
			
		||||
    drmmode->front_bo = dumb_bo_create(drmmode->fd, width, height, bpp);
 | 
			
		||||
    if (!drmmode->front_bo)
 | 
			
		||||
    if (!drmmode_create_bo(drmmode, &drmmode->front_bo, width, height, bpp))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    pScrn->displayWidth = drmmode->front_bo->pitch / cpp;
 | 
			
		||||
    pScrn->displayWidth = drmmode_bo_get_pitch(&drmmode->front_bo) / cpp;
 | 
			
		||||
 | 
			
		||||
    width = ms->cursor_width;
 | 
			
		||||
    height = ms->cursor_height;
 | 
			
		||||
| 
						 | 
				
			
			@ -1490,14 +1523,14 @@ drmmode_map_front_bo(drmmode_ptr drmmode)
 | 
			
		|||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (drmmode->front_bo->ptr)
 | 
			
		||||
        return drmmode->front_bo->ptr;
 | 
			
		||||
    if (drmmode->front_bo.dumb->ptr)
 | 
			
		||||
        return drmmode->front_bo.dumb->ptr;
 | 
			
		||||
 | 
			
		||||
    ret = dumb_bo_map(drmmode->fd, drmmode->front_bo);
 | 
			
		||||
    ret = dumb_bo_map(drmmode->fd, drmmode->front_bo.dumb);
 | 
			
		||||
    if (ret)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    return drmmode->front_bo->ptr;
 | 
			
		||||
    return drmmode->front_bo.dumb->ptr;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1544,8 +1577,7 @@ drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 | 
			
		|||
        drmmode->fb_id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dumb_bo_destroy(drmmode->fd, drmmode->front_bo);
 | 
			
		||||
    drmmode->front_bo = NULL;
 | 
			
		||||
    drmmode_bo_destroy(drmmode, &drmmode->front_bo);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < xf86_config->num_crtc; i++) {
 | 
			
		||||
        xf86CrtcPtr crtc = xf86_config->crtc[i];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,10 @@
 | 
			
		|||
 | 
			
		||||
#include "dumb_bo.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    struct dumb_bo *dumb;
 | 
			
		||||
} drmmode_bo;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    int fd;
 | 
			
		||||
    unsigned fb_id;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +51,7 @@ typedef struct {
 | 
			
		|||
    InputHandlerProc uevent_handler;
 | 
			
		||||
#endif
 | 
			
		||||
    drmEventContext event_context;
 | 
			
		||||
    struct dumb_bo *front_bo;
 | 
			
		||||
    drmmode_bo front_bo;
 | 
			
		||||
    Bool sw_cursor;
 | 
			
		||||
 | 
			
		||||
    Bool glamor;
 | 
			
		||||
| 
						 | 
				
			
			@ -123,6 +127,7 @@ extern DevPrivateKeyRec msPixmapPrivateKeyRec;
 | 
			
		|||
 | 
			
		||||
#define msGetPixmapPriv(drmmode, p) ((msPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, &(drmmode)->pixmapPrivateKeyRec))
 | 
			
		||||
 | 
			
		||||
uint32_t drmmode_bo_get_handle(drmmode_bo *bo);
 | 
			
		||||
Bool drmmode_glamor_handle_new_screen_pixmap(drmmode_ptr drmmode);
 | 
			
		||||
void *drmmode_map_slave_bo(drmmode_ptr drmmode, msPixmapPrivPtr ppriv);
 | 
			
		||||
Bool drmmode_SetSlaveBO(PixmapPtr ppix,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue