rsdFrameBuffer.cpp revision a94952436aeb251f587c1bccdf94c7f75285dfe2
1da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk/* 2da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * 4da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * you may not use this file except in compliance with the License. 6da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * You may obtain a copy of the License at 7da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * 8da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * 10da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * See the License for the specific language governing permissions and 14da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk * limitations under the License. 15da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk */ 16da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 17da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 18da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include "rsdCore.h" 19da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include "rsdFrameBuffer.h" 20a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk#include "rsdFrameBufferObj.h" 21eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams#include "rsdAllocation.h" 22da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 23da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include "rsContext.h" 24da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include "rsFBOCache.h" 25da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 26da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include <GLES2/gl2.h> 27da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include <GLES2/gl2ext.h> 28da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 29da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukusing namespace android; 30da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukusing namespace android::renderscript; 31da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 32da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid setDepthAttachment(const Context *rsc, const FBOCache *fb) { 33a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv; 34a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk 35a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk DrvAllocation *depth = NULL; 36da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk if (fb->mHal.state.depthTarget.get() != NULL) { 37a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk depth = (DrvAllocation *)fb->mHal.state.depthTarget->mHal.drv; 38a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk 39a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk if (depth->uploadDeferred) { 40a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk rsdAllocationSyncAll(rsc, fb->mHal.state.depthTarget.get(), 41a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RS_ALLOCATION_USAGE_SCRIPT); 42da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 43da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 44a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fbo->setDepthTarget(depth); 45da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 46da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 47da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid setColorAttachment(const Context *rsc, const FBOCache *fb) { 48a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv; 49da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk // Now attach color targets 50da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk for (uint32_t i = 0; i < fb->mHal.state.colorTargetsCount; i ++) { 51a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk DrvAllocation *color = NULL; 52da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk if (fb->mHal.state.colorTargets[i].get() != NULL) { 53a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk color = (DrvAllocation *)fb->mHal.state.colorTargets[i]->mHal.drv; 54da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 55a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk if (color->uploadDeferred) { 56a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk rsdAllocationSyncAll(rsc, fb->mHal.state.colorTargets[i].get(), 57a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RS_ALLOCATION_USAGE_SCRIPT); 58a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk } 59da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 60a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fbo->setColorTarget(color, i); 61da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 62da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 63da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 64da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukbool rsdFrameBufferInit(const Context *rsc, const FBOCache *fb) { 65a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdFrameBufferObj *fbo = new RsdFrameBufferObj(); 66a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk if (fbo == NULL) { 67da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk return false; 68da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 69a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fb->mHal.drv = fbo; 70a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk 71a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 72a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk dc->gl.currentFrameBuffer = fbo; 73da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 74da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk return true; 75da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 76da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 77da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid rsdFrameBufferSetActive(const Context *rsc, const FBOCache *fb) { 78a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk setDepthAttachment(rsc, fb); 79a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk setColorAttachment(rsc, fb); 80a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk 81a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv; 82a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk if (fb->mHal.state.colorTargets[0].get()) { 83a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fbo->setDimensions(fb->mHal.state.colorTargets[0]->getType()->getDimX(), 84a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fb->mHal.state.colorTargets[0]->getType()->getDimY()); 85a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk } else if (fb->mHal.state.depthTarget.get()) { 86a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fbo->setDimensions(fb->mHal.state.depthTarget->getType()->getDimX(), 87a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fb->mHal.state.depthTarget->getType()->getDimY()); 88da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 89a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk 90a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk fbo->setActive(rsc); 91da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 92da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 93da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid rsdFrameBufferDestroy(const Context *rsc, const FBOCache *fb) { 94a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv; 95a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk delete fbo; 96da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk fb->mHal.drv = NULL; 97da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 98da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 99da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 100