r600g: delay mapping until first map request. (v2)
authorDave Airlie <airlied@redhat.com>
Wed, 11 May 2011 03:14:16 +0000 (13:14 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 12 May 2011 23:22:39 +0000 (09:22 +1000)
Currently r600g always maps every bo, this is quite pointless as it wastes
VM and on 32-bit with wine running VM space is quite useful.

So with this patch we don't create the mappings until first use, without
tiling enabled this probably won't make a major difference on its own,
but with tiled staged uploads it should avoid keeping maps for most of the
textures unnecessarily.

v2: add bo data ptr check

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/winsys/r600/drm/r600_priv.h
src/gallium/winsys/r600/drm/radeon_bo.c

index f8363f9272b99cd64ced138cb3b3a83aceba9a4a..2ca122ac59a18c317eb7f12a63715ce5a181212b 100644 (file)
@@ -145,6 +145,7 @@ int radeon_bo_get_tiling_flags(struct radeon *radeon,
 int radeon_bo_get_name(struct radeon *radeon,
                       struct radeon_bo *bo,
                       uint32_t *name);
+int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo);
 
 /*
  * r600_hw_context.c
@@ -192,6 +193,8 @@ struct r600_bo *r600_bomgr_bo_create(struct r600_bomgr *mgr,
  */
 static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo)
 {
+       if (bo->map_count == 0 && !bo->data)
+               return radeon_bo_fixed_map(radeon, bo);
        bo->map_count++;
        return 0;
 }
index 13b1d50b6e51e57178c883d4b5fdb58f72de5163..9a534dddf323bf808988f635f7aa1b0406c2a737 100644 (file)
@@ -33,7 +33,7 @@
 #include "xf86drm.h"
 #include "radeon_drm.h"
 
-static int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo)
+int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo)
 {
        struct drm_radeon_gem_mmap args;
        void *ptr;
@@ -127,11 +127,6 @@ struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
                        return NULL;
                }
        }
-       if (radeon_bo_fixed_map(radeon, bo)) {
-               R600_ERR("failed to map bo\n");
-               radeon_bo_reference(radeon, &bo, NULL);
-               return bo;
-       }
 
        if (handle)
                util_hash_table_set(radeon->bo_handles, (void *)(uintptr_t)handle, bo);