9 #ifndef hifi_gpu_PointerStorage_h
10 #define hifi_gpu_PointerStorage_h
30 #if defined(GPU_POINTER_STORAGE_SHARED)
32 static inline bool compare(
const std::shared_ptr<T>& a,
const std::shared_ptr<T>& b) {
37 static inline T* acquire(
const std::shared_ptr<T>& pointer) {
42 static inline void reset(std::shared_ptr<T>& pointer) {
43 return pointer.reset();
47 static inline bool valid(
const std::shared_ptr<T>& pointer) {
48 return pointer.operator bool();
52 static inline void assign(std::shared_ptr<T>& pointer,
const std::shared_ptr<T>& source) {
56 using BufferReference = BufferPointer;
57 using TextureReference = TexturePointer;
58 using FramebufferReference = FramebufferPointer;
59 using FormatReference = Stream::FormatPointer;
60 using PipelineReference = PipelinePointer;
62 #define GPU_REFERENCE_INIT_VALUE nullptr
64 #elif defined(GPU_POINTER_STORAGE_REF)
67 class PointerReferenceWrapper :
public std::reference_wrapper<const std::shared_ptr<T>> {
68 using Parent = std::reference_wrapper<const std::shared_ptr<T>>;
71 using Pointer = std::shared_ptr<T>;
72 PointerReferenceWrapper() : Parent(EMPTY()) {}
73 PointerReferenceWrapper(
const Pointer& pointer) : Parent(pointer) {}
74 void clear() { *
this = EMPTY(); }
77 static const Pointer& EMPTY() {
78 static const Pointer EMPTY_VALUE;
84 static bool compare(
const PointerReferenceWrapper<T>& reference,
const std::shared_ptr<T>& pointer) {
85 return reference.get() == pointer;
89 static inline T* acquire(
const PointerReferenceWrapper<T>& reference) {
90 return reference.get().get();
94 static void assign(PointerReferenceWrapper<T>& reference,
const std::shared_ptr<T>& pointer) {
99 static bool valid(
const PointerReferenceWrapper<T>& reference) {
100 return reference.get().operator bool();
103 template <
typename T>
104 static inline void reset(PointerReferenceWrapper<T>& reference) {
105 return reference.clear();
108 using BufferReference = PointerReferenceWrapper<Buffer>;
109 using TextureReference = PointerReferenceWrapper<Texture>;
110 using FramebufferReference = PointerReferenceWrapper<Framebuffer>;
111 using FormatReference = PointerReferenceWrapper<Stream::Format>;
112 using PipelineReference = PointerReferenceWrapper<Pipeline>;
114 #define GPU_REFERENCE_INIT_VALUE
116 #elif defined(GPU_POINTER_STORAGE_RAW)
118 template <
typename T>
119 static bool compare(
const T*
const& rawPointer,
const std::shared_ptr<T>& pointer) {
120 return rawPointer == pointer.get();
123 template <
typename T>
124 static inline T* acquire(T*
const& rawPointer) {
128 template <
typename T>
129 static inline bool valid(
const T*
const& rawPointer) {
133 template <
typename T>
134 static inline void reset(T*& rawPointer) {
135 rawPointer =
nullptr;
138 template <
typename T>
139 static inline void assign(T*& rawPointer,
const std::shared_ptr<T>& pointer) {
140 rawPointer = pointer.get();
143 using BufferReference = Buffer*;
144 using TextureReference =
Texture*;
145 using FramebufferReference = Framebuffer*;
146 using FormatReference = Stream::Format*;
147 using PipelineReference = Pipeline*;
149 #define GPU_REFERENCE_INIT_VALUE nullptr
153 #error "No GPU pointer storage scheme defined"
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39