diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index ad21d71427..ed2afe91eb 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -97,68 +97,16 @@ public: TransformCamera getEyeCamera(int eye, const StereoState& stereo) const; }; - template< typename T > - static void setGPUObject(const Buffer& buffer, T* object) { - buffer.setGPUObject(object); + + template + static void setGPUObject(const U& object, T* gpuObject) { + object.gpuObject.setGPUObject(gpuObject); } - template< typename T > - static T* getGPUObject(const Buffer& buffer) { - return reinterpret_cast(buffer.getGPUObject()); + template + static T* getGPUObject(const U& object) { + return reinterpret_cast(object.gpuObject.getGPUObject()); } - template< typename T > - static void setGPUObject(const Texture& texture, T* object) { - texture.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const Texture& texture) { - return reinterpret_cast(texture.getGPUObject()); - } - - template< typename T > - static void setGPUObject(const Shader& shader, T* object) { - shader.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const Shader& shader) { - return reinterpret_cast(shader.getGPUObject()); - } - - template< typename T > - static void setGPUObject(const Pipeline& pipeline, T* object) { - pipeline.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const Pipeline& pipeline) { - return reinterpret_cast(pipeline.getGPUObject()); - } - - template< typename T > - static void setGPUObject(const State& state, T* object) { - state.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const State& state) { - return reinterpret_cast(state.getGPUObject()); - } - - template< typename T > - static void setGPUObject(const Framebuffer& framebuffer, T* object) { - framebuffer.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const Framebuffer& framebuffer) { - return reinterpret_cast(framebuffer.getGPUObject()); - } - - template< typename T > - static void setGPUObject(const Query& query, T* object) { - query.setGPUObject(object); - } - template< typename T > - static T* getGPUObject(const Query& query) { - return reinterpret_cast(query.getGPUObject()); - } protected: StereoState _stereo; diff --git a/libraries/gpu/src/gpu/Format.h b/libraries/gpu/src/gpu/Format.h index 41a95e2578..54d40c3e12 100644 --- a/libraries/gpu/src/gpu/Format.h +++ b/libraries/gpu/src/gpu/Format.h @@ -11,15 +11,30 @@ #ifndef hifi_gpu_Format_h #define hifi_gpu_Format_h -#include #include +#include + +#include namespace gpu { +class Backend; + class GPUObject { public: - GPUObject() {} - virtual ~GPUObject() {} + virtual ~GPUObject() = default; +}; + +class GPUObjectPointer { +private: + using GPUObjectUniquePointer = std::unique_ptr; + + // This shouldn't be used by anything else than the Backend class with the proper casting. + mutable GPUObjectUniquePointer _gpuObject; + void setGPUObject(GPUObject* gpuObject) const { _gpuObject.reset(gpuObject); } + GPUObject* getGPUObject() const { return _gpuObject.get(); } + + friend class Backend; }; typedef int Stamp; diff --git a/libraries/gpu/src/gpu/Framebuffer.h b/libraries/gpu/src/gpu/Framebuffer.h index 807047a56e..e986e4a481 100755 --- a/libraries/gpu/src/gpu/Framebuffer.h +++ b/libraries/gpu/src/gpu/Framebuffer.h @@ -134,6 +134,8 @@ public: static const uint32 MAX_NUM_RENDER_BUFFERS = 8; static uint32 getMaxNumRenderBuffers() { return MAX_NUM_RENDER_BUFFERS; } + const GPUObjectPointer gpuObject {}; + protected: SwapchainPointer _swapchain; @@ -153,12 +155,6 @@ protected: // Non exposed Framebuffer(const Framebuffer& framebuffer) = delete; Framebuffer() {} - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; }; typedef std::shared_ptr FramebufferPointer; diff --git a/libraries/gpu/src/gpu/Pipeline.h b/libraries/gpu/src/gpu/Pipeline.h index adc65a0c66..28f7fe106e 100755 --- a/libraries/gpu/src/gpu/Pipeline.h +++ b/libraries/gpu/src/gpu/Pipeline.h @@ -31,6 +31,8 @@ public: const StatePointer& getState() const { return _state; } + const GPUObjectPointer gpuObject {}; + protected: ShaderPointer _program; StatePointer _state; @@ -38,12 +40,6 @@ protected: Pipeline(); Pipeline(const Pipeline& pipeline); // deep copy of the sysmem shader Pipeline& operator=(const Pipeline& pipeline); // deep copy of the sysmem texture - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = nullptr; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; }; typedef Pipeline::Pointer PipelinePointer; diff --git a/libraries/gpu/src/gpu/Query.h b/libraries/gpu/src/gpu/Query.h index d9c3185d9e..25897c5c91 100644 --- a/libraries/gpu/src/gpu/Query.h +++ b/libraries/gpu/src/gpu/Query.h @@ -28,13 +28,7 @@ namespace gpu { double getElapsedTime(); - protected: - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; + const GPUObjectPointer gpuObject {}; }; typedef std::shared_ptr QueryPointer; diff --git a/libraries/gpu/src/gpu/Resource.cpp b/libraries/gpu/src/gpu/Resource.cpp index c162b38b93..1788f6ece5 100644 --- a/libraries/gpu/src/gpu/Resource.cpp +++ b/libraries/gpu/src/gpu/Resource.cpp @@ -170,20 +170,17 @@ Resource::Size Resource::Sysmem::append(Size size, const Byte* bytes) { Buffer::Buffer() : Resource(), - _sysmem(new Sysmem()), - _gpuObject(NULL) { + _sysmem(new Sysmem()) { } Buffer::Buffer(Size size, const Byte* bytes) : Resource(), - _sysmem(new Sysmem(size, bytes)), - _gpuObject(NULL) { + _sysmem(new Sysmem(size, bytes)) { } Buffer::Buffer(const Buffer& buf) : Resource(), - _sysmem(new Sysmem(buf.getSysmem())), - _gpuObject(NULL) { + _sysmem(new Sysmem(buf.getSysmem())) { } Buffer& Buffer::operator=(const Buffer& buf) { @@ -196,10 +193,6 @@ Buffer::~Buffer() { delete _sysmem; _sysmem = NULL; } - if (_gpuObject) { - delete _gpuObject; - _gpuObject = NULL; - } } Buffer::Size Buffer::resize(Size size) { diff --git a/libraries/gpu/src/gpu/Resource.h b/libraries/gpu/src/gpu/Resource.h index 794ee680f4..3517b67203 100644 --- a/libraries/gpu/src/gpu/Resource.h +++ b/libraries/gpu/src/gpu/Resource.h @@ -153,16 +153,11 @@ public: const Sysmem& getSysmem() const { assert(_sysmem); return (*_sysmem); } Sysmem& editSysmem() { assert(_sysmem); return (*_sysmem); } + const GPUObjectPointer gpuObject {}; + protected: Sysmem* _sysmem = NULL; - - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; }; typedef std::shared_ptr BufferPointer; diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index b737a42e12..59c6401150 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -155,6 +155,8 @@ public: // independant of the graphics api in use underneath (looking at you opengl & vulkan). static bool makeProgram(Shader& shader, const Shader::BindingSet& bindings = Shader::BindingSet()); + const GPUObjectPointer gpuObject {}; + protected: Shader(Type type, const Source& source); Shader(Type type, const Pointer& vertex, const Pointer& pixel); @@ -178,12 +180,6 @@ protected: // The type of the shader, the master key Type _type; - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; }; typedef Shader::Pointer ShaderPointer; diff --git a/libraries/gpu/src/gpu/State.h b/libraries/gpu/src/gpu/State.h index 7740506bce..7e32a7280a 100755 --- a/libraries/gpu/src/gpu/State.h +++ b/libraries/gpu/src/gpu/State.h @@ -385,6 +385,8 @@ public: State(const Data& values); const Data& getValues() const { return _values; } + const GPUObjectPointer gpuObject {}; + protected: State(const State& state); State& operator=(const State& state); @@ -392,12 +394,6 @@ protected: Data _values; Signature _signature{0}; Stamp _stamp{0}; - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = nullptr; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - friend class Backend; }; typedef std::shared_ptr< State > StatePointer; diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index 6e8eb10380..378f49c2f4 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -356,6 +356,8 @@ public: // Only callable by the Backend void notifyMipFaceGPULoaded(uint16 level, uint8 face) const { return _storage->notifyMipFaceGPULoaded(level, face); } + const GPUObjectPointer gpuObject {}; + protected: std::unique_ptr< Storage > _storage; @@ -386,13 +388,6 @@ protected: static Texture* create(Type type, const Element& texelFormat, uint16 width, uint16 height, uint16 depth, uint16 numSamples, uint16 numSlices, const Sampler& sampler); Size resize(Type type, const Element& texelFormat, uint16 width, uint16 height, uint16 depth, uint16 numSamples, uint16 numSlices); - - // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; - void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } - GPUObject* getGPUObject() const { return _gpuObject; } - - friend class Backend; }; typedef std::shared_ptr TexturePointer;