16950e428feaccc8164b989ef64e771a99948797aMathias Agopian/* 26950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Copyright (C) 2007 The Android Open Source Project 36950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 46950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 56950e428feaccc8164b989ef64e771a99948797aMathias Agopian * you may not use this file except in compliance with the License. 66950e428feaccc8164b989ef64e771a99948797aMathias Agopian * You may obtain a copy of the License at 76950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 86950e428feaccc8164b989ef64e771a99948797aMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 96950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 106950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Unless required by applicable law or agreed to in writing, software 116950e428feaccc8164b989ef64e771a99948797aMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 126950e428feaccc8164b989ef64e771a99948797aMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136950e428feaccc8164b989ef64e771a99948797aMathias Agopian * See the License for the specific language governing permissions and 146950e428feaccc8164b989ef64e771a99948797aMathias Agopian * limitations under the License. 156950e428feaccc8164b989ef64e771a99948797aMathias Agopian */ 166950e428feaccc8164b989ef64e771a99948797aMathias Agopian 176950e428feaccc8164b989ef64e771a99948797aMathias Agopian#ifndef ANDROID_GRAPHIC_BUFFER_H 186950e428feaccc8164b989ef64e771a99948797aMathias Agopian#define ANDROID_GRAPHIC_BUFFER_H 196950e428feaccc8164b989ef64e771a99948797aMathias Agopian 206950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <stdint.h> 216950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <sys/types.h> 226950e428feaccc8164b989ef64e771a99948797aMathias Agopian 236950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/android_native_buffer.h> 246950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/PixelFormat.h> 256950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/Rect.h> 26c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian#include <utils/Flattenable.h> 276950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <pixelflinger/pixelflinger.h> 286950e428feaccc8164b989ef64e771a99948797aMathias Agopian 29b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchevstruct ANativeWindowBuffer; 306950e428feaccc8164b989ef64e771a99948797aMathias Agopian 316950e428feaccc8164b989ef64e771a99948797aMathias Agopiannamespace android { 326950e428feaccc8164b989ef64e771a99948797aMathias Agopian 336950e428feaccc8164b989ef64e771a99948797aMathias Agopianclass GraphicBufferMapper; 346950e428feaccc8164b989ef64e771a99948797aMathias Agopian 356950e428feaccc8164b989ef64e771a99948797aMathias Agopian// =========================================================================== 366950e428feaccc8164b989ef64e771a99948797aMathias Agopian// GraphicBuffer 376950e428feaccc8164b989ef64e771a99948797aMathias Agopian// =========================================================================== 386950e428feaccc8164b989ef64e771a99948797aMathias Agopian 396950e428feaccc8164b989ef64e771a99948797aMathias Agopianclass GraphicBuffer 406950e428feaccc8164b989ef64e771a99948797aMathias Agopian : public EGLNativeBase< 41b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev ANativeWindowBuffer, 426950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBuffer, 43c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian LightRefBase<GraphicBuffer> >, public Flattenable 446950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 456950e428feaccc8164b989ef64e771a99948797aMathias Agopianpublic: 466950e428feaccc8164b989ef64e771a99948797aMathias Agopian 476950e428feaccc8164b989ef64e771a99948797aMathias Agopian enum { 486950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_READ_NEVER = GRALLOC_USAGE_SW_READ_NEVER, 496950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_READ_RARELY = GRALLOC_USAGE_SW_READ_RARELY, 506950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_READ_OFTEN = GRALLOC_USAGE_SW_READ_OFTEN, 516950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_READ_MASK = GRALLOC_USAGE_SW_READ_MASK, 526950e428feaccc8164b989ef64e771a99948797aMathias Agopian 536950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_WRITE_NEVER = GRALLOC_USAGE_SW_WRITE_NEVER, 546950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_WRITE_RARELY = GRALLOC_USAGE_SW_WRITE_RARELY, 556950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_WRITE_OFTEN = GRALLOC_USAGE_SW_WRITE_OFTEN, 566950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SW_WRITE_MASK = GRALLOC_USAGE_SW_WRITE_MASK, 57d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten 586950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_SOFTWARE_MASK = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK, 59d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten 60d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten USAGE_PROTECTED = GRALLOC_USAGE_PROTECTED, 61d6f5bde96b2fe82bc7e5d4e64266d585108c4648Glenn Kasten 626950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_HW_TEXTURE = GRALLOC_USAGE_HW_TEXTURE, 636950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_HW_RENDER = GRALLOC_USAGE_HW_RENDER, 646950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_HW_2D = GRALLOC_USAGE_HW_2D, 65d52c14df02a0d6db42f643e80e248b52fe5e2fddJamie Gennis USAGE_HW_COMPOSER = GRALLOC_USAGE_HW_COMPOSER, 666deb4b538ecf5cbd4418492bfb6b79df67eedfb7Jamie Gennis USAGE_HW_VIDEO_ENCODER = GRALLOC_USAGE_HW_VIDEO_ENCODER, 676950e428feaccc8164b989ef64e771a99948797aMathias Agopian USAGE_HW_MASK = GRALLOC_USAGE_HW_MASK 686950e428feaccc8164b989ef64e771a99948797aMathias Agopian }; 696950e428feaccc8164b989ef64e771a99948797aMathias Agopian 706950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBuffer(); 716950e428feaccc8164b989ef64e771a99948797aMathias Agopian 726950e428feaccc8164b989ef64e771a99948797aMathias Agopian // creates w * h buffer 739042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage); 749042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 759042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // create a buffer from an existing handle 769042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage, 779042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian uint32_t stride, native_handle_t* handle, bool keepOwnership); 786950e428feaccc8164b989ef64e771a99948797aMathias Agopian 79b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev // create a buffer from an existing ANativeWindowBuffer 80b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership); 811ef773ff9caf9c1b9ee32b634f1c80e9a065aa6aJamie Gennis 826950e428feaccc8164b989ef64e771a99948797aMathias Agopian // return status 836950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t initCheck() const; 846950e428feaccc8164b989ef64e771a99948797aMathias Agopian 856950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t getWidth() const { return width; } 866950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t getHeight() const { return height; } 876950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t getStride() const { return stride; } 886950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t getUsage() const { return usage; } 896950e428feaccc8164b989ef64e771a99948797aMathias Agopian PixelFormat getPixelFormat() const { return format; } 906950e428feaccc8164b989ef64e771a99948797aMathias Agopian Rect getBounds() const { return Rect(width, height); } 916950e428feaccc8164b989ef64e771a99948797aMathias Agopian 926950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t reallocate(uint32_t w, uint32_t h, PixelFormat f, uint32_t usage); 936950e428feaccc8164b989ef64e771a99948797aMathias Agopian 946950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t lock(uint32_t usage, void** vaddr); 956950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t lock(uint32_t usage, const Rect& rect, void** vaddr); 966950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t lock(GGLSurface* surface, uint32_t usage); 976950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t unlock(); 98e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian 99b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev ANativeWindowBuffer* getNativeBuffer() const; 1006950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1016950e428feaccc8164b989ef64e771a99948797aMathias Agopian void setIndex(int index); 1026950e428feaccc8164b989ef64e771a99948797aMathias Agopian int getIndex() const; 1036950e428feaccc8164b989ef64e771a99948797aMathias Agopian 104e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian // for debugging 105e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian static void dumpAllocationsToSystemLog(); 106e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian 1077623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopianprivate: 1086950e428feaccc8164b989ef64e771a99948797aMathias Agopian virtual ~GraphicBuffer(); 1096950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1109042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian enum { 1119042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian ownNone = 0, 1129042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian ownHandle = 1, 1139042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian ownData = 2, 1149042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian }; 1159042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 1167623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian inline const GraphicBufferMapper& getBufferMapper() const { 1177623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian return mBufferMapper; 1187623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian } 1197623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian inline GraphicBufferMapper& getBufferMapper() { 1207623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian return mBufferMapper; 1217623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian } 1229042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian uint8_t mOwner; 1236950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1246950e428feaccc8164b989ef64e771a99948797aMathias Agopianprivate: 1256950e428feaccc8164b989ef64e771a99948797aMathias Agopian friend class Surface; 1266950e428feaccc8164b989ef64e771a99948797aMathias Agopian friend class BpSurface; 1276950e428feaccc8164b989ef64e771a99948797aMathias Agopian friend class BnSurface; 12868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis friend class SurfaceTextureClient; 1296950e428feaccc8164b989ef64e771a99948797aMathias Agopian friend class LightRefBase<GraphicBuffer>; 1306950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBuffer(const GraphicBuffer& rhs); 1316950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBuffer& operator = (const GraphicBuffer& rhs); 1326950e428feaccc8164b989ef64e771a99948797aMathias Agopian const GraphicBuffer& operator = (const GraphicBuffer& rhs) const; 1336950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1346950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t initSize(uint32_t w, uint32_t h, PixelFormat format, 1356950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t usage); 1366950e428feaccc8164b989ef64e771a99948797aMathias Agopian 137c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian void free_handle(); 138c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 139c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian // Flattenable interface 140c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian size_t getFlattenedSize() const; 141c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian size_t getFdCount() const; 142c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian status_t flatten(void* buffer, size_t size, 143c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int fds[], size_t count) const; 144c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian status_t unflatten(void const* buffer, size_t size, 145c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int fds[], size_t count); 146c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 1476950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1486950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBufferMapper& mBufferMapper; 1496950e428feaccc8164b989ef64e771a99948797aMathias Agopian ssize_t mInitCheck; 1506950e428feaccc8164b989ef64e771a99948797aMathias Agopian int mIndex; 1511ef773ff9caf9c1b9ee32b634f1c80e9a065aa6aJamie Gennis 1521ef773ff9caf9c1b9ee32b634f1c80e9a065aa6aJamie Gennis // If we're wrapping another buffer then this reference will make sure it 1531ef773ff9caf9c1b9ee32b634f1c80e9a065aa6aJamie Gennis // doesn't get freed. 154b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev sp<ANativeWindowBuffer> mWrappedBuffer; 1556950e428feaccc8164b989ef64e771a99948797aMathias Agopian}; 1566950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1576950e428feaccc8164b989ef64e771a99948797aMathias Agopian}; // namespace android 1586950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1596950e428feaccc8164b989ef64e771a99948797aMathias Agopian#endif // ANDROID_GRAPHIC_BUFFER_H 160