RecordedOp.h revision 5854b34881b1a747ac80b5077869ef270a92b1f4
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/*
2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project
3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License.
6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at
7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software
11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and
14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License.
15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef ANDROID_HWUI_RECORDED_OP_H
18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define ANDROID_HWUI_RECORDED_OP_H
19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "utils/LinearAllocator.h"
21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Rect.h"
22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "SkXfermode.h"
25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
325854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer;
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * The provided macro is executed for each op type in order, with the results separated by commas.
38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs.
40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \
42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(BitmapOp) \
43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(RectOp) \
44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(RenderNodeOp) \
456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik        OP_FN(SimpleRectsOp) \
466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik        OP_FN(BeginLayerOp) \
476fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik        OP_FN(EndLayerOp) \
486fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik        OP_FN(LayerOp)
49b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
50b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
52b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
53b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    enum {
54b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        MAP_OPS(IDENTITY_FN)
55b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Count,
56b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    };
57b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
58b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstatic_assert(RecordedOpId::BitmapOp == 0,
59b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        "First index must be zero for LUTs to work");
60b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
61b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint
62b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect
63b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint)
64b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr)
65b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
67b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
68b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation */
71b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
76b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* clip in recording space */
77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect localClipRect;
78b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localClipRect(localClipRect)
87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER_PAINTLESS(RenderNodeOp)
93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , renderNode(renderNode) {}
94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNode * renderNode; // not const, since drawing modifies it (somehow...)
95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(BitmapOp)
100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , bitmap(bitmap) {}
101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkBitmap* bitmap;
102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    // TODO: asset atlas/texture id lookup?
103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RectOp(BASE_PARAMS)
107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(RectOp) {}
108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(SimpleRectsOp)
113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertices(vertices)
114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertexCount(vertexCount) {}
115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
1196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
1206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer,
1216fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it.
1226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
1236fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp {
1246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    BeginLayerOp(BASE_PARAMS)
1256fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : SUPER(BeginLayerOp) {}
1266fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
1276fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
1286fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
1296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that
1306fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO.
1316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik *
1326fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished.
1336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
1346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp {
1356fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    EndLayerOp()
1366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : RecordedOp(RecordedOpId::EndLayerOp, Rect(0, 0), Matrix4::identity(), Rect(0, 0), nullptr) {}
1376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
1386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
1396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp {
1405854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
141818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik            : SUPER(LayerOp)
142818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik            , layerHandle(layerHandle) {}
143818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // Records a handle to the Layer object, since the Layer itself won't be
144818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // constructed until after this operation is constructed.
1455854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    OffscreenBuffer** layerHandle;
1466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
1476fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H
152