vc4: Move job-submit skip cases to vc4_job_submit().
[mesa.git] / src / gallium / drivers / ilo / ilo_blitter_pipe.c
index e37231ac00b7209a33640a5029d2c46cfbe4f668..0bfe7827f11d77f3fedd64889b74d4c5d7c73a7d 100644 (file)
@@ -40,51 +40,63 @@ enum ilo_blitter_pipe_op {
 
 static void
 ilo_blitter_pipe_begin(struct ilo_blitter *blitter,
-                       enum ilo_blitter_pipe_op op)
+                       enum ilo_blitter_pipe_op op,
+                       bool scissor_enable)
 {
    struct blitter_context *b = blitter->pipe_blitter;
-   struct ilo_context *ilo = blitter->ilo;
-
-   /* as documented in util/u_blitter.h */
-   util_blitter_save_vertex_buffer_slot(b, ilo->vb.states);
-   util_blitter_save_vertex_elements(b, (void *) ilo->ve);
-   util_blitter_save_vertex_shader(b, ilo->vs);
-   util_blitter_save_geometry_shader(b, ilo->gs);
-   util_blitter_save_so_targets(b, ilo->so.count, ilo->so.states);
-
-   util_blitter_save_fragment_shader(b, ilo->fs);
-   util_blitter_save_depth_stencil_alpha(b, (void *) ilo->dsa);
-   util_blitter_save_blend(b, (void *) ilo->blend);
-
-   /* undocumented? */
-   util_blitter_save_viewport(b, &ilo->viewport.viewport0);
-   util_blitter_save_stencil_ref(b, &ilo->stencil_ref);
-   util_blitter_save_sample_mask(b, ilo->sample_mask);
+   struct ilo_state_vector *vec = &blitter->ilo->state_vector;
+
+   /* vertex states */
+   util_blitter_save_vertex_buffer_slot(b, vec->vb.states);
+   util_blitter_save_vertex_elements(b, (void *) vec->ve);
+   util_blitter_save_vertex_shader(b, vec->vs);
+   util_blitter_save_geometry_shader(b, vec->gs);
+   util_blitter_save_so_targets(b, vec->so.count, vec->so.states);
+   util_blitter_save_rasterizer(b, (void *) vec->rasterizer);
+
+   /* fragment states */
+   util_blitter_save_fragment_shader(b, vec->fs);
+   util_blitter_save_depth_stencil_alpha(b, (void *) vec->dsa);
+   util_blitter_save_blend(b, (void *) vec->blend);
+   util_blitter_save_sample_mask(b, vec->sample_mask);
+   util_blitter_save_stencil_ref(b, &vec->stencil_ref);
+   util_blitter_save_viewport(b, &vec->viewport.viewport0);
+
+   if (scissor_enable)
+      util_blitter_save_scissor(b, &vec->viewport.scissor0);
 
    switch (op) {
    case ILO_BLITTER_PIPE_BLIT:
    case ILO_BLITTER_PIPE_COPY:
-      util_blitter_save_rasterizer(b, (void *) ilo->rasterizer);
-      util_blitter_save_framebuffer(b, &ilo->fb.state);
-
+      /*
+       * We are about to call util_blitter_blit() or
+       * util_blitter_copy_texture().  Note that util_blitter uses at most two
+       * textures.
+       */
       util_blitter_save_fragment_sampler_states(b,
-            ilo->sampler[PIPE_SHADER_FRAGMENT].count,
-            (void **) ilo->sampler[PIPE_SHADER_FRAGMENT].cso);
+            2, (void **) vec->sampler[PIPE_SHADER_FRAGMENT].cso);
 
       util_blitter_save_fragment_sampler_views(b,
-            ilo->view[PIPE_SHADER_FRAGMENT].count,
-            ilo->view[PIPE_SHADER_FRAGMENT].states);
+            vec->view[PIPE_SHADER_FRAGMENT].count,
+            vec->view[PIPE_SHADER_FRAGMENT].states);
 
-      /* disable render condition? */
+      util_blitter_save_framebuffer(b, &vec->fb.state);
+
+      /* resource_copy_region() or blit() does not honor render condition */
+      util_blitter_save_render_condition(b,
+            blitter->ilo->render_condition.query,
+            blitter->ilo->render_condition.condition,
+            blitter->ilo->render_condition.mode);
       break;
    case ILO_BLITTER_PIPE_CLEAR:
-      util_blitter_save_rasterizer(b, (void *) ilo->rasterizer);
-      util_blitter_save_framebuffer(b, &ilo->fb.state);
-
-      /* disable render condition? */
+      /*
+       * we are about to call util_blitter_clear_render_target() or
+       * util_blitter_clear_depth_stencil()
+       */
+      util_blitter_save_framebuffer(b, &vec->fb.state);
       break;
    case ILO_BLITTER_PIPE_CLEAR_FB:
-      util_blitter_save_rasterizer(b, (void *) ilo->rasterizer);
+      /* we are about to call util_blitter_clear() */
       break;
    default:
       break;
@@ -125,7 +137,8 @@ ilo_blitter_pipe_blit(struct ilo_blitter *blitter,
       }
    }
 
-   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_BLIT);
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_BLIT,
+         info->scissor_enable);
    util_blitter_blit(b, info);
    ilo_blitter_pipe_end(blitter);
 
@@ -139,22 +152,18 @@ ilo_blitter_pipe_copy_resource(struct ilo_blitter *blitter,
                                struct pipe_resource *src, unsigned src_level,
                                const struct pipe_box *src_box)
 {
-   const unsigned mask = PIPE_MASK_RGBAZS;
-   const bool copy_all_samples = true;
-
    /* not until we allow rendertargets to be buffers */
    if (dst->target == PIPE_BUFFER || src->target == PIPE_BUFFER)
       return false;
 
-   if (!util_blitter_is_copy_supported(blitter->pipe_blitter, dst, src, mask))
+   if (!util_blitter_is_copy_supported(blitter->pipe_blitter, dst, src))
       return false;
 
-   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_COPY);
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_COPY, false);
 
    util_blitter_copy_texture(blitter->pipe_blitter,
          dst, dst_level, dst_x, dst_y, dst_z,
-         src, src_level, src_box,
-         mask, copy_all_samples);
+         src, src_level, src_box);
 
    ilo_blitter_pipe_end(blitter);
 
@@ -168,7 +177,7 @@ ilo_blitter_pipe_clear_rt(struct ilo_blitter *blitter,
                           unsigned x, unsigned y,
                           unsigned width, unsigned height)
 {
-   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR);
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR, false);
 
    util_blitter_clear_render_target(blitter->pipe_blitter,
          rt, color, x, y, width, height);
@@ -186,7 +195,7 @@ ilo_blitter_pipe_clear_zs(struct ilo_blitter *blitter,
                           unsigned x, unsigned y,
                           unsigned width, unsigned height)
 {
-   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR);
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR, false);
 
    util_blitter_clear_depth_stencil(blitter->pipe_blitter,
          zs, clear_flags, depth, stencil, x, y, width, height);
@@ -202,11 +211,13 @@ ilo_blitter_pipe_clear_fb(struct ilo_blitter *blitter,
                           const union pipe_color_union *color,
                           double depth, unsigned stencil)
 {
+   struct ilo_state_vector *vec = &blitter->ilo->state_vector;
+
    /* TODO we should pause/resume some queries */
-   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR_FB);
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR_FB, false);
 
    util_blitter_clear(blitter->pipe_blitter,
-         blitter->ilo->fb.state.width, blitter->ilo->fb.state.height,
+         vec->fb.state.width, vec->fb.state.height, 1,
          buffers, color, depth, stencil);
 
    ilo_blitter_pipe_end(blitter);