st/xorg: Make it work again
This commit is contained in:
parent
8ccec83e63
commit
3905119b47
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue