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