void OCLRendererThread::AllocOCLBufferRW(cl::Buffer **buff, const size_t size, const string &desc) { if (*buff) { // Check the size of the already allocated buffer if (size == (*buff)->getInfo<CL_MEM_SIZE>()) { // I can reuse the buffer return; } else FreeOCLBuffer(buff); } PrintMemUsage(size, desc); *buff = new cl::Buffer(*ctx, CL_MEM_READ_WRITE, size); usedDeviceMemory += (*buff)->getInfo<CL_MEM_SIZE>(); }
void OCLRendererThread::AllocOCLBufferRO(cl::Buffer **buff, void *src, const size_t size, const string &desc) { if (*buff) { // Check the size of the already allocated buffer if (size == (*buff)->getInfo<CL_MEM_SIZE>()) { // I can reuse the buffer; just update the content cmdQueue->enqueueWriteBuffer(**buff, CL_FALSE, 0, size, src); return; } else FreeOCLBuffer(buff); } PrintMemUsage(size, desc); *buff = new cl::Buffer(*ctx, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size, src); usedDeviceMemory += (*buff)->getInfo<CL_MEM_SIZE>(); }
void PathOCLRenderThread::Stop() { StopRenderThread(); if (frameBuffer) { // Transfer of the frame buffer cl::CommandQueue &oclQueue = intersectionDevice->GetOpenCLQueue(); oclQueue.enqueueReadBuffer( *frameBufferBuff, CL_TRUE, 0, frameBufferBuff->getInfo<CL_MEM_SIZE>(), frameBuffer); } FreeOCLBuffer(&raysBuff); FreeOCLBuffer(&hitsBuff); FreeOCLBuffer(&tasksBuff); FreeOCLBuffer(&taskStatsBuff); FreeOCLBuffer(&frameBufferBuff); FreeOCLBuffer(&materialsBuff); FreeOCLBuffer(&meshIDBuff); FreeOCLBuffer(&triangleIDBuff); FreeOCLBuffer(&meshDescsBuff); FreeOCLBuffer(&meshMatsBuff); FreeOCLBuffer(&normalsBuff); FreeOCLBuffer(&trianglesBuff); FreeOCLBuffer(&vertsBuff); if (infiniteLightBuff) { FreeOCLBuffer(&infiniteLightBuff); FreeOCLBuffer(&infiniteLightMapBuff); } FreeOCLBuffer(&sunLightBuff); FreeOCLBuffer(&skyLightBuff); FreeOCLBuffer(&cameraBuff); FreeOCLBuffer(&areaLightsBuff); FreeOCLBuffer(&texMapRGBBuff); FreeOCLBuffer(&texMapAlphaBuff); if (texMapRGBBuff || texMapAlphaBuff) { FreeOCLBuffer(&texMapDescBuff); FreeOCLBuffer(&meshTexsBuff); if (meshBumpsBuff) { FreeOCLBuffer(&meshBumpsBuff); FreeOCLBuffer(&meshBumpsScaleBuff); } if (meshNormalMapsBuff) FreeOCLBuffer(&meshNormalMapsBuff); FreeOCLBuffer(&uvsBuff); } started = false; // frameBuffer is delete on the destructor to allow image saving after // the rendering is finished }
void FreeBuffers() { FreeOCLBuffer(0, &pixelsBuff); FreeOCLBuffer(0, &sceneBuff); }
OCLRendererThread::~OCLRendererThread() { FreeOCLBuffer(&passFrameBuffer); FreeOCLBuffer(&tmpFrameBuffer); FreeOCLBuffer(&frameBuffer); FreeOCLBuffer(&toneMapFrameBuffer); FreeOCLBuffer(&bvhBuffer); FreeOCLBuffer(&gpuTaskBuffer); FreeOCLBuffer(&cameraBuffer); FreeOCLBuffer(&infiniteLightBuffer); FreeOCLBuffer(&matBuffer); FreeOCLBuffer(&matIndexBuffer); FreeOCLBuffer(&texMapBuffer); FreeOCLBuffer(&texMapRGBBuffer); FreeOCLBuffer(&texMapInstanceBuffer); FreeOCLBuffer(&bumpMapInstanceBuffer); if (index == 0) { delete pboBuff; glDeleteBuffersARB(1, &pbo); } delete kernelUpdatePixelBuffer; delete kernelToneMapLinear; delete kernelBlendFrame; delete kernelApplyBoxFilterXR1; delete kernelApplyBoxFilterYR1; delete kernelApplyBlurHeavyFilterXR1; delete kernelApplyBlurHeavyFilterYR1; delete kernelApplyBlurLightFilterXR1; delete kernelApplyBlurLightFilterYR1; delete kernelPathTracing; delete kernelInitFrameBuffer; delete kernelInit; delete cmdQueue; delete ctx; delete cpuFrameBuffer; }