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