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