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