mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
gobj: reduce unnecessary use of threading primitives in constructors
This commit is contained in:
parent
e04ddbef9a
commit
39abc66025
@ -512,22 +512,17 @@ CData() :
|
||||
*
|
||||
*/
|
||||
INLINE Geom::CData::
|
||||
CData(const Geom::CData ©) :
|
||||
_data(copy._data),
|
||||
_primitives(copy._primitives),
|
||||
_primitive_type(copy._primitive_type),
|
||||
_shade_model(copy._shade_model),
|
||||
_geom_rendering(copy._geom_rendering),
|
||||
_modified(copy._modified),
|
||||
_internal_bounds(copy._internal_bounds),
|
||||
_nested_vertices(copy._nested_vertices),
|
||||
_internal_bounds_stale(copy._internal_bounds_stale),
|
||||
_bounds_type(copy._bounds_type),
|
||||
_user_bounds(copy._user_bounds)
|
||||
CData(GeomVertexData *data) :
|
||||
_data(data),
|
||||
_primitive_type(PT_none),
|
||||
_shade_model(SM_uniform),
|
||||
_geom_rendering(0),
|
||||
_nested_vertices(0),
|
||||
_internal_bounds_stale(true),
|
||||
_bounds_type(BoundingVolume::BT_default)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -46,13 +46,7 @@ make_cow_copy() {
|
||||
*
|
||||
*/
|
||||
Geom::
|
||||
Geom(const GeomVertexData *data) {
|
||||
// Let's ensure the vertex data gets set on all stages at once.
|
||||
OPEN_ITERATE_ALL_STAGES(_cycler) {
|
||||
CDStageWriter cdata(_cycler, pipeline_stage);
|
||||
cdata->_data = (GeomVertexData *)data;
|
||||
}
|
||||
CLOSE_ITERATE_ALL_STAGES(_cycler);
|
||||
Geom(const GeomVertexData *data) : _cycler(CData((GeomVertexData *)data)) {
|
||||
}
|
||||
|
||||
/**
|
||||
@ -631,7 +625,7 @@ unify_in_place(int max_indices, bool preserve_order) {
|
||||
} else {
|
||||
// We have already encountered another primitive of this type. Combine
|
||||
// them.
|
||||
combine_primitives((*npi).second, primitive, current_thread);
|
||||
combine_primitives((*npi).second, move(primitive), current_thread);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1491,31 +1485,29 @@ reset_geom_rendering(Geom::CData *cdata) {
|
||||
* is modified to append the vertices from b_prim, which is unmodified.
|
||||
*/
|
||||
void Geom::
|
||||
combine_primitives(GeomPrimitive *a_prim, const GeomPrimitive *b_prim,
|
||||
combine_primitives(GeomPrimitive *a_prim, CPT(GeomPrimitive) b_prim,
|
||||
Thread *current_thread) {
|
||||
nassertv(a_prim != b_prim);
|
||||
nassertv(a_prim->get_type() == b_prim->get_type());
|
||||
|
||||
CPT(GeomPrimitive) b_prim2 = b_prim;
|
||||
|
||||
if (a_prim->get_index_type() != b_prim2->get_index_type()) {
|
||||
GeomPrimitive::NumericType index_type = max(a_prim->get_index_type(), b_prim2->get_index_type());
|
||||
if (a_prim->get_index_type() != b_prim->get_index_type()) {
|
||||
GeomPrimitive::NumericType index_type = max(a_prim->get_index_type(), b_prim->get_index_type());
|
||||
a_prim->set_index_type(index_type);
|
||||
if (b_prim2->get_index_type() != index_type) {
|
||||
PT(GeomPrimitive) b_prim_copy = b_prim2->make_copy();
|
||||
if (b_prim->get_index_type() != index_type) {
|
||||
PT(GeomPrimitive) b_prim_copy = b_prim->make_copy();
|
||||
b_prim_copy->set_index_type(index_type);
|
||||
b_prim2 = b_prim_copy;
|
||||
b_prim = b_prim_copy;
|
||||
}
|
||||
}
|
||||
|
||||
if (!b_prim2->is_indexed()) {
|
||||
PT(GeomPrimitive) b_prim_copy = b_prim2->make_copy();
|
||||
if (!b_prim->is_indexed()) {
|
||||
PT(GeomPrimitive) b_prim_copy = b_prim->make_copy();
|
||||
b_prim_copy->make_indexed();
|
||||
b_prim2 = b_prim_copy;
|
||||
b_prim = b_prim_copy;
|
||||
}
|
||||
|
||||
PT(GeomVertexArrayData) a_vertices = a_prim->modify_vertices();
|
||||
CPT(GeomVertexArrayData) b_vertices = b_prim2->get_vertices();
|
||||
CPT(GeomVertexArrayData) b_vertices = b_prim->get_vertices();
|
||||
|
||||
if (a_prim->requires_unused_vertices()) {
|
||||
GeomVertexReader index(b_vertices, 0);
|
||||
@ -1536,7 +1528,7 @@ combine_primitives(GeomPrimitive *a_prim, const GeomPrimitive *b_prim,
|
||||
if (a_prim->is_composite()) {
|
||||
// Also copy the ends array.
|
||||
PTA_int a_ends = a_prim->modify_ends();
|
||||
CPTA_int b_ends = b_prim2->get_ends();
|
||||
CPTA_int b_ends = b_prim->get_ends();
|
||||
for (size_t i = 0; i < b_ends.size(); ++i) {
|
||||
a_ends.push_back(b_ends[i] + orig_a_vertices);
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ private:
|
||||
|
||||
void reset_geom_rendering(CData *cdata);
|
||||
|
||||
void combine_primitives(GeomPrimitive *a_prim, const GeomPrimitive *b_prim,
|
||||
void combine_primitives(GeomPrimitive *a_prim, CPT(GeomPrimitive) b_prim,
|
||||
Thread *current_thread);
|
||||
|
||||
private:
|
||||
@ -302,7 +302,8 @@ private:
|
||||
class EXPCL_PANDA_GOBJ CData : public CycleData {
|
||||
public:
|
||||
INLINE CData();
|
||||
INLINE CData(const CData ©);
|
||||
INLINE CData(GeomVertexData *data);
|
||||
|
||||
ALLOC_DELETED_CHAIN(CData);
|
||||
virtual CycleData *make_copy() const;
|
||||
virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
|
||||
|
@ -229,8 +229,20 @@ mark_used() {
|
||||
*
|
||||
*/
|
||||
INLINE GeomVertexArrayData::CData::
|
||||
CData() :
|
||||
_usage_hint(UH_unspecified),
|
||||
CData(UsageHint usage_hint) :
|
||||
_usage_hint(usage_hint),
|
||||
_rw_lock("GeomVertexArrayData::CData::_rw_lock")
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
INLINE GeomVertexArrayData::CData::
|
||||
CData(GeomVertexArrayData::CData &&from) NOEXCEPT :
|
||||
_usage_hint(move(from._usage_hint)),
|
||||
_buffer(move(from._buffer)),
|
||||
_modified(move(from._modified)),
|
||||
_rw_lock("GeomVertexArrayData::CData::_rw_lock")
|
||||
{
|
||||
}
|
||||
|
@ -77,16 +77,10 @@ GeomVertexArrayData::
|
||||
GeomVertexArrayData(const GeomVertexArrayFormat *array_format,
|
||||
GeomVertexArrayData::UsageHint usage_hint) :
|
||||
SimpleLruPage(0),
|
||||
_array_format(array_format)
|
||||
_array_format(array_format),
|
||||
_cycler(CData(usage_hint)),
|
||||
_contexts(nullptr)
|
||||
{
|
||||
OPEN_ITERATE_ALL_STAGES(_cycler) {
|
||||
CDStageWriter cdata(_cycler, pipeline_stage);
|
||||
cdata->_usage_hint = usage_hint;
|
||||
}
|
||||
CLOSE_ITERATE_ALL_STAGES(_cycler);
|
||||
|
||||
_contexts = NULL;
|
||||
|
||||
set_lru_size(0);
|
||||
nassertv(_array_format->is_registered());
|
||||
}
|
||||
@ -99,10 +93,9 @@ GeomVertexArrayData(const GeomVertexArrayData ©) :
|
||||
CopyOnWriteObject(copy),
|
||||
SimpleLruPage(copy),
|
||||
_array_format(copy._array_format),
|
||||
_cycler(copy._cycler)
|
||||
_cycler(copy._cycler),
|
||||
_contexts(nullptr)
|
||||
{
|
||||
_contexts = NULL;
|
||||
|
||||
copy.mark_used_lru();
|
||||
|
||||
set_lru_size(get_data_size_bytes());
|
||||
|
@ -150,7 +150,8 @@ private:
|
||||
// This is the data that must be cycled between pipeline stages.
|
||||
class EXPCL_PANDA_GOBJ CData : public CycleData {
|
||||
public:
|
||||
INLINE CData();
|
||||
INLINE CData(UsageHint usage_hint = UH_unspecified);
|
||||
INLINE CData(CData &&from) NOEXCEPT;
|
||||
INLINE CData(const CData ©);
|
||||
INLINE void operator = (const CData ©);
|
||||
|
||||
|
@ -583,17 +583,14 @@ CData() :
|
||||
*
|
||||
*/
|
||||
INLINE GeomVertexData::CData::
|
||||
CData(const GeomVertexData::CData ©) :
|
||||
_usage_hint(copy._usage_hint),
|
||||
_format(copy._format),
|
||||
_arrays(copy._arrays),
|
||||
_transform_table(copy._transform_table),
|
||||
_transform_blend_table(copy._transform_blend_table),
|
||||
_slider_table(copy._slider_table),
|
||||
_animated_vertices(copy._animated_vertices),
|
||||
_animated_vertices_modified(copy._animated_vertices_modified),
|
||||
_modified(copy._modified)
|
||||
CData(const GeomVertexFormat *format, GeomVertexData::UsageHint usage_hint) :
|
||||
_format(format),
|
||||
_usage_hint(usage_hint)
|
||||
{
|
||||
size_t num_arrays = format->get_num_arrays();
|
||||
for (size_t i = 0; i < num_arrays; ++i) {
|
||||
_arrays.push_back(new GeomVertexArrayData(format->get_array(i), usage_hint));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -67,24 +67,10 @@ GeomVertexData(const string &name,
|
||||
_char_pcollector(PStatCollector(_animation_pcollector, name)),
|
||||
_skinning_pcollector(_char_pcollector, "Skinning"),
|
||||
_morphs_pcollector(_char_pcollector, "Morphs"),
|
||||
_blends_pcollector(_char_pcollector, "Calc blends")
|
||||
_blends_pcollector(_char_pcollector, "Calc blends"),
|
||||
_cycler(GeomVertexData::CData(format, usage_hint))
|
||||
{
|
||||
nassertv(format->is_registered());
|
||||
|
||||
// Create some empty arrays as required by the format. Let's ensure the
|
||||
// vertex data gets set on all stages at once.
|
||||
OPEN_ITERATE_ALL_STAGES(_cycler) {
|
||||
CDStageWriter cdata(_cycler, pipeline_stage);
|
||||
cdata->_format = format;
|
||||
cdata->_usage_hint = usage_hint;
|
||||
int num_arrays = format->get_num_arrays();
|
||||
for (int i = 0; i < num_arrays; i++) {
|
||||
PT(GeomVertexArrayData) array = new GeomVertexArrayData
|
||||
(format->get_array(i), usage_hint);
|
||||
cdata->_arrays.push_back(array.p());
|
||||
}
|
||||
}
|
||||
CLOSE_ITERATE_ALL_STAGES(_cycler);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -293,7 +293,8 @@ private:
|
||||
class EXPCL_PANDA_GOBJ CData : public CycleData {
|
||||
public:
|
||||
INLINE CData();
|
||||
INLINE CData(const CData ©);
|
||||
INLINE CData(const GeomVertexFormat *format, UsageHint usage_hint);
|
||||
|
||||
ALLOC_DELETED_CHAIN(CData);
|
||||
virtual CycleData *make_copy() const;
|
||||
virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
|
||||
|
@ -10,10 +10,3 @@
|
||||
* @author drose
|
||||
* @date 2002-02-21
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
INLINE CycleData::
|
||||
CycleData() {
|
||||
}
|
||||
|
@ -49,7 +49,9 @@ class EXPCL_PANDA_PIPELINE CycleData
|
||||
#endif // DO_PIPELINING
|
||||
{
|
||||
public:
|
||||
INLINE CycleData();
|
||||
INLINE CycleData() DEFAULT_CTOR;
|
||||
INLINE CycleData(CycleData &&from) DEFAULT_CTOR;
|
||||
INLINE CycleData(const CycleData ©) DEFAULT_CTOR;
|
||||
virtual ~CycleData();
|
||||
|
||||
virtual CycleData *make_copy() const=0;
|
||||
|
@ -25,6 +25,16 @@ PipelineCycler(Pipeline *pipeline) :
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
template<class CycleDataType>
|
||||
INLINE PipelineCycler<CycleDataType>::
|
||||
PipelineCycler(CycleDataType &&initial_data, Pipeline *pipeline) :
|
||||
PipelineCyclerBase(new CycleDataType(move(initial_data)), pipeline)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@ -182,6 +192,17 @@ PipelineCycler(Pipeline *pipeline) :
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
template<class CycleDataType>
|
||||
INLINE PipelineCycler<CycleDataType>::
|
||||
PipelineCycler(CycleDataType &&initial_data, Pipeline *pipeline) :
|
||||
_typed_data(move(initial_data)),
|
||||
PipelineCyclerBase(&_typed_data, pipeline)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -45,7 +45,9 @@
|
||||
template<class CycleDataType>
|
||||
struct PipelineCycler : public PipelineCyclerBase {
|
||||
public:
|
||||
INLINE PipelineCycler(Pipeline *pipeline = NULL);
|
||||
INLINE PipelineCycler(Pipeline *pipeline = nullptr);
|
||||
INLINE PipelineCycler(CycleDataType &&initial_data, Pipeline *pipeline = nullptr);
|
||||
|
||||
INLINE PipelineCycler(const PipelineCycler<CycleDataType> ©);
|
||||
INLINE void operator = (const PipelineCycler<CycleDataType> ©);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user