Skip to content

Commit 513f04d

Browse files
committed
pgraph: Use BamAuxData for RenderState overrides reading
Saves a bit of memory. Fast path for empty RenderState.
1 parent 98f94a4 commit 513f04d

File tree

2 files changed

+35
-32
lines changed

2 files changed

+35
-32
lines changed

panda/src/pgraph/renderState.cxx

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ RenderState() :
7474
_saved_entry = -1;
7575
_last_mi = -1;
7676
_cache_stats.add_num_states(1);
77-
_read_overrides = nullptr;
7877
_generated_shader = nullptr;
7978

8079
#ifdef DO_MEMORY_USAGE
@@ -99,7 +98,6 @@ RenderState(const RenderState &copy) :
9998
_saved_entry = -1;
10099
_last_mi = -1;
101100
_cache_stats.add_num_states(1);
102-
_read_overrides = nullptr;
103101
_generated_shader = nullptr;
104102

105103
#ifdef DO_MEMORY_USAGE
@@ -1899,23 +1897,21 @@ int RenderState::
18991897
complete_pointers(TypedWritable **p_list, BamReader *manager) {
19001898
int pi = TypedWritable::complete_pointers(p_list, manager);
19011899

1902-
if (_read_overrides != nullptr) {
1903-
RenderAttribRegistry *reg = RenderAttribRegistry::quick_get_global_ptr();
1904-
for (size_t i = 0; i < (*_read_overrides).size(); ++i) {
1905-
int override = (*_read_overrides)[i];
1906-
1907-
RenderAttrib *attrib = DCAST(RenderAttrib, p_list[pi++]);
1908-
if (attrib != nullptr) {
1909-
int slot = attrib->get_slot();
1910-
if (slot > 0 && slot < reg->get_max_slots()) {
1911-
_attributes[slot].set(attrib, override);
1912-
_filled_slots.set_bit(slot);
1913-
}
1900+
BamAuxData *aux = (BamAuxData *)manager->get_aux_data(this, "overrides");
1901+
nassertr(aux != nullptr, pi);
1902+
1903+
RenderAttribRegistry *reg = RenderAttribRegistry::quick_get_global_ptr();
1904+
for (size_t i = 0; i < aux->_overrides.size(); ++i) {
1905+
int override = aux->_overrides[i];
1906+
1907+
RenderAttrib *attrib = DCAST(RenderAttrib, p_list[pi++]);
1908+
if (attrib != nullptr) {
1909+
int slot = attrib->get_slot();
1910+
if (slot > 0 && slot < reg->get_max_slots()) {
1911+
_attributes[slot].set(attrib, override);
1912+
_filled_slots.set_bit(slot);
19141913
}
19151914
}
1916-
1917-
delete _read_overrides;
1918-
_read_overrides = nullptr;
19191915
}
19201916

19211917
return pi;
@@ -1974,15 +1970,19 @@ finalize(BamReader *) {
19741970
*/
19751971
TypedWritable *RenderState::
19761972
make_from_bam(const FactoryParams &params) {
1977-
RenderState *state = new RenderState;
19781973
DatagramIterator scan;
19791974
BamReader *manager;
19801975

19811976
parse_params(params, scan, manager);
1982-
state->fillin(scan, manager);
1983-
manager->register_change_this(change_this, state);
19841977

1985-
return state;
1978+
if (scan.peek_uint16() != 0) {
1979+
RenderState *state = new RenderState;
1980+
state->fillin(scan, manager);
1981+
manager->register_change_this(change_this, state);
1982+
return state;
1983+
} else {
1984+
return (TypedWritable *)_empty_state;
1985+
}
19861986
}
19871987

19881988
/**
@@ -1994,16 +1994,15 @@ fillin(DatagramIterator &scan, BamReader *manager) {
19941994
TypedWritable::fillin(scan, manager);
19951995

19961996
int num_attribs = scan.get_uint16();
1997-
if (num_attribs == 0) {
1998-
_read_overrides = nullptr;
1999-
} else {
2000-
_read_overrides = new vector_int;
2001-
(*_read_overrides).reserve(num_attribs);
20021997

2003-
for (int i = 0; i < num_attribs; ++i) {
2004-
manager->read_pointer(scan);
2005-
int override = scan.get_int32();
2006-
(*_read_overrides).push_back(override);
2007-
}
1998+
BamAuxData *aux_data = new BamAuxData;
1999+
aux_data->_overrides.reserve(num_attribs);
2000+
2001+
for (int i = 0; i < num_attribs; ++i) {
2002+
manager->read_pointer(scan);
2003+
int override = scan.get_int32();
2004+
aux_data->_overrides.push_back(override);
20082005
}
2006+
2007+
manager->set_aux_data(this, "overrides", aux_data);
20092008
}

panda/src/pgraph/renderState.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,11 @@ class EXPCL_PANDA_PGRAPH RenderState : public NodeCachedReferenceCount {
338338
};
339339
unsigned int _flags;
340340

341-
vector_int *_read_overrides; // Only used during bam reading.
341+
// This data is only needed when reading from a bam file.
342+
class BamAuxData : public BamReader::AuxData {
343+
public:
344+
vector_int _overrides;
345+
};
342346

343347
// This mutex protects _flags, and all of the above computed values.
344348
LightMutex _lock;

0 commit comments

Comments
 (0)