st/xorg: Make it work again

This commit is contained in:
Jakob Bornecrantz 2009-08-05 19:26:21 +01:00
parent 8ccec83e63
commit 3905119b47
5 changed files with 86 additions and 10 deletions

View File

@ -39,6 +39,8 @@
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "util/u_rect.h"
typedef struct {
PixmapPtr pPixmap;
struct pipe_texture *tex;
@ -83,7 +85,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
pipe_texture_reference(&tex, depth);
} else if (attachments[i] == DRI2BufferDepth) {
struct pipe_texture template;
memset(&template, 0, sizeof(template));
template.target = PIPE_TEXTURE_2D;
template.format = PIPE_FORMAT_S8Z24_UNORM;
@ -92,8 +93,9 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
template.height[0] = pDraw->height;
template.depth[0] = 1;
template.last_level = 0;
template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
template.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
tex = ms->screen->texture_create(ms->screen, &template);
depth = tex;
} else {
struct pipe_texture template;
memset(&template, 0, sizeof(template));
@ -108,6 +110,9 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
tex = ms->screen->texture_create(ms->screen, &template);
}
if (!tex)
FatalError("NO TEXTURE IN DRI2\n");
ms->api->buffer_from_texture(ms->api, tex, &buf, &stride);
ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle);
@ -138,6 +143,7 @@ driDestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
modesettingPtr ms = modesettingPTR(pScrn);
BufferPrivatePtr private;
int i;
(void)ms;
for (i = 0; i < count; i++) {
private = buffers[i].driverPrivate;
@ -172,8 +178,13 @@ driCopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
ms->screen->get_tex_surface(ms->screen, src_priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_GPU_READ);
#if 0
ms->ctx->surface_copy(ms->ctx, dst_surf, 0, 0, src_surf,
0, 0, pDraw->width, pDraw->height);
#else
util_surface_copy(ms->ctx, false, dst_surf, 0, 0, src_surf,
0, 0, pDraw->width, pDraw->height);
#endif
pipe_surface_reference(&dst_surf, NULL);
pipe_surface_reference(&src_surf, NULL);

View File

@ -179,8 +179,10 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
modesettingPtr ms = modesettingPTR(pScrn);
ScreenPtr pScreen = pScrn->pScreen;
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
unsigned handle, stride;
ms->noEvict = TRUE;
xorg_exa_set_displayed_usage(rootPixmap);
pScreen->ModifyPixmapHeader(rootPixmap,
pScrn->virtualX, pScrn->virtualY,
pScrn->depth, pScrn->bitsPerPixel,
@ -188,13 +190,16 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
NULL);
ms->noEvict = FALSE;
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
drmModeAddFB(ms->fd,
pScrn->virtualX,
pScrn->virtualY,
pScrn->depth,
pScrn->bitsPerPixel,
pScrn->displayWidth * pScrn->bitsPerPixel / 8,
xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
stride,
handle,
&ms->fb_id);
pScrn->frameX0 = 0;
pScrn->frameY0 = 0;
@ -426,6 +431,7 @@ CreateScreenResources(ScreenPtr pScreen)
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap;
Bool ret;
unsigned handle, stride;
ms->noEvict = TRUE;
@ -435,18 +441,22 @@ CreateScreenResources(ScreenPtr pScreen)
rootPixmap = pScreen->GetScreenPixmap(pScreen);
xorg_exa_set_displayed_usage(rootPixmap);
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
FatalError("Couldn't adjust screen pixmap\n");
ms->noEvict = FALSE;
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
drmModeAddFB(ms->fd,
pScrn->virtualX,
pScrn->virtualY,
pScrn->depth,
pScrn->bitsPerPixel,
pScrn->displayWidth * pScrn->bitsPerPixel / 8,
xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
stride,
handle,
&ms->fb_id);
AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);

View File

@ -359,8 +359,48 @@ ExaPixmapIsOffscreen(PixmapPtr pPixmap)
return FALSE;
}
int
xorg_exa_set_displayed_usage(PixmapPtr pPixmap)
{
struct exa_pixmap_priv *priv;
priv = exaGetPixmapDriverPrivate(pPixmap);
if (!priv) {
FatalError("NO PIXMAP PRIVATE\n");
return 0;
}
if (priv->flags & ~PIPE_TEXTURE_USAGE_PRIMARY) {
FatalError("BAD FLAGS\n");
return 0;
}
priv->flags = PIPE_TEXTURE_USAGE_PRIMARY;
return 0;
}
int
xorg_exa_set_shared_usage(PixmapPtr pPixmap)
{
struct exa_pixmap_priv *priv;
priv = exaGetPixmapDriverPrivate(pPixmap);
if (!priv) {
FatalError("NO PIXMAP PRIVATE\n");
return 0;
}
if (priv->flags & ~PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
FatalError("BAD FLAGS\n");
return 0;
}
priv->flags = PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
return 0;
}
unsigned
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
{
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
@ -385,6 +425,9 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
pipe_buffer_reference(&buffer, NULL);
if (stride_out)
*stride_out = stride;
return handle;
}
@ -421,7 +464,9 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
bitsPerPixel, devKind, NULL);
/* Deal with screen resize */
if (priv->tex && (priv->tex->width[0] != width || priv->tex->height[0] != height)) {
if (priv->tex && (priv->tex->width[0] != width ||
priv->tex->height[0] != height ||
priv->tex_flags != priv->flags)) {
pipe_texture_reference(&priv->tex, NULL);
}
@ -436,7 +481,8 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
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_RENDER_TARGET | priv->flags;
priv->tex_flags = priv->flags;
priv->tex = exa->scrn->texture_create(exa->scrn, &template);
}

View File

@ -14,6 +14,8 @@ struct exa_context
struct exa_pixmap_priv
{
int flags;
int tex_flags;
struct pipe_texture *tex;
unsigned int color;
struct pipe_surface *src_surf; /* for copies */

View File

@ -31,6 +31,7 @@
#ifndef _XORG_TRACKER_H_
#define _XORG_TRACKER_H_
#include <stddef.h>
#include <stdint.h>
#include <errno.h>
#include <drm.h>
@ -98,7 +99,13 @@ struct pipe_texture *
xorg_exa_get_texture(PixmapPtr pPixmap);
unsigned
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap);
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride);
int
xorg_exa_set_displayed_usage(PixmapPtr pPixmap);
int
xorg_exa_set_shared_usage(PixmapPtr pPixmap);
void *
xorg_exa_init(ScrnInfoPtr pScrn);