zink: start to refactor clearing

we currently only handle clears inside renderpasses, but it's also possible
to perform clears outside of renderpasses, so we can break this logic up a bit
to open the door to handling the non-rp case

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8512>
This commit is contained in:
Mike Blumenkrantz 2020-08-13 11:45:30 -04:00 committed by Marge Bot
parent cf40a087f3
commit 196794264f
1 changed files with 24 additions and 7 deletions

View File

@ -26,8 +26,8 @@
#include "util/u_framebuffer.h"
void
zink_clear(struct pipe_context *pctx,
static void
clear_in_rp(struct pipe_context *pctx,
unsigned buffers,
const struct pipe_scissor_state *scissor_state,
const union pipe_color_union *pcolor,
@ -36,11 +36,6 @@ zink_clear(struct pipe_context *pctx,
struct zink_context *ctx = zink_context(pctx);
struct pipe_framebuffer_state *fb = &ctx->fb_state;
/* FIXME: this is very inefficient; if no renderpass has been started yet,
* we should record the clear if it's full-screen, and apply it as we
* start the render-pass. Otherwise we can do a partial out-of-renderpass
* clear.
*/
struct zink_batch *batch = zink_batch_rp(ctx);
VkClearAttachment attachments[1 + PIPE_MAX_COLOR_BUFS];
@ -86,3 +81,25 @@ zink_clear(struct pipe_context *pctx,
cr.layerCount = util_framebuffer_get_num_layers(fb);
vkCmdClearAttachments(batch->cmdbuf, num_attachments, attachments, 1, &cr);
}
void
zink_clear(struct pipe_context *pctx,
unsigned buffers,
const struct pipe_scissor_state *scissor_state,
const union pipe_color_union *pcolor,
double depth, unsigned stencil)
{
struct zink_context *ctx = zink_context(pctx);
/* FIXME: this is very inefficient; if no renderpass has been started yet,
* we should record the clear if it's full-screen, and apply it as we
* start the render-pass. Otherwise we can do a partial out-of-renderpass
* clear.
*/
zink_batch_rp(ctx);
assert(zink_curr_batch(ctx)->in_rp);
if (zink_curr_batch(ctx)->in_rp || ctx->render_condition_active) {
clear_in_rp(pctx, buffers, scissor_state, pcolor, depth, stencil);
return;
}
}