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.
This commit is contained in:
@@ -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,
|
DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width,
|
||||||
height, pitch);
|
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)
|
if (!irb->region)
|
||||||
return GL_FALSE; /* out of memory? */
|
return GL_FALSE; /* out of memory? */
|
||||||
|
|
||||||
|
@@ -103,7 +103,8 @@ intel_miptree_create(struct intel_context *intel,
|
|||||||
GLuint last_level,
|
GLuint last_level,
|
||||||
GLuint width0,
|
GLuint width0,
|
||||||
GLuint height0,
|
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;
|
struct intel_mipmap_tree *mt;
|
||||||
|
|
||||||
@@ -120,7 +121,8 @@ intel_miptree_create(struct intel_context *intel,
|
|||||||
mt->cpp,
|
mt->cpp,
|
||||||
mt->pitch,
|
mt->pitch,
|
||||||
mt->total_height,
|
mt->total_height,
|
||||||
mt->pitch);
|
mt->pitch,
|
||||||
|
expect_accelerated_upload);
|
||||||
|
|
||||||
if (!mt->region) {
|
if (!mt->region) {
|
||||||
free(mt);
|
free(mt);
|
||||||
|
@@ -133,7 +133,8 @@ struct intel_mipmap_tree *intel_miptree_create(struct intel_context *intel,
|
|||||||
GLuint height0,
|
GLuint height0,
|
||||||
GLuint depth0,
|
GLuint depth0,
|
||||||
GLuint cpp,
|
GLuint cpp,
|
||||||
GLuint compress_byte);
|
GLuint compress_byte,
|
||||||
|
GLboolean expect_accelerated_upload);
|
||||||
|
|
||||||
struct intel_mipmap_tree *
|
struct intel_mipmap_tree *
|
||||||
intel_miptree_create_for_region(struct intel_context *intel,
|
intel_miptree_create_for_region(struct intel_context *intel,
|
||||||
|
@@ -109,12 +109,18 @@ intel_region_alloc_internal(struct intel_context *intel,
|
|||||||
|
|
||||||
struct intel_region *
|
struct intel_region *
|
||||||
intel_region_alloc(struct intel_context *intel,
|
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;
|
dri_bo *buffer;
|
||||||
|
|
||||||
buffer = dri_bo_alloc(intel->bufmgr, "region",
|
if (expect_accelerated_upload) {
|
||||||
pitch * cpp * height, 64);
|
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);
|
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,
|
struct intel_region *intel_region_alloc(struct intel_context *intel,
|
||||||
GLuint cpp, GLuint width,
|
GLuint cpp, GLuint width,
|
||||||
GLuint height, GLuint pitch);
|
GLuint height, GLuint pitch,
|
||||||
|
GLboolean expect_accelerated_upload);
|
||||||
|
|
||||||
struct intel_region *
|
struct intel_region *
|
||||||
intel_region_alloc_for_handle(struct intel_context *intel,
|
intel_region_alloc_for_handle(struct intel_context *intel,
|
||||||
|
@@ -62,7 +62,8 @@ logbase2(int n)
|
|||||||
static void
|
static void
|
||||||
guess_and_alloc_mipmap_tree(struct intel_context *intel,
|
guess_and_alloc_mipmap_tree(struct intel_context *intel,
|
||||||
struct intel_texture_object *intelObj,
|
struct intel_texture_object *intelObj,
|
||||||
struct intel_texture_image *intelImage)
|
struct intel_texture_image *intelImage,
|
||||||
|
GLboolean expect_accelerated_upload)
|
||||||
{
|
{
|
||||||
GLuint firstLevel;
|
GLuint firstLevel;
|
||||||
GLuint lastLevel;
|
GLuint lastLevel;
|
||||||
@@ -136,7 +137,8 @@ guess_and_alloc_mipmap_tree(struct intel_context *intel,
|
|||||||
height,
|
height,
|
||||||
depth,
|
depth,
|
||||||
intelImage->base.TexFormat->TexelBytes,
|
intelImage->base.TexFormat->TexelBytes,
|
||||||
comp_byte);
|
comp_byte,
|
||||||
|
expect_accelerated_upload);
|
||||||
|
|
||||||
DBG("%s - success\n", __FUNCTION__);
|
DBG("%s - success\n", __FUNCTION__);
|
||||||
}
|
}
|
||||||
@@ -385,7 +387,7 @@ intelTexImage(GLcontext * ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!intelObj->mt) {
|
if (!intelObj->mt) {
|
||||||
guess_and_alloc_mipmap_tree(intel, intelObj, intelImage);
|
guess_and_alloc_mipmap_tree(intel, intelObj, intelImage, pixels == NULL);
|
||||||
if (!intelObj->mt) {
|
if (!intelObj->mt) {
|
||||||
DBG("guess_and_alloc_mipmap_tree: failed\n");
|
DBG("guess_and_alloc_mipmap_tree: failed\n");
|
||||||
}
|
}
|
||||||
@@ -415,7 +417,7 @@ intelTexImage(GLcontext * ctx,
|
|||||||
level, level,
|
level, level,
|
||||||
width, height, depth,
|
width, height, depth,
|
||||||
intelImage->base.TexFormat->TexelBytes,
|
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.Height,
|
||||||
firstImage->base.Depth,
|
firstImage->base.Depth,
|
||||||
cpp,
|
cpp,
|
||||||
comp_byte);
|
comp_byte,
|
||||||
|
GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pull in any images not in the object's tree:
|
/* Pull in any images not in the object's tree:
|
||||||
|
Reference in New Issue
Block a user