/* Allocate an extra bo if we can't fit everything we need simultaneously. * (Could happen for very large user arrays.) */ static INLINE boolean nouveau_scratch_runout(struct nouveau_context *nv, unsigned size) { int ret; const unsigned n = nv->scratch.nr_runout++; nv->scratch.runout = REALLOC(nv->scratch.runout, (n + 0) * sizeof(*nv->scratch.runout), (n + 1) * sizeof(*nv->scratch.runout)); nv->scratch.runout[n] = NULL; ret = nouveau_scratch_bo_alloc(nv, &nv->scratch.runout[n], size); if (!ret) { ret = nouveau_bo_map(nv->scratch.runout[n], 0, NULL); if (ret) nouveau_bo_ref(NULL, &nv->scratch.runout[--nv->scratch.nr_runout]); } if (!ret) { nv->scratch.current = nv->scratch.runout[n]; nv->scratch.offset = 0; nv->scratch.end = size; nv->scratch.map = nv->scratch.current->map; } return !ret; }
/* Continue to next scratch buffer, if available (no wrapping, large enough). * Allocate it if it has not yet been created. */ static INLINE boolean nouveau_scratch_next(struct nouveau_context *nv, unsigned size) { struct nouveau_bo *bo; int ret; const unsigned i = (nv->scratch.id + 1) % NOUVEAU_MAX_SCRATCH_BUFS; if ((size > nv->scratch.bo_size) || (i == nv->scratch.wrap)) return FALSE; nv->scratch.id = i; bo = nv->scratch.bo[i]; if (!bo) { ret = nouveau_scratch_bo_alloc(nv, &bo, nv->scratch.bo_size); if (ret) return FALSE; nv->scratch.bo[i] = bo; } nv->scratch.current = bo; nv->scratch.offset = 0; nv->scratch.end = nv->scratch.bo_size; ret = nouveau_bo_map(bo, NOUVEAU_BO_WR, nv->screen->client); if (!ret) nv->scratch.map = bo->map; return !ret; }
/* Allocate an extra bo if we can't fit everything we need simultaneously. * (Could happen for very large user arrays.) */ static inline bool nouveau_scratch_runout(struct nouveau_context *nv, unsigned size) { int ret; unsigned n; if (nv->scratch.runout) n = nv->scratch.runout->nr; else n = 0; nv->scratch.runout = REALLOC(nv->scratch.runout, n == 0 ? 0 : (sizeof(*nv->scratch.runout) + (n + 0) * sizeof(void *)), sizeof(*nv->scratch.runout) + (n + 1) * sizeof(void *)); nv->scratch.runout->nr = n + 1; nv->scratch.runout->bo[n] = NULL; ret = nouveau_scratch_bo_alloc(nv, &nv->scratch.runout->bo[n], size); if (!ret) { ret = nouveau_bo_map(nv->scratch.runout->bo[n], 0, NULL); if (ret) nouveau_bo_ref(NULL, &nv->scratch.runout->bo[--nv->scratch.runout->nr]); } if (!ret) { nv->scratch.current = nv->scratch.runout->bo[n]; nv->scratch.offset = 0; nv->scratch.end = size; nv->scratch.map = nv->scratch.current->map; } return !ret; }