summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-02-13 14:33:57 -0800
committerEric Anholt <[email protected]>2014-02-18 09:56:36 -0800
commit019560c127778dc3b08bdc7c3acdc68dbbb80ea0 (patch)
tree07bb3124a32731af3d6b1efae3a30f21b2207314
parent0440e677b98c6e09f0958fcf782be67dccb94b08 (diff)
i965: Drop some duplicated code in DRI winsys BO updates.
The only DRI2 vs DRI3 delta was just how to decide about frontbuffer-ness for doing the upsample. v2: Fix missing singlesample_mt->region->name update in the merged code, which would have broken the DRI2 don't-recreate-the-miptree optimization. Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.c26
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.c103
-rw-r--r--src/mesa/drivers/dri/i965/intel_mipmap_tree.h19
3 files changed, 38 insertions, 110 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 021287ee234..ba2f971bcc1 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -1302,11 +1302,14 @@ intel_process_dri2_buffer(struct brw_context *brw,
return;
}
- rb->mt = intel_miptree_create_for_dri2_buffer(brw,
- buffer->attachment,
- intel_rb_format(rb),
- num_samples,
- region);
+ intel_update_winsys_renderbuffer_miptree(brw, rb, region);
+
+ if (brw->is_front_buffer_rendering &&
+ (buffer->attachment == __DRI_BUFFER_FRONT_LEFT ||
+ buffer->attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) &&
+ rb->Base.Base.NumSamples > 1) {
+ intel_miptree_upsample(brw, rb->mt);
+ }
assert(rb->mt);
@@ -1359,12 +1362,13 @@ intel_update_image_buffer(struct brw_context *intel,
return;
}
- intel_miptree_release(&rb->mt);
- rb->mt = intel_miptree_create_for_image_buffer(intel,
- buffer_type,
- intel_rb_format(rb),
- num_samples,
- region);
+ intel_update_winsys_renderbuffer_miptree(intel, rb, region);
+
+ if (intel->is_front_buffer_rendering &&
+ buffer_type == __DRI_IMAGE_BUFFER_FRONT &&
+ rb->Base.Base.NumSamples > 1) {
+ intel_miptree_upsample(intel, rb->mt);
+ }
}
static void
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index 5417ac2b608..c5c8a362f9d 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -35,6 +35,7 @@
#include "intel_resolve_map.h"
#include "intel_tex.h"
#include "intel_blit.h"
+#include "intel_fbo.h"
#include "brw_blorp.h"
#include "brw_context.h"
@@ -666,78 +667,6 @@ intel_miptree_create_for_bo(struct brw_context *brw,
return mt;
}
-
-/**
- * For a singlesample DRI2 buffer, this simply wraps the given region with a miptree.
- *
- * For a multisample DRI2 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.
- */
-struct intel_mipmap_tree*
-intel_miptree_create_for_dri2_buffer(struct brw_context *brw,
- unsigned dri_attachment,
- mesa_format format,
- uint32_t num_samples,
- struct intel_region *region)
-{
- struct intel_mipmap_tree *singlesample_mt = NULL;
- struct intel_mipmap_tree *multisample_mt = NULL;
-
- /* Only the front and back buffers, which are color buffers, are shared
- * through DRI2.
- */
- assert(dri_attachment == __DRI_BUFFER_BACK_LEFT ||
- dri_attachment == __DRI_BUFFER_FRONT_LEFT ||
- dri_attachment == __DRI_BUFFER_FAKE_FRONT_LEFT);
- assert(_mesa_get_format_base_format(format) == GL_RGB ||
- _mesa_get_format_base_format(format) == GL_RGBA);
-
- singlesample_mt = intel_miptree_create_for_bo(brw,
- region->bo,
- format,
- 0,
- region->width,
- region->height,
- region->pitch,
- region->tiling);
- if (!singlesample_mt)
- return NULL;
- singlesample_mt->region->name = region->name;
-
- /* If this miptree is capable of supporting fast color clears, set
- * fast_clear_state appropriately to ensure that fast clears will occur.
- * Allocation of the MCS miptree will be deferred until the first fast
- * clear actually occurs.
- */
- if (intel_is_non_msrt_mcs_buffer_supported(brw, singlesample_mt))
- singlesample_mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;
-
- if (num_samples == 0)
- return singlesample_mt;
-
- multisample_mt = intel_miptree_create_for_renderbuffer(brw,
- format,
- region->width,
- region->height,
- num_samples);
- if (!multisample_mt) {
- intel_miptree_release(&singlesample_mt);
- return NULL;
- }
-
- multisample_mt->singlesample_mt = singlesample_mt;
- multisample_mt->need_downsample = false;
-
- if (brw->is_front_buffer_rendering &&
- (dri_attachment == __DRI_BUFFER_FRONT_LEFT ||
- dri_attachment == __DRI_BUFFER_FAKE_FRONT_LEFT)) {
- intel_miptree_upsample(brw, multisample_mt);
- }
-
- return multisample_mt;
-}
-
/**
* For a singlesample image buffer, this simply wraps the given region with a miptree.
*
@@ -745,15 +674,18 @@ intel_miptree_create_for_dri2_buffer(struct brw_context *brw,
* a singlesample miptree, then creates a multisample miptree into which the
* singlesample miptree is embedded as a child.
*/
-struct intel_mipmap_tree*
-intel_miptree_create_for_image_buffer(struct brw_context *intel,
- enum __DRIimageBufferMask buffer_type,
- mesa_format format,
- uint32_t num_samples,
- struct intel_region *region)
+void
+intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
+ struct intel_renderbuffer *irb,
+ struct intel_region *region)
{
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;
+ int num_samples = rb->NumSamples;
+
+ intel_miptree_release(&irb->mt);
/* Only the front and back buffers, which are color buffers, are allocated
* through the image loader.
@@ -770,7 +702,8 @@ intel_miptree_create_for_image_buffer(struct brw_context *intel,
region->pitch,
region->tiling);
if (!singlesample_mt)
- return NULL;
+ return;
+ singlesample_mt->region->name = region->name;
/* If this miptree is capable of supporting fast color clears, set
* mcs_state appropriately to ensure that fast clears will occur.
@@ -780,8 +713,10 @@ intel_miptree_create_for_image_buffer(struct brw_context *intel,
if (intel_is_non_msrt_mcs_buffer_supported(intel, singlesample_mt))
singlesample_mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;
- if (num_samples == 0)
- return singlesample_mt;
+ if (num_samples == 0) {
+ irb->mt = singlesample_mt;
+ return;
+ }
multisample_mt = intel_miptree_create_for_renderbuffer(intel,
format,
@@ -796,11 +731,7 @@ intel_miptree_create_for_image_buffer(struct brw_context *intel,
multisample_mt->singlesample_mt = singlesample_mt;
multisample_mt->need_downsample = false;
- if (intel->is_front_buffer_rendering && buffer_type == __DRI_IMAGE_BUFFER_FRONT) {
- intel_miptree_upsample(intel, multisample_mt);
- }
-
- return multisample_mt;
+ irb->mt = multisample_mt;
}
struct intel_mipmap_tree*
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
index 0c0a3d316a2..753e938d625 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
@@ -38,6 +38,8 @@
extern "C" {
#endif
+struct intel_renderbuffer;
+
/* A layer on top of the intel_regions code which adds:
*
* - Code to size and layout a region to hold a set of mipmaps.
@@ -529,19 +531,10 @@ intel_miptree_create_for_bo(struct brw_context *brw,
int pitch,
uint32_t tiling);
-struct intel_mipmap_tree*
-intel_miptree_create_for_dri2_buffer(struct brw_context *brw,
- unsigned dri_attachment,
- mesa_format format,
- uint32_t num_samples,
- struct intel_region *region);
-
-struct intel_mipmap_tree*
-intel_miptree_create_for_image_buffer(struct brw_context *intel,
- enum __DRIimageBufferMask buffer_type,
- mesa_format format,
- uint32_t num_samples,
- struct intel_region *region);
+void
+intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
+ struct intel_renderbuffer *irb,
+ struct intel_region *region);
/**
* Create a miptree appropriate as the storage for a non-texture renderbuffer.