[Mesa-dev] [PATCH 4/5] gallium/u_blitter: add bool u_blitter::leaving
Marek Olšák
maraeo at gmail.com
Sun Mar 11 18:44:48 UTC 2018
Please ignore patches 4 & 5. Patch 5 breaks gl-1.0-readpixsanity.
Marek
On Sun, Mar 11, 2018 at 2:11 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/gallium/auxiliary/util/u_blitter.c | 14 ++++++++++++++
> src/gallium/auxiliary/util/u_blitter.h | 2 ++
> 2 files changed, 16 insertions(+)
>
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index 4748627..87fb33b 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -532,31 +532,33 @@ void util_blitter_set_texture_multisample(struct blitter_context *blitter,
> ctx->has_texture_multisample = supported;
> }
>
> void util_blitter_set_running_flag(struct blitter_context *blitter)
> {
> if (blitter->running) {
> _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
> __LINE__);
> }
> blitter->running = true;
> + blitter->leaving = false;
>
> blitter->pipe->set_active_query_state(blitter->pipe, false);
> }
>
> void util_blitter_unset_running_flag(struct blitter_context *blitter)
> {
> if (!blitter->running) {
> _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n",
> __LINE__);
> }
> blitter->running = false;
> + blitter->leaving = false;
>
> blitter->pipe->set_active_query_state(blitter->pipe, true);
> }
>
> static void blitter_check_saved_vertex_states(MAYBE_UNUSED struct blitter_context_priv *ctx)
> {
> assert(ctx->base.saved_vs != INVALID_PTR);
> assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR);
> assert(!ctx->has_tessellation || ctx->base.saved_tcs != INVALID_PTR);
> assert(!ctx->has_tessellation || ctx->base.saved_tes != INVALID_PTR);
> @@ -1410,20 +1412,21 @@ static void util_blitter_clear_custom(struct blitter_context *blitter,
> get_vs = get_vs_passthrough_pos_generic;
> else
> get_vs = get_vs_passthrough_pos;
>
> blitter_set_common_draw_rect_state(ctx, false);
> blitter->draw_rectangle(blitter, ctx->velem_state, get_vs,
> 0, 0, width, height,
> (float) depth, 1, type, &attrib);
> }
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> void util_blitter_clear(struct blitter_context *blitter,
> unsigned width, unsigned height, unsigned num_layers,
> unsigned clear_buffers,
> const union pipe_color_union *color,
> @@ -1960,20 +1963,21 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
>
> if (scissor) {
> pipe->set_scissor_states(pipe, 0, 1, scissor);
> }
>
> blitter_set_common_draw_rect_state(ctx, scissor != NULL);
>
> do_blits(ctx, dst, dstbox, src, src_width0, src_height0,
> srcbox, blit_depth || blit_stencil, use_txf);
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_textures(blitter);
> util_blitter_restore_fb_state(blitter);
> if (scissor) {
> pipe->set_scissor_states(pipe, 0, 1, &ctx->base.saved_scissor);
> }
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
> @@ -2101,20 +2105,21 @@ void util_blitter_generate_mipmap(struct blitter_context *blitter,
>
> pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &src_view);
>
> do_blits(ctx, dst_view, &dstbox, src_view, tex->width0, tex->height0,
> &srcbox, is_depth, false);
>
> pipe_surface_reference(&dst_view, NULL);
> pipe_sampler_view_reference(&src_view, NULL);
> }
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_textures(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> /* Clear a region of a color surface to a constant value. */
> void util_blitter_clear_render_target(struct blitter_context *blitter,
> @@ -2165,20 +2170,21 @@ void util_blitter_clear_render_target(struct blitter_context *blitter,
> dstx, dsty, dstx+width, dsty+height, 0,
> num_layers, UTIL_BLITTER_ATTRIB_COLOR, &attrib);
> } else {
> blitter_set_common_draw_rect_state(ctx, false);
> blitter->draw_rectangle(blitter, ctx->velem_state,
> get_vs_passthrough_pos_generic,
> dstx, dsty, dstx+width, dsty+height, 0,
> 1, UTIL_BLITTER_ATTRIB_COLOR, &attrib);
> }
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> /* Clear a region of a depth stencil surface. */
> void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
> struct pipe_surface *dstsurf,
> @@ -2244,20 +2250,21 @@ void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
> dstx, dsty, dstx+width, dsty+height, depth,
> num_layers, UTIL_BLITTER_ATTRIB_NONE, NULL);
> } else {
> blitter_set_common_draw_rect_state(ctx, false);
> blitter->draw_rectangle(blitter, ctx->velem_state,
> get_vs_passthrough_pos,
> dstx, dsty, dstx+width, dsty+height, depth, 1,
> UTIL_BLITTER_ATTRIB_NONE, NULL);
> }
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> /* draw a rectangle across a region using a custom dsa stage - for r600g */
> void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
> struct pipe_surface *zsurf,
> @@ -2303,20 +2310,21 @@ void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
> fb_state.zsbuf = zsurf;
> pipe->set_framebuffer_state(pipe, &fb_state);
> pipe->set_sample_mask(pipe, sample_mask);
>
> blitter_set_common_draw_rect_state(ctx, false);
> blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height);
> blitter->draw_rectangle(blitter, ctx->velem_state, get_vs_passthrough_pos,
> 0, 0, zsurf->width, zsurf->height, depth,
> 1, UTIL_BLITTER_ATTRIB_NONE, NULL);
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> void util_blitter_copy_buffer(struct blitter_context *blitter,
> struct pipe_resource *dst,
> unsigned dstx,
> @@ -2372,20 +2380,21 @@ void util_blitter_copy_buffer(struct blitter_context *blitter,
> pipe->bind_tcs_state(pipe, NULL);
> pipe->bind_tes_state(pipe, NULL);
> }
> pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state);
>
> so_target = pipe->create_stream_output_target(pipe, dst, dstx, size);
> pipe->set_stream_output_targets(pipe, 1, &so_target, offsets);
>
> util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4);
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> pipe_so_target_reference(&so_target, NULL);
> }
>
> void util_blitter_clear_buffer(struct blitter_context *blitter,
> struct pipe_resource *dst,
> unsigned offset, unsigned size,
> unsigned num_channels,
> @@ -2440,20 +2449,21 @@ void util_blitter_clear_buffer(struct blitter_context *blitter,
> pipe->bind_tes_state(pipe, NULL);
> }
> pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state);
>
> so_target = pipe->create_stream_output_target(pipe, dst, offset, size);
> pipe->set_stream_output_targets(pipe, 1, &so_target, offsets);
>
> util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4);
>
> out:
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> pipe_so_target_reference(&so_target, NULL);
> pipe_resource_reference(&vb.buffer.resource, NULL);
> }
>
> /* probably radeon specific */
> void util_blitter_custom_resolve_color(struct blitter_context *blitter,
> struct pipe_resource *dst,
> @@ -2502,20 +2512,22 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter,
> fb_state.cbufs[0] = srcsurf;
> fb_state.cbufs[1] = dstsurf;
> fb_state.zsbuf = NULL;
> pipe->set_framebuffer_state(pipe, &fb_state);
>
> blitter_set_common_draw_rect_state(ctx, false);
> blitter_set_dst_dimensions(ctx, src->width0, src->height0);
> blitter->draw_rectangle(blitter, ctx->velem_state, get_vs_passthrough_pos,
> 0, 0, src->width0, src->height0,
> 0, 1, UTIL_BLITTER_ATTRIB_NONE, NULL);
> +
> + blitter->leaving = true;
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
>
> pipe_surface_reference(&srcsurf, NULL);
> pipe_surface_reference(&dstsurf, NULL);
> }
>
> @@ -2553,20 +2565,21 @@ void util_blitter_custom_color(struct blitter_context *blitter,
> fb_state.zsbuf = 0;
> pipe->set_framebuffer_state(pipe, &fb_state);
> pipe->set_sample_mask(pipe, ~0);
>
> blitter_set_common_draw_rect_state(ctx, false);
> blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
> blitter->draw_rectangle(blitter, ctx->velem_state, get_vs_passthrough_pos,
> 0, 0, dstsurf->width, dstsurf->height,
> 0, 1, UTIL_BLITTER_ATTRIB_NONE, NULL);
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
>
> static void *get_custom_vs(struct blitter_context *blitter)
> {
> struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
> @@ -2615,16 +2628,17 @@ void util_blitter_custom_shader(struct blitter_context *blitter,
> fb_state.zsbuf = 0;
> pipe->set_framebuffer_state(pipe, &fb_state);
> pipe->set_sample_mask(pipe, ~0);
>
> blitter_set_common_draw_rect_state(ctx, false);
> blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height);
> blitter->draw_rectangle(blitter, ctx->velem_state, get_custom_vs,
> 0, 0, dstsurf->width, dstsurf->height,
> 0, 1, UTIL_BLITTER_ATTRIB_NONE, NULL);
>
> + blitter->leaving = true;
> util_blitter_restore_vertex_states(blitter);
> util_blitter_restore_fragment_states(blitter);
> util_blitter_restore_fb_state(blitter);
> util_blitter_restore_render_cond(blitter);
> util_blitter_unset_running_flag(blitter);
> }
> diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
> index 9e94598..89813e5 100644
> --- a/src/gallium/auxiliary/util/u_blitter.h
> +++ b/src/gallium/auxiliary/util/u_blitter.h
> @@ -92,20 +92,22 @@ struct blitter_context
> void (*draw_rectangle)(struct blitter_context *blitter,
> void *vertex_elements_cso,
> blitter_get_vs_func get_vs,
> int x1, int y1, int x2, int y2,
> float depth, unsigned num_instances,
> enum blitter_attrib_type type,
> const union blitter_attrib *attrib);
>
> /* Whether the blitter is running. */
> bool running;
> + /* Whether the blitter is done and restoring states. */
> + bool leaving;
>
> /* Private members, really. */
> struct pipe_context *pipe; /**< pipe context */
>
> void *saved_blend_state; /**< blend state */
> void *saved_dsa_state; /**< depth stencil alpha state */
> void *saved_velem_state; /**< vertex elements state */
> void *saved_rs_state; /**< rasterizer state */
> void *saved_fs, *saved_vs, *saved_gs, *saved_tcs, *saved_tes; /**< shaders */
>
> --
> 2.7.4
>
More information about the mesa-dev
mailing list