[Mesa-dev] [PATCH 2/3] i965/blit: Add a color blit function and use it in set_alpha_to_one
Jason Ekstrand
jason at jlekstrand.net
Wed Oct 1 14:07:02 PDT 2014
Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
---
src/mesa/drivers/dri/i965/intel_blit.c | 90 ++++++++++++++++++++++++----------
src/mesa/drivers/dri/i965/intel_blit.h | 10 ++++
2 files changed, 73 insertions(+), 27 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/intel_blit.c b/src/mesa/drivers/dri/i965/intel_blit.c
index f9e2e30..f46e355 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.c
+++ b/src/mesa/drivers/dri/i965/intel_blit.c
@@ -568,42 +568,52 @@ intel_emit_linear_blit(struct brw_context *brw,
}
}
-/**
- * Used to initialize the alpha value of an ARGB8888 miptree after copying
- * into it from an XRGB8888 source.
+/* Emits a blit that sets the color of a buffer. The color is copied
+ * exactly with no conversion or blending. This roughtly corresponds to
+ * doing a memset on the surface.
*
- * This is very common with glCopyTexImage2D(). Note that the coordinates are
- * relative to the start of the miptree, not relative to a slice within the
- * miptree.
+ * The color parameter specifies the 32, 24, 16, or 8-bit color value to
+ * write. When writing a 32-bit color, the set_rgb and set_alpha options
+ * controle whether the rgb components or alpha components are overwritten
+ * respectively. These two parameters do nothing for colors with less than
+ * 32 bits.
*/
-static void
-intel_miptree_set_alpha_to_one(struct brw_context *brw,
- struct intel_mipmap_tree *mt,
- int x, int y, int width, int height)
+bool
+intel_emit_color_blit(struct brw_context *brw,
+ unsigned cpp,
+ uint32_t color,
+ int16_t dst_pitch,
+ drm_intel_bo *dst_buffer,
+ unsigned dst_offset, uint32_t dst_tiling,
+ int16_t x, int16_t y, int16_t width, int16_t height,
+ bool set_rgb, bool set_alpha)
{
uint32_t BR13, CMD;
- int pitch, cpp;
drm_intel_bo *aper_array[2];
- pitch = mt->pitch;
- cpp = mt->cpp;
-
- DBG("%s dst:buf(%p)/%d %d,%d sz:%dx%d\n",
- __FUNCTION__, mt->bo, pitch, x, y, width, height);
+ if (dst_tiling != I915_TILING_NONE && (dst_offset & 4095))
+ return false;
+ if (cpp > 4)
+ return false;
- BR13 = br13_for_cpp(cpp) | 0xf0 << 16;
CMD = XY_COLOR_BLT_CMD;
- CMD |= XY_BLT_WRITE_ALPHA;
+ if (set_alpha)
+ CMD |= XY_BLT_WRITE_ALPHA;
+ if (set_rgb)
+ CMD |= XY_BLT_WRITE_RGB;
+
+ bool dst_y_tiled = dst_tiling == I915_TILING_Y;
- if (mt->tiling != I915_TILING_NONE) {
+ BR13 = br13_for_cpp(cpp) | 0xf0 << 16;
+ if (dst_y_tiled) {
CMD |= XY_DST_TILED;
- pitch /= 4;
+ dst_pitch /= 4;
}
- BR13 |= pitch;
+ BR13 |= dst_pitch;
/* do space check before going any further */
aper_array[0] = brw->batch.bo;
- aper_array[1] = mt->bo;
+ aper_array[1] = dst_buffer;
if (drm_intel_bufmgr_check_aperture_space(aper_array,
ARRAY_SIZE(aper_array)) != 0) {
@@ -611,7 +621,6 @@ intel_miptree_set_alpha_to_one(struct brw_context *brw,
}
unsigned length = brw->gen >= 8 ? 7 : 6;
- bool dst_y_tiled = mt->tiling == I915_TILING_Y;
BEGIN_BATCH_BLT_TILED(length, dst_y_tiled, false);
OUT_BATCH(CMD | (length - 2));
@@ -619,16 +628,43 @@ intel_miptree_set_alpha_to_one(struct brw_context *brw,
OUT_BATCH(SET_FIELD(y, BLT_Y) | SET_FIELD(x, BLT_X));
OUT_BATCH(SET_FIELD(y + height, BLT_Y) | SET_FIELD(x + width, BLT_X));
if (brw->gen >= 8) {
- OUT_RELOC64(mt->bo,
+ OUT_RELOC64(dst_buffer,
I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
- 0);
+ dst_offset);
} else {
- OUT_RELOC(mt->bo,
+ OUT_RELOC(dst_buffer,
I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
- 0);
+ dst_offset);
}
OUT_BATCH(0xffffffff); /* white, but only alpha gets written */
ADVANCE_BATCH_TILED(dst_y_tiled, false);
intel_batchbuffer_emit_mi_flush(brw);
+
+ return false;
+}
+
+/**
+ * Used to initialize the alpha value of an ARGB8888 miptree after copying
+ * into it from an XRGB8888 source.
+ *
+ * This is very common with glCopyTexImage2D(). Note that the coordinates are
+ * relative to the start of the miptree, not relative to a slice within the
+ * miptree.
+ */
+static void
+intel_miptree_set_alpha_to_one(struct brw_context *brw,
+ struct intel_mipmap_tree *mt,
+ int x, int y, int width, int height)
+{
+ bool ok;
+ DBG("%s dst:buf(%p)/%d %d,%d sz:%dx%d\n",
+ __FUNCTION__, mt->bo, mt->pitch, x, y, width, height);
+
+ ok = intel_emit_color_blit(brw, mt->cpp, 0xffffffff, mt->pitch, mt->bo,
+ mt->offset, mt->tiling, x, y, width, height,
+ false, true);
+
+ if (!ok)
+ _mesa_problem(&brw->ctx, "Failed to set alpha to 1");
}
diff --git a/src/mesa/drivers/dri/i965/intel_blit.h b/src/mesa/drivers/dri/i965/intel_blit.h
index b7cf0bb..cf71f5a 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.h
+++ b/src/mesa/drivers/dri/i965/intel_blit.h
@@ -76,4 +76,14 @@ void intel_emit_linear_blit(struct brw_context *brw,
unsigned int src_offset,
unsigned int size);
+bool
+intel_emit_color_blit(struct brw_context *brw,
+ unsigned cpp,
+ uint32_t color,
+ int16_t dst_pitch,
+ drm_intel_bo *dst_buffer,
+ unsigned dst_offset, uint32_t dst_tiling,
+ int16_t x, int16_t y, int16_t width, int16_t height,
+ bool set_rgb, bool set_alpha);
+
#endif
--
2.1.0
More information about the mesa-dev
mailing list