X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Filo%2Filo_blitter_pipe.c;h=0bfe7827f11d77f3fedd64889b74d4c5d7c73a7d;hb=774a556b6dc0d49f9f29c438349a66e69062e6e4;hp=e37231ac00b7209a33640a5029d2c46cfbe4f668;hpb=98bc4c62a621fa1f8c099c45767d22e5d2bc9741;p=mesa.git diff --git a/src/gallium/drivers/ilo/ilo_blitter_pipe.c b/src/gallium/drivers/ilo/ilo_blitter_pipe.c index e37231ac00b..0bfe7827f11 100644 --- a/src/gallium/drivers/ilo/ilo_blitter_pipe.c +++ b/src/gallium/drivers/ilo/ilo_blitter_pipe.c @@ -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);