1202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/*
2202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Copyright (C) 2010 The Android Open Source Project
3a43fb8fce6d9be5577de1e0f49c99bd4fe2f6d44Duy Truong * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
4202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
5202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
6202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * you may not use this file except in compliance with the License.
7202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * You may obtain a copy of the License at
8202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
9202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
10202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
11202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
12202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
13202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * See the License for the specific language governing permissions and
15202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * limitations under the License.
16202a77d28ac251545f6f998a974690212309b927Iliyan Malchev */
17202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
18202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <GLES2/gl2.h>
19202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <EGL/egl.h>
20202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <gl2ext.h>
21202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <OpenGLRenderer.h>
22202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "tilerenderer.h"
23202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
24202a77d28ac251545f6f998a974690212309b927Iliyan Malchevnamespace android {
25202a77d28ac251545f6f998a974690212309b927Iliyan MalchevANDROID_SINGLETON_STATIC_INSTANCE(uirenderer::TileRenderer) ;
26202a77d28ac251545f6f998a974690212309b927Iliyan Malchevnamespace uirenderer {
27202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
28202a77d28ac251545f6f998a974690212309b927Iliyan MalchevTileRenderer::TileRenderer() {
29202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mIsTiled = false;
30202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
31202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
32202a77d28ac251545f6f998a974690212309b927Iliyan MalchevTileRenderer::~TileRenderer() {
33202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
34202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
35202a77d28ac251545f6f998a974690212309b927Iliyan Malchevvoid TileRenderer::startTileRendering(OpenGLRenderer* renderer,
36202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                                      int left, int top,
37202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                                      int right, int bottom) {
38202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int width = 0;
39202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int height = 0;
40202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    GLenum status = GL_NO_ERROR;
41202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
42202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (renderer != NULL) {
43202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        renderer->getViewport(width, height);
44202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
45202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
46202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (!left && !right && !top && !bottom) {
47202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        left = 0;
48202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        top = 0;
49202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        right = width;
50202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        bottom = height;
51202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
52202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
53202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (!left && !right && !top && !bottom) {
54202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        //can't do tile rendering
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("can't tile render; drity region, width, height not available");
56202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return;
57202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
58202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
59202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int l = left, t = (height - bottom), w = (right - left), h = (bottom - top), preserve = 0;
60202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
61202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (l < 0 || t < 0) {
62202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        l = (l < 0) ? 0 : l;
63202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        t = (t < 0) ? 0 : t;
64202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        preserve = 1;
65202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
66202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
67202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (w > width || h > height) {
68202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        w = (w > width) ? width : w;
69202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        h = (h > height) ? height : h;
70202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        preserve = 1;
71202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
72202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
73202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    //clear off all errors before tiling, if any
74202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    while ((status = glGetError()) != GL_NO_ERROR);
75202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
76202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (preserve)
77202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        glStartTilingQCOM(l, t, w, h, GL_COLOR_BUFFER_BIT0_QCOM);
78202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    else
79202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        glStartTilingQCOM(l, t, w, h, GL_NONE);
80202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
81202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    status = glGetError();
82202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (status == GL_NO_ERROR)
83202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        mIsTiled = true;
84202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
85202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
86202a77d28ac251545f6f998a974690212309b927Iliyan Malchevvoid TileRenderer::endTileRendering(OpenGLRenderer*) {
87202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (!mIsTiled) {
88202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return;
89202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
90202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
91202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mIsTiled = false;
92202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    GLenum status = GL_NO_ERROR;
93202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    while ((status = glGetError()) != GL_NO_ERROR);
94202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
95202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
96202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}; // namespace uirenderer
97202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}; // namespace android
98