radeon: fixup destroy texture object exit path and update LRU
authorDave Airlie <airlied@redhat.com>
Tue, 17 Feb 2009 01:17:22 +0000 (11:17 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 17 Feb 2009 01:17:22 +0000 (11:17 +1000)
the destroy path was doing bad things with structure names, make it do less
bad things, use container_of instead

src/mesa/drivers/dri/radeon/radeon_bo_legacy.c

index 65b0a9a0ce0c018e60a685620e3f36ea9adeefa2..1cc039c844025055dcce4c2e7eaf10ca3b23b41a 100644 (file)
@@ -32,6 +32,7 @@
  *      Jérôme Glisse <glisse@freedesktop.org>
  */
 #include <stdio.h>
+#include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
@@ -51,7 +52,6 @@
 
 struct bo_legacy {
     struct radeon_bo    base;
-    driTextureObject    tobj_base;
     int                 map_count;
     uint32_t            pending;
     int                 is_pending;
@@ -85,11 +85,15 @@ struct bo_manager_legacy {
     unsigned                    *free_handles;
 };
 
+#define container_of(ptr, type, member) ({                      \
+        const __typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+        (type *)( (char *)__mptr - offsetof(type,member) );})
+
 static void bo_legacy_tobj_destroy(void *data, driTextureObject *t)
 {
-    struct bo_legacy *bo_legacy;
+    struct bo_legacy *bo_legacy = container_of(t, struct bo_legacy, dri_texture_obj);
+
 
-    bo_legacy = (struct bo_legacy*)((char*)t)-sizeof(struct radeon_bo);
     bo_legacy->got_dri_texture_obj = 0;
     bo_legacy->validated = 0;
 }
@@ -535,6 +539,9 @@ static int bo_vram_validate(struct radeon_bo *bo,
         bo_legacy->got_dri_texture_obj = 1;
         bo_legacy->dirty = 1;
     }
+
+    if (bo_legacy->got_dri_texture_obj)
+      driUpdateTextureLRU(&bo_legacy->dri_texture_obj);
     if (bo_legacy->dirty) {
         /* Copy to VRAM using a blit.
          * All memory is 4K aligned. We're using 1024 pixels wide blits.