From: Boris Brezillon Date: Sun, 18 Oct 2020 08:13:18 +0000 (+0200) Subject: panfrost: Rename panfrost_transfer to panfrost_ptr X-Git-Tag: upstream/21.0.0~3382 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b3b289c5c1e996bdb3640dfcfaa516e16da7d0d;p=platform%2Fupstream%2Fmesa.git panfrost: Rename panfrost_transfer to panfrost_ptr And use it in panfrost_bo to store a GPU/CPU pointer tuple. Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/gallium/drivers/panfrost/pan_assemble.c b/src/gallium/drivers/panfrost/pan_assemble.c index 6b04663..c951ad7 100644 --- a/src/gallium/drivers/panfrost/pan_assemble.c +++ b/src/gallium/drivers/panfrost/pan_assemble.c @@ -262,8 +262,8 @@ panfrost_shader_compile(struct panfrost_context *ctx, if (size) { state->bo = panfrost_bo_create(dev, size, PAN_BO_EXECUTE); - memcpy(state->bo->cpu, program->compiled.data, size); - shader = state->bo->gpu; + memcpy(state->bo->ptr.cpu, program->compiled.data, size); + shader = state->bo->ptr.gpu; } /* Midgard needs the first tag on the bottom nibble */ @@ -305,7 +305,7 @@ panfrost_shader_compile(struct panfrost_context *ctx, if (!program->blend_ret_offsets[i]) continue; - state->blend_ret_addrs[i] = (state->bo->gpu & UINT32_MAX) + + state->blend_ret_addrs[i] = (state->bo->ptr.gpu & UINT32_MAX) + program->blend_ret_offsets[i]; assert(!(state->blend_ret_addrs[i] & 0x7)); } diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c index 15308d2..370fe9f 100644 --- a/src/gallium/drivers/panfrost/pan_blend_cso.c +++ b/src/gallium/drivers/panfrost/pan_blend_cso.c @@ -272,14 +272,14 @@ panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti, struc /* Size check */ assert((*shader_offset + shader->size) < 4096); - memcpy((*bo)->cpu + *shader_offset, shader->buffer, shader->size); + memcpy((*bo)->ptr.cpu + *shader_offset, shader->buffer, shader->size); struct panfrost_blend_final final = { .is_shader = true, .shader = { .work_count = shader->work_count, .first_tag = shader->first_tag, - .gpu = (*bo)->gpu + *shader_offset, + .gpu = (*bo)->ptr.gpu + *shader_offset, }, .load_dest = rt->load_dest, }; diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 49f1c2c..05298f7 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -57,7 +57,7 @@ panfrost_vt_emit_shared_memory(struct panfrost_batch *batch) { struct panfrost_device *dev = pan_device(batch->ctx->base.screen); - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, MALI_LOCAL_STORAGE_LENGTH, 64); @@ -71,7 +71,7 @@ panfrost_vt_emit_shared_memory(struct panfrost_batch *batch) dev->core_count); ls.tls_size = panfrost_get_stack_shift(batch->stack_size); - ls.tls_base_pointer = stack->gpu; + ls.tls_base_pointer = stack->ptr.gpu; } } @@ -107,7 +107,7 @@ panfrost_get_index_buffer_bounded(struct panfrost_context *ctx, PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_READ | PAN_BO_ACCESS_VERTEX_TILER); - out = rsrc->bo->gpu + offset; + out = rsrc->bo->ptr.gpu + offset; /* Check the cache */ needs_indices = !panfrost_minmax_cache_get(rsrc->index_cache, @@ -118,7 +118,7 @@ panfrost_get_index_buffer_bounded(struct panfrost_context *ctx, } else { /* Otherwise, we need to upload to transient memory */ const uint8_t *ibuf8 = (const uint8_t *) info->index.user; - struct panfrost_transfer T = + struct panfrost_ptr T = panfrost_pool_alloc_aligned(&batch->pool, info->count * info->index_size, info->index_size); @@ -295,7 +295,7 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch, * TODO: Ensure that's always the case. */ assert((blend[i].shader.gpu & (0xffffffffull << 32)) == - (fs->bo->gpu & (0xffffffffull << 32))); + (fs->bo->ptr.gpu & (0xffffffffull << 32))); cfg.bifrost.internal.shader.pc = (u32)blend[i].shader.gpu; assert(!(fs->blend_ret_addrs[i] & 0x7)); cfg.bifrost.internal.shader.return_value = fs->blend_ret_addrs[i]; @@ -578,7 +578,7 @@ panfrost_emit_compute_shader_meta(struct panfrost_batch *batch, enum pipe_shader PAN_BO_ACCESS_READ | PAN_BO_ACCESS_VERTEX_TILER); - return pan_resource(ss->upload.rsrc)->bo->gpu + ss->upload.offset; + return pan_resource(ss->upload.rsrc)->bo->ptr.gpu + ss->upload.offset; } mali_ptr @@ -595,7 +595,7 @@ panfrost_emit_frag_shader_meta(struct panfrost_batch *batch) struct panfrost_device *dev = pan_device(ctx->base.screen); unsigned rt_count = MAX2(ctx->pipe_framebuffer.nr_cbufs, 1); - struct panfrost_transfer xfer; + struct panfrost_ptr xfer; unsigned rt_size; if (dev->quirks & MIDGARD_SFBD) @@ -661,7 +661,7 @@ panfrost_emit_viewport(struct panfrost_batch *batch) if (maxx == 0 || maxy == 0) maxx = maxy = minx = miny = 1; - struct panfrost_transfer T = panfrost_pool_alloc(&batch->pool, MALI_VIEWPORT_LENGTH); + struct panfrost_ptr T = panfrost_pool_alloc(&batch->pool, MALI_VIEWPORT_LENGTH); pan_pack(T.cpu, VIEWPORT, cfg) { /* [minx, maxx) and [miny, maxy) are exclusive ranges, but @@ -696,7 +696,7 @@ panfrost_map_constant_buffer_gpu(struct panfrost_batch *batch, /* Alignment gauranteed by * PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT */ - return rsrc->bo->gpu + cb->buffer_offset; + return rsrc->bo->ptr.gpu + cb->buffer_offset; } else if (cb->user_buffer) { return panfrost_pool_upload_aligned(&batch->pool, cb->user_buffer + @@ -785,7 +785,7 @@ panfrost_upload_ssbo_sysval(struct panfrost_batch *batch, panfrost_bo_access_for_stage(st)); /* Upload address and size as sysval */ - uniform->du[0] = bo->gpu + sb.buffer_offset; + uniform->du[0] = bo->ptr.gpu + sb.buffer_offset; uniform->u[2] = sb.buffer_size; } @@ -874,7 +874,7 @@ panfrost_map_constant_buffer_cpu(struct panfrost_constant_buffer *buf, struct panfrost_resource *rsrc = pan_resource(cb->buffer); if (rsrc) - return rsrc->bo->cpu; + return rsrc->bo->ptr.cpu; else if (cb->user_buffer) return cb->user_buffer; else @@ -903,7 +903,7 @@ panfrost_emit_const_buf(struct panfrost_batch *batch, size_t sys_size = sizeof(float) * 4 * ss->sysval_count; size_t uniform_size = has_uniforms ? (buf->cb[0].buffer_size) : 0; size_t size = sys_size + uniform_size; - struct panfrost_transfer transfer = + struct panfrost_ptr transfer = panfrost_pool_alloc_aligned(&batch->pool, size, 16); /* Upload sysvals requested by the shader */ @@ -922,7 +922,7 @@ panfrost_emit_const_buf(struct panfrost_batch *batch, unsigned ubo_count = 32 - __builtin_clz(buf->enabled_mask | 1); size_t sz = MALI_UNIFORM_BUFFER_LENGTH * ubo_count; - struct panfrost_transfer ubos = + struct panfrost_ptr ubos = panfrost_pool_alloc_aligned(&batch->pool, sz, MALI_UNIFORM_BUFFER_LENGTH); @@ -988,13 +988,13 @@ panfrost_emit_shared_memory(struct panfrost_batch *batch, struct panfrost_bo *bo = panfrost_batch_get_shared_memory(batch, shared_size, 1); - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, MALI_LOCAL_STORAGE_LENGTH, 64); pan_pack(t.cpu, LOCAL_STORAGE, ls) { - ls.wls_base_pointer = bo->gpu; + ls.wls_base_pointer = bo->ptr.gpu; ls.wls_instances = log2_instances; ls.wls_size_scale = util_logbase2(single_size) + 1; }; @@ -1023,7 +1023,7 @@ panfrost_get_tex_desc(struct panfrost_batch *batch, PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_READ | panfrost_bo_access_for_stage(st)); - return view->bo->gpu; + return view->bo->ptr.gpu; } static void @@ -1031,7 +1031,7 @@ panfrost_update_sampler_view(struct panfrost_sampler_view *view, struct pipe_context *pctx) { struct panfrost_resource *rsrc = pan_resource(view->base.texture); - if (view->texture_bo != rsrc->bo->gpu || + if (view->texture_bo != rsrc->bo->ptr.gpu || view->modifier != rsrc->modifier) { panfrost_bo_unreference(view->bo); panfrost_create_sampler_view_bo(view, pctx, &rsrc->base); @@ -1049,7 +1049,7 @@ panfrost_emit_texture_descriptors(struct panfrost_batch *batch, return 0; if (device->quirks & IS_BIFROST) { - struct panfrost_transfer T = panfrost_pool_alloc_aligned(&batch->pool, + struct panfrost_ptr T = panfrost_pool_alloc_aligned(&batch->pool, MALI_BIFROST_TEXTURE_LENGTH * ctx->sampler_view_count[stage], MALI_BIFROST_TEXTURE_LENGTH); @@ -1108,7 +1108,7 @@ panfrost_emit_sampler_descriptors(struct panfrost_batch *batch, assert(MALI_BIFROST_SAMPLER_LENGTH == MALI_MIDGARD_SAMPLER_LENGTH); size_t sz = desc_size * ctx->sampler_count[stage]; - struct panfrost_transfer T = panfrost_pool_alloc_aligned(&batch->pool, sz, desc_size); + struct panfrost_ptr T = panfrost_pool_alloc_aligned(&batch->pool, sz, desc_size); struct mali_midgard_sampler_packed *out = (struct mali_midgard_sampler_packed *) T.cpu; for (unsigned i = 0; i < ctx->sampler_count[stage]; ++i) @@ -1127,12 +1127,12 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch, /* Worst case: everything is NPOT, which is only possible if instancing * is enabled. Otherwise single record is gauranteed */ - struct panfrost_transfer S = panfrost_pool_alloc_aligned(&batch->pool, + struct panfrost_ptr S = panfrost_pool_alloc_aligned(&batch->pool, MALI_ATTRIBUTE_BUFFER_LENGTH * vs->attribute_count * (ctx->instance_count > 1 ? 2 : 1), MALI_ATTRIBUTE_BUFFER_LENGTH * 2); - struct panfrost_transfer T = panfrost_pool_alloc_aligned(&batch->pool, + struct panfrost_ptr T = panfrost_pool_alloc_aligned(&batch->pool, MALI_ATTRIBUTE_LENGTH * vs->attribute_count, MALI_ATTRIBUTE_LENGTH); @@ -1172,7 +1172,7 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch, PAN_BO_ACCESS_VERTEX_TILER); /* Mask off lower bits, see offset fixup below */ - mali_ptr raw_addr = rsrc->bo->gpu + buf->buffer_offset; + mali_ptr raw_addr = rsrc->bo->ptr.gpu + buf->buffer_offset; mali_ptr addr = raw_addr & ~63; /* Since we advanced the base pointer, we shrink the buffer @@ -1343,7 +1343,7 @@ panfrost_emit_streamout(struct panfrost_batch *batch, PAN_BO_ACCESS_FRAGMENT); /* We will have an offset applied to get alignment */ - mali_ptr addr = bo->gpu + target->buffer_offset + (pan_so_target(target)->offset * stride); + mali_ptr addr = bo->ptr.gpu + target->buffer_offset + (pan_so_target(target)->offset * stride); pan_pack(slot, ATTRIBUTE_BUFFER, cfg) { cfg.pointer = (addr & ~63); @@ -1730,7 +1730,7 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, vs_size = MALI_ATTRIBUTE_LENGTH * vs->varying_count; fs_size = MALI_ATTRIBUTE_LENGTH * fs->varying_count; - struct panfrost_transfer trans = panfrost_pool_alloc_aligned( + struct panfrost_ptr trans = panfrost_pool_alloc_aligned( &batch->pool, vs_size + fs_size, MALI_ATTRIBUTE_LENGTH); struct pipe_stream_output_info *so = &vs->stream_output; @@ -1777,7 +1777,7 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, } unsigned xfb_base = pan_xfb_base(present); - struct panfrost_transfer T = panfrost_pool_alloc_aligned(&batch->pool, + struct panfrost_ptr T = panfrost_pool_alloc_aligned(&batch->pool, MALI_ATTRIBUTE_BUFFER_LENGTH * (xfb_base + ctx->streamout.num_targets), MALI_ATTRIBUTE_BUFFER_LENGTH * 2); struct mali_attribute_buffer_packed *varyings = @@ -1821,8 +1821,8 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, - const struct panfrost_transfer *vertex_job, - const struct panfrost_transfer *tiler_job) + const struct panfrost_ptr *vertex_job, + const struct panfrost_ptr *tiler_job) { struct panfrost_context *ctx = batch->ctx; bool wallpapering = ctx->wallpaper_batch && batch->scoreboard.tiler_dep; diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.h b/src/gallium/drivers/panfrost/pan_cmdstream.h index 20abf61..6ed36bd 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.h +++ b/src/gallium/drivers/panfrost/pan_cmdstream.h @@ -84,8 +84,8 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, - const struct panfrost_transfer *vertex_job, - const struct panfrost_transfer *tiler_job); + const struct panfrost_ptr *vertex_job, + const struct panfrost_ptr *tiler_job); mali_ptr panfrost_emit_sample_locations(struct panfrost_batch *batch); diff --git a/src/gallium/drivers/panfrost/pan_compute.c b/src/gallium/drivers/panfrost/pan_compute.c index 3b5e633..e1044cc 100644 --- a/src/gallium/drivers/panfrost/pan_compute.c +++ b/src/gallium/drivers/panfrost/pan_compute.c @@ -104,7 +104,7 @@ panfrost_launch_grid(struct pipe_context *pipe, ctx->compute_grid = info; /* TODO: Stub */ - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, MALI_COMPUTE_JOB_LENGTH, 64); diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 9d0b6c4..6f5742f 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -88,8 +88,8 @@ panfrost_emit_midg_tiler(struct panfrost_batch *batch, header_size + t.polygon_list_size); - t.heap_start = device->tiler_heap->gpu; - t.heap_end = device->tiler_heap->gpu + + t.heap_start = device->tiler_heap->ptr.gpu; + t.heap_end = device->tiler_heap->ptr.gpu + device->tiler_heap->size; } else { struct panfrost_bo *tiler_dummy; @@ -98,11 +98,11 @@ panfrost_emit_midg_tiler(struct panfrost_batch *batch, header_size = MALI_MIDGARD_TILER_MINIMUM_HEADER_SIZE; /* The tiler is disabled, so don't allow the tiler heap */ - t.heap_start = tiler_dummy->gpu; + t.heap_start = tiler_dummy->ptr.gpu; t.heap_end = t.heap_start; /* Use a dummy polygon list */ - t.polygon_list = tiler_dummy->gpu; + t.polygon_list = tiler_dummy->ptr.gpu; /* Disable the tiler */ if (hierarchy) @@ -112,7 +112,7 @@ panfrost_emit_midg_tiler(struct panfrost_batch *batch, t.polygon_list_size = MALI_MIDGARD_TILER_MINIMUM_HEADER_SIZE + 4; /* We don't have a WRITE_VALUE job, so write the polygon list manually */ - uint32_t *polygon_list_body = (uint32_t *) (tiler_dummy->cpu + header_size); + uint32_t *polygon_list_body = (uint32_t *) (tiler_dummy->ptr.cpu + header_size); polygon_list_body[0] = 0xa0000000; /* TODO: Just that? */ } } @@ -406,7 +406,7 @@ panfrost_draw_emit_tiler(struct panfrost_batch *batch, cfg.occlusion_query = MALI_OCCLUSION_MODE_COUNTER; else cfg.occlusion_query = MALI_OCCLUSION_MODE_PREDICATE; - cfg.occlusion = ctx->occlusion_query->bo->gpu; + cfg.occlusion = ctx->occlusion_query->bo->ptr.gpu; panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo, PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_RW | @@ -470,13 +470,13 @@ panfrost_draw_vbo( ctx->active_prim = info->mode; bool is_bifrost = device->quirks & IS_BIFROST; - struct panfrost_transfer tiler = + struct panfrost_ptr tiler = panfrost_pool_alloc_aligned(&batch->pool, is_bifrost ? MALI_BIFROST_TILER_JOB_LENGTH : MALI_MIDGARD_TILER_JOB_LENGTH, 64); - struct panfrost_transfer vertex = + struct panfrost_ptr vertex = panfrost_pool_alloc_aligned(&batch->pool, MALI_COMPUTE_JOB_LENGTH, 64); @@ -980,7 +980,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so, desc = util_format_description(format); } - so->texture_bo = prsrc->bo->gpu; + so->texture_bo = prsrc->bo->ptr.gpu; so->modifier = prsrc->modifier; unsigned char user_swizzle[4] = { @@ -1044,7 +1044,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so, texture->nr_samples, prsrc->cubemap_stride, panfrost_translate_swizzle_4(composed_swizzle), - prsrc->bo->gpu, + prsrc->bo->ptr.gpu, prsrc->slices, so->bo); } else { @@ -1060,7 +1060,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so, so->bo = panfrost_bo_create(device, size, 0); panfrost_new_texture( - so->bo->cpu, + so->bo->ptr.cpu, texture->width0, texture->height0, depth, array_size, format, @@ -1072,7 +1072,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so, texture->nr_samples, prsrc->cubemap_stride, panfrost_translate_swizzle_4(user_swizzle), - prsrc->bo->gpu, + prsrc->bo->ptr.gpu, prsrc->slices); } } @@ -1365,10 +1365,9 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q) } /* Default to 0 if nothing at all drawn. */ - memset(query->bo->cpu, 0, size); + memset(query->bo->ptr.cpu, 0, size); query->msaa = (ctx->pipe_framebuffer.samples > 1); - ctx->occlusion_query = query; break; } @@ -1432,7 +1431,7 @@ panfrost_get_query_result(struct pipe_context *pipe, panfrost_bo_wait(query->bo, INT64_MAX, false); /* Read back the query results */ - uint64_t *result = (uint64_t *) query->bo->cpu; + uint64_t *result = (uint64_t *) query->bo->ptr.cpu; if (query->type == PIPE_QUERY_OCCLUSION_COUNTER) { uint64_t passed = 0; diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 3e9a150..a452c4c 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -337,7 +337,7 @@ panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags); bool panfrost_writes_point_size(struct panfrost_context *ctx); -struct panfrost_transfer +struct panfrost_ptr panfrost_vertex_tiler_job(struct panfrost_context *ctx, bool is_tiler); void diff --git a/src/gallium/drivers/panfrost/pan_fragment.c b/src/gallium/drivers/panfrost/pan_fragment.c index ec19140..def9f5d 100644 --- a/src/gallium/drivers/panfrost/pan_fragment.c +++ b/src/gallium/drivers/panfrost/pan_fragment.c @@ -88,7 +88,7 @@ panfrost_fragment_job(struct panfrost_batch *batch, bool has_draws) assert(batch->maxx > batch->minx); assert(batch->maxy > batch->miny); - struct panfrost_transfer transfer = + struct panfrost_ptr transfer = panfrost_pool_alloc_aligned(&batch->pool, MALI_FRAGMENT_JOB_LENGTH, 64); diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index d91f31a..9ad6f57 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -632,7 +632,7 @@ panfrost_batch_get_polygon_list(struct panfrost_batch *batch, unsigned size) PAN_BO_ACCESS_FRAGMENT); } - return batch->polygon_list->gpu; + return batch->polygon_list->ptr.gpu; } struct panfrost_bo * @@ -687,14 +687,14 @@ panfrost_batch_get_bifrost_tiler(struct panfrost_batch *batch, unsigned vertex_c return batch->tiler_meta; struct panfrost_device *dev = pan_device(batch->ctx->base.screen); - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, MALI_BIFROST_TILER_HEAP_LENGTH, 64); pan_pack(t.cpu, BIFROST_TILER_HEAP, heap) { heap.size = dev->tiler_heap->size; - heap.base = dev->tiler_heap->gpu; - heap.bottom = dev->tiler_heap->gpu; - heap.top = dev->tiler_heap->gpu + dev->tiler_heap->size; + heap.base = dev->tiler_heap->ptr.gpu; + heap.bottom = dev->tiler_heap->ptr.gpu; + heap.top = dev->tiler_heap->ptr.gpu + dev->tiler_heap->size; } mali_ptr heap = t.gpu; @@ -864,13 +864,13 @@ panfrost_load_surface(struct panfrost_batch *batch, struct pipe_surface *surf, u PAN_BO_ACCESS_READ | PAN_BO_ACCESS_FRAGMENT); - memcpy(bo->cpu, b->buffer, b->size); + memcpy(bo->ptr.cpu, b->buffer, b->size); assert(b->work_count <= 4); - blend_shader = bo->gpu | b->first_tag; + blend_shader = bo->ptr.gpu | b->first_tag; } - struct panfrost_transfer transfer = panfrost_pool_alloc_aligned(&batch->pool, + struct panfrost_ptr transfer = panfrost_pool_alloc_aligned(&batch->pool, 4 * 4 * 6 * rsrc->damage.inverted_len, 64); for (unsigned i = 0; i < rsrc->damage.inverted_len; ++i) { diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h index 2a61980..69c30a4 100644 --- a/src/gallium/drivers/panfrost/pan_job.h +++ b/src/gallium/drivers/panfrost/pan_job.h @@ -119,7 +119,7 @@ struct panfrost_batch { struct panfrost_bo *tiler_dummy; /* Framebuffer descriptor. */ - struct panfrost_transfer framebuffer; + struct panfrost_ptr framebuffer; /* Bifrost tiler meta descriptor. */ mali_ptr tiler_meta; diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c index f535173..27b7896 100644 --- a/src/gallium/drivers/panfrost/pan_mfbd.c +++ b/src/gallium/drivers/panfrost/pan_mfbd.c @@ -331,9 +331,9 @@ panfrost_mfbd_zs_crc_ext_set_bufs(struct panfrost_batch *batch, ext->crc_row_stride = slice->checksum_stride; if (slice->checksum_bo) - ext->crc_base = slice->checksum_bo->gpu; + ext->crc_base = slice->checksum_bo->ptr.gpu; else - ext->crc_base = rsrc->bo->gpu + slice->checksum_offset; + ext->crc_base = rsrc->bo->ptr.gpu + slice->checksum_offset; if ((batch->clear & PIPE_CLEAR_COLOR0) && version >= 7) { ext->crc_clear_color = batch->clear_color[0][0] | @@ -513,7 +513,7 @@ panfrost_mfbd_emit_local_storage(struct panfrost_batch *batch, void *fb) dev->thread_tls_alloc, dev->core_count); ls.tls_size = shift; - ls.tls_base_pointer = bo->gpu; + ls.tls_base_pointer = bo->ptr.gpu; } ls.wls_instances = MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM; @@ -585,7 +585,7 @@ panfrost_mfbd_fragment(struct panfrost_batch *batch, bool has_draws) { struct panfrost_device *dev = pan_device(batch->ctx->base.screen); unsigned vertex_count = has_draws; - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, panfrost_mfbd_size(batch), 64); void *fb = t.cpu, *zs_crc_ext, *rts; diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index b9078c3..810ec67 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -769,7 +769,7 @@ pan_blit_to_staging(struct pipe_context *pctx, struct panfrost_gtransfer *trans) } static void * -panfrost_transfer_map(struct pipe_context *pctx, +panfrost_ptr_map(struct pipe_context *pctx, struct pipe_resource *resource, unsigned level, unsigned usage, /* a combination of PIPE_MAP_x */ @@ -821,14 +821,14 @@ panfrost_transfer_map(struct pipe_context *pctx, } panfrost_bo_mmap(staging->bo); - return staging->bo->cpu; + return staging->bo->ptr.cpu; } /* If we haven't already mmaped, now's the time */ panfrost_bo_mmap(bo); if (dev->debug & (PAN_DBG_TRACE | PAN_DBG_SYNC)) - pandecode_inject_mmap(bo->gpu, bo->cpu, bo->size, NULL); + pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL); bool create_new_bo = usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE; bool copy_resource = false; @@ -874,7 +874,7 @@ panfrost_transfer_map(struct pipe_context *pctx, if (newbo) { if (copy_resource) - memcpy(newbo->cpu, rsrc->bo->cpu, bo->size); + memcpy(newbo->ptr.cpu, rsrc->bo->ptr.cpu, bo->size); panfrost_bo_unreference(bo); rsrc->bo = newbo; @@ -910,7 +910,7 @@ panfrost_transfer_map(struct pipe_context *pctx, if ((usage & PIPE_MAP_READ) && rsrc->slices[level].initialized) { panfrost_load_tiled_image( transfer->map, - bo->cpu + rsrc->slices[level].offset, + bo->ptr.cpu + rsrc->slices[level].offset, box->x, box->y, box->width, box->height, transfer->base.stride, rsrc->slices[level].stride, @@ -943,7 +943,7 @@ panfrost_transfer_map(struct pipe_context *pctx, panfrost_minmax_cache_invalidate(rsrc->index_cache, &transfer->base); } - return bo->cpu + return bo->ptr.cpu + rsrc->slices[level].offset + transfer->base.box.z * transfer->base.layer_stride + transfer->base.box.y * rsrc->slices[level].stride @@ -979,7 +979,7 @@ panfrost_should_linear_convert(struct panfrost_resource *prsrc, } static void -panfrost_transfer_unmap(struct pipe_context *pctx, +panfrost_ptr_unmap(struct pipe_context *pctx, struct pipe_transfer *transfer) { /* Gallium expects writeback here, so we tile */ @@ -1028,7 +1028,7 @@ panfrost_transfer_unmap(struct pipe_context *pctx, prsrc->modifier = DRM_FORMAT_MOD_LINEAR; util_copy_rect( - bo->cpu + prsrc->slices[0].offset, + bo->ptr.cpu + prsrc->slices[0].offset, prsrc->base.format, prsrc->slices[0].stride, 0, 0, @@ -1039,7 +1039,7 @@ panfrost_transfer_unmap(struct pipe_context *pctx, 0, 0); } else { panfrost_store_tiled_image( - bo->cpu + prsrc->slices[transfer->level].offset, + bo->ptr.cpu + prsrc->slices[transfer->level].offset, trans->map, transfer->box.x, transfer->box.y, transfer->box.width, transfer->box.height, @@ -1066,7 +1066,7 @@ panfrost_transfer_unmap(struct pipe_context *pctx, } static void -panfrost_transfer_flush_region(struct pipe_context *pctx, +panfrost_ptr_flush_region(struct pipe_context *pctx, struct pipe_transfer *transfer, const struct pipe_box *box) { @@ -1134,7 +1134,10 @@ panfrost_get_texture_address( unsigned level, unsigned face, unsigned sample) { bool is_3d = rsrc->base.target == PIPE_TEXTURE_3D; - return rsrc->bo->gpu + panfrost_texture_offset(rsrc->slices, is_3d, rsrc->cubemap_stride, level, face, sample); + return rsrc->bo->ptr.gpu + + panfrost_texture_offset(rsrc->slices, is_3d, + rsrc->cubemap_stride, + level, face, sample); } static void @@ -1153,9 +1156,9 @@ panfrost_resource_get_stencil(struct pipe_resource *prsrc) static const struct u_transfer_vtbl transfer_vtbl = { .resource_create = panfrost_resource_create, .resource_destroy = panfrost_resource_destroy, - .transfer_map = panfrost_transfer_map, - .transfer_unmap = panfrost_transfer_unmap, - .transfer_flush_region = panfrost_transfer_flush_region, + .transfer_map = panfrost_ptr_map, + .transfer_unmap = panfrost_ptr_unmap, + .transfer_flush_region = panfrost_ptr_flush_region, .get_internal_format = panfrost_resource_get_internal_format, .set_stencil = panfrost_resource_set_stencil, .get_stencil = panfrost_resource_get_stencil, diff --git a/src/gallium/drivers/panfrost/pan_sfbd.c b/src/gallium/drivers/panfrost/pan_sfbd.c index 3bbfda3..d6d7547 100644 --- a/src/gallium/drivers/panfrost/pan_sfbd.c +++ b/src/gallium/drivers/panfrost/pan_sfbd.c @@ -155,7 +155,7 @@ panfrost_sfbd_set_zsbuf( unreachable("Invalid render modifier."); fb->zs_block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED; - fb->zs_writeback.base = rsrc->bo->gpu + rsrc->slices[level].offset; + fb->zs_writeback.base = rsrc->bo->ptr.gpu + rsrc->slices[level].offset; fb->zs_writeback.row_stride = rsrc->slices[level].stride * 16; switch (surf->format) { case PIPE_FORMAT_Z24_UNORM_S8_UINT: @@ -201,7 +201,7 @@ panfrost_emit_sfdb_local_storage(struct panfrost_batch *batch, void *sfbd, panfrost_batch_get_scratchpad(batch, shift, dev->thread_tls_alloc, - dev->core_count)->gpu; + dev->core_count)->ptr.gpu; } } @@ -236,7 +236,7 @@ panfrost_attach_sfbd(struct panfrost_batch *batch, unsigned vertex_count) mali_ptr panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws) { - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(&batch->pool, MALI_SINGLE_TARGET_FRAMEBUFFER_LENGTH, 64); @@ -261,7 +261,7 @@ panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws) struct panfrost_slice *slice = &rsrc->slices[level]; params.crc_buffer.row_stride = slice->checksum_stride; - params.crc_buffer.base = bo->gpu + slice->checksum_offset; + params.crc_buffer.base = bo->ptr.gpu + slice->checksum_offset; } } diff --git a/src/panfrost/bifrost/test/bi_submit.c b/src/panfrost/bifrost/test/bi_submit.c index 0c2ee93..647ee08 100644 --- a/src/panfrost/bifrost/test/bi_submit.c +++ b/src/panfrost/bifrost/test/bi_submit.c @@ -36,7 +36,7 @@ static struct panfrost_bo * bit_bo_create(struct panfrost_device *dev, size_t size) { struct panfrost_bo *bo = panfrost_bo_create(dev, size, PAN_BO_EXECUTE); - pandecode_inject_mmap(bo->gpu, bo->cpu, bo->size, NULL); + pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL); return bo; } @@ -64,11 +64,11 @@ bit_submit(struct panfrost_device *dev, struct panfrost_bo **bos, size_t bo_count, enum bit_debug debug) { struct panfrost_bo *job = bit_bo_create(dev, 4096); - pan_pack(job->cpu, JOB_HEADER, cfg) { + pan_pack(job->ptr.cpu, JOB_HEADER, cfg) { cfg.type = T; cfg.index = 1; } - memcpy(job->cpu + MALI_JOB_HEADER_LENGTH, payload, payload_size); + memcpy(job->ptr.cpu + MALI_JOB_HEADER_LENGTH, payload, payload_size); uint32_t *bo_handles = calloc(sizeof(uint32_t), bo_count); @@ -82,7 +82,7 @@ bit_submit(struct panfrost_device *dev, assert(!ret); struct drm_panfrost_submit submit = { - .jc = job->gpu, + .jc = job->ptr.gpu, .bo_handles = (uintptr_t) bo_handles, .bo_handle_count = bo_count, .out_sync = syncobj, @@ -106,12 +106,12 @@ bool bit_sanity_check(struct panfrost_device *dev) { struct panfrost_bo *scratch = bit_bo_create(dev, 65536); - ((uint32_t *) scratch->cpu)[0] = 0xAA; + ((uint32_t *) scratch->ptr.cpu)[0] = 0xAA; struct mali_write_value_job_payload_packed payload; pan_pack(&payload, WRITE_VALUE_JOB_PAYLOAD, cfg) { - cfg.address = scratch->gpu; + cfg.address = scratch->ptr.gpu; cfg.type = MALI_WRITE_VALUE_TYPE_ZERO; }; @@ -119,7 +119,7 @@ bit_sanity_check(struct panfrost_device *dev) bool success = bit_submit(dev, MALI_JOB_TYPE_WRITE_VALUE, &payload, sizeof(payload), bos, 1, false); - return success && (((uint8_t *) scratch->cpu)[0] == 0x0); + return success && (((uint8_t *) scratch->ptr.cpu)[0] == 0x0); } /* Constructs a vertex job */ @@ -136,45 +136,45 @@ bit_vertex(struct panfrost_device *dev, panfrost_program *prog, struct panfrost_bo *var = bit_bo_create(dev, 4096); struct panfrost_bo *attr = bit_bo_create(dev, 4096); - pan_pack(attr->cpu, ATTRIBUTE, cfg) { + pan_pack(attr->ptr.cpu, ATTRIBUTE, cfg) { cfg.format = (MALI_RGBA32UI << 12); cfg.offset_enable = true; } - pan_pack(var->cpu, ATTRIBUTE, cfg) { + pan_pack(var->ptr.cpu, ATTRIBUTE, cfg) { cfg.format = (MALI_RGBA32UI << 12); cfg.offset_enable = false; } - pan_pack(var->cpu + 256, ATTRIBUTE_BUFFER, cfg) { - cfg.pointer = (var->gpu + 1024); + pan_pack(var->ptr.cpu + 256, ATTRIBUTE_BUFFER, cfg) { + cfg.pointer = (var->ptr.gpu + 1024); cfg.size = 1024; } - pan_pack(attr->cpu + 256, ATTRIBUTE_BUFFER, cfg) { - cfg.pointer = (attr->gpu + 1024); + pan_pack(attr->ptr.cpu + 256, ATTRIBUTE_BUFFER, cfg) { + cfg.pointer = (attr->ptr.gpu + 1024); cfg.size = 1024; } - pan_pack(ubo->cpu, UNIFORM_BUFFER, cfg) { + pan_pack(ubo->ptr.cpu, UNIFORM_BUFFER, cfg) { cfg.entries = sz_ubo / 16; - cfg.pointer = ubo->gpu + 1024; + cfg.pointer = ubo->ptr.gpu + 1024; } if (sz_ubo) - memcpy(ubo->cpu + 1024, iubo, sz_ubo); + memcpy(ubo->ptr.cpu + 1024, iubo, sz_ubo); if (sz_attr) - memcpy(attr->cpu + 1024, iattr, sz_attr); + memcpy(attr->ptr.cpu + 1024, iattr, sz_attr); struct panfrost_bo *shmem = bit_bo_create(dev, 4096); - pan_pack(shmem->cpu, LOCAL_STORAGE, cfg) { + pan_pack(shmem->ptr.cpu, LOCAL_STORAGE, cfg) { cfg.wls_instances = MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM; } - pan_pack(shader_desc->cpu, RENDERER_STATE, cfg) { - cfg.shader.shader = shader->gpu; + pan_pack(shader_desc->ptr.cpu, RENDERER_STATE, cfg) { + cfg.shader.shader = shader->ptr.gpu; cfg.shader.attribute_count = cfg.shader.varying_count = 1; cfg.properties.uniform_buffer_count = 1; cfg.properties.bifrost.zs_update_operation = MALI_PIXEL_KILL_STRONG_EARLY; @@ -183,7 +183,7 @@ bit_vertex(struct panfrost_device *dev, panfrost_program *prog, cfg.preload.uniform_count = (sz_ubo / 16); } - memcpy(shader->cpu, prog->compiled.data, prog->compiled.size); + memcpy(shader->ptr.cpu, prog->compiled.data, prog->compiled.size); struct mali_compute_job_packed job; @@ -193,14 +193,14 @@ bit_vertex(struct panfrost_device *dev, panfrost_program *prog, pan_section_pack(&job, COMPUTE_JOB, DRAW, cfg) { cfg.draw_descriptor_is_64b = true; - cfg.thread_storage = shmem->gpu; - cfg.state = shader_desc->gpu; - cfg.push_uniforms = ubo->gpu + 1024; - cfg.uniform_buffers = ubo->gpu; - cfg.attributes = attr->gpu; - cfg.attribute_buffers = attr->gpu + 256; - cfg.varyings = var->gpu; - cfg.varying_buffers = var->gpu + 256; + cfg.thread_storage = shmem->ptr.gpu; + cfg.state = shader_desc->ptr.gpu; + cfg.push_uniforms = ubo->ptr.gpu + 1024; + cfg.uniform_buffers = ubo->ptr.gpu; + cfg.attributes = attr->ptr.gpu; + cfg.attribute_buffers = attr->ptr.gpu + 256; + cfg.varyings = var->ptr.gpu; + cfg.varying_buffers = var->ptr.gpu + 256; } void *invocation = pan_section_ptr(&job, COMPUTE_JOB, INVOCATION); @@ -220,7 +220,7 @@ bit_vertex(struct panfrost_device *dev, panfrost_program *prog, /* Check the output varyings */ - uint32_t *output = (uint32_t *) (var->cpu + 1024); + uint32_t *output = (uint32_t *) (var->ptr.cpu + 1024); float *foutput = (float *) output; float *fexpected = (float *) expected; diff --git a/src/panfrost/lib/pan_blit.c b/src/panfrost/lib/pan_blit.c index ba33043..5085c9d 100644 --- a/src/panfrost/lib/pan_blit.c +++ b/src/panfrost/lib/pan_blit.c @@ -178,9 +178,11 @@ panfrost_init_blit_shaders(struct panfrost_device *dev) nir_types[T], ms); assert(offset + program->compiled.size < total_size); - memcpy(dev->blit_shaders.bo->cpu + offset, program->compiled.data, program->compiled.size); + memcpy(dev->blit_shaders.bo->ptr.cpu + offset, + program->compiled.data, program->compiled.size); - shader->shader = (dev->blit_shaders.bo->gpu + offset) | program->first_tag; + shader->shader = (dev->blit_shaders.bo->ptr.gpu + offset) | + program->first_tag; int rt = loc - FRAG_RESULT_DATA0; if (rt >= 0 && rt < 8 && program->blend_ret_offsets[rt]) @@ -210,10 +212,10 @@ panfrost_load_midg( unsigned width = u_minify(image->width0, image->first_level); unsigned height = u_minify(image->height0, image->first_level); - struct panfrost_transfer viewport = panfrost_pool_alloc(pool, MALI_VIEWPORT_LENGTH); - struct panfrost_transfer sampler = panfrost_pool_alloc(pool, MALI_MIDGARD_SAMPLER_LENGTH); - struct panfrost_transfer varying = panfrost_pool_alloc(pool, MALI_ATTRIBUTE_LENGTH); - struct panfrost_transfer varying_buffer = panfrost_pool_alloc(pool, MALI_ATTRIBUTE_BUFFER_LENGTH); + struct panfrost_ptr viewport = panfrost_pool_alloc(pool, MALI_VIEWPORT_LENGTH); + struct panfrost_ptr sampler = panfrost_pool_alloc(pool, MALI_MIDGARD_SAMPLER_LENGTH); + struct panfrost_ptr varying = panfrost_pool_alloc(pool, MALI_ATTRIBUTE_LENGTH); + struct panfrost_ptr varying_buffer = panfrost_pool_alloc(pool, MALI_ATTRIBUTE_BUFFER_LENGTH); pan_pack(viewport.cpu, VIEWPORT, cfg) { cfg.scissor_maximum_x = width - 1; /* Inclusive */ @@ -242,7 +244,7 @@ panfrost_load_midg( bool ms = image->nr_samples > 1; - struct panfrost_transfer shader_meta_t = + struct panfrost_ptr shader_meta_t = panfrost_pool_alloc_aligned(pool, MALI_RENDERER_STATE_LENGTH + 8 * MALI_BLEND_LENGTH, @@ -312,7 +314,7 @@ panfrost_load_midg( * textures, removing the need to separately key the blit shaders for * 2D and 3D variants */ - struct panfrost_transfer texture_t = panfrost_pool_alloc_aligned( + struct panfrost_ptr texture_t = panfrost_pool_alloc_aligned( pool, MALI_MIDGARD_TEXTURE_LENGTH + sizeof(mali_ptr) * 2 * MAX2(image->nr_samples, 1), 128); panfrost_new_texture(texture_t.cpu, @@ -325,7 +327,7 @@ panfrost_load_midg( image->nr_samples, 0, (MALI_CHANNEL_R << 0) | (MALI_CHANNEL_G << 3) | (MALI_CHANNEL_B << 6) | (MALI_CHANNEL_A << 9), - image->bo->gpu + image->first_layer * + image->bo->ptr.gpu + image->first_layer * panfrost_get_layer_stride(image->slices, image->dim == MALI_TEXTURE_DIMENSION_3D, image->cubemap_stride, image->first_level), @@ -361,7 +363,7 @@ panfrost_load_midg( } } - struct panfrost_transfer t = + struct panfrost_ptr t = panfrost_pool_alloc_aligned(pool, MALI_MIDGARD_TILER_JOB_LENGTH, 64); pan_section_pack(t.cpu, MIDGARD_TILER_JOB, DRAW, cfg) { diff --git a/src/panfrost/lib/pan_bo.c b/src/panfrost/lib/pan_bo.c index 03a83c4..f64a787 100644 --- a/src/panfrost/lib/pan_bo.c +++ b/src/panfrost/lib/pan_bo.c @@ -80,7 +80,7 @@ panfrost_bo_alloc(struct panfrost_device *dev, size_t size, assert(!memcmp(bo, &((struct panfrost_bo){}), sizeof(*bo))); bo->size = create_bo.size; - bo->gpu = create_bo.offset; + bo->ptr.gpu = create_bo.offset; bo->gem_handle = create_bo.handle; bo->flags = flags; bo->dev = dev; @@ -322,7 +322,7 @@ panfrost_bo_mmap(struct panfrost_bo *bo) struct drm_panfrost_mmap_bo mmap_bo = { .handle = bo->gem_handle }; int ret; - if (bo->cpu) + if (bo->ptr.cpu) return; ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PANFROST_MMAP_BO, &mmap_bo); @@ -331,10 +331,10 @@ panfrost_bo_mmap(struct panfrost_bo *bo) assert(0); } - bo->cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, - bo->dev->fd, mmap_bo.offset); - if (bo->cpu == MAP_FAILED) { - fprintf(stderr, "mmap failed: %p %m\n", bo->cpu); + bo->ptr.cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, + bo->dev->fd, mmap_bo.offset); + if (bo->ptr.cpu == MAP_FAILED) { + fprintf(stderr, "mmap failed: %p %m\n", bo->ptr.cpu); assert(0); } } @@ -342,15 +342,15 @@ panfrost_bo_mmap(struct panfrost_bo *bo) static void panfrost_bo_munmap(struct panfrost_bo *bo) { - if (!bo->cpu) + if (!bo->ptr.cpu) return; - if (os_munmap((void *) (uintptr_t)bo->cpu, bo->size)) { + if (os_munmap((void *) (uintptr_t)bo->ptr.cpu, bo->size)) { perror("munmap"); abort(); } - bo->cpu = NULL; + bo->ptr.cpu = NULL; } struct panfrost_bo * @@ -398,9 +398,9 @@ panfrost_bo_create(struct panfrost_device *dev, size_t size, if (dev->debug & (PAN_DBG_TRACE | PAN_DBG_SYNC)) { if (flags & PAN_BO_INVISIBLE) - pandecode_inject_mmap(bo->gpu, NULL, bo->size, NULL); + pandecode_inject_mmap(bo->ptr.gpu, NULL, bo->size, NULL); else if (!(flags & PAN_BO_DELAY_MMAP)) - pandecode_inject_mmap(bo->gpu, bo->cpu, bo->size, NULL); + pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL); } return bo; @@ -466,7 +466,7 @@ panfrost_bo_import(struct panfrost_device *dev, int fd) assert(!ret); bo->dev = dev; - bo->gpu = (mali_ptr) get_bo_offset.offset; + bo->ptr.gpu = (mali_ptr) get_bo_offset.offset; bo->size = lseek(fd, 0, SEEK_END); bo->flags = PAN_BO_SHARED; bo->gem_handle = gem_handle; @@ -489,7 +489,7 @@ panfrost_bo_import(struct panfrost_device *dev, int fd) p_atomic_set(&bo->refcnt, 1); else panfrost_bo_reference(bo); - assert(bo->cpu); + assert(bo->ptr.cpu); } pthread_mutex_unlock(&dev->bo_map_lock); diff --git a/src/panfrost/lib/pan_bo.h b/src/panfrost/lib/pan_bo.h index 360b102..451e0e1 100644 --- a/src/panfrost/lib/pan_bo.h +++ b/src/panfrost/lib/pan_bo.h @@ -68,6 +68,14 @@ /* BO is accessed by the fragment job. */ #define PAN_BO_ACCESS_FRAGMENT (1 << 4) +struct panfrost_ptr { + /* CPU address */ + void *cpu; + + /* GPU address */ + mali_ptr gpu; +}; + struct panfrost_bo { /* Must be first for casting */ struct list_head bucket_link; @@ -86,10 +94,7 @@ struct panfrost_bo { struct panfrost_device *dev; /* Mapping for the entire object (all levels) */ - uint8_t *cpu; - - /* GPU address for the object */ - mali_ptr gpu; + struct panfrost_ptr ptr; /* Size of all entire trees */ size_t size; diff --git a/src/panfrost/lib/pan_pool.c b/src/panfrost/lib/pan_pool.c index bea6eea..6bd730b 100644 --- a/src/panfrost/lib/pan_pool.c +++ b/src/panfrost/lib/pan_pool.c @@ -91,7 +91,7 @@ panfrost_pool_get_bo_handles(struct pan_pool *pool, uint32_t *handles) } } -struct panfrost_transfer +struct panfrost_ptr panfrost_pool_alloc_aligned(struct pan_pool *pool, size_t sz, unsigned alignment) { assert(alignment == util_next_power_of_two(alignment)); @@ -109,9 +109,9 @@ panfrost_pool_alloc_aligned(struct pan_pool *pool, size_t sz, unsigned alignment pool->transient_offset = offset + sz; - struct panfrost_transfer ret = { - .cpu = bo->cpu + offset, - .gpu = bo->gpu + offset, + struct panfrost_ptr ret = { + .cpu = bo->ptr.cpu + offset, + .gpu = bo->ptr.gpu + offset, }; return ret; @@ -126,7 +126,7 @@ panfrost_pool_upload(struct pan_pool *pool, const void *data, size_t sz) mali_ptr panfrost_pool_upload_aligned(struct pan_pool *pool, const void *data, size_t sz, unsigned alignment) { - struct panfrost_transfer transfer = panfrost_pool_alloc_aligned(pool, sz, alignment); + struct panfrost_ptr transfer = panfrost_pool_alloc_aligned(pool, sz, alignment); memcpy(transfer.cpu, data, sz); return transfer.gpu; } diff --git a/src/panfrost/lib/pan_pool.h b/src/panfrost/lib/pan_pool.h index 1793bad..112dfd7 100644 --- a/src/panfrost/lib/pan_pool.h +++ b/src/panfrost/lib/pan_pool.h @@ -27,6 +27,7 @@ #include #include +#include "pan_bo.h" #include "util/u_dynarray.h" @@ -72,24 +73,19 @@ panfrost_pool_get_bo_handles(struct pan_pool *pool, uint32_t *handles); /* Represents a fat pointer for GPU-mapped memory, returned from the transient * allocator and not used for much else */ -struct panfrost_transfer { - uint8_t *cpu; - mali_ptr gpu; -}; - -struct panfrost_transfer +struct panfrost_ptr panfrost_pool_alloc_aligned(struct pan_pool *pool, size_t sz, unsigned alignment); /* Default to self-alignment */ -static inline struct panfrost_transfer +static inline struct panfrost_ptr panfrost_pool_alloc(struct pan_pool *pool, size_t sz) { assert(sz == util_next_power_of_two(sz)); return panfrost_pool_alloc_aligned(pool, sz, sz); } -struct panfrost_transfer +struct panfrost_ptr panfrost_pool_alloc(struct pan_pool *pool, size_t sz); mali_ptr diff --git a/src/panfrost/lib/pan_scoreboard.c b/src/panfrost/lib/pan_scoreboard.c index bbe12c2..27967fc 100644 --- a/src/panfrost/lib/pan_scoreboard.c +++ b/src/panfrost/lib/pan_scoreboard.c @@ -112,7 +112,7 @@ panfrost_add_job( enum mali_job_type type, bool barrier, unsigned local_dep, - const struct panfrost_transfer *job, + const struct panfrost_ptr *job, bool inject) { bool is_bifrost = !!(pool->dev->quirks & IS_BIFROST); @@ -203,7 +203,7 @@ panfrost_scoreboard_initialize_tiler(struct pan_pool *pool, /* Okay, we do. Let's generate it. We'll need the job's polygon list * regardless of size. */ - struct panfrost_transfer transfer = + struct panfrost_ptr transfer = panfrost_pool_alloc_aligned(pool, MALI_WRITE_VALUE_JOB_LENGTH, 64); diff --git a/src/panfrost/lib/pan_scoreboard.h b/src/panfrost/lib/pan_scoreboard.h index 27710aa..c79c6c8 100644 --- a/src/panfrost/lib/pan_scoreboard.h +++ b/src/panfrost/lib/pan_scoreboard.h @@ -61,7 +61,7 @@ panfrost_add_job( enum mali_job_type type, bool barrier, unsigned local_dep, - const struct panfrost_transfer *job, + const struct panfrost_ptr *job, bool inject); void panfrost_scoreboard_initialize_tiler( diff --git a/src/panfrost/lib/pan_texture.c b/src/panfrost/lib/pan_texture.c index c380293..cda1802 100644 --- a/src/panfrost/lib/pan_texture.c +++ b/src/panfrost/lib/pan_texture.c @@ -410,7 +410,7 @@ panfrost_new_texture_bifrost( assert(mali_format); panfrost_emit_texture_payload( - (mali_ptr *) payload->cpu, + payload->ptr.cpu, desc, mali_format, dim, @@ -437,7 +437,7 @@ panfrost_new_texture_bifrost( cfg.swizzle = swizzle; cfg.texel_ordering = panfrost_modifier_to_layout(modifier); cfg.levels = last_level - first_level; - cfg.surfaces = payload->gpu; + cfg.surfaces = payload->ptr.gpu; /* We specify API-level LOD clamps in the sampler descriptor * and use these clamps simply for bounds checking */