rsFBOCache.cpp revision da6d34a5a6ece8c30d20673b9b6ff07d8c91768b
17d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk/* 27d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 37d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * 47d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 57d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * you may not use this file except in compliance with the License. 67d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * You may obtain a copy of the License at 77d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * 87d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 97d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * 107d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 117d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 127d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * See the License for the specific language governing permissions and 147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk * limitations under the License. 157d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk */ 167d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 177d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk#include "rsFBOCache.h" 187d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 197d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk#include "rsContext.h" 207d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk#include "rsAllocation.h" 217d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 227d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukusing namespace android; 237d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukusing namespace android::renderscript; 247d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 257d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 267d9c5ffccb7a5e682860f752403e5a03aed587beAlex SakhartchoukFBOCache::FBOCache() { 27c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk mDirty = true; 28da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.colorTargetsCount = 1; 29da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.colorTargets = new ObjectBaseRef<Allocation>[mHal.state.colorTargetsCount]; 307d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 317d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 327d9c5ffccb7a5e682860f752403e5a03aed587beAlex SakhartchoukFBOCache::~FBOCache() { 33da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk delete[] mHal.state.colorTargets; 34da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 35da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 36da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid FBOCache::init(Context *rsc) { 37da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsc->mHal.funcs.framebuffer.init(rsc, this); 38da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk} 39da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 40da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid FBOCache::deinit(Context *rsc) { 41da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsc->mHal.funcs.framebuffer.destroy(rsc, this); 427d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 437d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 447d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) { 45da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk if (slot >= mHal.state.colorTargetsCount) { 467d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk LOGE("Invalid render target index"); 477d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk return; 487d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 497d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a != NULL) { 507d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (!a->getIsTexture()) { 517d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk LOGE("Invalid Color Target"); 527d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk return; 537d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 547d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a->getIsTexture()) { 557d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a->getTextureID() == 0) { 567d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk a->deferredUploadToTexture(rsc); 577d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 587d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } else if (a->getRenderTargetID() == 0) { 597d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk a->deferredAllocateRenderTarget(rsc); 607d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 617d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 62da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.colorTargets[slot].set(a); 637d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk mDirty = true; 647d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 657d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 667d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::bindDepthTarget(Context *rsc, Allocation *a) { 677d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a != NULL) { 687d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (!a->getIsRenderTarget()) { 697d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk LOGE("Invalid Depth Target"); 707d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk return; 717d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 727d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a->getIsTexture()) { 737d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (a->getTextureID() == 0) { 747d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk a->deferredUploadToTexture(rsc); 757d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 767d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } else if (a->getRenderTargetID() == 0) { 777d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk a->deferredAllocateRenderTarget(rsc); 787d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 797d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 80da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.depthTarget.set(a); 817d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk mDirty = true; 827d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 847d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::resetAll(Context *) { 85da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) { 86da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.colorTargets[i].set(NULL); 877d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 88da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.depthTarget.set(NULL); 897d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk mDirty = true; 907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 917d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 92c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid FBOCache::setup(Context *rsc) { 937d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk if (!mDirty) { 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk return; 957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 967d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 97da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk if (mHal.state.depthTarget.get() != NULL) { 98da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.depthTarget->uploadCheck(rsc); 99da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 101da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) { 102da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk if (mHal.state.colorTargets[i].get() != NULL) { 103da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk mHal.state.colorTargets[i]->uploadCheck(rsc); 1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk } 105da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk } 1067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 107da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsc->mHal.funcs.framebuffer.setActive(rsc, this); 1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 109c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk mDirty = false; 1107d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 111