mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-31 12:00:12 +01:00
zink: hook up valid_buffer_range for buffer resources using util_range
this lets us avoid stalling during transfer map in some cases Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9062>
This commit is contained in:
parent
8b6e7d00f0
commit
de6ed18584
6 changed files with 47 additions and 10 deletions
|
|
@ -33,7 +33,9 @@ blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info)
|
|||
if (src->format != zink_get_format(screen, info->src.format) ||
|
||||
dst->format != zink_get_format(screen, info->dst.format))
|
||||
return false;
|
||||
|
||||
if (info->dst.resource->target == PIPE_BUFFER)
|
||||
util_range_add(info->dst.resource, &dst->valid_buffer_range,
|
||||
info->dst.box.x, info->dst.box.x + info->dst.box.width);
|
||||
struct zink_batch *batch = zink_batch_no_rp(ctx);
|
||||
|
||||
zink_batch_reference_resource_rw(batch, src, false);
|
||||
|
|
@ -119,7 +121,9 @@ blit_native(struct zink_context *ctx, const struct pipe_blit_info *info)
|
|||
zink_batch_reference_resource_rw(batch, dst, true);
|
||||
|
||||
zink_resource_setup_transfer_layouts(batch, src, dst);
|
||||
|
||||
if (info->dst.resource->target == PIPE_BUFFER)
|
||||
util_range_add(info->dst.resource, &dst->valid_buffer_range,
|
||||
info->dst.box.x, info->dst.box.x + info->dst.box.width);
|
||||
VkImageBlit region = {};
|
||||
region.srcSubresource.aspectMask = src->aspect;
|
||||
region.srcSubresource.mipLevel = info->src.level;
|
||||
|
|
@ -203,6 +207,9 @@ zink_blit(struct pipe_context *pctx,
|
|||
return;
|
||||
}
|
||||
|
||||
if (info->dst.resource->target == PIPE_BUFFER)
|
||||
util_range_add(info->dst.resource, &dst->valid_buffer_range,
|
||||
info->dst.box.x, info->dst.box.x + info->dst.box.width);
|
||||
util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state);
|
||||
util_blitter_save_viewport(ctx->blitter, ctx->viewport_states);
|
||||
|
||||
|
|
|
|||
|
|
@ -276,6 +276,8 @@ zink_clear_texture(struct pipe_context *pctx,
|
|||
zink_blit_begin(ctx, ZINK_BLIT_SAVE_FB | ZINK_BLIT_SAVE_FS);
|
||||
util_clear_render_target(pctx, surf, &color, box->x, box->y, box->width, box->height);
|
||||
}
|
||||
if (res->base.target == PIPE_BUFFER)
|
||||
util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
|
||||
} else {
|
||||
float depth = 0.0;
|
||||
uint8_t stencil = 0;
|
||||
|
|
|
|||
|
|
@ -610,6 +610,8 @@ zink_set_shader_buffers(struct pipe_context *pctx,
|
|||
pipe_resource_reference(&ssbo->buffer, &res->base);
|
||||
ssbo->buffer_offset = buffers[i].buffer_offset;
|
||||
ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->size - ssbo->buffer_offset);
|
||||
util_range_add(&res->base, &res->valid_buffer_range, ssbo->buffer_offset,
|
||||
ssbo->buffer_offset + ssbo->buffer_size);
|
||||
} else {
|
||||
pipe_resource_reference(&ssbo->buffer, NULL);
|
||||
ssbo->buffer_offset = 0;
|
||||
|
|
@ -651,6 +653,8 @@ zink_set_shader_images(struct pipe_context *pctx,
|
|||
if (images[i].resource->target == PIPE_BUFFER) {
|
||||
image_view->buffer_view = create_buffer_view(zink_screen(pctx->screen), res, images[i].format, images[i].u.buf.offset, images[i].u.buf.size);
|
||||
assert(image_view->buffer_view);
|
||||
util_range_add(&res->base, &res->valid_buffer_range, images[i].u.buf.offset,
|
||||
images[i].u.buf.offset + images[i].u.buf.size);
|
||||
} else {
|
||||
struct pipe_surface tmpl = {};
|
||||
tmpl.format = images[i].format;
|
||||
|
|
@ -1512,10 +1516,11 @@ zink_resource_copy_region(struct pipe_context *pctx,
|
|||
struct zink_batch *batch = zink_batch_no_rp(ctx);
|
||||
zink_batch_reference_resource_rw(batch, src, false);
|
||||
zink_batch_reference_resource_rw(batch, dst, true);
|
||||
|
||||
util_range_add(&dst->base, &dst->valid_buffer_range, dstx, dstx + src_box->width);
|
||||
vkCmdCopyBuffer(batch->cmdbuf, src->buffer, dst->buffer, 1, ®ion);
|
||||
} else
|
||||
debug_printf("zink: TODO resource copy\n");
|
||||
//util_range_add(dst, &dst->valid_buffer_range, dstx, dstx + src_box->width);
|
||||
}
|
||||
|
||||
static struct pipe_stream_output_target *
|
||||
|
|
@ -1545,6 +1550,9 @@ zink_create_stream_output_target(struct pipe_context *pctx,
|
|||
t->base.buffer_offset = buffer_offset;
|
||||
t->base.buffer_size = buffer_size;
|
||||
|
||||
struct zink_resource *res = zink_resource(pres);
|
||||
util_range_add(pres, &res->valid_buffer_range, buffer_offset,
|
||||
buffer_offset + buffer_size);
|
||||
return &t->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -781,9 +781,11 @@ zink_get_query_result_resource(struct pipe_context *pctx,
|
|||
uint64_t *u64_map = map;
|
||||
u64_map[0] = u64[1];
|
||||
}
|
||||
util_range_add(&res->base, &res->valid_buffer_range, offset, result_size);
|
||||
pipe_buffer_unmap(pctx, transfer);
|
||||
return;
|
||||
}
|
||||
util_range_add(&res->base, &res->valid_buffer_range, offset, result_size);
|
||||
|
||||
unsigned fences = p_atomic_read(&query->fences);
|
||||
if (!is_time_query(query) && (!fences || wait)) {
|
||||
|
|
|
|||
|
|
@ -52,9 +52,10 @@ zink_resource_destroy(struct pipe_screen *pscreen,
|
|||
{
|
||||
struct zink_screen *screen = zink_screen(pscreen);
|
||||
struct zink_resource *res = zink_resource(pres);
|
||||
if (pres->target == PIPE_BUFFER)
|
||||
if (pres->target == PIPE_BUFFER) {
|
||||
vkDestroyBuffer(screen->dev, res->buffer, NULL);
|
||||
else
|
||||
util_range_destroy(&res->valid_buffer_range);
|
||||
} else
|
||||
vkDestroyImage(screen->dev, res->image, NULL);
|
||||
|
||||
vkFreeMemory(screen->dev, res->mem, NULL);
|
||||
|
|
@ -344,9 +345,10 @@ resource_create(struct pipe_screen *pscreen,
|
|||
res->offset = 0;
|
||||
res->size = reqs.size;
|
||||
|
||||
if (templ->target == PIPE_BUFFER)
|
||||
if (templ->target == PIPE_BUFFER) {
|
||||
vkBindBufferMemory(screen->dev, res->buffer, res->mem, res->offset);
|
||||
else
|
||||
util_range_init(&res->valid_buffer_range);
|
||||
} else
|
||||
vkBindImageMemory(screen->dev, res->image, res->mem, res->offset);
|
||||
|
||||
if (screen->winsys && (templ->bind & PIPE_BIND_DISPLAY_TARGET)) {
|
||||
|
|
@ -550,7 +552,7 @@ zink_transfer_map(struct pipe_context *pctx,
|
|||
|
||||
void *ptr;
|
||||
if (pres->target == PIPE_BUFFER) {
|
||||
if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) {
|
||||
if (!(usage & PIPE_MAP_UNSYNCHRONIZED) && util_ranges_intersect(&res->valid_buffer_range, box->x, box->x + box->width)) {
|
||||
if ((usage & PIPE_MAP_READ && batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) ||
|
||||
(usage & PIPE_MAP_WRITE && batch_uses)) {
|
||||
/* need to wait for rendering to finish
|
||||
|
|
@ -591,6 +593,8 @@ zink_transfer_map(struct pipe_context *pctx,
|
|||
trans->base.stride = 0;
|
||||
trans->base.layer_stride = 0;
|
||||
ptr = ((uint8_t *)ptr) + box->x;
|
||||
if (usage & PIPE_MAP_WRITE)
|
||||
util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
|
||||
} else {
|
||||
if (res->optimal_tiling || !res->host_visible) {
|
||||
enum pipe_format format = pres->format;
|
||||
|
|
@ -675,6 +679,16 @@ zink_transfer_map(struct pipe_context *pctx,
|
|||
return ptr;
|
||||
}
|
||||
|
||||
static void
|
||||
zink_transfer_flush_region(struct pipe_context *ctx,
|
||||
struct pipe_transfer *ptrans,
|
||||
const struct pipe_box *box)
|
||||
{
|
||||
struct zink_resource *res = zink_resource(ptrans->resource);
|
||||
if (res->base.target == PIPE_BUFFER)
|
||||
util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
|
||||
}
|
||||
|
||||
static void
|
||||
zink_transfer_unmap(struct pipe_context *pctx,
|
||||
struct pipe_transfer *ptrans)
|
||||
|
|
@ -703,7 +717,9 @@ zink_transfer_unmap(struct pipe_context *pctx,
|
|||
vkUnmapMemory(screen->dev, res->mem);
|
||||
if ((trans->base.usage & PIPE_MAP_PERSISTENT) && !(trans->base.usage & PIPE_MAP_COHERENT))
|
||||
res->persistent_maps--;
|
||||
|
||||
if (!(trans->base.usage & (PIPE_MAP_FLUSH_EXPLICIT | PIPE_MAP_COHERENT))) {
|
||||
zink_transfer_flush_region(pctx, ptrans, &ptrans->box);
|
||||
}
|
||||
pipe_resource_reference(&trans->base.resource, NULL);
|
||||
slab_free(&ctx->transfer_pool, ptrans);
|
||||
}
|
||||
|
|
@ -794,7 +810,7 @@ static const struct u_transfer_vtbl transfer_vtbl = {
|
|||
.resource_destroy = zink_resource_destroy,
|
||||
.transfer_map = zink_transfer_map,
|
||||
.transfer_unmap = zink_transfer_unmap,
|
||||
.transfer_flush_region = u_default_transfer_flush_region,
|
||||
.transfer_flush_region = zink_transfer_flush_region,
|
||||
.get_internal_format = zink_resource_get_internal_format,
|
||||
.set_stencil = zink_resource_set_separate_stencil,
|
||||
.get_stencil = zink_resource_get_separate_stencil,
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ struct sw_displaytarget;
|
|||
struct zink_batch;
|
||||
|
||||
#include "util/u_transfer.h"
|
||||
#include "util/u_range.h"
|
||||
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
|
|
@ -45,6 +46,7 @@ struct zink_resource {
|
|||
struct {
|
||||
VkAccessFlags access;
|
||||
VkBuffer buffer;
|
||||
struct util_range valid_buffer_range;
|
||||
};
|
||||
struct {
|
||||
VkFormat format;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue