Logo Search packages:      
Sourcecode: xserver-xorg-video-ati version File versions  Download package

radeon_legacy_memory.c

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

/* Driver data structures */
#include "radeon.h"

/* Allocates memory, either by resizing the allocation pointed to by mem_struct,
 * or by freeing mem_struct (if non-NULL) and allocating a new space.  The size
 * is measured in bytes, and the offset from the beginning of card space is
 * returned.
 */
uint32_t
radeon_legacy_allocate_memory(ScrnInfoPtr pScrn,
                   void **mem_struct,
                   int size,
                   int align)
{
    ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
    RADEONInfoPtr info = RADEONPTR(pScrn);
    uint32_t offset = 0;

#ifdef XF86DRM_MODE
    if (info->cs) {
      struct radeon_bo *video_bo;

      video_bo = radeon_bo_open(info->bufmgr, 0, size, 4096, 0, 0);

      *mem_struct = video_bo;

      if (!video_bo)
          return 0;

      return (uint32_t)-1;
    }
#endif
#ifdef USE_EXA
    if (info->useEXA) {
      ExaOffscreenArea *area = *mem_struct;

      if (area != NULL) {
          if (area->size >= size)
            return area->offset;

          exaOffscreenFree(pScreen, area);
      }

      area = exaOffscreenAlloc(pScreen, size, align, TRUE,
                         NULL, NULL);

      *mem_struct = area;
      if (area == NULL)
          return 0;
      offset = area->offset;
    }
#endif /* USE_EXA */
#ifdef USE_XAA
    if (!info->useEXA) {
      FBLinearPtr linear = *mem_struct;
      int cpp = info->CurrentLayout.bitsPerPixel / 8;

      /* XAA allocates in units of pixels at the screen bpp, so adjust size
       * appropriately.
       */
      size = (size + cpp - 1) / cpp;
      align = (align + cpp - 1) / cpp;

      if (linear) {
          if(linear->size >= size)
            return linear->offset * cpp;

          if(xf86ResizeOffscreenLinear(linear, size))
            return linear->offset * cpp;

          xf86FreeOffscreenLinear(linear);
      }

      linear = xf86AllocateOffscreenLinear(pScreen, size, align,
                                   NULL, NULL, NULL);
      *mem_struct = linear;

      if (!linear) {
          int max_size;

          xf86QueryLargestOffscreenLinear(pScreen, &max_size, align,
                                  PRIORITY_EXTREME);

          if (max_size < size)
            return 0;

          xf86PurgeUnlockedOffscreenAreas(pScreen);
          linear = xf86AllocateOffscreenLinear(pScreen, size, align,
                                     NULL, NULL, NULL);
          *mem_struct = linear;
          if (!linear)
            return 0;
      }
      offset = linear->offset * cpp;
    }
#endif /* USE_XAA */

    return offset;
}

void
radeon_legacy_free_memory(ScrnInfoPtr pScrn,
               void *mem_struct)
{
    RADEONInfoPtr info = RADEONPTR(pScrn);

#ifdef XF86DRM_MODE
    if (info->cs) {
        struct radeon_bo *bo = mem_struct;
      radeon_bo_unref(bo);
      return;
    }
#endif
#ifdef USE_EXA
    ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];

    if (info->useEXA) {
      ExaOffscreenArea *area = mem_struct;

      if (area != NULL)
          exaOffscreenFree(pScreen, area);
      area = NULL;
    }
#endif /* USE_EXA */
#ifdef USE_XAA
    if (!info->useEXA) {
      FBLinearPtr linear = mem_struct;

      if (linear != NULL)
          xf86FreeOffscreenLinear(linear);
      linear = NULL;
    }
#endif /* USE_XAA */
}

Generated by  Doxygen 1.6.0   Back to index