mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 02:10:11 +01:00
nouveau: accelerate buffer copies in resource_copy_region
This commit is contained in:
parent
3ed4bbd769
commit
2a8145d36b
5 changed files with 47 additions and 11 deletions
|
|
@ -2,6 +2,7 @@
|
|||
#include "util/u_inlines.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_surface.h"
|
||||
|
||||
#include "nouveau_screen.h"
|
||||
#include "nouveau_context.h"
|
||||
|
|
@ -460,6 +461,39 @@ nouveau_buffer_transfer_unmap(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
nouveau_copy_buffer(struct nouveau_context *nv,
|
||||
struct nv04_resource *dst, unsigned dstx,
|
||||
struct nv04_resource *src, unsigned srcx, unsigned size)
|
||||
{
|
||||
assert(dst->base.target == PIPE_BUFFER && src->base.target == PIPE_BUFFER);
|
||||
|
||||
if (likely(dst->domain) && likely(src->domain)) {
|
||||
nv->copy_data(nv,
|
||||
dst->bo, dst->offset + dstx, dst->domain,
|
||||
src->bo, src->offset + srcx, src->domain, size);
|
||||
|
||||
dst->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING;
|
||||
nouveau_fence_ref(nv->screen->fence.current, &dst->fence);
|
||||
nouveau_fence_ref(nv->screen->fence.current, &dst->fence_wr);
|
||||
|
||||
src->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
|
||||
nouveau_fence_ref(nv->screen->fence.current, &src->fence);
|
||||
} else {
|
||||
struct pipe_box src_box;
|
||||
src_box.x = srcx;
|
||||
src_box.y = 0;
|
||||
src_box.z = 0;
|
||||
src_box.width = size;
|
||||
src_box.height = 1;
|
||||
src_box.depth = 1;
|
||||
util_resource_copy_region(&nv->pipe,
|
||||
&dst->base, 0, dstx, 0, 0,
|
||||
&src->base, 0, &src_box);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
nouveau_resource_map_offset(struct nouveau_context *nv,
|
||||
struct nv04_resource *res, uint32_t offset,
|
||||
|
|
|
|||
|
|
@ -49,9 +49,10 @@ struct nv04_resource {
|
|||
void
|
||||
nouveau_buffer_release_gpu_storage(struct nv04_resource *);
|
||||
|
||||
boolean
|
||||
nouveau_buffer_download(struct nouveau_context *, struct nv04_resource *,
|
||||
unsigned start, unsigned size);
|
||||
void
|
||||
nouveau_copy_buffer(struct nouveau_context *,
|
||||
struct nv04_resource *dst, unsigned dst_pos,
|
||||
struct nv04_resource *src, unsigned src_pos, unsigned size);
|
||||
|
||||
boolean
|
||||
nouveau_buffer_migrate(struct nouveau_context *,
|
||||
|
|
|
|||
|
|
@ -130,8 +130,9 @@ nv30_resource_copy_region(struct pipe_context *pipe,
|
|||
struct nv30_rect src, dst;
|
||||
|
||||
if (dstres->target == PIPE_BUFFER && srcres->target == PIPE_BUFFER) {
|
||||
util_resource_copy_region(pipe, dstres, dst_level, dstx, dsty, dstz,
|
||||
srcres, src_level, src_box);
|
||||
nouveau_copy_buffer(&nv30->base,
|
||||
nv04_resource(dstres), dstx,
|
||||
nv04_resource(srcres), src_box->x, src_box->width);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -200,10 +200,10 @@ nv50_resource_copy_region(struct pipe_context *pipe,
|
|||
boolean m2mf;
|
||||
unsigned dst_layer = dstz, src_layer = src_box->z;
|
||||
|
||||
/* Fallback for buffers. */
|
||||
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
||||
util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz,
|
||||
src, src_level, src_box);
|
||||
nouveau_copy_buffer(&nv50->base,
|
||||
nv04_resource(dst), dstx,
|
||||
nv04_resource(src), src_box->x, src_box->width);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -201,10 +201,10 @@ nvc0_resource_copy_region(struct pipe_context *pipe,
|
|||
boolean m2mf;
|
||||
unsigned dst_layer = dstz, src_layer = src_box->z;
|
||||
|
||||
/* Fallback for buffers. */
|
||||
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
||||
util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz,
|
||||
src, src_level, src_box);
|
||||
nouveau_copy_buffer(&nvc0->base,
|
||||
nv04_resource(dst), dstx,
|
||||
nv04_resource(src), src_box->x, src_box->width);
|
||||
NOUVEAU_DRV_STAT(&nvc0->screen->base, buf_copy_bytes, src_box->width);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue