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