summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/freedreno/freedreno_blitter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_blitter.c')
-rw-r--r--src/gallium/drivers/freedreno/freedreno_blitter.c47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.c b/src/gallium/drivers/freedreno/freedreno_blitter.c
index c41a0736ecb..43f08f40d81 100644
--- a/src/gallium/drivers/freedreno/freedreno_blitter.c
+++ b/src/gallium/drivers/freedreno/freedreno_blitter.c
@@ -79,7 +79,9 @@ default_src_texture(struct pipe_sampler_view *src_templ,
static void
fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt
{
- util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vtx.vertexbuf.vb);
+ util_blitter_save_vertex_buffers(
+ ctx->blitter, ctx->vtx.vertexbuf.vb,
+ util_last_bit(ctx->vtx.vertexbuf.enabled_mask));
util_blitter_save_vertex_elements(ctx->blitter, ctx->vtx.vtx);
util_blitter_save_vertex_shader(ctx->blitter, ctx->prog.vs);
util_blitter_save_tessctrl_shader(ctx->blitter, ctx->prog.hs);
@@ -88,13 +90,13 @@ fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt
util_blitter_save_so_targets(ctx->blitter, ctx->streamout.num_targets,
ctx->streamout.targets);
util_blitter_save_rasterizer(ctx->blitter, ctx->rasterizer);
- util_blitter_save_viewport(ctx->blitter, &ctx->viewport);
- util_blitter_save_scissor(ctx->blitter, &ctx->scissor);
+ util_blitter_save_viewport(ctx->blitter, &ctx->viewport[0]);
+ util_blitter_save_scissor(ctx->blitter, &ctx->scissor[0]);
util_blitter_save_fragment_shader(ctx->blitter, ctx->prog.fs);
util_blitter_save_blend(ctx->blitter, ctx->blend);
util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->zsa);
util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
- util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask);
+ util_blitter_save_sample_mask(ctx->blitter, ctx->sample_mask, ctx->min_samples);
util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer);
util_blitter_save_fragment_sampler_states(
ctx->blitter, ctx->tex[PIPE_SHADER_FRAGMENT].num_samplers,
@@ -166,7 +168,7 @@ fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info)
util_blitter_blit_generic(
ctx->blitter, dst_view, &info->dst.box, src_view, &info->src.box,
src->width0, src->height0, info->mask, info->filter,
- info->scissor_enable ? &info->scissor : NULL, info->alpha_blend, false);
+ info->scissor_enable ? &info->scissor : NULL, info->alpha_blend, false, 0);
pipe_surface_reference(&dst_view, NULL);
pipe_sampler_view_reference(&src_view, NULL);
@@ -235,8 +237,8 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
pctx->set_viewport_states(pctx, 0, 1, &vp);
pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx);
- pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1, 0, false,
- &ctx->solid_vbuf_state.vertexbuf.vb[0]);
+ util_set_vertex_buffers(pctx, 1, false,
+ &ctx->solid_vbuf_state.vertexbuf.vb[0]);
pctx->set_stream_output_targets(pctx, 0, NULL, NULL);
if (pfb->layers > 1)
@@ -254,7 +256,7 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
pctx->bind_tes_state(pctx, NULL);
struct pipe_draw_info info = {
- .mode = PIPE_PRIM_MAX, /* maps to DI_PT_RECTLIST */
+ .mode = MESA_PRIM_COUNT, /* maps to DI_PT_RECTLIST */
.index_bounds_valid = true,
.max_index = 1,
.instance_count = MAX2(1, pfb->layers),
@@ -279,6 +281,35 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
fd_blitter_pipe_end(ctx);
}
+/* Partially generic clear_render_target implementation using u_blitter */
+void
+fd_blitter_clear_render_target(struct pipe_context *pctx, struct pipe_surface *ps,
+ const union pipe_color_union *color, unsigned x,
+ unsigned y, unsigned w, unsigned h,
+ bool render_condition_enabled)
+{
+ struct fd_context *ctx = fd_context(pctx);
+
+ fd_blitter_pipe_begin(ctx, render_condition_enabled);
+ util_blitter_clear_render_target(ctx->blitter, ps, color, x, y, w, h);
+ fd_blitter_pipe_end(ctx);
+}
+
+/* Partially generic clear_depth_stencil implementation using u_blitter */
+void
+fd_blitter_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *ps,
+ unsigned buffers, double depth, unsigned stencil,
+ unsigned x, unsigned y, unsigned w, unsigned h,
+ bool render_condition_enabled)
+{
+ struct fd_context *ctx = fd_context(pctx);
+
+ fd_blitter_pipe_begin(ctx, render_condition_enabled);
+ util_blitter_clear_depth_stencil(ctx->blitter, ps, buffers, depth,
+ stencil, x, y, w, h);
+ fd_blitter_pipe_end(ctx);
+}
+
/**
* Optimal hardware path for blitting pixels.
* Scaling, format conversion, up- and downsampling (resolve) are allowed.