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