-static void
-wrap_buffers(struct brw_context *brw, GLuint size)
-{
- intel_upload_finish(brw);
-
- if (size < INTEL_UPLOAD_SIZE)
- size = INTEL_UPLOAD_SIZE;
-
- brw->upload.bo = drm_intel_bo_alloc(brw->bufmgr, "upload", size, 0);
- brw->upload.offset = 0;
-}
-
-void
-intel_upload_data(struct brw_context *brw,
- const void *ptr, GLuint size, GLuint align,
- drm_intel_bo **return_bo,
- GLuint *return_offset)
-{
- GLuint base, delta;
-
- base = (brw->upload.offset + align - 1) / align * align;
- if (brw->upload.bo == NULL || base + size > brw->upload.bo->size) {
- wrap_buffers(brw, size);
- base = 0;
- }
-
- drm_intel_bo_reference(brw->upload.bo);
- *return_bo = brw->upload.bo;
- *return_offset = base;
-
- delta = base - brw->upload.offset;
- if (brw->upload.buffer_len &&
- brw->upload.buffer_len + delta + size > sizeof(brw->upload.buffer)) {
- drm_intel_bo_subdata(brw->upload.bo,
- brw->upload.buffer_offset,
- brw->upload.buffer_len,
- brw->upload.buffer);
- brw->upload.buffer_len = 0;
- }
-
- if (size < sizeof(brw->upload.buffer)) {
- if (brw->upload.buffer_len == 0)
- brw->upload.buffer_offset = base;
- else
- brw->upload.buffer_len += delta;
-
- memcpy(brw->upload.buffer + brw->upload.buffer_len, ptr, size);
- brw->upload.buffer_len += size;
- } else {
- drm_intel_bo_subdata(brw->upload.bo, base, size, ptr);
- }
-
- brw->upload.offset = base + size;
-}
-
+/**
+ * Interface for getting memory for uploading streamed data to the GPU
+ *
+ * In most cases, streamed data (for GPU state structures, for example) is
+ * uploaded through brw_state_batch(), since that interface allows relocations
+ * from the streamed space returned to other BOs. However, that interface has
+ * the restriction that the amount of space allocated has to be "small" (see
+ * estimated_max_prim_size in brw_draw.c).
+ *
+ * This interface, on the other hand, is able to handle arbitrary sized
+ * allocation requests, though it will batch small allocations into the same
+ * BO for efficiency and reduced memory footprint.
+ *
+ * \note The returned pointer is valid only until intel_upload_finish(), which
+ * will happen at batch flush or the next
+ * intel_upload_space()/intel_upload_data().
+ *
+ * \param out_bo Pointer to a BO, which must point to a valid BO or NULL on
+ * entry, and will have a reference to the new BO containing the state on
+ * return.
+ *
+ * \param out_offset Offset within the buffer object that the data will land.
+ */