diff options
author | Abdiel Janulgue <abdiel.janulgue@linux.intel.com> | 2015-11-06 20:15:54 +0200 |
---|---|---|
committer | Abdiel Janulgue <abdiel.janulgue@linux.intel.com> | 2015-11-06 20:15:54 +0200 |
commit | a79fc8e636a8d4bad32f36776c5c05ff14efb8a5 (patch) | |
tree | 58fd228010f799411cc28a78264417375c2dec00 | |
parent | 8d307977cfac368be45247b902b4b9d6ceeef783 (diff) |
256-bit entry tracker
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_binding_tables.c | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_program.c | 55 |
3 files changed, 55 insertions, 10 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_binding_tables.c b/src/mesa/drivers/dri/i965/brw_binding_tables.c index 1ea2b21d6a..447f60bced 100644 --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c @@ -426,8 +426,9 @@ gen7_reset_hw_bt_pool_offsets(struct brw_context *brw) brw->hw_bt_pool.next_offset = 0; brw->gather_pool.next_offset = 0; + // If this were contigous, you could just memset 0 for (int i = 0; i < brw->num_offset_reset; i++) - *(brw->needs_offset_reset[i]) = 128; + *(brw->needs_offset_reset[i]) = 0; } const struct brw_tracked_state gen7_hw_binding_tables = { diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 0a0f306c80..a2c8af83ea 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -39,6 +39,7 @@ #include "main/macros.h" #include "main/mm.h" #include "main/mtypes.h" +#include "util/bitset.h" #include "brw_structs.h" #include "intel_aub.h" #include "program/prog_parameter.h" @@ -374,6 +375,10 @@ struct brw_shader_program { */ bool needs_update; + /* Tracking for the range that the data previously occupied in the buffer */ + unsigned previous_start_offset; + unsigned previous_end_offset; + unsigned size; unsigned elements; int offset; @@ -382,6 +387,8 @@ struct brw_shader_program { /** Pointers to the update flag of live uniform storages */ bool **reset_update_flags; unsigned nr_updates; + + BITSET_DECLARE(enabled_entries, 256); }; struct brw_gather_table diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index 094c86772c..0917c70411 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -333,11 +333,11 @@ brwUniformStorageChange(struct gl_context *ctx, struct gl_shader_program *prog, /* *shader_prog->reset_update_flags[i] = true; */ /* } */ /* } */ - /* printf("Try update stor: 0x%x [loc: %d] | size: %d |" */ - /* "next_off: %d | bat reset? %s | prog: 0x%x\n", */ - /* storage, loc, shader_prog->storage_table[loc].size, */ - /* shader_prog->next_offset, */ - /* brw_state_dirty(brw, 0, BRW_NEW_BATCH) ? "YES":"NO", shader_prog); */ + printf("Try update stor: 0x%x [loc: %d] | size: %d |" + "next_off: %d | bat reset? %s | prog: 0x%x\n", + storage, loc, shader_prog->storage_table[loc].size, + shader_prog->next_offset, + brw_state_dirty(brw, 0, BRW_NEW_BATCH) ? "YES":"NO", shader_prog); if (!shader_prog->storage_table[loc].needs_update) return; @@ -347,18 +347,53 @@ brwUniformStorageChange(struct gl_context *ctx, struct gl_shader_program *prog, */ if ((shader_prog->next_offset + shader_prog->storage_table[loc].size) > shader_prog->bo->size) { - //assert(0); + assert(0); shader_prog->next_offset = 0; // printf(" ==-- BATCH FLUSHED --== \n"); } + /* Check if entry is taken */ + bool offset_updated; + do { + offset_updated = false; + unsigned offset = shader_prog->next_offset; + const int from = offset / 16; + const int to = (from + (shader_prog->storage_table[loc].size / 16)) - 1; + printf(" RING: 0x%x (%d ==> %d)\n", shader_prog->enabled_entries[0], from, to); + + if (BITSET_TEST_RANGE(shader_prog->enabled_entries, from, to)) { + offset += shader_prog->storage_table[loc].size; + offset_updated = true; + shader_prog->next_offset = offset; + // TODO: handle when offset wraps! + printf(" ^^ %d -> %d is TAKEN!\n", from, to); + assert(shader_prog->next_offset < shader_prog->bo->size); + } else { + /* Free previous occupied slot and mark current slot as in-use */ + BITSET_CLEAR_RANGE(shader_prog->enabled_entries, + shader_prog->storage_table[loc].previous_start_offset, + shader_prog->storage_table[loc].previous_end_offset); + printf(" ** Clearing %d -> %d (OLD)\n", + shader_prog->storage_table[loc].previous_start_offset, + shader_prog->storage_table[loc].previous_end_offset); + + shader_prog->storage_table[loc].previous_start_offset = from; + shader_prog->storage_table[loc].previous_end_offset = to; + + BITSET_SET_RANGE(shader_prog->enabled_entries, from, to); + printf(" ++ Setting %d -> %d as NEW slot\n", + shader_prog->storage_table[loc].previous_start_offset, + shader_prog->storage_table[loc].previous_end_offset); + } + } while (offset_updated); + storage->driver_storage[0].data = shader_prog->bo->virtual + shader_prog->next_offset; /* Update the current offset within the buffer */ - /* printf(" ++ Update stor: 0x%x prev offset: %d to Current: %d\n", */ - /* storage, shader_prog->storage_table[loc].offset, */ - /* shader_prog->next_offset); */ + printf(" ++ Update stor: 0x%x prev offset: %d to Current: %d\n", + storage, shader_prog->storage_table[loc].offset, + shader_prog->next_offset); shader_prog->storage_table[loc].offset = shader_prog->next_offset; shader_prog->storage_table[loc].needs_update = false; @@ -412,6 +447,8 @@ brwUniformStorageChange(struct gl_context *ctx, struct gl_shader_program *prog, /* } */ /* } */ + printf(" sz: %d\n", sizeof(shader_prog->enabled_entries)); + shader_prog->next_offset += shader_prog->storage_table[loc].size; } |