intel: tell libdrm whether we want a cpu-ready or gpu-ready BO for regions.
authorEric Anholt <eric@anholt.net>
Wed, 18 Feb 2009 19:34:47 +0000 (11:34 -0800)
committerEric Anholt <eric@anholt.net>
Sat, 21 Feb 2009 18:53:41 +0000 (10:53 -0800)
This lets us avoid allocing new buffers for renderbuffers, finalized miptrees,
and PBO-uploaded textures when there's an unreferenced but still active one
cached, while also avoiding CPU waits for batchbuffers and CPU-uploaded
textures.  The size of BOs allocated for a desktop running current GL
cairogears on i915 is cut in half with this.

Note that this means we require libdrm 2.4.5.

src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_mipmap_tree.c
src/mesa/drivers/dri/intel/intel_mipmap_tree.h
src/mesa/drivers/dri/intel/intel_regions.c
src/mesa/drivers/dri/intel/intel_regions.h
src/mesa/drivers/dri/intel/intel_tex_image.c
src/mesa/drivers/dri/intel/intel_tex_validate.c

index 54d6044ad3b6796b6bac2f5429540906c6c78a37..c9fb90f3b2632e5150fc8f008532e215327cc1cb 100644 (file)
@@ -210,7 +210,8 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
       DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width,
          height, pitch);
 
-      irb->region = intel_region_alloc(intel, cpp, width, height, pitch);
+      irb->region = intel_region_alloc(intel, cpp, width, height, pitch,
+                                      GL_TRUE);
       if (!irb->region)
          return GL_FALSE;       /* out of memory? */
 
index bf1c3f03f0e1983e3d09e8bb9e2fe3467e01c094..6e1e034e53d60936f237ea76495de4e4ae6da769 100644 (file)
@@ -103,7 +103,8 @@ intel_miptree_create(struct intel_context *intel,
                     GLuint last_level,
                     GLuint width0,
                     GLuint height0,
-                    GLuint depth0, GLuint cpp, GLuint compress_byte)
+                    GLuint depth0, GLuint cpp, GLuint compress_byte,
+                    GLboolean expect_accelerated_upload)
 {
    struct intel_mipmap_tree *mt;
 
@@ -120,7 +121,8 @@ intel_miptree_create(struct intel_context *intel,
                                   mt->cpp,
                                   mt->pitch,
                                   mt->total_height,
-                                  mt->pitch);
+                                  mt->pitch,
+                                  expect_accelerated_upload);
 
    if (!mt->region) {
        free(mt);
index c9537dbb9a48908a63c0361ab75199a100ebee59..4060b9df78f8857e1329c959a6d8e36958e69495 100644 (file)
@@ -133,7 +133,8 @@ struct intel_mipmap_tree *intel_miptree_create(struct intel_context *intel,
                                                GLuint height0,
                                                GLuint depth0,
                                                GLuint cpp,
-                                               GLuint compress_byte);
+                                               GLuint compress_byte,
+                                              GLboolean expect_accelerated_upload);
 
 struct intel_mipmap_tree *
 intel_miptree_create_for_region(struct intel_context *intel,
index ec85c4131a13a20dab211523e79d6ec185ca197f..749920502a250c52a35ecd2ab7b3479c76e0c75a 100644 (file)
@@ -109,12 +109,18 @@ intel_region_alloc_internal(struct intel_context *intel,
 
 struct intel_region *
 intel_region_alloc(struct intel_context *intel,
-                   GLuint cpp, GLuint width, GLuint height, GLuint pitch)
+                   GLuint cpp, GLuint width, GLuint height, GLuint pitch,
+                  GLboolean expect_accelerated_upload)
 {
    dri_bo *buffer;
 
-   buffer = dri_bo_alloc(intel->bufmgr, "region",
-                        pitch * cpp * height, 64);
+   if (expect_accelerated_upload) {
+      buffer = drm_intel_bo_alloc_for_render(intel->bufmgr, "region",
+                                            pitch * cpp * height, 64);
+   } else {
+      buffer = drm_intel_bo_alloc(intel->bufmgr, "region",
+                                 pitch * cpp * height, 64);
+   }
 
    return intel_region_alloc_internal(intel, cpp, width, height, pitch, buffer);
 }
index 4b120ba4cee6c62bc0c4b5f8df5ff355a66075d5..45e2bf4e77ab3626b7c1493380b1561f428823a6 100644 (file)
@@ -74,7 +74,8 @@ struct intel_region
  */
 struct intel_region *intel_region_alloc(struct intel_context *intel,
                                         GLuint cpp, GLuint width,
-                                        GLuint height, GLuint pitch);
+                                        GLuint height, GLuint pitch,
+                                       GLboolean expect_accelerated_upload);
 
 struct intel_region *
 intel_region_alloc_for_handle(struct intel_context *intel,
index 866022d0ce210af2a1ee0b76ea987948f728e3eb..c3bbcfc1b9768b488ff80285f3e34409c7ec1be3 100644 (file)
@@ -62,7 +62,8 @@ logbase2(int n)
 static void
 guess_and_alloc_mipmap_tree(struct intel_context *intel,
                             struct intel_texture_object *intelObj,
-                            struct intel_texture_image *intelImage)
+                            struct intel_texture_image *intelImage,
+                           GLboolean expect_accelerated_upload)
 {
    GLuint firstLevel;
    GLuint lastLevel;
@@ -136,7 +137,8 @@ guess_and_alloc_mipmap_tree(struct intel_context *intel,
                                        height,
                                        depth,
                                        intelImage->base.TexFormat->TexelBytes,
-                                       comp_byte);
+                                       comp_byte,
+                                      expect_accelerated_upload);
 
    DBG("%s - success\n", __FUNCTION__);
 }
@@ -385,7 +387,7 @@ intelTexImage(GLcontext * ctx,
    }
 
    if (!intelObj->mt) {
-      guess_and_alloc_mipmap_tree(intel, intelObj, intelImage);
+      guess_and_alloc_mipmap_tree(intel, intelObj, intelImage, pixels == NULL);
       if (!intelObj->mt) {
         DBG("guess_and_alloc_mipmap_tree: failed\n");
       }
@@ -415,7 +417,7 @@ intelTexImage(GLcontext * ctx,
                                            level, level,
                                            width, height, depth,
                                            intelImage->base.TexFormat->TexelBytes,
-                                           comp_byte);
+                                           comp_byte, pixels == NULL);
 
    }
 
index 820683d42eb6d5e86922694e403b7953e5eaf25b..05a375e1f3b375c4e28f6af64777bb595dbd81de 100644 (file)
@@ -206,7 +206,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
                                           firstImage->base.Height,
                                           firstImage->base.Depth,
                                           cpp,
-                                          comp_byte);
+                                          comp_byte,
+                                         GL_TRUE);
    }
 
    /* Pull in any images not in the object's tree: