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;
29064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mHal.state.colorTargets = new Allocation*[mHal.state.colorTargetsCount];
30064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mColorTargets = new ObjectBaseRef<Allocation>[mHal.state.colorTargetsCount];
31064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    resetAll(NULL);
327d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
337d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
347d9c5ffccb7a5e682860f752403e5a03aed587beAlex SakhartchoukFBOCache::~FBOCache() {
35da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    delete[] mHal.state.colorTargets;
36064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    delete[] mColorTargets;
37da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk}
38da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk
39da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid FBOCache::init(Context *rsc) {
40da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    rsc->mHal.funcs.framebuffer.init(rsc, this);
41da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk}
42da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk
43da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukvoid FBOCache::deinit(Context *rsc) {
44da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    rsc->mHal.funcs.framebuffer.destroy(rsc, this);
457d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
467d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
477d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
48da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    if (slot >= mHal.state.colorTargetsCount) {
49af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Invalid render target index");
507d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk        return;
517d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    }
527d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    if (a != NULL) {
53b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        if (!(a->getIsTexture() || (a->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT))) {
54af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("Invalid Color Target");
557d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk            return;
567d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk        }
577d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    }
58064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mColorTargets[slot].set(a);
59064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mHal.state.colorTargets[slot] = a;
607d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    mDirty = true;
617d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
627d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
637d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::bindDepthTarget(Context *rsc, Allocation *a) {
647d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    if (a != NULL) {
657d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk        if (!a->getIsRenderTarget()) {
66af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("Invalid Depth Target");
677d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk            return;
687d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk        }
697d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    }
70064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mDepthTarget.set(a);
71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mHal.state.depthTarget = a;
727d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    mDirty = true;
737d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
747d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
757d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchoukvoid FBOCache::resetAll(Context *) {
76da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) {
77064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mColorTargets[i].set(NULL);
78064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mHal.state.colorTargets[i] = NULL;
797d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    }
80064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mDepthTarget.set(NULL);
81064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    mHal.state.depthTarget = NULL;
827d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    mDirty = true;
837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
847d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
85c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid FBOCache::setup(Context *rsc) {
867d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    if (!mDirty) {
877d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk        return;
887d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    }
897d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
90da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    rsc->mHal.funcs.framebuffer.setActive(rsc, this);
917d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
92c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    mDirty = false;
937d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
94