summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/util/u_surface.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-06-23 08:11:25 -0600
committerBrian Paul <[email protected]>2016-06-30 14:32:06 -0600
commit5f1335878e26784e2b006622fd315f89b66782f4 (patch)
tree04bd3c6332d10f0262a7721ad45451c2d275b1ca /src/gallium/auxiliary/util/u_surface.c
parenta029d9f074c510d86c487b249f4ca535e8782df7 (diff)
gallium/util: add tight_format_check param to util_can_blit_via_copy_region()
The VMware driver will use this for implementing GL_ARB_copy_image. Reviewed-by: Marek Olšák <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]> Reviewed-by: Charmaine Lee <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/util/u_surface.c')
-rw-r--r--src/gallium/auxiliary/util/u_surface.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/gallium/auxiliary/util/u_surface.c b/src/gallium/auxiliary/util/u_surface.c
index e2229bc7d13..e0234f8d15e 100644
--- a/src/gallium/auxiliary/util/u_surface.c
+++ b/src/gallium/auxiliary/util/u_surface.c
@@ -687,19 +687,37 @@ get_sample_count(const struct pipe_resource *res)
}
+/**
+ * Check if a blit() command can be implemented with a resource_copy_region().
+ * If tight_format_check is true, only allow the resource_copy_region() if
+ * the blit src/dst formats are identical, ignoring the resource formats.
+ * Otherwise, check for format casting and compatibility.
+ */
boolean
-util_can_blit_via_copy_region(const struct pipe_blit_info *blit)
+util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
+ boolean tight_format_check)
{
- unsigned mask = util_format_get_mask(blit->dst.format);
+ const struct util_format_description *src_desc, *dst_desc;
- /* No format conversions. */
- if (blit->src.resource->format != blit->src.format ||
- blit->dst.resource->format != blit->dst.format ||
- !util_is_format_compatible(
- util_format_description(blit->src.resource->format),
- util_format_description(blit->dst.resource->format))) {
- return FALSE;
+ src_desc = util_format_description(blit->src.resource->format);
+ dst_desc = util_format_description(blit->dst.resource->format);
+
+ if (tight_format_check) {
+ /* no format conversions allowed */
+ if (blit->src.format != blit->dst.format) {
+ return FALSE;
+ }
}
+ else {
+ /* do loose format compatibility checking */
+ if (blit->src.resource->format != blit->src.format ||
+ blit->dst.resource->format != blit->dst.format ||
+ !util_is_format_compatible(src_desc, dst_desc)) {
+ return FALSE;
+ }
+ }
+
+ unsigned mask = util_format_get_mask(blit->dst.format);
/* No masks, no filtering, no scissor, no blending */
if ((blit->mask & mask) != mask ||
@@ -752,7 +770,7 @@ boolean
util_try_blit_via_copy_region(struct pipe_context *ctx,
const struct pipe_blit_info *blit)
{
- if (util_can_blit_via_copy_region(blit)) {
+ if (util_can_blit_via_copy_region(blit, FALSE)) {
ctx->resource_copy_region(ctx, blit->dst.resource, blit->dst.level,
blit->dst.box.x, blit->dst.box.y,
blit->dst.box.z,