resource.h 2.02 KB
Newer Older
Nianchen Deng's avatar
sync    
Nianchen Deng committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#pragma once
#include <cuda_runtime.h>
#include "../common.h"
#include "error.h"

namespace utils::cuda {
    class Resource {
    public:
        virtual ~Resource() {}

        virtual void *getBuffer() const = 0;

        virtual size_t size() const = 0;
    };

    class BufferResource : public Resource {
    public:
        BufferResource(void *buffer = nullptr, size_t size = 0)
            : _p_buffer(buffer), _ownBuffer(false), _size(size) {}
        BufferResource(size_t size) : _ownBuffer(true), _size(size) {
            void *p_buffer;
            THROW_IF_FAILED(cudaMalloc(&p_buffer, size));
            _p_buffer = std::shared_ptr<void>(p_buffer);
        }

        virtual ~BufferResource() {
            if (!_ownBuffer || _p_buffer.use_count() > 1)
                return;
            try {
                THROW_IF_FAILED(cudaFree(_p_buffer.get()));
            } catch (std::exception &ex) {
                common::Logger::instance.warning("Exception raised in destructor: %s", ex.what());
            }
        }

        virtual void *getBuffer() const { return _p_buffer.get(); }

        virtual size_t size() const { return _size; }

    private:
        std::shared_ptr<void> _p_buffer;
        bool _ownBuffer;
        size_t _size;
    };

    class GraphicsResource : public Resource {
    public:
        cudaGraphicsResource_t getHandler() { return _res; }

        virtual ~GraphicsResource() {
            if (_res == nullptr)
                return;
            try {
                THROW_IF_FAILED(cudaGraphicsUnregisterResource(_res));
            } catch (std::exception &ex) {
                common::Logger::instance.warning("Exception raised in destructor: %s", ex.what());
            }
            _res = nullptr;
        }

        virtual size_t size() const { return _size; }

    protected:
        cudaGraphicsResource_t _res;
        size_t _size;

        GraphicsResource() : _res(nullptr), _size(0) {}
    };

} // namespace utils::cuda