X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Filo%2Filo_draw.c;h=6831d2c4eff381b5050b86daad171f59a0ba0e89;hb=779653489e53dc837fec5b20319f4b221e8a6432;hp=3d2b128804e25758f32b4e9e60a57ab4a2a1e292;hpb=3afe30e64be7f4686398f826389159d87d8ae096;p=mesa.git diff --git a/src/gallium/drivers/ilo/ilo_draw.c b/src/gallium/drivers/ilo/ilo_draw.c index 3d2b128804e..6831d2c4eff 100644 --- a/src/gallium/drivers/ilo/ilo_draw.c +++ b/src/gallium/drivers/ilo/ilo_draw.c @@ -26,7 +26,7 @@ */ #include "util/u_prim.h" -#include "intel_winsys.h" +#include "core/intel_winsys.h" #include "ilo_render.h" #include "ilo_blit.h" @@ -71,6 +71,7 @@ query_process_bo(const struct ilo_context *ilo, struct ilo_query *q) switch (q->type) { case PIPE_QUERY_OCCLUSION_COUNTER: + case PIPE_QUERY_OCCLUSION_PREDICATE: case PIPE_QUERY_TIME_ELAPSED: case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_EMITTED: @@ -130,7 +131,7 @@ query_begin_bo(struct ilo_context *ilo, struct ilo_query *q) /* write the beginning value to the bo */ if (q->in_pairs) - ilo_3d_pipeline_emit_query(ilo->pipeline, q, q->stride * q->used); + ilo_render_emit_query(ilo->render, q, q->stride * q->used); } static void @@ -147,7 +148,7 @@ query_end_bo(struct ilo_context *ilo, struct ilo_query *q) q->used++; /* write the ending value to the bo */ - ilo_3d_pipeline_emit_query(ilo->pipeline, q, offset); + ilo_render_emit_query(ilo->render, q, offset); } bool @@ -157,6 +158,7 @@ ilo_init_draw_query(struct ilo_context *ilo, struct ilo_query *q) switch (q->type) { case PIPE_QUERY_OCCLUSION_COUNTER: + case PIPE_QUERY_OCCLUSION_PREDICATE: case PIPE_QUERY_TIME_ELAPSED: case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_EMITTED: @@ -176,15 +178,14 @@ ilo_init_draw_query(struct ilo_context *ilo, struct ilo_query *q) break; } - q->cmd_len = ilo_3d_pipeline_estimate_size(ilo->pipeline, - ILO_3D_PIPELINE_QUERY, q); + q->cmd_len = ilo_render_get_query_len(ilo->render, q->type); /* double cmd_len and stride if in pairs */ q->cmd_len <<= q->in_pairs; q->stride <<= q->in_pairs; bo_size = (q->stride > 4096) ? q->stride : 4096; - q->bo = intel_winsys_alloc_buffer(ilo->winsys, "query", bo_size, false); + q->bo = intel_winsys_alloc_bo(ilo->winsys, "query", bo_size, false); if (!q->bo) return false; @@ -297,8 +298,9 @@ draw_vbo(struct ilo_context *ilo, const struct ilo_state_vector *vec) bool success = true; int max_len, before_space; - /* on GEN7+, we need SOL_RESET to reset the SO write offsets */ + /* on Gen7 and Gen7.5, we need SOL_RESET to reset the SO write offsets */ if (ilo_dev_gen(ilo->dev) >= ILO_GEN(7) && + ilo_dev_gen(ilo->dev) <= ILO_GEN(7.5) && (vec->dirty & ILO_DIRTY_SO) && vec->so.enabled && !vec->so.append_bitmask) { ilo_cp_submit(ilo->cp, "SOL_RESET"); @@ -321,12 +323,9 @@ draw_vbo(struct ilo_context *ilo, const struct ilo_state_vector *vec) ilo_draw_set_owner(ilo); /* make sure there is enough room first */ - max_len = ilo_3d_pipeline_estimate_size(ilo->pipeline, - ILO_3D_PIPELINE_DRAW, vec); - if (need_flush) { - max_len += ilo_3d_pipeline_estimate_size(ilo->pipeline, - ILO_3D_PIPELINE_FLUSH, NULL); - } + max_len = ilo_render_get_draw_len(ilo->render, vec); + if (need_flush) + max_len += ilo_render_get_flush_len(ilo->render); if (max_len > ilo_cp_space(ilo->cp)) { ilo_cp_submit(ilo->cp, "out of space"); @@ -338,14 +337,14 @@ draw_vbo(struct ilo_context *ilo, const struct ilo_state_vector *vec) before_space = ilo_cp_space(ilo->cp); if (need_flush) - ilo_3d_pipeline_emit_flush(ilo->pipeline); + ilo_render_emit_flush(ilo->render); while (true) { struct ilo_builder_snapshot snapshot; ilo_builder_batch_snapshot(&ilo->cp->builder, &snapshot); - ilo_3d_pipeline_emit_draw(ilo->pipeline, vec); + ilo_render_emit_draw(ilo->render, vec); if (!ilo_builder_validate(&ilo->cp->builder, 0, NULL)) { ilo_builder_batch_restore(&ilo->cp->builder, &snapshot); @@ -362,8 +361,6 @@ draw_vbo(struct ilo_context *ilo, const struct ilo_state_vector *vec) break; } - ilo->pipeline->invalidate_flags = 0x0; - /* sanity check size estimation */ assert(before_space - ilo_cp_space(ilo->cp) <= max_len); @@ -380,10 +377,8 @@ ilo_draw_rectlist(struct ilo_context *ilo) ilo_draw_set_owner(ilo); - max_len = ilo_3d_pipeline_estimate_size(ilo->pipeline, - ILO_3D_PIPELINE_RECTLIST, ilo->blitter); - max_len += ilo_3d_pipeline_estimate_size(ilo->pipeline, - ILO_3D_PIPELINE_FLUSH, NULL) * 2; + max_len = ilo_render_get_rectlist_len(ilo->render, ilo->blitter); + max_len += ilo_render_get_flush_len(ilo->render) * 2; if (max_len > ilo_cp_space(ilo->cp)) { ilo_cp_submit(ilo->cp, "out of space"); @@ -416,14 +411,14 @@ ilo_draw_rectlist(struct ilo_context *ilo) * Skip checking blitter->op and do the flushes. */ if (need_flush) - ilo_3d_pipeline_emit_flush(ilo->pipeline); + ilo_render_emit_flush(ilo->render); while (true) { struct ilo_builder_snapshot snapshot; ilo_builder_batch_snapshot(&ilo->cp->builder, &snapshot); - ilo_3d_pipeline_emit_rectlist(ilo->pipeline, ilo->blitter); + ilo_render_emit_rectlist(ilo->render, ilo->blitter); if (!ilo_builder_validate(&ilo->cp->builder, 0, NULL)) { ilo_builder_batch_restore(&ilo->cp->builder, &snapshot); @@ -438,9 +433,9 @@ ilo_draw_rectlist(struct ilo_context *ilo) break; } - ilo_3d_pipeline_invalidate(ilo->pipeline, ILO_3D_PIPELINE_INVALIDATE_HW); + ilo_render_invalidate_hw(ilo->render); - ilo_3d_pipeline_emit_flush(ilo->pipeline); + ilo_render_emit_flush(ilo->render); /* sanity check size estimation */ assert(before_space - ilo_cp_space(ilo->cp) <= max_len); @@ -451,6 +446,7 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo, const struct pipe_draw_info *info) { const struct ilo_ib_state *ib = &ilo->state_vector.ib; + const struct ilo_vma *vma; union { const void *ptr; const uint8_t *u8; @@ -459,12 +455,14 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo, } u; /* we will draw with IB mapped */ - if (ib->buffer) { - u.ptr = intel_bo_map(ilo_buffer(ib->buffer)->bo, false); + if (ib->state.buffer) { + vma = ilo_resource_get_vma(ib->state.buffer); + u.ptr = intel_bo_map(vma->bo, false); if (u.ptr) - u.u8 += ib->offset; + u.u8 += vma->bo_offset + ib->state.offset; } else { - u.ptr = ib->user_buffer; + vma = NULL; + u.ptr = ib->state.user_buffer; } if (!u.ptr) @@ -490,7 +488,7 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo, (pipe)->draw_vbo(pipe, &subinfo); \ } while (0) - switch (ib->index_size) { + switch (ib->state.index_size) { case 1: DRAW_VBO_WITH_SW_RESTART(&ilo->base, info, u.u8); break; @@ -507,8 +505,8 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo, #undef DRAW_VBO_WITH_SW_RESTART - if (ib->buffer) - intel_bo_unmap(ilo_buffer(ib->buffer)->bo); + if (vma) + intel_bo_unmap(vma->bo); } static bool @@ -518,9 +516,9 @@ draw_vbo_need_sw_restart(const struct ilo_context *ilo, /* the restart index is fixed prior to GEN7.5 */ if (ilo_dev_gen(ilo->dev) < ILO_GEN(7.5)) { const unsigned cut_index = - (ilo->state_vector.ib.index_size == 1) ? 0xff : - (ilo->state_vector.ib.index_size == 2) ? 0xffff : - (ilo->state_vector.ib.index_size == 4) ? 0xffffffff : 0; + (ilo->state_vector.ib.state.index_size == 1) ? 0xff : + (ilo->state_vector.ib.state.index_size == 2) ? 0xffff : + (ilo->state_vector.ib.state.index_size == 4) ? 0xffffffff : 0; if (info->restart_index < cut_index) return true; @@ -551,6 +549,7 @@ static void ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) { struct ilo_context *ilo = ilo_context(pipe); + int vs_scratch_size, gs_scratch_size, fs_scratch_size; if (ilo_debug & ILO_DEBUG_DRAW) { if (info->indexed) { @@ -578,8 +577,15 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) ilo_finalize_3d_states(ilo, info); + /* upload kernels */ ilo_shader_cache_upload(ilo->shader_cache, &ilo->cp->builder); + /* prepare scratch spaces */ + ilo_shader_cache_get_max_scratch_sizes(ilo->shader_cache, + &vs_scratch_size, &gs_scratch_size, &fs_scratch_size); + ilo_render_prepare_scratch_spaces(ilo->render, + vs_scratch_size, gs_scratch_size, fs_scratch_size); + ilo_blit_resolve_framebuffer(ilo); /* If draw_vbo ever fails, return immediately. */ @@ -593,7 +599,7 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) ilo->state_vector.draw = NULL; if (ilo_debug & ILO_DEBUG_NOCACHE) - ilo_3d_pipeline_emit_flush(ilo->pipeline); + ilo_render_emit_flush(ilo->render); } static void @@ -604,7 +610,7 @@ ilo_texture_barrier(struct pipe_context *pipe) if (ilo->cp->ring != INTEL_RING_RENDER) return; - ilo_3d_pipeline_emit_flush(ilo->pipeline); + ilo_render_emit_flush(ilo->render); /* don't know why */ if (ilo_dev_gen(ilo->dev) >= ILO_GEN(7)) @@ -619,7 +625,7 @@ ilo_get_sample_position(struct pipe_context *pipe, { struct ilo_context *ilo = ilo_context(pipe); - ilo_3d_pipeline_get_sample_position(ilo->pipeline, + ilo_render_get_sample_position(ilo->render, sample_count, sample_index, &out_value[0], &out_value[1]); }