i965: Stop making a pointless region for DRI2 to just throw it away.
I noticed that we were doing this while changing the DRI3 path to not use regions, which involved changing the signature of intel_update_winsys_renderbuffer_miptree() this way. v2: Replace my comment with Chad's version. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (v1) Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> (v1) Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
@@ -1229,10 +1229,9 @@ intel_query_dri2_buffers(struct brw_context *brw,
|
||||
* DRI2BufferDepthStencil are handled as special cases.
|
||||
*
|
||||
* \param buffer_name is a human readable name, such as "dri2 front buffer",
|
||||
* that is passed to intel_region_alloc_for_handle().
|
||||
* that is passed to drm_intel_bo_gem_create_from_name().
|
||||
*
|
||||
* \see intel_update_renderbuffers()
|
||||
* \see intel_region_alloc_for_handle()
|
||||
*/
|
||||
static void
|
||||
intel_process_dri2_buffer(struct brw_context *brw,
|
||||
@@ -1241,8 +1240,8 @@ intel_process_dri2_buffer(struct brw_context *brw,
|
||||
struct intel_renderbuffer *rb,
|
||||
const char *buffer_name)
|
||||
{
|
||||
struct intel_region *region = NULL;
|
||||
struct gl_framebuffer *fb = drawable->driverPrivate;
|
||||
drm_intel_bo *bo;
|
||||
|
||||
if (!rb)
|
||||
return;
|
||||
@@ -1259,14 +1258,15 @@ intel_process_dri2_buffer(struct brw_context *brw,
|
||||
else
|
||||
last_mt = rb->singlesample_mt;
|
||||
|
||||
/* Get the name for our previous RB mt. We know it had a name already (and
|
||||
* thus the DRM call is just a getter), because it could only have been
|
||||
* allocated by a previous intel_process_dri2_buffer(), so
|
||||
* drm_intel_bo_flink() is just a getter.
|
||||
*/
|
||||
uint32_t old_name = 0;
|
||||
if (last_mt)
|
||||
if (last_mt) {
|
||||
/* The bo already has a name because the miptree was created by a
|
||||
* previous call to intel_process_dri2_buffer(). If a bo already has a
|
||||
* name, then drm_intel_bo_flink() is a low-cost getter. It does not
|
||||
* create a new name.
|
||||
*/
|
||||
drm_intel_bo_flink(last_mt->region->bo, &old_name);
|
||||
}
|
||||
|
||||
if (old_name == buffer->name)
|
||||
return;
|
||||
@@ -1279,24 +1279,21 @@ intel_process_dri2_buffer(struct brw_context *brw,
|
||||
}
|
||||
|
||||
intel_miptree_release(&rb->mt);
|
||||
region = intel_region_alloc_for_handle(brw->intelScreen,
|
||||
buffer->cpp,
|
||||
drawable->w,
|
||||
drawable->h,
|
||||
buffer->pitch,
|
||||
buffer->name,
|
||||
buffer_name);
|
||||
if (!region) {
|
||||
bo = drm_intel_bo_gem_create_from_name(brw->bufmgr, buffer_name,
|
||||
buffer->name);
|
||||
if (!bo) {
|
||||
fprintf(stderr,
|
||||
"Failed to make region for returned DRI2 buffer "
|
||||
"(%dx%d, named %d).\n"
|
||||
"Failed to open BO for returned DRI2 buffer "
|
||||
"(%dx%d, %s, named %d).\n"
|
||||
"This is likely a bug in the X Server that will lead to a "
|
||||
"crash soon.\n",
|
||||
drawable->w, drawable->h, buffer->name);
|
||||
drawable->w, drawable->h, buffer_name, buffer->name);
|
||||
return;
|
||||
}
|
||||
|
||||
intel_update_winsys_renderbuffer_miptree(brw, rb, region);
|
||||
intel_update_winsys_renderbuffer_miptree(brw, rb, bo,
|
||||
drawable->w, drawable->h,
|
||||
buffer->pitch);
|
||||
|
||||
if (brw_is_front_buffer_drawing(fb) &&
|
||||
(buffer->attachment == __DRI_BUFFER_FRONT_LEFT ||
|
||||
@@ -1307,7 +1304,7 @@ intel_process_dri2_buffer(struct brw_context *brw,
|
||||
|
||||
assert(rb->mt);
|
||||
|
||||
intel_region_release(®ion);
|
||||
drm_intel_bo_unreference(bo);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1353,7 +1350,9 @@ intel_update_image_buffer(struct brw_context *intel,
|
||||
if (last_mt && last_mt->region->bo == region->bo)
|
||||
return;
|
||||
|
||||
intel_update_winsys_renderbuffer_miptree(intel, rb, region);
|
||||
intel_update_winsys_renderbuffer_miptree(intel, rb, region->bo,
|
||||
region->width, region->height,
|
||||
region->pitch);
|
||||
|
||||
if (brw_is_front_buffer_drawing(fb) &&
|
||||
buffer_type == __DRI_IMAGE_BUFFER_FRONT &&
|
||||
|
||||
@@ -690,16 +690,21 @@ intel_miptree_create_for_bo(struct brw_context *brw,
|
||||
}
|
||||
|
||||
/**
|
||||
* For a singlesample image buffer, this simply wraps the given region with a miptree.
|
||||
* For a singlesample renderbuffer, this simply wraps the given BO with a
|
||||
* miptree.
|
||||
*
|
||||
* For a multisample image buffer, this wraps the given region with
|
||||
* a singlesample miptree, then creates a multisample miptree into which the
|
||||
* singlesample miptree is embedded as a child.
|
||||
* For a multisample renderbuffer, this wraps the window system's
|
||||
* (singlesample) BO with a singlesample miptree attached to the
|
||||
* intel_renderbuffer, then creates a multisample miptree attached to irb->mt
|
||||
* that will contain the actual rendering (which is lazily resolved to
|
||||
* irb->singlesample_mt).
|
||||
*/
|
||||
void
|
||||
intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
|
||||
struct intel_renderbuffer *irb,
|
||||
struct intel_region *region)
|
||||
drm_intel_bo *bo,
|
||||
uint32_t width, uint32_t height,
|
||||
uint32_t pitch)
|
||||
{
|
||||
struct intel_mipmap_tree *singlesample_mt = NULL;
|
||||
struct intel_mipmap_tree *multisample_mt = NULL;
|
||||
@@ -714,12 +719,12 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
|
||||
_mesa_get_format_base_format(format) == GL_RGBA);
|
||||
|
||||
singlesample_mt = intel_miptree_create_for_bo(intel,
|
||||
region->bo,
|
||||
bo,
|
||||
format,
|
||||
0,
|
||||
region->width,
|
||||
region->height,
|
||||
region->pitch);
|
||||
width,
|
||||
height,
|
||||
pitch);
|
||||
if (!singlesample_mt)
|
||||
goto fail;
|
||||
|
||||
@@ -741,12 +746,12 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
|
||||
irb->singlesample_mt = singlesample_mt;
|
||||
|
||||
if (!irb->mt ||
|
||||
irb->mt->logical_width0 != region->width ||
|
||||
irb->mt->logical_height0 != region->height) {
|
||||
irb->mt->logical_width0 != width ||
|
||||
irb->mt->logical_height0 != height) {
|
||||
multisample_mt = intel_miptree_create_for_renderbuffer(intel,
|
||||
format,
|
||||
region->width,
|
||||
region->height,
|
||||
width,
|
||||
height,
|
||||
num_samples);
|
||||
if (!multisample_mt)
|
||||
goto fail;
|
||||
|
||||
@@ -483,7 +483,9 @@ intel_miptree_create_for_bo(struct brw_context *brw,
|
||||
void
|
||||
intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
|
||||
struct intel_renderbuffer *irb,
|
||||
struct intel_region *region);
|
||||
drm_intel_bo *bo,
|
||||
uint32_t width, uint32_t height,
|
||||
uint32_t pitch);
|
||||
|
||||
/**
|
||||
* Create a miptree appropriate as the storage for a non-texture renderbuffer.
|
||||
|
||||
Reference in New Issue
Block a user