r300g: allow the GTT domain for samplers
authorMarek Olšák <maraeo@gmail.com>
Fri, 9 Jul 2010 18:22:20 +0000 (20:22 +0200)
committerMarek Olšák <maraeo@gmail.com>
Fri, 9 Jul 2010 18:28:13 +0000 (20:28 +0200)
This fixes sluggishness in vdrift.

src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_texture.c

index 014b382edf3cf70345c0d4f9fbe778f64c2e960b..5ce3eb63c56393079fed12ba1f606d4214d814ae 100644 (file)
@@ -959,7 +959,8 @@ validate:
     for (i = 0; i < fb->nr_cbufs; i++) {
         tex = r300_texture(fb->cbufs[i]->texture);
         assert(tex && tex->buffer && "cbuf is marked, but NULL!");
-        if (!r300_add_texture(r300->rws, tex, 0, tex->domain)) {
+        if (!r300_add_texture(r300->rws, tex, 0,
+                              r300_surface(fb->cbufs[i])->domain)) {
             r300->context.flush(&r300->context, 0, NULL);
             goto validate;
         }
@@ -968,8 +969,8 @@ validate:
     if (fb->zsbuf) {
         tex = r300_texture(fb->zsbuf->texture);
         assert(tex && tex->buffer && "zsbuf is marked, but NULL!");
-        if (!r300_add_texture(r300->rws, tex,
-                             0, tex->domain)) {
+        if (!r300_add_texture(r300->rws, tex, 0,
+                              r300_surface(fb->zsbuf)->domain)) {
             r300->context.flush(&r300->context, 0, NULL);
             goto validate;
         }
index 094f22dd37a18627dd03aa3bc48d59b605fbfe68..d378a7150d6bc4efd3b227059b6fc3b6e36a9132 100644 (file)
@@ -1001,8 +1001,9 @@ struct pipe_resource* r300_texture_create(struct pipe_screen* screen,
                tex->size,
                util_format_short_name(base->format));
 
-    tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ? R300_DOMAIN_GTT :
-                                                              R300_DOMAIN_VRAM;
+    tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ?
+                  R300_DOMAIN_GTT :
+                  R300_DOMAIN_VRAM | R300_DOMAIN_GTT;
 
     tex->buffer = rws->buffer_create(rws, 2048, base->bind, tex->domain,
                                      tex->size);
@@ -1044,7 +1045,12 @@ struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
         surface->base.level = level;
 
         surface->buffer = tex->buffer;
+
+        /* Prefer VRAM if there are multiple domains to choose from. */
         surface->domain = tex->domain;
+        if (surface->domain & R300_DOMAIN_VRAM)
+            surface->domain &= ~R300_DOMAIN_GTT;
+
         surface->offset = r300_texture_get_offset(tex, level, zslice, face);
         surface->pitch = tex->fb_state.pitch[level];
         surface->format = tex->fb_state.format;