LayerDim.cpp revision edbf3b6af777b721cd2a1ef461947e51e88241e1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceFlinger"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerDim.h"
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "VRamHeap.h"
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst uint32_t LayerDim::typeInfo = LayerBaseClient::typeInfo | 0x10;
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* const LayerDim::typeID = "LayerDim";
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<MemoryDealer> LayerDim::mDimmerDealer;
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBitmap LayerDim::mDimmerBitmap;
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerDim::LayerDim(SurfaceFlinger* flinger, DisplayID display,
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Client* client, int32_t i)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     : LayerBaseClient(flinger, display, client, i)
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerDim::initDimmer(SurfaceFlinger* flinger, uint32_t w, uint32_t h)
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // must only be called once.
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDimmerDealer = flinger->getSurfaceHeapManager()
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ->createHeap(ISurfaceComposer::eHardware);
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mDimmerDealer != 0) {
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mDimmerBitmap.init(mDimmerDealer);
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mDimmerBitmap.setBits(w, h, 1, PIXEL_FORMAT_RGB_565);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mDimmerBitmap.clear();
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerDim::~LayerDim()
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerDim::onDraw(const Region& clip) const
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region::iterator iterator(clip);
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (s.alpha>0 && iterator) {
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t err = NO_ERROR;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int can_use_copybit = canUseCopybit();
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (can_use_copybit)  {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // StopWatch watch("copybit");
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit_image_t dst;
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            hw.getDisplaySurface(&dst);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const copybit_rect_t& drect
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                = reinterpret_cast<const copybit_rect_t&>(mTransformedBounds);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit_image_t src;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mDimmerBitmap.getBitmapSurface(&src);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const copybit_rect_t& srect(drect);
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit_device_t* copybit = mFlinger->getBlitEngine();
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, s.alpha);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            region_iterator it(clip);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it);
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!can_use_copybit || err) {
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GGLfixed alpha = (s.alpha << 16)/255;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const uint32_t fbHeight = hw.getHeight();
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_TEXTURE_2D);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_DITHER);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glColor4x(0, 0, 0, alpha);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glVertexPointer(2, GL_FIXED, 0, mVertices);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Rect r;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (iterator.iterate(&r)) {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                const GLint sy = fbHeight - (r.top + r.height());
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glScissor(r.left, sy, r.width(), r.height());
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
114