Skip to content
Snippets Groups Projects
Commit 1bc644a1 authored by Nianchen Deng's avatar Nianchen Deng
Browse files

sync

parent 6294701e
No related merge requests found
Showing
with 63 additions and 29 deletions
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
#pragma once #pragma once
#include <map> #include <map>
#include <vector> #include <vector>
#include <cuda_gl_interop.h>
#include "Logger.h"
class Resource { class Resource
{
public: public:
virtual ~Resource() {} virtual ~Resource() {}
virtual void *getBuffer() const = 0; virtual void *data() const = 0;
virtual size_t size() const = 0; virtual size_t size() const = 0;
}; };
class CudaBuffer : public Resource { class CudaBuffer : public Resource
{
public: public:
CudaBuffer(void *buffer = nullptr, size_t size = 0) CudaBuffer(void *buffer = nullptr, size_t size = 0)
: _buffer(buffer), _ownBuffer(false), _size(size) {} : _buffer(buffer), _ownBuffer(false), _size(size) {}
CudaBuffer(size_t size) : _buffer(nullptr), _ownBuffer(true), _size(size) { CudaBuffer(size_t size) : _buffer(nullptr), _ownBuffer(true), _size(size)
{
CHECK_EX(cudaMalloc(&_buffer, size)); CHECK_EX(cudaMalloc(&_buffer, size));
} }
CudaBuffer(const CudaBuffer &rhs) = delete; CudaBuffer(const CudaBuffer &rhs) = delete;
virtual ~CudaBuffer() { virtual ~CudaBuffer()
{
if (!_ownBuffer || _buffer == nullptr) if (!_ownBuffer || _buffer == nullptr)
return; return;
try { try
{
CHECK_EX(cudaFree(_buffer)); CHECK_EX(cudaFree(_buffer));
} catch (std::exception &ex) { }
catch (std::exception &ex)
{
Logger::instance.warning(std::string("Exception raised in destructor: ") + ex.what()); Logger::instance.warning(std::string("Exception raised in destructor: ") + ex.what());
} }
_buffer = nullptr; _buffer = nullptr;
_ownBuffer = false; _ownBuffer = false;
} }
virtual void *getBuffer() const { return _buffer; } virtual void *data() const { return _buffer; }
template <class T> T *getBuffer() const { return (T *)getBuffer(); }
virtual size_t size() const { return _size; } virtual size_t size() const { return _size; }
template <class T1>
T1 *data() const { return (T1 *)data(); }
template <class T1>
operator T1 *() const { return (T1 *)data(); }
private: private:
void *_buffer; void *_buffer;
bool _ownBuffer; bool _ownBuffer;
size_t _size; size_t _size;
}; };
template <typename T> class CudaArray : public CudaBuffer { template <typename T>
class CudaArray : public CudaBuffer
{
public: public:
CudaArray(size_t n) : CudaBuffer(n * sizeof(T)) {} CudaArray(size_t n) : CudaBuffer(n * sizeof(T)) {}
CudaArray(T *buffer, size_t n) : CudaBuffer(buffer, n * sizeof(T)) {} CudaArray(T *buffer, size_t n) : CudaBuffer(buffer, n * sizeof(T)) {}
CudaArray(const std::vector<T> &hostArray) : CudaBuffer(hostArray.size() * sizeof(T)) { CudaArray(const std::vector<T> &hostArray) : CudaBuffer(hostArray.size() * sizeof(T))
cudaMemcpy(getBuffer(), hostArray.data(), size(), cudaMemcpyHostToDevice); {
cudaMemcpy(data(), hostArray.data(), size(), cudaMemcpyHostToDevice);
} }
CudaArray(const CudaArray<T> &rhs) = delete; CudaArray(const CudaArray<T> &rhs) = delete;
size_t n() const { return size() / sizeof(T); } size_t n() const { return size() / sizeof(T); }
operator T *() { return (T *)getBuffer(); } operator T *() { return (T *)data(); }
CudaArray<T> *subArray(size_t offset, size_t n = -1) { CudaArray<T> *subArray(size_t offset, size_t n = -1)
{
if (n == -1) if (n == -1)
n = this->n() - offset; n = this->n() - offset;
return new CudaArray<T>(*this + offset, n); return new CudaArray<T>(*this + offset, n);
} }
}; };
class GraphicsResource : public Resource { class GraphicsResource : public Resource
{
public: public:
cudaGraphicsResource_t getHandler() { return _res; } cudaGraphicsResource_t getHandler() { return _res; }
virtual ~GraphicsResource() { virtual ~GraphicsResource()
{
if (_res == nullptr) if (_res == nullptr)
return; return;
try { try
{
CHECK_EX(cudaGraphicsUnregisterResource(_res)); CHECK_EX(cudaGraphicsUnregisterResource(_res));
} catch (std::exception &ex) { }
catch (std::exception &ex)
{
Logger::instance.warning(std::string("Exception raised in destructor: ") + ex.what()); Logger::instance.warning(std::string("Exception raised in destructor: ") + ex.what());
} }
_res = nullptr; _res = nullptr;
...@@ -86,9 +109,12 @@ protected: ...@@ -86,9 +109,12 @@ protected:
GraphicsResource() : _res(nullptr), _size(0) {} GraphicsResource() : _res(nullptr), _size(0) {}
}; };
template <typename T> class GlTextureResource : public GraphicsResource { template <typename T>
class GlTextureResource : public GraphicsResource
{
public: public:
GlTextureResource(GLuint textureID, glm::uvec2 textureSize) { GlTextureResource(GLuint textureID, glm::uvec2 textureSize)
{
CHECK_EX(cudaGraphicsGLRegisterImage(&_res, textureID, GL_TEXTURE_2D, CHECK_EX(cudaGraphicsGLRegisterImage(&_res, textureID, GL_TEXTURE_2D,
cudaGraphicsRegisterFlagsWriteDiscard)); cudaGraphicsRegisterFlagsWriteDiscard));
_size = textureSize.x * textureSize.y * sizeof(T); _size = textureSize.x * textureSize.y * sizeof(T);
...@@ -97,17 +123,21 @@ public: ...@@ -97,17 +123,21 @@ public:
virtual ~GlTextureResource() { cudaGraphicsUnmapResources(1, &_res, 0); } virtual ~GlTextureResource() { cudaGraphicsUnmapResources(1, &_res, 0); }
virtual void *getBuffer() const { virtual void *data() const
{
cudaArray_t buffer; cudaArray_t buffer;
try { try
{
CHECK_EX(cudaGraphicsSubResourceGetMappedArray(&buffer, _res, 0, 0)); CHECK_EX(cudaGraphicsSubResourceGetMappedArray(&buffer, _res, 0, 0));
} catch (...) { }
catch (...)
{
return nullptr; return nullptr;
} }
return buffer; return buffer;
} }
operator T *() { return (T *)getBuffer(); } operator T *() { return (T *)data(); }
glm::uvec2 textureSize() { return _textureSize; } glm::uvec2 textureSize() { return _textureSize; }
...@@ -115,19 +145,22 @@ private: ...@@ -115,19 +145,22 @@ private:
glm::uvec2 _textureSize; glm::uvec2 _textureSize;
}; };
class Resources { class Resources
{
public: public:
std::map<std::string, Resource *> resources; std::map<std::string, Resource *> resources;
std::vector<cudaGraphicsResource_t> graphicsResources; std::vector<cudaGraphicsResource_t> graphicsResources;
void addResource(const std::string &name, Resource *res) { void addResource(const std::string &name, Resource *res)
{
auto gres = dynamic_cast<GraphicsResource *>(res); auto gres = dynamic_cast<GraphicsResource *>(res);
if (gres != nullptr) if (gres != nullptr)
graphicsResources.push_back(gres->getHandler()); graphicsResources.push_back(gres->getHandler());
resources[name] = res; resources[name] = res;
} }
void clear() { void clear()
{
resources.clear(); resources.clear();
graphicsResources.clear(); graphicsResources.clear();
} }
...@@ -135,10 +168,11 @@ public: ...@@ -135,10 +168,11 @@ public:
template <typename T, typename T2 = T> template <typename T, typename T2 = T>
void dumpArray(std::ostream &so, CudaArray<T> &arr, size_t maxDumpRows = 0, void dumpArray(std::ostream &so, CudaArray<T> &arr, size_t maxDumpRows = 0,
size_t elemsPerRow = 1) { size_t elemsPerRow = 1)
{
int chns = sizeof(T) / sizeof(T2); int chns = sizeof(T) / sizeof(T2);
T2 *hostArr = new T2[arr.n() * chns]; T2 *hostArr = new T2[arr.n() * chns];
cudaMemcpy(hostArr, arr.getBuffer(), arr.n() * sizeof(T), cudaMemcpyDeviceToHost); cudaMemcpy(hostArr, arr.data(), arr.n() * sizeof(T), cudaMemcpyDeviceToHost);
dumpHostBuffer<T2>(so, hostArr, arr.n() * sizeof(T), chns * elemsPerRow, maxDumpRows); dumpHostBuffer<T2>(so, hostArr, arr.n() * sizeof(T), chns * elemsPerRow, maxDumpRows);
delete[] hostArr; delete[] hostArr;
} }
\ No newline at end of file
File moved
File moved
File moved
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment