Commit 787412b7 authored by Mike Blumenkrantz's avatar Mike Blumenkrantz 🏋 Committed by Marge Bot
Browse files

zink: break out region overlap testing function into helper



this is useful for a lot of copying operations
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Part-of: <mesa/mesa!9206>
parent 48716b14
......@@ -4,6 +4,7 @@
#include "zink_screen.h"
#include "util/u_blitter.h"
#include "util/u_rect.h"
#include "util/u_surface.h"
#include "util/format/u_format.h"
......@@ -260,3 +261,20 @@ zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags)
ctx->sampler_views[PIPE_SHADER_FRAGMENT]);
}
}
bool
zink_blit_region_fills(struct u_rect region, unsigned width, unsigned height)
{
struct u_rect intersect = {0, width, 0, height};
if (!u_rect_test_intersection(&region, &intersect))
/* is this even a thing? */
return false;
u_rect_find_intersection(&region, &intersect);
if (intersect.x0 != 0 || intersect.y0 != 0 ||
intersect.x1 != width || intersect.y1 != height)
return false;
return false;
}
......@@ -162,22 +162,7 @@ clear_zs_no_rp(struct zink_context *ctx, struct zink_resource *res, VkImageAspec
vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, &zs_value, 1, &range);
}
static bool
clear_needs_rp(unsigned width, unsigned height, struct u_rect *region)
{
struct u_rect intersect = {0, width, 0, height};
if (!u_rect_test_intersection(region, &intersect))
/* is this even a thing? */
return true;
u_rect_find_intersection(region, &intersect);
if (intersect.x0 != 0 || intersect.y0 != 0 ||
intersect.x1 != width || intersect.y1 != height)
return true;
return false;
}
static struct zink_framebuffer_clear_data *
get_clear_data(struct zink_context *ctx, struct zink_framebuffer_clear *fb_clear, const struct pipe_scissor_state *scissor_state)
......@@ -212,7 +197,7 @@ zink_clear(struct pipe_context *pctx,
if (scissor_state) {
struct u_rect scissor = {scissor_state->minx, scissor_state->maxx, scissor_state->miny, scissor_state->maxy};
needs_rp = clear_needs_rp(fb->width, fb->height, &scissor);
needs_rp = !zink_blit_region_fills(scissor, fb->width, fb->height);
}
......@@ -373,7 +358,7 @@ zink_clear_texture(struct pipe_context *pctx,
struct zink_resource *res = zink_resource(pres);
struct pipe_screen *pscreen = pctx->screen;
struct u_rect region = {box->x, box->x + box->width, box->y, box->y + box->height};
bool needs_rp = clear_needs_rp(pres->width0, pres->height0, &region) || ctx->render_condition_active;
bool needs_rp = !zink_blit_region_fills(region, pres->width0, pres->height0) || ctx->render_condition_active;
struct zink_batch *batch = zink_curr_batch(ctx);
struct pipe_surface *surf = NULL;
......
......@@ -38,6 +38,7 @@
struct blitter_context;
struct primconvert_context;
struct list_head;
struct u_rect;
struct zink_blend_state;
struct zink_depth_stencil_alpha_state;
......@@ -280,6 +281,9 @@ void
zink_blit(struct pipe_context *pctx,
const struct pipe_blit_info *info);
bool
zink_blit_region_fills(struct u_rect region, unsigned width, unsigned height);
void
zink_clear(struct pipe_context *pctx,
unsigned buffers,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment