1c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu/* 2c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * Copyright (C) 2013 The Android Open Source Project 3c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * 4c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * Licensed under the Apache License, Version 2.0 (the "License"); 5c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * you may not use this file except in compliance with the License. 6c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * You may obtain a copy of the License at 7c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * 8c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * http://www.apache.org/licenses/LICENSE-2.0 9c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * 10c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * Unless required by applicable law or agreed to in writing, software 11c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * distributed under the License is distributed on an "AS IS" BASIS, 12c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * See the License for the specific language governing permissions and 14c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu * limitations under the License. 15c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu */ 16c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 17c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// Provides the implementation of the GraphicBuffer interface in 18c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// renderer compostior 19c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 20c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu#include "graphic_buffer_impl.h" 21c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 22c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu#include <utils/Errors.h> 23c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 24c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglunamespace android { 25c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 26c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan BalogluGraphicBufferImpl::GraphicBufferImpl(uint32_t w, uint32_t h) 27c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu : mBuffer(new android::GraphicBuffer(w, h, PIXEL_FORMAT_RGBA_8888, 28c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu android::GraphicBuffer::USAGE_HW_TEXTURE | 29c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu android::GraphicBuffer::USAGE_SW_READ_OFTEN | 30c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu android::GraphicBuffer::USAGE_SW_WRITE_OFTEN)) { 31c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 32c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 33c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan BalogluGraphicBufferImpl::~GraphicBufferImpl() { 34c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 35c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 36c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 372ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroylong GraphicBufferImpl::Create(int w, int h) { 38c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = new GraphicBufferImpl( 39c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu static_cast<uint32_t>(w), static_cast<uint32_t>(h)); 40c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu if (buffer->InitCheck() != NO_ERROR) { 41c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu delete buffer; 42c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return 0; 43c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu } 442ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroy return reinterpret_cast<intptr_t>(buffer); 45c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 46c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 47c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 482ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroyvoid GraphicBufferImpl::Release(long buffer_id) { 49c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 50c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu delete buffer; 51c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 52c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 53c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 542ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroyint GraphicBufferImpl::MapStatic(long buffer_id, AwMapMode mode, void** vaddr) { 55c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 561cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglu return buffer->Map(mode, vaddr); 57c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 58c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 59c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 602ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroyint GraphicBufferImpl::UnmapStatic(long buffer_id) { 61c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 621cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglu return buffer->Unmap(); 63c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 64c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 65c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 662ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroyvoid* GraphicBufferImpl::GetNativeBufferStatic(long buffer_id) { 67c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 68c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return buffer->GetNativeBuffer(); 69c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 70c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 71c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu// static 722ddcc98cb29e567ea545b3eba2fedc576d1f5365Ross McIlroyuint32_t GraphicBufferImpl::GetStrideStatic(long buffer_id) { 73c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 74c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return buffer->GetStride(); 75c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 76c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 771cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglustatus_t GraphicBufferImpl::Map(AwMapMode mode, void** vaddr) { 78c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu int usage = 0; 79c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu switch (mode) { 801cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglu case MAP_READ_ONLY: 81c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN; 82c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu break; 831cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglu case MAP_WRITE_ONLY: 84c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu usage = android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; 85c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu break; 861cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglu case MAP_READ_WRITE: 87c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN | 88c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; 89c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu break; 90c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu default: 91c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return INVALID_OPERATION; 92c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu } 93c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return mBuffer->lock(usage, vaddr); 94c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 95c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 961cc1c4153a26307948af9f1ee6d9cde7a7103b94Kaan Baloglustatus_t GraphicBufferImpl::Unmap() { 97c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return mBuffer->unlock(); 98c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 99c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 100c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglustatus_t GraphicBufferImpl::InitCheck() const { 101c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return mBuffer->initCheck(); 102c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 103c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 104c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Balogluvoid* GraphicBufferImpl::GetNativeBuffer() const { 105c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu return mBuffer->getNativeBuffer(); 106c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 107c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 108c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Balogluuint32_t GraphicBufferImpl::GetStride() const { 10921924076a888ad00382329c8689dda28222844b0Kaan Baloglu static const int kBytesPerPixel = 4; 11021924076a888ad00382329c8689dda28222844b0Kaan Baloglu return mBuffer->getStride() * kBytesPerPixel; 111c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} 112c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu 113c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu} // namespace android 114