Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-29 Thread Eric Anholt
Adam Jackson a...@redhat.com writes:

 On Mon, 2015-07-27 at 13:29 -0700, Eric Anholt wrote:
 It's clearly derived from fb/fb24_32.c.  But I'm not sure where
 things would have switched from SuSE to keithp.
 
 It does make me wonder why we don't just use fb's CopyArea to do the
 job, though.

 shadow's not really set up that way in general, the dix code draws to a
 pixmap but the front buffer is arbitrary storage.  I guess you could
 wrap it in a scratch pixmap header for this case, but that would be
 true of shpacked.c too.

Yeah, that's what I was thinking.


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-29 Thread Adam Jackson
On Mon, 2015-07-27 at 13:29 -0700, Eric Anholt wrote:
 It's clearly derived from fb/fb24_32.c.  But I'm not sure where
 things would have switched from SuSE to keithp.
 
 It does make me wonder why we don't just use fb's CopyArea to do the
 job, though.

shadow's not really set up that way in general, the dix code draws to a
pixmap but the front buffer is arbitrary storage.  I guess you could
wrap it in a scratch pixmap header for this case, but that would be
true of shpacked.c too.

- ajax

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-27 Thread Eric Anholt
Matt Turner matts...@gmail.com writes:

 On Wed, Jul 22, 2015 at 9:14 AM, Adam Jackson a...@redhat.com wrote:
 From: Dave Airlie airl...@redhat.com

 24bpp front buffers tend to be the least well tested path for client
 rendering.  On the qemu cirrus emulation, and on some Matrox G200 server
 chips, the hardware can't do 32bpp at all.  It's better to just allocate
 a 32bpp shadow and downconvert in the upload hook than expose a funky
 pixmap format to clients.

 [ajax: Ported from RHEL and separate modesetting driver, lifted kbpp
 into the drmmode struct, cleaned up commit message, fixed 16bpp]

 Reviewed-by: Adam Jackson a...@redhat.com
 Signed-off-by: Dave Airlied airl...@redhat.com
 ---
  hw/xfree86/drivers/modesetting/Makefile.am   |   2 +
  hw/xfree86/drivers/modesetting/driver.c  |  41 ---
  hw/xfree86/drivers/modesetting/drmmode_display.c |  24 ++--
  hw/xfree86/drivers/modesetting/drmmode_display.h |   2 +
  hw/xfree86/drivers/modesetting/sh3224.c  | 140 
 +++
  hw/xfree86/drivers/modesetting/sh3224.h  |   7 ++
  6 files changed, 193 insertions(+), 23 deletions(-)
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.c
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.h

 diff --git a/hw/xfree86/drivers/modesetting/sh3224.c 
 b/hw/xfree86/drivers/modesetting/sh3224.c
 new file mode 100644
 index 000..a64a103
 --- /dev/null
 +++ b/hw/xfree86/drivers/modesetting/sh3224.c
 @@ -0,0 +1,140 @@
 +/*
 + *
 + * Copyright © 2000 Keith Packard

 Whoops. (Keith appears throughout below as well).

It's clearly derived from fb/fb24_32.c.  But I'm not sure where things
would have switched from SuSE to keithp.

It does make me wonder why we don't just use fb's CopyArea to do the
job, though.


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-26 Thread Matt Turner
On Wed, Jul 22, 2015 at 9:14 AM, Adam Jackson a...@redhat.com wrote:
 From: Dave Airlie airl...@redhat.com

 24bpp front buffers tend to be the least well tested path for client
 rendering.  On the qemu cirrus emulation, and on some Matrox G200 server
 chips, the hardware can't do 32bpp at all.  It's better to just allocate
 a 32bpp shadow and downconvert in the upload hook than expose a funky
 pixmap format to clients.

 [ajax: Ported from RHEL and separate modesetting driver, lifted kbpp
 into the drmmode struct, cleaned up commit message, fixed 16bpp]

 Reviewed-by: Adam Jackson a...@redhat.com
 Signed-off-by: Dave Airlied airl...@redhat.com
 ---
  hw/xfree86/drivers/modesetting/Makefile.am   |   2 +
  hw/xfree86/drivers/modesetting/driver.c  |  41 ---
  hw/xfree86/drivers/modesetting/drmmode_display.c |  24 ++--
  hw/xfree86/drivers/modesetting/drmmode_display.h |   2 +
  hw/xfree86/drivers/modesetting/sh3224.c  | 140 
 +++
  hw/xfree86/drivers/modesetting/sh3224.h  |   7 ++
  6 files changed, 193 insertions(+), 23 deletions(-)
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.c
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.h

 diff --git a/hw/xfree86/drivers/modesetting/Makefile.am 
 b/hw/xfree86/drivers/modesetting/Makefile.am
 index 82c4f2f..ca7e05a 100644
 --- a/hw/xfree86/drivers/modesetting/Makefile.am
 +++ b/hw/xfree86/drivers/modesetting/Makefile.am
 @@ -51,6 +51,8 @@ modesetting_drv_la_SOURCES = \
  dumb_bo.c \
  dumb_bo.h \
  present.c \
 +sh3224.c \
 +sh3224.h \
  vblank.c \
  $(NULL)

 diff --git a/hw/xfree86/drivers/modesetting/driver.c 
 b/hw/xfree86/drivers/modesetting/driver.c
 index 324b8bd..68a865f 100644
 --- a/hw/xfree86/drivers/modesetting/driver.c
 +++ b/hw/xfree86/drivers/modesetting/driver.c
 @@ -60,6 +60,7 @@
  #endif

  #include driver.h
 +#include sh3224.h

  static void AdjustFrame(ScrnInfoPtr pScrn, int x, int y);
  static Bool CloseScreen(ScreenPtr pScreen);
 @@ -770,10 +771,16 @@ PreInit(ScrnInfoPtr pScrn, int flags)
  }
  #endif
  drmmode_get_default_bpp(pScrn, ms-drmmode, defaultdepth, defaultbpp);
 -if (defaultdepth == 24  defaultbpp == 24)
 -bppflags = SupportConvert32to24 | Support24bppFb;
 -else
 -bppflags = PreferConvert24to32 | SupportConvert24to32 | 
 Support32bppFb;
 +if (defaultdepth == 24  defaultbpp == 24) {
 +   ms-drmmode.force_24_32 = TRUE;
 +   ms-drmmode.kbpp = 24;
 +   xf86DrvMsg(pScrn-scrnIndex, X_INFO,
 +  Using 24bpp hw front buffer with 32bpp shadow\n);
 +   defaultbpp = 32;
 +} else {
 +   ms-drmmode.kbpp = defaultbpp;
 +}
 +bppflags = PreferConvert24to32 | SupportConvert24to32 | Support32bppFb;

  if (!xf86SetDepthBpp
  (pScrn, defaultdepth, defaultdepth, defaultbpp, bppflags))
 @@ -827,18 +834,24 @@ PreInit(ScrnInfoPtr pScrn, int flags)
  } else {
  Bool prefer_shadow = TRUE;

 -ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
 -if (!ret) {
 -prefer_shadow = !!value;
 -}
 +   if (ms-drmmode.force_24_32) {
 +   prefer_shadow = TRUE;
 +   ms-drmmode.shadow_enable = TRUE;
 +   } else {
 +   ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
 +   if (!ret) {
 +   prefer_shadow = !!value;
 +   }

 -ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
 - OPTION_SHADOW_FB,
 - prefer_shadow);
 +   ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
 +OPTION_SHADOW_FB,
 +prefer_shadow);
 +   }

  xf86DrvMsg(pScrn-scrnIndex, X_INFO,
 ShadowFB: preferred %s, enabled %s\n,
 prefer_shadow ? YES : NO,
 +  ms-drmmode.force_24_32 ? FORCE :
 ms-drmmode.shadow_enable ? YES : NO);

  ms-drmmode.pageflip = FALSE;
 @@ -894,7 +907,7 @@ msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 
 offset, int mode,
  modesettingPtr ms = modesettingPTR(pScrn);
  int stride;

 -stride = (pScrn-displayWidth * pScrn-bitsPerPixel) / 8;
 +stride = (pScrn-displayWidth * ms-drmmode.kbpp) / 8;
  *size = stride;

  return ((uint8_t *) ms-drmmode.front_bo.dumb-ptr + row * stride + 
 offset);
 @@ -915,6 +928,7 @@ CreateScreenResources(ScreenPtr pScreen)
  Bool ret;
  void *pixels = NULL;
  int err;
 +Bool use_ms_shadow = ms-drmmode.force_24_32  pScrn-bitsPerPixel == 
 32;

  pScreen-CreateScreenResources = ms-createScreenResources;
  ret = pScreen-CreateScreenResources(pScreen);
 @@ -946,7 +960,8 @@ CreateScreenResources(ScreenPtr pScreen)

[PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-22 Thread Adam Jackson
From: Dave Airlie airl...@redhat.com

24bpp front buffers tend to be the least well tested path for client
rendering.  On the qemu cirrus emulation, and on some Matrox G200 server
chips, the hardware can't do 32bpp at all.  It's better to just allocate
a 32bpp shadow and downconvert in the upload hook than expose a funky
pixmap format to clients.

[ajax: Ported from RHEL and separate modesetting driver, lifted kbpp
into the drmmode struct, cleaned up commit message, fixed 16bpp]

Reviewed-by: Adam Jackson a...@redhat.com
Signed-off-by: Dave Airlied airl...@redhat.com
---
 hw/xfree86/drivers/modesetting/Makefile.am   |   2 +
 hw/xfree86/drivers/modesetting/driver.c  |  41 ---
 hw/xfree86/drivers/modesetting/drmmode_display.c |  24 ++--
 hw/xfree86/drivers/modesetting/drmmode_display.h |   2 +
 hw/xfree86/drivers/modesetting/sh3224.c  | 140 +++
 hw/xfree86/drivers/modesetting/sh3224.h  |   7 ++
 6 files changed, 193 insertions(+), 23 deletions(-)
 create mode 100644 hw/xfree86/drivers/modesetting/sh3224.c
 create mode 100644 hw/xfree86/drivers/modesetting/sh3224.h

diff --git a/hw/xfree86/drivers/modesetting/Makefile.am 
b/hw/xfree86/drivers/modesetting/Makefile.am
index 82c4f2f..ca7e05a 100644
--- a/hw/xfree86/drivers/modesetting/Makefile.am
+++ b/hw/xfree86/drivers/modesetting/Makefile.am
@@ -51,6 +51,8 @@ modesetting_drv_la_SOURCES = \
 dumb_bo.c \
 dumb_bo.h \
 present.c \
+sh3224.c \
+sh3224.h \
 vblank.c \
 $(NULL)
 
diff --git a/hw/xfree86/drivers/modesetting/driver.c 
b/hw/xfree86/drivers/modesetting/driver.c
index 324b8bd..68a865f 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -60,6 +60,7 @@
 #endif
 
 #include driver.h
+#include sh3224.h
 
 static void AdjustFrame(ScrnInfoPtr pScrn, int x, int y);
 static Bool CloseScreen(ScreenPtr pScreen);
@@ -770,10 +771,16 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 }
 #endif
 drmmode_get_default_bpp(pScrn, ms-drmmode, defaultdepth, defaultbpp);
-if (defaultdepth == 24  defaultbpp == 24)
-bppflags = SupportConvert32to24 | Support24bppFb;
-else
-bppflags = PreferConvert24to32 | SupportConvert24to32 | Support32bppFb;
+if (defaultdepth == 24  defaultbpp == 24) {
+   ms-drmmode.force_24_32 = TRUE;
+   ms-drmmode.kbpp = 24;
+   xf86DrvMsg(pScrn-scrnIndex, X_INFO,
+  Using 24bpp hw front buffer with 32bpp shadow\n);
+   defaultbpp = 32;
+} else {
+   ms-drmmode.kbpp = defaultbpp;
+}
+bppflags = PreferConvert24to32 | SupportConvert24to32 | Support32bppFb;
 
 if (!xf86SetDepthBpp
 (pScrn, defaultdepth, defaultdepth, defaultbpp, bppflags))
@@ -827,18 +834,24 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 } else {
 Bool prefer_shadow = TRUE;
 
-ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
-if (!ret) {
-prefer_shadow = !!value;
-}
+   if (ms-drmmode.force_24_32) {
+   prefer_shadow = TRUE;
+   ms-drmmode.shadow_enable = TRUE;
+   } else {
+   ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
+   if (!ret) {
+   prefer_shadow = !!value;
+   }
 
-ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
- OPTION_SHADOW_FB,
- prefer_shadow);
+   ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
+OPTION_SHADOW_FB,
+prefer_shadow);
+   }
 
 xf86DrvMsg(pScrn-scrnIndex, X_INFO,
ShadowFB: preferred %s, enabled %s\n,
prefer_shadow ? YES : NO,
+  ms-drmmode.force_24_32 ? FORCE :
ms-drmmode.shadow_enable ? YES : NO);
 
 ms-drmmode.pageflip = FALSE;
@@ -894,7 +907,7 @@ msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, 
int mode,
 modesettingPtr ms = modesettingPTR(pScrn);
 int stride;
 
-stride = (pScrn-displayWidth * pScrn-bitsPerPixel) / 8;
+stride = (pScrn-displayWidth * ms-drmmode.kbpp) / 8;
 *size = stride;
 
 return ((uint8_t *) ms-drmmode.front_bo.dumb-ptr + row * stride + 
offset);
@@ -915,6 +928,7 @@ CreateScreenResources(ScreenPtr pScreen)
 Bool ret;
 void *pixels = NULL;
 int err;
+Bool use_ms_shadow = ms-drmmode.force_24_32  pScrn-bitsPerPixel == 32;
 
 pScreen-CreateScreenResources = ms-createScreenResources;
 ret = pScreen-CreateScreenResources(pScreen);
@@ -946,7 +960,8 @@ CreateScreenResources(ScreenPtr pScreen)
 FatalError(Couldn't adjust screen pixmap\n);
 
 if (ms-drmmode.shadow_enable) {
-if (!shadowAdd(pScreen, rootPixmap, msUpdatePacked,
+if 

Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update

2015-07-22 Thread Alex Deucher
On Wed, Jul 22, 2015 at 12:14 PM, Adam Jackson a...@redhat.com wrote:
 From: Dave Airlie airl...@redhat.com

 24bpp front buffers tend to be the least well tested path for client
 rendering.  On the qemu cirrus emulation, and on some Matrox G200 server
 chips, the hardware can't do 32bpp at all.  It's better to just allocate
 a 32bpp shadow and downconvert in the upload hook than expose a funky
 pixmap format to clients.

 [ajax: Ported from RHEL and separate modesetting driver, lifted kbpp
 into the drmmode struct, cleaned up commit message, fixed 16bpp]

 Reviewed-by: Adam Jackson a...@redhat.com
 Signed-off-by: Dave Airlied airl...@redhat.com

For the series:
Reviewed-by: Alex Deucher alexander.deuc...@amd.com

 ---
  hw/xfree86/drivers/modesetting/Makefile.am   |   2 +
  hw/xfree86/drivers/modesetting/driver.c  |  41 ---
  hw/xfree86/drivers/modesetting/drmmode_display.c |  24 ++--
  hw/xfree86/drivers/modesetting/drmmode_display.h |   2 +
  hw/xfree86/drivers/modesetting/sh3224.c  | 140 
 +++
  hw/xfree86/drivers/modesetting/sh3224.h  |   7 ++
  6 files changed, 193 insertions(+), 23 deletions(-)
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.c
  create mode 100644 hw/xfree86/drivers/modesetting/sh3224.h

 diff --git a/hw/xfree86/drivers/modesetting/Makefile.am 
 b/hw/xfree86/drivers/modesetting/Makefile.am
 index 82c4f2f..ca7e05a 100644
 --- a/hw/xfree86/drivers/modesetting/Makefile.am
 +++ b/hw/xfree86/drivers/modesetting/Makefile.am
 @@ -51,6 +51,8 @@ modesetting_drv_la_SOURCES = \
  dumb_bo.c \
  dumb_bo.h \
  present.c \
 +sh3224.c \
 +sh3224.h \
  vblank.c \
  $(NULL)

 diff --git a/hw/xfree86/drivers/modesetting/driver.c 
 b/hw/xfree86/drivers/modesetting/driver.c
 index 324b8bd..68a865f 100644
 --- a/hw/xfree86/drivers/modesetting/driver.c
 +++ b/hw/xfree86/drivers/modesetting/driver.c
 @@ -60,6 +60,7 @@
  #endif

  #include driver.h
 +#include sh3224.h

  static void AdjustFrame(ScrnInfoPtr pScrn, int x, int y);
  static Bool CloseScreen(ScreenPtr pScreen);
 @@ -770,10 +771,16 @@ PreInit(ScrnInfoPtr pScrn, int flags)
  }
  #endif
  drmmode_get_default_bpp(pScrn, ms-drmmode, defaultdepth, defaultbpp);
 -if (defaultdepth == 24  defaultbpp == 24)
 -bppflags = SupportConvert32to24 | Support24bppFb;
 -else
 -bppflags = PreferConvert24to32 | SupportConvert24to32 | 
 Support32bppFb;
 +if (defaultdepth == 24  defaultbpp == 24) {
 +   ms-drmmode.force_24_32 = TRUE;
 +   ms-drmmode.kbpp = 24;
 +   xf86DrvMsg(pScrn-scrnIndex, X_INFO,
 +  Using 24bpp hw front buffer with 32bpp shadow\n);
 +   defaultbpp = 32;
 +} else {
 +   ms-drmmode.kbpp = defaultbpp;
 +}
 +bppflags = PreferConvert24to32 | SupportConvert24to32 | Support32bppFb;

  if (!xf86SetDepthBpp
  (pScrn, defaultdepth, defaultdepth, defaultbpp, bppflags))
 @@ -827,18 +834,24 @@ PreInit(ScrnInfoPtr pScrn, int flags)
  } else {
  Bool prefer_shadow = TRUE;

 -ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
 -if (!ret) {
 -prefer_shadow = !!value;
 -}
 +   if (ms-drmmode.force_24_32) {
 +   prefer_shadow = TRUE;
 +   ms-drmmode.shadow_enable = TRUE;
 +   } else {
 +   ret = drmGetCap(ms-fd, DRM_CAP_DUMB_PREFER_SHADOW, value);
 +   if (!ret) {
 +   prefer_shadow = !!value;
 +   }

 -ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
 - OPTION_SHADOW_FB,
 - prefer_shadow);
 +   ms-drmmode.shadow_enable = xf86ReturnOptValBool(ms-Options,
 +OPTION_SHADOW_FB,
 +prefer_shadow);
 +   }

  xf86DrvMsg(pScrn-scrnIndex, X_INFO,
 ShadowFB: preferred %s, enabled %s\n,
 prefer_shadow ? YES : NO,
 +  ms-drmmode.force_24_32 ? FORCE :
 ms-drmmode.shadow_enable ? YES : NO);

  ms-drmmode.pageflip = FALSE;
 @@ -894,7 +907,7 @@ msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 
 offset, int mode,
  modesettingPtr ms = modesettingPTR(pScrn);
  int stride;

 -stride = (pScrn-displayWidth * pScrn-bitsPerPixel) / 8;
 +stride = (pScrn-displayWidth * ms-drmmode.kbpp) / 8;
  *size = stride;

  return ((uint8_t *) ms-drmmode.front_bo.dumb-ptr + row * stride + 
 offset);
 @@ -915,6 +928,7 @@ CreateScreenResources(ScreenPtr pScreen)
  Bool ret;
  void *pixels = NULL;
  int err;
 +Bool use_ms_shadow = ms-drmmode.force_24_32  pScrn-bitsPerPixel == 
 32;

  pScreen-CreateScreenResources = ms-createScreenResources;
  ret =