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
@@ -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? */ | |||
@@ -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); |
@@ -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, |
@@ -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); | |||
} |
@@ -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, |
@@ -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); | |||
} | |||
@@ -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: |