[PATCH 1/4] modesetting: Allocate and destroy shadow_fb in drmmode_display

Jason Ekstrand jason at jlekstrand.net
Sat Dec 20 18:34:57 PST 2014


While these patches seem to work ok, somethings not properly getting
accelerated when using a shadow buffer and I really don't know why.  I
guess it's still better than no shadow.

On Fri, Dec 19, 2014 at 2:25 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:
>
> I've also pushed a branch with my patches on top of Ken's new present
> patches here:
>
> http://cgit.freedesktop.org/~jekstrand/xserver/log/?h=wip/modeset-shadow
>
> On Fri, Dec 19, 2014 at 2:12 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
>>
>> This way all of the buffer allocation/destruction is in the same file.
>>
>> Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
>> ---
>>  hw/xfree86/drivers/modesetting/driver.c          | 16 +---------------
>>  hw/xfree86/drivers/modesetting/drmmode_display.c | 19 ++++++++++++++++++-
>>  hw/xfree86/drivers/modesetting/drmmode_display.h |  2 +-
>>  3 files changed, 20 insertions(+), 17 deletions(-)
>>
>> diff --git a/hw/xfree86/drivers/modesetting/driver.c
>> b/hw/xfree86/drivers/modesetting/driver.c
>> index 5dda96b..77da2cc 100644
>> --- a/hw/xfree86/drivers/modesetting/driver.c
>> +++ b/hw/xfree86/drivers/modesetting/driver.c
>> @@ -993,15 +993,6 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
>>      if (!drmmode_create_initial_bos(pScrn, &ms->drmmode))
>>          return FALSE;
>>
>> -    if (ms->drmmode.shadow_enable) {
>> -        ms->drmmode.shadow_fb =
>> -            calloc(1,
>> -                   pScrn->displayWidth * pScrn->virtualY *
>> -                   ((pScrn->bitsPerPixel + 7) >> 3));
>> -        if (!ms->drmmode.shadow_fb)
>> -            ms->drmmode.shadow_enable = FALSE;
>> -    }
>> -
>>      miClearVisualTypes();
>>
>>      if (!miSetVisualTypes(pScrn->depth,
>> @@ -1200,14 +1191,9 @@ CloseScreen(ScreenPtr pScreen)
>>          ms->damage = NULL;
>>      }
>>
>> -    if (ms->drmmode.shadow_enable) {
>> -        shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen));
>> -        free(ms->drmmode.shadow_fb);
>> -        ms->drmmode.shadow_fb = NULL;
>> -    }
>>      drmmode_uevent_fini(pScrn, &ms->drmmode);
>>
>> -    drmmode_free_bos(pScrn, &ms->drmmode);
>> +    drmmode_free_bos(pScreen, &ms->drmmode);
>>
>>      if (pScrn->vtSema) {
>>          LeaveVT(pScrn);
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c
>> b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> index 824500b..30ee79d 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> @@ -39,6 +39,7 @@
>>  #include "micmap.h"
>>  #include "xf86cmap.h"
>>  #include "xf86DDC.h"
>> +#include "shadow.h"
>>
>>  #include <xf86drm.h>
>>  #include "xf86Crtc.h"
>> @@ -1539,6 +1540,15 @@ drmmode_create_initial_bos(ScrnInfoPtr pScrn,
>> drmmode_ptr drmmode)
>>          return FALSE;
>>      pScrn->displayWidth = drmmode_bo_get_pitch(&drmmode->front_bo) / cpp;
>>
>> +    if (drmmode->shadow_enable) {
>> +        drmmode->shadow_fb =
>> +            calloc(1,
>> +                   pScrn->displayWidth * pScrn->virtualY *
>> +                   ((pScrn->bitsPerPixel + 7) >> 3));
>> +        if (!drmmode->shadow_fb)
>> +            drmmode->shadow_enable = FALSE;
>> +    }
>> +
>>      width = ms->cursor_width;
>>      height = ms->cursor_height;
>>      bpp = 32;
>> @@ -1601,8 +1611,9 @@ drmmode_map_cursor_bos(ScrnInfoPtr pScrn,
>> drmmode_ptr drmmode)
>>  }
>>
>>  void
>> -drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
>> +drmmode_free_bos(ScreenPtr pScreen, drmmode_ptr drmmode)
>>  {
>> +    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
>>      xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
>>      int i;
>>
>> @@ -1611,6 +1622,12 @@ drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr
>> drmmode)
>>          drmmode->fb_id = 0;
>>      }
>>
>> +    if (drmmode->shadow_enable) {
>> +        shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen));
>> +        free(drmmode->shadow_fb);
>> +        drmmode->shadow_fb = NULL;
>> +    }
>> +
>>      drmmode_bo_destroy(drmmode, &drmmode->front_bo);
>>
>>      for (i = 0; i < xf86_config->num_crtc; i++) {
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h
>> b/hw/xfree86/drivers/modesetting/drmmode_display.h
>> index 66d0ca2..c67809b 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.h
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
>> @@ -155,7 +155,7 @@ extern void drmmode_uevent_fini(ScrnInfoPtr scrn,
>> drmmode_ptr drmmode);
>>  Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
>>  void *drmmode_map_front_bo(drmmode_ptr drmmode);
>>  Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
>> -void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
>> +void drmmode_free_bos(ScreenPtr pScreen, drmmode_ptr drmmode);
>>  void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode,
>>                               int *depth, int *bpp);
>>
>> --
>> 2.2.0
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20141220/f29a7c79/attachment-0001.html>


More information about the xorg-devel mailing list