st/xorg: Massivly redo root pixmap creation

This commit is contained in:
Jakob Bornecrantz
2009-10-18 15:42:25 +02:00
parent e9e6152cb3
commit 846da0bfda
3 changed files with 137 additions and 38 deletions
+84 -38
View File
@@ -144,20 +144,22 @@ static Bool
CreateFrontBuffer(ScrnInfoPtr pScrn)
{
modesettingPtr ms = modesettingPTR(pScrn);
ScreenPtr pScreen = pScrn->pScreen;
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
unsigned handle, stride;
struct pipe_texture *tex;
ms->noEvict = TRUE;
xorg_exa_set_displayed_usage(rootPixmap);
pScreen->ModifyPixmapHeader(rootPixmap,
pScrn->virtualX, pScrn->virtualY,
pScrn->depth, pScrn->bitsPerPixel,
pScrn->displayWidth * pScrn->bitsPerPixel / 8,
NULL);
ms->noEvict = FALSE;
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
tex = xorg_exa_create_root_texture(pScrn, pScrn->virtualX, pScrn->virtualY,
pScrn->depth, pScrn->bitsPerPixel);
if (!tex)
return FALSE;
if (!ms->api->local_handle_from_texture(ms->api, ms->screen,
tex,
&stride,
&handle))
return FALSE;
drmModeAddFB(ms->fd,
pScrn->virtualX,
@@ -166,12 +168,39 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
pScrn->bitsPerPixel,
stride,
handle,
&ms->fb_id);
&ms->fb_id);
pScrn->frameX0 = 0;
pScrn->frameY0 = 0;
AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
pipe_texture_reference(&ms->root_texture, tex);
pipe_texture_reference(&tex, NULL);
return TRUE;
}
static Bool
BindTextureToRoot(ScrnInfoPtr pScrn)
{
modesettingPtr ms = modesettingPTR(pScrn);
ScreenPtr pScreen = pScrn->pScreen;
struct pipe_texture *check;
PixmapPtr rootPixmap;
rootPixmap = pScreen->GetScreenPixmap(pScreen);
xorg_exa_set_displayed_usage(rootPixmap);
xorg_exa_set_shared_usage(rootPixmap);
xorg_exa_set_texture(rootPixmap, ms->root_texture);
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
FatalError("Couldn't adjust screen pixmap\n");
check = xorg_exa_get_texture(rootPixmap);
if (ms->root_texture != check)
FatalError("Created new root texture\n");
pipe_texture_reference(&check, NULL);
return TRUE;
}
@@ -179,10 +208,9 @@ static Bool
crtc_resize(ScrnInfoPtr pScrn, int width, int height)
{
modesettingPtr ms = modesettingPTR(pScrn);
//ScreenPtr pScreen = pScrn->pScreen;
//PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
//Bool fbAccessDisabled;
//CARD8 *fbstart;
unsigned handle, stride;
PixmapPtr rootPixmap;
ScreenPtr pScreen = pScrn->pScreen;
if (width == pScrn->virtualX && height == pScrn->virtualY)
return TRUE;
@@ -192,13 +220,40 @@ crtc_resize(ScrnInfoPtr pScrn, int width, int height)
pScrn->virtualX = width;
pScrn->virtualY = height;
/*
* Remove the old framebuffer & texture.
*/
drmModeRmFB(ms->fd, ms->fb_id);
pipe_texture_reference(&ms->root_texture, NULL);
rootPixmap = pScreen->GetScreenPixmap(pScreen);
if (!pScreen->ModifyPixmapHeader(rootPixmap, width, height, -1, -1, -1, NULL))
return FALSE;
/* takes one ref */
ms->root_texture = xorg_exa_get_texture(rootPixmap);
if (!ms->api->local_handle_from_texture(ms->api, ms->screen,
ms->root_texture,
&stride,
&handle))
FatalError("Could not get handle and stride from texture\n");
drmModeAddFB(ms->fd,
pScrn->virtualX,
pScrn->virtualY,
pScrn->depth,
pScrn->bitsPerPixel,
stride,
handle,
&ms->fb_id);
/* HW dependent - FIXME */
pScrn->displayWidth = pScrn->virtualX;
drmModeRmFB(ms->fd, ms->fb_id);
/* now create new frontbuffer */
return CreateFrontBuffer(pScrn);
return CreateFrontBuffer(pScrn) && BindTextureToRoot(pScrn);
}
static const xf86CrtcConfigFuncsRec crtc_config_funcs = {
@@ -429,7 +484,6 @@ CreateScreenResources(ScreenPtr pScreen)
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap;
Bool ret;
unsigned handle, stride;
ms->noEvict = TRUE;
@@ -437,29 +491,14 @@ CreateScreenResources(ScreenPtr pScreen)
ret = pScreen->CreateScreenResources(pScreen);
pScreen->CreateScreenResources = CreateScreenResources;
rootPixmap = pScreen->GetScreenPixmap(pScreen);
xorg_exa_set_displayed_usage(rootPixmap);
xorg_exa_set_shared_usage(rootPixmap);
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
FatalError("Couldn't adjust screen pixmap\n");
BindTextureToRoot(pScrn);
ms->noEvict = FALSE;
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
drmModeAddFB(ms->fd,
pScrn->virtualX,
pScrn->virtualY,
pScrn->depth,
pScrn->bitsPerPixel,
stride,
handle,
&ms->fb_id);
AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
#ifdef DRM_MODE_FEATURE_DIRTYFB
rootPixmap = pScreen->GetScreenPixmap(pScreen);
ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
pScreen, rootPixmap);
@@ -472,6 +511,8 @@ CreateScreenResources(ScreenPtr pScreen)
"Failed to create screen damage record\n");
return FALSE;
}
#else
(void)rootPixmap;
#endif
return ret;
@@ -684,8 +725,11 @@ EnterVT(int scrnIndex, int flags)
SaveHWState(pScrn);
}
if (!flags) /* signals startup as we'll do this in CreateScreenResources */
CreateFrontBuffer(pScrn);
if (!CreateFrontBuffer(pScrn))
return FALSE;
if (!flags && !BindTextureToRoot(pScrn))
return FALSE;
if (!xf86SetDesiredModes(pScrn))
return FALSE;
@@ -725,6 +769,8 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
}
#endif
pipe_texture_reference(&ms->root_texture, NULL);
if (ms->exa)
xorg_exa_close(pScrn);
@@ -708,6 +708,50 @@ xorg_exa_get_texture(PixmapPtr pPixmap)
return tex;
}
Bool
xorg_exa_set_texture(PixmapPtr pPixmap, struct pipe_texture *tex)
{
struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
int mask = PIPE_TEXTURE_USAGE_PRIMARY | PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
if (!priv)
return FALSE;
if (pPixmap->drawable.width != tex->width[0] ||
pPixmap->drawable.height != tex->height[0])
return FALSE;
pipe_texture_reference(&priv->tex, tex);
priv->tex_flags = tex->tex_usage & mask;
return TRUE;
}
struct pipe_texture *
xorg_exa_create_root_texture(ScrnInfoPtr pScrn,
int width, int height,
int depth, int bitsPerPixel)
{
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_context *exa = ms->exa;
struct pipe_texture template;
memset(&template, 0, sizeof(template));
template.target = PIPE_TEXTURE_2D;
exa_get_pipe_format(depth, &template.format, &bitsPerPixel);
pf_get_block(template.format, &template.block);
template.width[0] = width;
template.height[0] = height;
template.depth[0] = 1;
template.last_level = 0;
template.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET;
template.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY;
template.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
return exa->scrn->texture_create(exa->scrn, &template);
}
void
xorg_exa_close(ScrnInfoPtr pScrn)
{
@@ -92,6 +92,7 @@ typedef struct _modesettingRec
struct pipe_context *ctx;
boolean d_depth_bits_last;
boolean ds_depth_bits_last;
struct pipe_texture *root_texture;
/* exa */
struct exa_context *exa;
@@ -121,6 +122,14 @@ xorg_exa_set_displayed_usage(PixmapPtr pPixmap);
int
xorg_exa_set_shared_usage(PixmapPtr pPixmap);
Bool
xorg_exa_set_texture(PixmapPtr pPixmap, struct pipe_texture *tex);
struct pipe_texture *
xorg_exa_create_root_texture(ScrnInfoPtr pScrn,
int width, int height,
int depth, int bpp);
void *
xorg_exa_init(ScrnInfoPtr pScrn);