static void rsdAllocationSyncFromFBO(const Context *rsc, const Allocation *alloc) { if (!alloc->getIsScript()) { return; // nothing to sync } RsdHal *dc = (RsdHal *)rsc->mHal.drv; RsdFrameBufferObj *lastFbo = dc->gl.currentFrameBuffer; DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; if (!drv->textureID && !drv->renderTargetID) { return; // nothing was rendered here yet, so nothing to sync } if (drv->readBackFBO == NULL) { drv->readBackFBO = new RsdFrameBufferObj(); drv->readBackFBO->setColorTarget(drv, 0); drv->readBackFBO->setDimensions(alloc->getType()->getDimX(), alloc->getType()->getDimY()); } // Bind the framebuffer object so we can read back from it drv->readBackFBO->setActive(rsc); // Do the readback RSD_CALL_GL(glReadPixels, 0, 0, alloc->getType()->getDimX(), alloc->getType()->getDimY(), drv->glFormat, drv->glType, alloc->getPtr()); // Revert framebuffer to its original lastFbo->setActive(rsc); }
void rsdFrameBufferSetActive(const Context *rsc, const FBOCache *fb) { setDepthAttachment(rsc, fb); setColorAttachment(rsc, fb); RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv; if (fb->mHal.state.colorTargets[0]) { fbo->setDimensions(fb->mHal.state.colorTargets[0]->getType()->getDimX(), fb->mHal.state.colorTargets[0]->getType()->getDimY()); } else if (fb->mHal.state.depthTarget) { fbo->setDimensions(fb->mHal.state.depthTarget->getType()->getDimX(), fb->mHal.state.depthTarget->getType()->getDimY()); } fbo->setActive(rsc); }