mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
st/xorg: Make it work again
This commit is contained in:
parent
8ccec83e63
commit
3905119b47
5 changed files with 86 additions and 10 deletions
|
|
@ -39,6 +39,8 @@
|
||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "pipe/p_inlines.h"
|
#include "pipe/p_inlines.h"
|
||||||
|
|
||||||
|
#include "util/u_rect.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PixmapPtr pPixmap;
|
PixmapPtr pPixmap;
|
||||||
struct pipe_texture *tex;
|
struct pipe_texture *tex;
|
||||||
|
|
@ -83,7 +85,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||||
pipe_texture_reference(&tex, depth);
|
pipe_texture_reference(&tex, depth);
|
||||||
} else if (attachments[i] == DRI2BufferDepth) {
|
} else if (attachments[i] == DRI2BufferDepth) {
|
||||||
struct pipe_texture template;
|
struct pipe_texture template;
|
||||||
|
|
||||||
memset(&template, 0, sizeof(template));
|
memset(&template, 0, sizeof(template));
|
||||||
template.target = PIPE_TEXTURE_2D;
|
template.target = PIPE_TEXTURE_2D;
|
||||||
template.format = PIPE_FORMAT_S8Z24_UNORM;
|
template.format = PIPE_FORMAT_S8Z24_UNORM;
|
||||||
|
|
@ -92,8 +93,9 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||||
template.height[0] = pDraw->height;
|
template.height[0] = pDraw->height;
|
||||||
template.depth[0] = 1;
|
template.depth[0] = 1;
|
||||||
template.last_level = 0;
|
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);
|
tex = ms->screen->texture_create(ms->screen, &template);
|
||||||
|
depth = tex;
|
||||||
} else {
|
} else {
|
||||||
struct pipe_texture template;
|
struct pipe_texture template;
|
||||||
memset(&template, 0, sizeof(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);
|
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->buffer_from_texture(ms->api, tex, &buf, &stride);
|
||||||
ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle);
|
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);
|
modesettingPtr ms = modesettingPTR(pScrn);
|
||||||
BufferPrivatePtr private;
|
BufferPrivatePtr private;
|
||||||
int i;
|
int i;
|
||||||
|
(void)ms;
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
private = buffers[i].driverPrivate;
|
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,
|
ms->screen->get_tex_surface(ms->screen, src_priv->tex, 0, 0, 0,
|
||||||
PIPE_BUFFER_USAGE_GPU_READ);
|
PIPE_BUFFER_USAGE_GPU_READ);
|
||||||
|
|
||||||
|
#if 0
|
||||||
ms->ctx->surface_copy(ms->ctx, dst_surf, 0, 0, src_surf,
|
ms->ctx->surface_copy(ms->ctx, dst_surf, 0, 0, src_surf,
|
||||||
0, 0, pDraw->width, pDraw->height);
|
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(&dst_surf, NULL);
|
||||||
pipe_surface_reference(&src_surf, NULL);
|
pipe_surface_reference(&src_surf, NULL);
|
||||||
|
|
|
||||||
|
|
@ -179,8 +179,10 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
|
||||||
modesettingPtr ms = modesettingPTR(pScrn);
|
modesettingPtr ms = modesettingPTR(pScrn);
|
||||||
ScreenPtr pScreen = pScrn->pScreen;
|
ScreenPtr pScreen = pScrn->pScreen;
|
||||||
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
|
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
|
||||||
|
unsigned handle, stride;
|
||||||
|
|
||||||
ms->noEvict = TRUE;
|
ms->noEvict = TRUE;
|
||||||
|
xorg_exa_set_displayed_usage(rootPixmap);
|
||||||
pScreen->ModifyPixmapHeader(rootPixmap,
|
pScreen->ModifyPixmapHeader(rootPixmap,
|
||||||
pScrn->virtualX, pScrn->virtualY,
|
pScrn->virtualX, pScrn->virtualY,
|
||||||
pScrn->depth, pScrn->bitsPerPixel,
|
pScrn->depth, pScrn->bitsPerPixel,
|
||||||
|
|
@ -188,13 +190,16 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
|
||||||
NULL);
|
NULL);
|
||||||
ms->noEvict = FALSE;
|
ms->noEvict = FALSE;
|
||||||
|
|
||||||
|
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
|
||||||
|
|
||||||
drmModeAddFB(ms->fd,
|
drmModeAddFB(ms->fd,
|
||||||
pScrn->virtualX,
|
pScrn->virtualX,
|
||||||
pScrn->virtualY,
|
pScrn->virtualY,
|
||||||
pScrn->depth,
|
pScrn->depth,
|
||||||
pScrn->bitsPerPixel,
|
pScrn->bitsPerPixel,
|
||||||
pScrn->displayWidth * pScrn->bitsPerPixel / 8,
|
stride,
|
||||||
xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
|
handle,
|
||||||
|
&ms->fb_id);
|
||||||
|
|
||||||
pScrn->frameX0 = 0;
|
pScrn->frameX0 = 0;
|
||||||
pScrn->frameY0 = 0;
|
pScrn->frameY0 = 0;
|
||||||
|
|
@ -426,6 +431,7 @@ CreateScreenResources(ScreenPtr pScreen)
|
||||||
modesettingPtr ms = modesettingPTR(pScrn);
|
modesettingPtr ms = modesettingPTR(pScrn);
|
||||||
PixmapPtr rootPixmap;
|
PixmapPtr rootPixmap;
|
||||||
Bool ret;
|
Bool ret;
|
||||||
|
unsigned handle, stride;
|
||||||
|
|
||||||
ms->noEvict = TRUE;
|
ms->noEvict = TRUE;
|
||||||
|
|
||||||
|
|
@ -435,18 +441,22 @@ CreateScreenResources(ScreenPtr pScreen)
|
||||||
|
|
||||||
rootPixmap = pScreen->GetScreenPixmap(pScreen);
|
rootPixmap = pScreen->GetScreenPixmap(pScreen);
|
||||||
|
|
||||||
|
xorg_exa_set_displayed_usage(rootPixmap);
|
||||||
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
|
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
|
||||||
FatalError("Couldn't adjust screen pixmap\n");
|
FatalError("Couldn't adjust screen pixmap\n");
|
||||||
|
|
||||||
ms->noEvict = FALSE;
|
ms->noEvict = FALSE;
|
||||||
|
|
||||||
|
handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
|
||||||
|
|
||||||
drmModeAddFB(ms->fd,
|
drmModeAddFB(ms->fd,
|
||||||
pScrn->virtualX,
|
pScrn->virtualX,
|
||||||
pScrn->virtualY,
|
pScrn->virtualY,
|
||||||
pScrn->depth,
|
pScrn->depth,
|
||||||
pScrn->bitsPerPixel,
|
pScrn->bitsPerPixel,
|
||||||
pScrn->displayWidth * pScrn->bitsPerPixel / 8,
|
stride,
|
||||||
xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
|
handle,
|
||||||
|
&ms->fb_id);
|
||||||
|
|
||||||
AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
|
AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -359,8 +359,48 @@ ExaPixmapIsOffscreen(PixmapPtr pPixmap)
|
||||||
return FALSE;
|
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
|
unsigned
|
||||||
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
|
xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
|
||||||
{
|
{
|
||||||
ScreenPtr pScreen = pPixmap->drawable.pScreen;
|
ScreenPtr pScreen = pPixmap->drawable.pScreen;
|
||||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
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->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
|
||||||
ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
|
ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
|
||||||
pipe_buffer_reference(&buffer, NULL);
|
pipe_buffer_reference(&buffer, NULL);
|
||||||
|
if (stride_out)
|
||||||
|
*stride_out = stride;
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -421,7 +464,9 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
|
||||||
bitsPerPixel, devKind, NULL);
|
bitsPerPixel, devKind, NULL);
|
||||||
|
|
||||||
/* Deal with screen resize */
|
/* 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);
|
pipe_texture_reference(&priv->tex, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -436,7 +481,8 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
|
||||||
template.height[0] = height;
|
template.height[0] = height;
|
||||||
template.depth[0] = 1;
|
template.depth[0] = 1;
|
||||||
template.last_level = 0;
|
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);
|
priv->tex = exa->scrn->texture_create(exa->scrn, &template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ struct exa_context
|
||||||
struct exa_pixmap_priv
|
struct exa_pixmap_priv
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
|
int tex_flags;
|
||||||
|
|
||||||
struct pipe_texture *tex;
|
struct pipe_texture *tex;
|
||||||
unsigned int color;
|
unsigned int color;
|
||||||
struct pipe_surface *src_surf; /* for copies */
|
struct pipe_surface *src_surf; /* for copies */
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#ifndef _XORG_TRACKER_H_
|
#ifndef _XORG_TRACKER_H_
|
||||||
#define _XORG_TRACKER_H_
|
#define _XORG_TRACKER_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <drm.h>
|
#include <drm.h>
|
||||||
|
|
@ -98,7 +99,13 @@ struct pipe_texture *
|
||||||
xorg_exa_get_texture(PixmapPtr pPixmap);
|
xorg_exa_get_texture(PixmapPtr pPixmap);
|
||||||
|
|
||||||
unsigned
|
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 *
|
void *
|
||||||
xorg_exa_init(ScrnInfoPtr pScrn);
|
xorg_exa_init(ScrnInfoPtr pScrn);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue