SynthesisPipeline.cpp 3.62 KB
Newer Older
Nianchen Deng's avatar
Nianchen Deng committed
1
2
#include "SynthesisPipeline.h"

Nianchen Deng's avatar
Nianchen Deng committed
3
SynthesisPipeline::SynthesisPipeline(sptr<Msl> net, sptr<Camera> cam, unsigned int nSamples,
Nianchen Deng's avatar
sync    
Nianchen Deng committed
4
5
6
7
8
9
10
11
                                     glm::vec2 depthRange, int encodeDim, int coordChns,
                                     float enhanceSigma, float enhanceFe)
    : _nRays(cam->res().x * cam->res().y),
      _nSamples(nSamples),
      _enhanceSigma(enhanceSigma),
      _enhanceFe(enhanceFe),
      _cam(cam),
      _inferPipeline(new InferPipeline(net, _nRays, nSamples, depthRange, encodeDim, coordChns)),
Nianchen Deng's avatar
Nianchen Deng committed
12
//      _enhancement(new Enhancement(cam->res())),
Nianchen Deng's avatar
sync    
Nianchen Deng committed
13
14
15
16
      _rays(new CudaArray<glm::vec3>(_nRays)),
      _colors(new CudaArray<glm::vec4>(_nRays)) {
    _glResultBuffer = _createGlResultBuffer(_nRays);
    _glResultTextures.push_back(_createGlResultTexture(_cam->res()));
Nianchen Deng's avatar
Nianchen Deng committed
17
18
}

Nianchen Deng's avatar
Nianchen Deng committed
19
20
21
22
void SynthesisPipeline::getRays(sptr<CudaArray<glm::vec3>> o_rays, View& view) {

}

Nianchen Deng's avatar
sync    
Nianchen Deng committed
23
void SynthesisPipeline::run(View &view) {
Nianchen Deng's avatar
Nianchen Deng committed
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
    CudaEvent eStart, eGenRays, eInferred, eEnhanced;

    cudaEventRecord(eStart);

    _genRays(view);

    cudaEventRecord(eGenRays);

    _inferPipeline->run(_colors, _rays, view.t(), true);

    cudaEventRecord(eInferred);

    _enhance();

    cudaEventRecord(eEnhanced);

    CHECK_EX(cudaDeviceSynchronize());

    float timeTotal, timeGenRays, timeInfer, timeEnhance;
    cudaEventElapsedTime(&timeTotal, eStart, eEnhanced);
    cudaEventElapsedTime(&timeGenRays, eStart, eGenRays);
    cudaEventElapsedTime(&timeInfer, eGenRays, eInferred);
    cudaEventElapsedTime(&timeEnhance, eInferred, eEnhanced);
    {
        std::ostringstream sout;
Nianchen Deng's avatar
sync    
Nianchen Deng committed
49
50
51
        sout << typeid(*this).name() << " => Total: " << timeTotal
             << "ms (Gen rays: " << timeGenRays << "ms, Infer: " << timeInfer
             << "ms, Enhance: " << timeEnhance << "ms)";
Nianchen Deng's avatar
Nianchen Deng committed
52
53
54
55
56
57
58
59
60
61
62
63
64
        Logger::instance.info(sout.str());
    }

    // Copy result from Cuda array to OpenGL buffer
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _glResultBuffer);
    void *bufferData = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
    cudaMemcpy(bufferData, _colors->getBuffer(), _colors->size(), cudaMemcpyDeviceToHost);
    glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

    _uploadResultToTextures();
}

Nianchen Deng's avatar
sync    
Nianchen Deng committed
65
66
67
68
GLuint SynthesisPipeline::getGlResultTexture(int index) { return _glResultTextures[index]; }

void SynthesisPipeline::_genRays(View &view) { view.transVectors(_rays, _cam->localRays()); }

Nianchen Deng's avatar
Nianchen Deng committed
69
void SynthesisPipeline::_enhance() { _enhancement->run(_colors); }
Nianchen Deng's avatar
sync    
Nianchen Deng committed
70
71
72
73
74
75
76

void SynthesisPipeline::_uploadResultToTextures() {
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _glResultBuffer);
    glBindTexture(GL_TEXTURE_2D, _glResultTextures[0]);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _cam->res().x, _cam->res().y, GL_RGBA, GL_FLOAT, 0);
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
Nianchen Deng's avatar
Nianchen Deng committed
77
78
}

Nianchen Deng's avatar
sync    
Nianchen Deng committed
79
GLuint SynthesisPipeline::_createGlResultTexture(glm::uvec2 res) {
Nianchen Deng's avatar
Nianchen Deng committed
80
81
82
83
84
85
86
87
88
89
90
91
    GLuint textureID;
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, res.x, res.y, 0, GL_RGBA, GL_FLOAT, nullptr);
    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);
    return textureID;
}

Nianchen Deng's avatar
Nianchen Deng committed
92
GLuint SynthesisPipeline::_createGlResultBuffer(unsigned int elements) {
Nianchen Deng's avatar
Nianchen Deng committed
93
94
95
    GLuint glBuffer;
    glGenBuffers(1, &glBuffer);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glBuffer);
Nianchen Deng's avatar
sync    
Nianchen Deng committed
96
    glBufferData(GL_PIXEL_UNPACK_BUFFER, elements * sizeof(glm::vec4), nullptr, GL_STREAM_DRAW);
Nianchen Deng's avatar
Nianchen Deng committed
97
98
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    return glBuffer;
Nianchen Deng's avatar
sync    
Nianchen Deng committed
99
}