- if (brw->curbe.curbe_bo != NULL &&
- brw->curbe.last_buf &&
- bufsz == brw->curbe.last_bufsz &&
- memcmp(buf, brw->curbe.last_buf, bufsz) == 0) {
- /* constants have not changed */
- _mesa_free(buf);
- }
- else {
- /* constants have changed */
- if (brw->curbe.last_buf)
- _mesa_free(brw->curbe.last_buf);
-
- brw->curbe.last_buf = buf;
- brw->curbe.last_bufsz = bufsz;
-
- if (brw->curbe.curbe_bo != NULL &&
- (brw->curbe.need_new_bo ||
- brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size))
- {
- dri_bo_unreference(brw->curbe.curbe_bo);
- brw->curbe.curbe_bo = NULL;
- }
-
- if (brw->curbe.curbe_bo == NULL) {
- /* Allocate a single page for CURBE entries for this batchbuffer.
- * They're generally around 64b.
- */
- brw->curbe.curbe_bo = dri_bo_alloc(brw->intel.bufmgr, "CURBE",
- 4096, 1 << 6);
- brw->curbe.curbe_next_offset = 0;
- }
-
- brw->curbe.curbe_offset = brw->curbe.curbe_next_offset;
- brw->curbe.curbe_next_offset += bufsz;
- brw->curbe.curbe_next_offset = ALIGN(brw->curbe.curbe_next_offset, 64);
-
- /* Copy data to the buffer:
- */
- dri_bo_subdata(brw->curbe.curbe_bo, brw->curbe.curbe_offset, bufsz, buf);
- }
-
- brw_add_validated_bo(brw, brw->curbe.curbe_bo);
-