#include <stdlib.h>
+#define ITEM_MAPPED_FOR_READING (1<<0)
+#define ITEM_MAPPED_FOR_WRITING (1<<1)
+#define ITEM_FOR_PROMOTING (1<<2)
+#define ITEM_FOR_DEMOTING (1<<3)
+
struct compute_memory_pool;
struct compute_memory_item
{
int64_t id; ///ID of the memory chunk
- int untouched; ///True if the memory contains only junk, no need to save it for defrag
+ uint32_t status; ///Will track the status of the item
int64_t start_in_dw; ///Start pointer in dwords relative in the pool bo
int64_t size_in_dw; ///Size of the chunk in dwords
return;
}
+ /* We mark these items for promotion to the pool if they
+ * aren't already there */
+ for (int i = 0; i < n; i++) {
+ struct compute_memory_item *item = buffers[i]->chunk;
+
+ if (!is_item_in_pool(item))
+ buffers[i]->chunk->status |= ITEM_FOR_PROMOTING;
+ }
+
compute_memory_finalize_pending(pool, ctx_);
for (int i = 0; i < n; i++)
offset += (buffer->chunk->start_in_dw * 4);
}
+ if (usage & PIPE_TRANSFER_READ)
+ buffer->chunk->status |= ITEM_MAPPED_FOR_READING;
+
COMPUTE_DBG(rctx->screen, "* r600_compute_global_transfer_map()\n"
"level = %u, usage = %u, box(x = %u, y = %u, z = %u "
"width = %u, height = %u, depth = %u)\n", level, usage,