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:
committed by
Jason Ekstrand
parent
aadd37298c
commit
34e1ccbfbe
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user