vc4: Handle a couple of the transfer map flags.

This is part of fixing extremely long runtimes on some piglit tests that
involve streaming vertex reuploads due to format conversions, and will
similarly be important for X performance, which relies on these flags.
This commit is contained in:
Eric Anholt 2014-08-22 13:47:19 -07:00
parent 8f55174fbd
commit d71a9b7d9d
2 changed files with 12 additions and 4 deletions

View file

@ -70,6 +70,9 @@ vc4_bo_reference(struct vc4_bo *bo)
static inline void
vc4_bo_unreference(struct vc4_bo **bo)
{
if (!*bo)
return;
if (pipe_reference(&(*bo)->reference, NULL))
vc4_bo_free(*bo);
*bo = NULL;

View file

@ -73,15 +73,20 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
enum pipe_format format = prsc->format;
char *buf;
vc4_flush_for_bo(pctx, rsc->bo);
if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
uint32_t size = rsc->bo->size;
vc4_bo_unreference(&rsc->bo);
rsc->bo = vc4_bo_alloc(vc4->screen, size, "resource");
}
if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED))
vc4_flush_for_bo(pctx, rsc->bo);
trans = util_slab_alloc(&vc4->transfer_pool);
if (!trans)
return NULL;
/* XXX: Handle DISCARD_WHOLE_RESOURCE, DONTBLOCK, UNSYNCHRONIZED,
* DISCARD_WHOLE_RESOURCE, PERSISTENT, COHERENT.
*/
/* XXX: Handle DONTBLOCK, DISCARD_RANGE, PERSISTENT, COHERENT. */
/* util_slab_alloc() doesn't zero: */
memset(trans, 0, sizeof(*trans));