Browse Source

intel: tell libdrm whether we want a cpu-ready or gpu-ready BO for regions.

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.
tags/mesa_20090313
Eric Anholt 16 years ago
parent
commit
40dd024be6

+ 2
- 1
src/mesa/drivers/dri/intel/intel_fbo.c View 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? */


+ 4
- 2
src/mesa/drivers/dri/intel/intel_mipmap_tree.c View 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);

+ 2
- 1
src/mesa/drivers/dri/intel/intel_mipmap_tree.h View 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,

+ 9
- 3
src/mesa/drivers/dri/intel/intel_regions.c View 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);
}

+ 2
- 1
src/mesa/drivers/dri/intel/intel_regions.h View 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,

+ 6
- 4
src/mesa/drivers/dri/intel/intel_tex_image.c View 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);

}


+ 2
- 1
src/mesa/drivers/dri/intel/intel_tex_validate.c View 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:

Loading…
Cancel
Save