[PATCHv3] xfree86: use screen privates for Xv offscreen images.
Aaron Plattner
aplattner at nvidia.com
Mon Apr 26 15:53:43 PDT 2010
On Mon, Apr 26, 2010 at 12:56:21PM -0700, Jamey Sharp wrote:
> This replaces a globally-allocated array that depended on MAXSCREENS.
>
> Signed-off-by: Jamey Sharp <jamey at minilop.net>
> ---
> On Mon, Apr 26, 2010 at 12:06 PM, Aaron Plattner <aplattner at nvidia.com> wrote:
> > Ah, okay, I didn't realize there was an ordering problem there. It's
> > kind of weird that clients are allowed to do that, but given that,
> > calling dixRequestPrivate each time seems okay. It might be nice to
> > have a comment to that effect in xf86XVRegisterOffscreenImages.
>
> Good point. Here's one.
>
> Tiago, if you happen to get this version into your tree before Keith
> pulls it, cool; else, oh well, it's just a comment.
>
> hw/xfree86/common/xf86xv.c | 27 ++++++++++++++++++---------
> 1 files changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
> index bdcc4fc..2cc2f60 100644
> --- a/hw/xfree86/common/xf86xv.c
> +++ b/hw/xfree86/common/xf86xv.c
> @@ -186,7 +186,9 @@ typedef struct {
> int num;
> } OffscreenImageRec;
>
> -static OffscreenImageRec OffscreenImages[MAXSCREENS];
> +static int OffscreenPrivateKeyIndex;
> +static DevPrivateKey OffscreenPrivateKey = &OffscreenPrivateKeyIndex;
> +#define GetOffscreenImage(pScreen) ((OffscreenImageRec *) dixLookupPrivate(&(pScreen)->devPrivates, OffscreenPrivateKey))
>
> Bool
> xf86XVRegisterOffscreenImages(
> @@ -194,9 +196,18 @@ xf86XVRegisterOffscreenImages(
> XF86OffscreenImagePtr images,
> int num
> ){
> - OffscreenImages[pScreen->myNum].num = num;
> - OffscreenImages[pScreen->myNum].images = images;
> -
> + OffscreenImageRec *OffscreenImage;
> + /* This function may be called before xf86XVScreenInit, so there's
> + * no better place than this to call dixRequestPrivate to ensure we
> + * have space reserved. After the first call it is a no-op. */
Thanks Jamey, this comment looks good to me.
> + if(!dixRequestPrivate(OffscreenPrivateKey, sizeof(OffscreenImageRec)) ||
> + !(OffscreenImage = GetOffscreenImage(pScreen)))
> + /* Every X.org driver assumes this function always succeeds, so
> + * just die on allocation failure. */
> + FatalError("Could not allocate private storage for XV offscreen images.\n");
> +
> + OffscreenImage->num = num;
> + OffscreenImage->images = images;
> return TRUE;
> }
>
> @@ -205,8 +216,9 @@ xf86XVQueryOffscreenImages(
> ScreenPtr pScreen,
> int *num
> ){
> - *num = OffscreenImages[pScreen->myNum].num;
> - return OffscreenImages[pScreen->myNum].images;
> + OffscreenImageRec *OffscreenImage = GetOffscreenImage(pScreen);
> + *num = OffscreenImage->num;
> + return OffscreenImage->images;
> }
>
>
> @@ -1177,9 +1189,6 @@ xf86XVCloseScreen(int i, ScreenPtr pScreen)
> XvAdaptorPtr pa;
> int c;
>
> - /* Clear offscreen images */
> - memset(&OffscreenImages[pScreen->myNum], 0, sizeof(OffscreenImages[0]));
> -
> if(!ScreenPriv) return TRUE;
>
> if(ScreenPriv->videoGC) {
> --
> 1.7.0
>
More information about the xorg-devel
mailing list