xref: /aosp_15_r20/frameworks/rs/driver/rsdFrameBuffer.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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