freedreno: Restructure transfer_map()
Separate the parts that, with threaded_context, can be called from either driver or frontend thread. Signed-off-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9323>
This commit is contained in:
parent
39d6343a3e
commit
5fbaa8033b
|
@ -34,6 +34,7 @@
|
||||||
#include "util/list.h"
|
#include "util/list.h"
|
||||||
#include "util/slab.h"
|
#include "util/slab.h"
|
||||||
#include "util/u_string.h"
|
#include "util/u_string.h"
|
||||||
|
#include "util/u_threaded_context.h"
|
||||||
#include "util/u_trace.h"
|
#include "util/u_trace.h"
|
||||||
|
|
||||||
#include "freedreno_screen.h"
|
#include "freedreno_screen.h"
|
||||||
|
|
|
@ -649,45 +649,47 @@ invalidate_resource(struct fd_resource *rsc, unsigned usage)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
fd_resource_transfer_map(struct pipe_context *pctx,
|
resource_transfer_map_unsync(struct pipe_context *pctx,
|
||||||
struct pipe_resource *prsc,
|
struct pipe_resource *prsc,
|
||||||
unsigned level, unsigned usage,
|
unsigned level, unsigned usage,
|
||||||
const struct pipe_box *box,
|
const struct pipe_box *box,
|
||||||
struct pipe_transfer **pptrans)
|
struct fd_transfer *trans)
|
||||||
in_dt /* TODO for threaded-ctx we'll need to split out unsynchronized path */
|
|
||||||
{
|
{
|
||||||
struct fd_context *ctx = fd_context(pctx);
|
|
||||||
struct fd_resource *rsc = fd_resource(prsc);
|
struct fd_resource *rsc = fd_resource(prsc);
|
||||||
struct fd_transfer *trans;
|
|
||||||
struct pipe_transfer *ptrans;
|
|
||||||
enum pipe_format format = prsc->format;
|
enum pipe_format format = prsc->format;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
|
buf = fd_bo_map(rsc->bo);
|
||||||
|
offset =
|
||||||
|
box->y / util_format_get_blockheight(format) * trans->base.stride +
|
||||||
|
box->x / util_format_get_blockwidth(format) * rsc->layout.cpp +
|
||||||
|
fd_resource_offset(rsc, level, box->z);
|
||||||
|
|
||||||
|
if (usage & PIPE_MAP_WRITE)
|
||||||
|
rsc->valid = true;
|
||||||
|
|
||||||
|
return buf + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note, with threaded_context, resource_transfer_map() is only called
|
||||||
|
* in driver thread, but resource_transfer_map_unsync() can be called in
|
||||||
|
* either driver or frontend thread.
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
resource_transfer_map(struct pipe_context *pctx,
|
||||||
|
struct pipe_resource *prsc,
|
||||||
|
unsigned level, unsigned usage,
|
||||||
|
const struct pipe_box *box,
|
||||||
|
struct fd_transfer *trans)
|
||||||
|
in_dt
|
||||||
|
{
|
||||||
|
struct fd_context *ctx = fd_context(pctx);
|
||||||
|
struct fd_resource *rsc = fd_resource(prsc);
|
||||||
|
char *buf;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
DBG("prsc=%p, level=%u, usage=%x, box=%dx%d+%d,%d", prsc, level, usage,
|
|
||||||
box->width, box->height, box->x, box->y);
|
|
||||||
|
|
||||||
if ((usage & PIPE_MAP_DIRECTLY) && rsc->layout.tile_mode) {
|
|
||||||
DBG("CANNOT MAP DIRECTLY!\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptrans = slab_alloc(&ctx->transfer_pool);
|
|
||||||
if (!ptrans)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* slab_alloc_st() doesn't zero: */
|
|
||||||
trans = fd_transfer(ptrans);
|
|
||||||
memset(trans, 0, sizeof(*trans));
|
|
||||||
|
|
||||||
pipe_resource_reference(&ptrans->resource, prsc);
|
|
||||||
ptrans->level = level;
|
|
||||||
ptrans->usage = usage;
|
|
||||||
ptrans->box = *box;
|
|
||||||
ptrans->stride = fd_resource_pitch(rsc, level);
|
|
||||||
ptrans->layer_stride = fd_resource_layer_stride(rsc, level);
|
|
||||||
|
|
||||||
/* we always need a staging texture for tiled buffers:
|
/* we always need a staging texture for tiled buffers:
|
||||||
*
|
*
|
||||||
* TODO we might sometimes want to *also* shadow the resource to avoid
|
* TODO we might sometimes want to *also* shadow the resource to avoid
|
||||||
|
@ -697,9 +699,10 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
||||||
if (rsc->layout.tile_mode) {
|
if (rsc->layout.tile_mode) {
|
||||||
struct fd_resource *staging_rsc;
|
struct fd_resource *staging_rsc;
|
||||||
|
|
||||||
|
assert(prsc->target != PIPE_BUFFER);
|
||||||
|
|
||||||
staging_rsc = fd_alloc_staging(ctx, rsc, level, box);
|
staging_rsc = fd_alloc_staging(ctx, rsc, level, box);
|
||||||
if (staging_rsc) {
|
if (staging_rsc) {
|
||||||
// TODO for PIPE_MAP_READ, need to do untiling blit..
|
|
||||||
trans->staging_prsc = &staging_rsc->base;
|
trans->staging_prsc = &staging_rsc->base;
|
||||||
trans->base.stride = fd_resource_pitch(staging_rsc, 0);
|
trans->base.stride = fd_resource_pitch(staging_rsc, 0);
|
||||||
trans->base.layer_stride = fd_resource_layer_stride(staging_rsc, 0);
|
trans->base.layer_stride = fd_resource_layer_stride(staging_rsc, 0);
|
||||||
|
@ -716,9 +719,6 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = fd_bo_map(staging_rsc->bo);
|
buf = fd_bo_map(staging_rsc->bo);
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
*pptrans = ptrans;
|
|
||||||
|
|
||||||
ctx->stats.staging_uploads++;
|
ctx->stats.staging_uploads++;
|
||||||
|
|
||||||
|
@ -800,9 +800,6 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
||||||
trans->staging_box.y = 0;
|
trans->staging_box.y = 0;
|
||||||
trans->staging_box.z = 0;
|
trans->staging_box.z = 0;
|
||||||
buf = fd_bo_map(staging_rsc->bo);
|
buf = fd_bo_map(staging_rsc->bo);
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
*pptrans = ptrans;
|
|
||||||
|
|
||||||
fd_batch_reference(&write_batch, NULL);
|
fd_batch_reference(&write_batch, NULL);
|
||||||
|
|
||||||
|
@ -827,26 +824,62 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
||||||
if (busy) {
|
if (busy) {
|
||||||
ret = fd_resource_wait(ctx, rsc, op);
|
ret = fd_resource_wait(ctx, rsc, op);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = fd_bo_map(rsc->bo);
|
return resource_transfer_map_unsync(pctx, prsc, level, usage, box, trans);
|
||||||
offset =
|
}
|
||||||
box->y / util_format_get_blockheight(format) * ptrans->stride +
|
|
||||||
box->x / util_format_get_blockwidth(format) * rsc->layout.cpp +
|
|
||||||
fd_resource_offset(rsc, level, box->z);
|
|
||||||
|
|
||||||
if (usage & PIPE_MAP_WRITE)
|
static void *
|
||||||
rsc->valid = true;
|
fd_resource_transfer_map(struct pipe_context *pctx,
|
||||||
|
struct pipe_resource *prsc,
|
||||||
|
unsigned level, unsigned usage,
|
||||||
|
const struct pipe_box *box,
|
||||||
|
struct pipe_transfer **pptrans)
|
||||||
|
{
|
||||||
|
struct fd_context *ctx = fd_context(pctx);
|
||||||
|
struct fd_resource *rsc = fd_resource(prsc);
|
||||||
|
struct fd_transfer *trans;
|
||||||
|
struct pipe_transfer *ptrans;
|
||||||
|
|
||||||
*pptrans = ptrans;
|
DBG("prsc=%p, level=%u, usage=%x, box=%dx%d+%d,%d", prsc, level, usage,
|
||||||
|
box->width, box->height, box->x, box->y);
|
||||||
|
|
||||||
return buf + offset;
|
if ((usage & PIPE_MAP_DIRECTLY) && rsc->layout.tile_mode) {
|
||||||
|
DBG("CANNOT MAP DIRECTLY!\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
fail:
|
ptrans = slab_alloc(&ctx->transfer_pool);
|
||||||
fd_resource_transfer_unmap(pctx, ptrans);
|
if (!ptrans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
/* slab_alloc_st() doesn't zero: */
|
||||||
|
trans = fd_transfer(ptrans);
|
||||||
|
memset(trans, 0, sizeof(*trans));
|
||||||
|
|
||||||
|
pipe_resource_reference(&ptrans->resource, prsc);
|
||||||
|
ptrans->level = level;
|
||||||
|
ptrans->usage = usage;
|
||||||
|
ptrans->box = *box;
|
||||||
|
ptrans->stride = fd_resource_pitch(rsc, level);
|
||||||
|
ptrans->layer_stride = fd_resource_layer_stride(rsc, level);
|
||||||
|
|
||||||
|
void *ret;
|
||||||
|
if (usage & (PIPE_MAP_UNSYNCHRONIZED | TC_TRANSFER_MAP_THREADED_UNSYNC)) {
|
||||||
|
ret = resource_transfer_map_unsync(pctx, prsc, level, usage, box, trans);
|
||||||
|
} else {
|
||||||
|
ret = resource_transfer_map(pctx, prsc, level, usage, box, trans);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
*pptrans = ptrans;
|
||||||
|
} else {
|
||||||
|
fd_resource_transfer_unmap(pctx, ptrans);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue