Re: [PATCH 1/4] modesetting: Implement 32-24 bpp conversion in shadow update
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
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
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
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
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
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 =