i965/miptree: Allocate mt earlier in update winsys

Later commits require intel_update_image_buffer() to have control over
the miptree creation.   However, intel_update_winsys_renderbuffer_miptree()
currently  creates it based on the given buffer object. This patch moves
the creation to the caller side.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
Ben Widawsky
2017-05-30 17:23:58 +05:30
committed by Jason Ekstrand
parent aadd37298c
commit 34e1ccbfbe
3 changed files with 38 additions and 19 deletions

View File

@@ -1504,10 +1504,26 @@ intel_process_dri2_buffer(struct brw_context *brw,
return;
}
if (!intel_update_winsys_renderbuffer_miptree(brw, rb, bo,
struct intel_mipmap_tree *mt =
intel_miptree_create_for_bo(brw,
bo,
intel_rb_format(rb),
0,
drawable->w,
drawable->h,
1,
buffer->pitch,
MIPTREE_LAYOUT_FOR_SCANOUT);
if (!mt) {
brw_bo_unreference(bo);
return;
}
if (!intel_update_winsys_renderbuffer_miptree(brw, rb, mt,
drawable->w, drawable->h,
buffer->pitch)) {
brw_bo_unreference(bo);
intel_miptree_release(&mt);
return;
}
@@ -1565,11 +1581,26 @@ intel_update_image_buffer(struct brw_context *intel,
if (last_mt && last_mt->bo == buffer->bo)
return;
if (!intel_update_winsys_renderbuffer_miptree(intel, rb, buffer->bo,
buffer->width, buffer->height,
buffer->pitch))
struct intel_mipmap_tree *mt =
intel_miptree_create_for_bo(intel,
buffer->bo,
intel_rb_format(rb),
0,
buffer->width,
buffer->height,
1,
buffer->pitch,
MIPTREE_LAYOUT_FOR_SCANOUT);
if (!mt)
return;
if (!intel_update_winsys_renderbuffer_miptree(intel, rb, mt,
buffer->width, buffer->height,
buffer->pitch)) {
intel_miptree_release(&mt);
return;
}
if (_mesa_is_front_buffer_drawing(fb) &&
buffer_type == __DRI_IMAGE_BUFFER_FRONT &&
rb->Base.Base.NumSamples > 1) {

View File

@@ -1115,11 +1115,10 @@ intel_miptree_create_for_dri_image(struct brw_context *brw,
bool
intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
struct intel_renderbuffer *irb,
struct brw_bo *bo,
struct intel_mipmap_tree *singlesample_mt,
uint32_t width, uint32_t height,
uint32_t pitch)
{
struct intel_mipmap_tree *singlesample_mt = NULL;
struct intel_mipmap_tree *multisample_mt = NULL;
struct gl_renderbuffer *rb = &irb->Base.Base;
mesa_format format = rb->Format;
@@ -1131,17 +1130,7 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
assert(_mesa_get_format_base_format(format) == GL_RGB ||
_mesa_get_format_base_format(format) == GL_RGBA);
singlesample_mt = intel_miptree_create_for_bo(intel,
bo,
format,
0,
width,
height,
1,
pitch,
MIPTREE_LAYOUT_FOR_SCANOUT);
if (!singlesample_mt)
goto fail;
assert(singlesample_mt);
if (num_samples == 0) {
intel_miptree_release(&irb->mt);
@@ -1171,7 +1160,6 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
return true;
fail:
intel_miptree_release(&irb->singlesample_mt);
intel_miptree_release(&irb->mt);
return false;
}

View File

@@ -694,7 +694,7 @@ intel_miptree_create_for_dri_image(struct brw_context *brw,
bool
intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
struct intel_renderbuffer *irb,
struct brw_bo *bo,
struct intel_mipmap_tree *singlesample_mt,
uint32_t width, uint32_t height,
uint32_t pitch);