X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fvulkan%2FgenX_blorp_exec.c;h=239bfb474330579772a93b117be634eefdf2100c;hb=c9bebae2877e55cdcd94f9f9f3f6805238caeb28;hp=f041fc71b55393b5da4fb7826bc2a4fbaa9c48df;hpb=3e50607a40541de81ef008ee187c26dd03cd6c9e;p=mesa.git diff --git a/src/intel/vulkan/genX_blorp_exec.c b/src/intel/vulkan/genX_blorp_exec.c index f041fc71b55..239bfb47433 100644 --- a/src/intel/vulkan/genX_blorp_exec.c +++ b/src/intel/vulkan/genX_blorp_exec.c @@ -62,7 +62,33 @@ blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset, ss_offset, address.buffer, address.offset + delta); if (result != VK_SUCCESS) anv_batch_set_error(&cmd_buffer->batch, result); + + void *dest = anv_block_pool_map( + &cmd_buffer->device->surface_state_pool.block_pool, ss_offset); + uint64_t val = ((struct anv_bo*)address.buffer)->offset + address.offset + + delta; + write_reloc(cmd_buffer->device, dest, val, false); +} + +static uint64_t +blorp_get_surface_address(struct blorp_batch *blorp_batch, + struct blorp_address address) +{ + /* We'll let blorp_surface_reloc write the address. */ + return 0ull; +} + +#if GEN_GEN >= 7 && GEN_GEN < 10 +static struct blorp_address +blorp_get_surface_base_address(struct blorp_batch *batch) +{ + struct anv_cmd_buffer *cmd_buffer = batch->driver_batch; + return (struct blorp_address) { + .buffer = cmd_buffer->device->surface_state_pool.block_pool.bo, + .offset = 0, + }; } +#endif static void * blorp_alloc_dynamic_state(struct blorp_batch *batch, @@ -106,8 +132,6 @@ blorp_alloc_binding_table(struct blorp_batch *batch, unsigned num_entries, surface_offsets[i] = surface_state.offset; surface_maps[i] = surface_state.map; } - - anv_state_flush(cmd_buffer->device, bt_state); } static void * @@ -132,13 +156,24 @@ blorp_alloc_vertex_buffer(struct blorp_batch *batch, uint32_t size, anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, size, 64); *addr = (struct blorp_address) { - .buffer = &cmd_buffer->device->dynamic_state_pool.block_pool.bo, + .buffer = cmd_buffer->device->dynamic_state_pool.block_pool.bo, .offset = vb_state.offset, + .mocs = cmd_buffer->device->default_mocs, }; return vb_state.map; } +static void +blorp_vf_invalidate_for_vb_48b_transitions(struct blorp_batch *batch, + const struct blorp_address *addrs, + unsigned num_vbs) +{ + /* anv forces all vertex buffers into the low 4GB so there are never any + * transitions that require a VF invalidation. + */ +} + #if GEN_GEN >= 8 static struct blorp_address blorp_get_workaround_page(struct blorp_batch *batch) @@ -154,9 +189,8 @@ blorp_get_workaround_page(struct blorp_batch *batch) static void blorp_flush_range(struct blorp_batch *batch, void *start, size_t size) { - struct anv_device *device = batch->blorp->driver_ctx; - if (!device->info.has_llc) - gen_flush_range(start, size); + /* We don't need to flush states anymore, since everything will be snooped. + */ } static void @@ -189,6 +223,34 @@ genX(blorp_exec)(struct blorp_batch *batch, genX(cmd_buffer_config_l3)(cmd_buffer, cfg); } + const unsigned scale = params->fast_clear_op ? UINT_MAX : 1; + genX(cmd_buffer_emit_hashing_mode)(cmd_buffer, params->x1 - params->x0, + params->y1 - params->y0, scale); + +#if GEN_GEN >= 11 + /* The PIPE_CONTROL command description says: + * + * "Whenever a Binding Table Index (BTI) used by a Render Taget Message + * points to a different RENDER_SURFACE_STATE, SW must issue a Render + * Target Cache Flush by enabling this bit. When render target flush + * is set due to new association of BTI, PS Scoreboard Stall bit must + * be set in this packet." + */ + cmd_buffer->state.pending_pipe_bits |= + ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | + ANV_PIPE_STALL_AT_SCOREBOARD_BIT; +#endif + +#if GEN_GEN == 7 + /* The MI_LOAD/STORE_REGISTER_MEM commands which BLORP uses to implement + * indirect fast-clear colors can cause GPU hangs if we don't stall first. + * See genX(cmd_buffer_mi_memcpy) for more details. + */ + if (params->src.clear_color_addr.buffer || + params->dst.clear_color_addr.buffer) + cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_CS_STALL_BIT; +#endif + genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer); genX(flush_pipeline_select_3d)(cmd_buffer); @@ -200,14 +262,9 @@ genX(blorp_exec)(struct blorp_batch *batch, */ genX(cmd_buffer_enable_pma_fix)(cmd_buffer, false); - /* Disable VF statistics */ - blorp_emit(batch, GENX(3DSTATE_VF_STATISTICS), vf) { - vf.StatisticsEnable = false; - } - blorp_exec(batch, params); - cmd_buffer->state.vb_dirty = ~0; - cmd_buffer->state.dirty = ~0; + cmd_buffer->state.gfx.vb_dirty = ~0; + cmd_buffer->state.gfx.dirty = ~0; cmd_buffer->state.push_constants_dirty = ~0; }