summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbdiel Janulgue <abdiel.janulgue@linux.intel.com>2015-11-06 20:15:54 +0200
committerAbdiel Janulgue <abdiel.janulgue@linux.intel.com>2015-11-06 20:15:54 +0200
commita79fc8e636a8d4bad32f36776c5c05ff14efb8a5 (patch)
tree58fd228010f799411cc28a78264417375c2dec00
parent8d307977cfac368be45247b902b4b9d6ceeef783 (diff)
256-bit entry tracker
-rw-r--r--src/mesa/drivers/dri/i965/brw_binding_tables.c3
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h7
-rw-r--r--src/mesa/drivers/dri/i965/brw_program.c55
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;
}