This is email regards the hw cursor garbling in mach64 based cards when
DRI is enabled.

The relevant parts of XFree86.0.log are:

        (II) ATI(0): VESA VBE Total Mem: 4096 kB
        ...
        (II) ATI(0): Storing hardware cursor image at 0xFD3FFC00.
        (II) ATI(0): Using 8 MB linear aperture at 0xFD000000.
        (!!) ATI(0): Virtual resolutions will be limited to 4095 kB
         due to linear aperture size and/or placement of hardware cursor image
area.
        (II) ATI(0): Using Block 0 MMIO aperture at 0xFC100400.
        (II) ATI(0): Using Block 1 MMIO aperture at 0xFC100000.
        (==) ATI(0): Write-combining range (0xfd000000,0x400000)
        (II) ATI(0): MMIO write caching enabled.
        (--) ATI(0): 4096 kB of SGRAM (2:1) 32-bit detected (using 4095 kB).
        ...
        (II) ATI(0): [drm] framebuffer handle = 0xfd000000
        ...
        (II) ATI(0): Visual configs initialized
        (II) ATI(0): Block 0 base at 0xfc100400
        (II) ATI(0): Memory manager initialized to (0,0) (640,1587)
        (II) ATI(0): Reserved back buffer from (0,480) to (640,960)
        (II) ATI(0): Reserved depth buffer from (0,960) to (640,1440)
        (II) ATI(0): Reserved 2112 kb for textures at offset 0x1eff00

After some calculations we have that:

                        start           end
        textures:       0x1eff00        0x3fff00
        hw cursor:      0x3ffc00        0x400000
        
Notice the overlap.

The relevant piece of code is from atiscreen.c:

        int fbSize = pATI->VideoRAM * 1024;

> Here is the problem! It should be pScreenInfo->videoRam and not
pATI->VideoRAM. See below.

        /* Try for front, back, depth, and one viewport's worth of
         * pixmap cache.  Should be enough for at least a fullscreen
         * background image.
         */
        pATIDRIServer->textureSize = fbSize - (3 * bufferSize +
                                               ATI_DRI_XAA_LINES * widthBytes);

        l = ATIMinBits((pATIDRIServer->textureSize-1) / MACH64_NR_TEX_REGIONS);
        if (l < MACH64_LOG_TEX_GRANULARITY) l = MACH64_LOG_TEX_GRANULARITY;

        /* Round the texture size up to the nearest whole number of
         * texture regions.  Again, be greedy about this, don't round
         * down.
         */
        pATIDRIServer->logTextureGranularity = l;
        pATIDRIServer->textureSize =
            (pATIDRIServer->textureSize >> l) << l;
            
> NOTE: Why round up if there's no memory for that? Anyway this code is
rounding down and not up...

        total = fbSize - pATIDRIServer->textureSize;
        scanlines = total / widthBytes;
        if (scanlines > ATIMach64MaxY) scanlines = ATIMach64MaxY;

        /* Recalculate the texture offset and size to accomodate any
         * rounding to a whole number of scanlines.
         * FIXME: Is this actually needed?
         */
        pATIDRIServer->textureOffset = scanlines * widthBytes;
        pATIDRIServer->textureSize = fbSize - pATIDRIServer->textureOffset;

        ...
        
    else
#endif /* XF86DRI */
    {
        ScreenArea.x1 = ScreenArea.y1 = 0;
        ScreenArea.x2 = pATI->displayWidth;
        ScreenArea.y2 = pScreenInfo->videoRam * 1024 * 8 / pATI->displayWidth /
        
> The non-DRI code      ^^^^^^^^^^^^^^^^^^^^^

            pATI->bitsPerPixel;
        if ((unsigned)ScreenArea.y2 > ATIMach64MaxY)
            ScreenArea.y2 = ATIMach64MaxY;
        xf86InitFBManager(pScreen, &ScreenArea);
    }


And from atipreinit.c we have:

                if (ServerVideoRAM < pATI->VideoRAM)
                {
                    pScreenInfo->videoRam = ServerVideoRAM;
                    
>                   ^^^^^^^^^^^^^^^^^^^^^                    

                    xf86DrvMsg(pScreenInfo->scrnIndex, X_NOTICE,
                        "Virtual resolutions will be limited to %d kB\n
due to"
                        " linear aperture size and/or placement of
hardware"
                        " cursor image area.\n",
                        ServerVideoRAM);
                }
 
 
So the fix is rather simple. My question is why having different
variables with apparent same meaning and with different values?

In xf86str.h says:

    /* Some of these may be moved out of here into the driver private
area */
    ...
    int         videoRam;               /* amount of video ram (kb) */


Regards,

Jose Fonseca



_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to