mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
gsgbase: Switch gsg list to use patomic instead of AtomicAdjust
This commit is contained in:
parent
5d63c7e898
commit
9c4d08f589
@ -15,7 +15,7 @@
|
|||||||
#include "lightMutexHolder.h"
|
#include "lightMutexHolder.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
AtomicAdjust::Pointer GraphicsStateGuardianBase::_gsg_list;
|
patomic<GraphicsStateGuardianBase::GSGList *> GraphicsStateGuardianBase::_gsg_list { nullptr };
|
||||||
UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq;
|
UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq;
|
||||||
TypeHandle GraphicsStateGuardianBase::_type_handle;
|
TypeHandle GraphicsStateGuardianBase::_type_handle;
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ TypeHandle GraphicsStateGuardianBase::_type_handle;
|
|||||||
*/
|
*/
|
||||||
GraphicsStateGuardianBase *GraphicsStateGuardianBase::
|
GraphicsStateGuardianBase *GraphicsStateGuardianBase::
|
||||||
get_default_gsg() {
|
get_default_gsg() {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
if (gsg_list == nullptr) {
|
if (gsg_list == nullptr) {
|
||||||
// Nobody created a GSG list, so we won't have any GSGs either.
|
// Nobody created a GSG list, so we won't have any GSGs either.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -44,7 +44,7 @@ get_default_gsg() {
|
|||||||
*/
|
*/
|
||||||
void GraphicsStateGuardianBase::
|
void GraphicsStateGuardianBase::
|
||||||
set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
|
set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
if (gsg_list == nullptr) {
|
if (gsg_list == nullptr) {
|
||||||
// Nobody ever created a GSG list. How could we have a GSG?
|
// Nobody ever created a GSG list. How could we have a GSG?
|
||||||
nassertv(false);
|
nassertv(false);
|
||||||
@ -52,7 +52,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LightMutexHolder holder(gsg_list->_lock);
|
LightMutexHolder holder(gsg_list->_lock);
|
||||||
if (find(gsg_list->_gsgs.begin(), gsg_list->_gsgs.end(), default_gsg) == gsg_list->_gsgs.end()) {
|
if (std::find(gsg_list->_gsgs.begin(), gsg_list->_gsgs.end(), default_gsg) == gsg_list->_gsgs.end()) {
|
||||||
// The specified GSG doesn't exist or it has already destructed.
|
// The specified GSG doesn't exist or it has already destructed.
|
||||||
nassert_raise("GSG not found or already destructed");
|
nassert_raise("GSG not found or already destructed");
|
||||||
return;
|
return;
|
||||||
@ -66,7 +66,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
|
|||||||
*/
|
*/
|
||||||
size_t GraphicsStateGuardianBase::
|
size_t GraphicsStateGuardianBase::
|
||||||
get_num_gsgs() {
|
get_num_gsgs() {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
if (gsg_list == nullptr) {
|
if (gsg_list == nullptr) {
|
||||||
// Nobody created a GSG list, so we won't have any GSGs either.
|
// Nobody created a GSG list, so we won't have any GSGs either.
|
||||||
return 0;
|
return 0;
|
||||||
@ -81,7 +81,7 @@ get_num_gsgs() {
|
|||||||
*/
|
*/
|
||||||
GraphicsStateGuardianBase *GraphicsStateGuardianBase::
|
GraphicsStateGuardianBase *GraphicsStateGuardianBase::
|
||||||
get_gsg(size_t n) {
|
get_gsg(size_t n) {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
nassertr(gsg_list != nullptr, nullptr);
|
nassertr(gsg_list != nullptr, nullptr);
|
||||||
|
|
||||||
LightMutexHolder holder(gsg_list->_lock);
|
LightMutexHolder holder(gsg_list->_lock);
|
||||||
@ -95,15 +95,12 @@ get_gsg(size_t n) {
|
|||||||
*/
|
*/
|
||||||
void GraphicsStateGuardianBase::
|
void GraphicsStateGuardianBase::
|
||||||
add_gsg(GraphicsStateGuardianBase *gsg) {
|
add_gsg(GraphicsStateGuardianBase *gsg) {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
if (gsg_list == nullptr) {
|
if (gsg_list == nullptr) {
|
||||||
gsg_list = new GSGList;
|
gsg_list = new GSGList;
|
||||||
gsg_list->_default_gsg = nullptr;
|
|
||||||
|
|
||||||
GSGList *orig_gsg_list = (GSGList *)
|
GSGList *orig_gsg_list = nullptr;
|
||||||
AtomicAdjust::compare_and_exchange_ptr(_gsg_list, nullptr, gsg_list);
|
if (!_gsg_list.compare_exchange_strong(orig_gsg_list, gsg_list, std::memory_order_release, std::memory_order_consume)) {
|
||||||
|
|
||||||
if (orig_gsg_list != nullptr) {
|
|
||||||
// Another thread beat us to it. No problem, we'll use that.
|
// Another thread beat us to it. No problem, we'll use that.
|
||||||
delete gsg_list;
|
delete gsg_list;
|
||||||
gsg_list = orig_gsg_list;
|
gsg_list = orig_gsg_list;
|
||||||
@ -129,7 +126,7 @@ add_gsg(GraphicsStateGuardianBase *gsg) {
|
|||||||
*/
|
*/
|
||||||
void GraphicsStateGuardianBase::
|
void GraphicsStateGuardianBase::
|
||||||
remove_gsg(GraphicsStateGuardianBase *gsg) {
|
remove_gsg(GraphicsStateGuardianBase *gsg) {
|
||||||
GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list);
|
GSGList *gsg_list = _gsg_list.load(std::memory_order_consume);
|
||||||
if (gsg_list == nullptr) {
|
if (gsg_list == nullptr) {
|
||||||
// No GSGs were added yet, or the program is destructing anyway.
|
// No GSGs were added yet, or the program is destructing anyway.
|
||||||
return;
|
return;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "nodeCachedReferenceCount.h"
|
#include "nodeCachedReferenceCount.h"
|
||||||
#include "luse.h"
|
#include "luse.h"
|
||||||
#include "lightMutex.h"
|
#include "lightMutex.h"
|
||||||
|
#include "patomic.h"
|
||||||
|
|
||||||
// A handful of forward references.
|
// A handful of forward references.
|
||||||
|
|
||||||
@ -264,9 +265,9 @@ private:
|
|||||||
|
|
||||||
typedef pvector<GraphicsStateGuardianBase *> GSGs;
|
typedef pvector<GraphicsStateGuardianBase *> GSGs;
|
||||||
GSGs _gsgs;
|
GSGs _gsgs;
|
||||||
GraphicsStateGuardianBase *_default_gsg;
|
GraphicsStateGuardianBase *_default_gsg = nullptr;
|
||||||
};
|
};
|
||||||
static AtomicAdjust::Pointer _gsg_list;
|
static patomic<GSGList *> _gsg_list;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static UpdateSeq _generated_shader_seq;
|
static UpdateSeq _generated_shader_seq;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user