10f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)/* 20f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * Copyright (C) 2013 The Android Open Source Project 30f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * 40f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 50f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * you may not use this file except in compliance with the License. 60f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * You may obtain a copy of the License at 70f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * 80f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 90f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * 100f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 110f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 120f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * See the License for the specific language governing permissions and 140f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) * limitations under the License. 150f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) */ 160f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 170f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// Provides the implementation of the GraphicBuffer interface in 180f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// renderer compostior 190f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 200f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)#include "graphic_buffer_impl.h" 210f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 220f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)#include <utils/Errors.h> 230f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 240f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)namespace android { 250f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 260f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)GraphicBufferImpl::GraphicBufferImpl(uint32_t w, uint32_t h) 270f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) : mBuffer(new android::GraphicBuffer(w, h, PIXEL_FORMAT_RGBA_8888, 280f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) android::GraphicBuffer::USAGE_HW_TEXTURE | 290f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) android::GraphicBuffer::USAGE_SW_READ_OFTEN | 300f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) android::GraphicBuffer::USAGE_SW_WRITE_OFTEN)) { 310f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 320f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 330f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)GraphicBufferImpl::~GraphicBufferImpl() { 340f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 350f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 360f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 370f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)long GraphicBufferImpl::Create(int w, int h) { 380f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = new GraphicBufferImpl( 390f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) static_cast<uint32_t>(w), static_cast<uint32_t>(h)); 400f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) if (buffer->InitCheck() != NO_ERROR) { 410f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) delete buffer; 420f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return 0; 430f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) } 440f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return reinterpret_cast<intptr_t>(buffer); 450f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 460f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 470f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 480f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)void GraphicBufferImpl::Release(long buffer_id) { 490f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 500f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) delete buffer; 510f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 520f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 530f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 540f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)int GraphicBufferImpl::MapStatic(long buffer_id, AwMapMode mode, void** vaddr) { 550f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 560f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return buffer->Map(mode, vaddr); 570f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 580f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 590f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 600f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)int GraphicBufferImpl::UnmapStatic(long buffer_id) { 610f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 620f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return buffer->Unmap(); 630f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 640f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 650f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 660f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)void* GraphicBufferImpl::GetNativeBufferStatic(long buffer_id) { 670f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 680f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return buffer->GetNativeBuffer(); 690f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 700f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 710f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)// static 720f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)uint32_t GraphicBufferImpl::GetStrideStatic(long buffer_id) { 730f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); 740f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return buffer->GetStride(); 750f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 760f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 770f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)status_t GraphicBufferImpl::Map(AwMapMode mode, void** vaddr) { 780f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) int usage = 0; 790f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) switch (mode) { 800f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) case MAP_READ_ONLY: 810f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN; 820f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) break; 830f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) case MAP_WRITE_ONLY: 840f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) usage = android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; 850f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) break; 860f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) case MAP_READ_WRITE: 870f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN | 880f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; 890f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) break; 900f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) default: 910f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return INVALID_OPERATION; 920f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) } 930f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return mBuffer->lock(usage, vaddr); 940f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 950f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 960f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)status_t GraphicBufferImpl::Unmap() { 970f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return mBuffer->unlock(); 980f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 990f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 1000f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)status_t GraphicBufferImpl::InitCheck() const { 1010f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return mBuffer->initCheck(); 1020f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 1030f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 1040f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)void* GraphicBufferImpl::GetNativeBuffer() const { 1050f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return mBuffer->getNativeBuffer(); 1060f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 1070f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 1080f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)uint32_t GraphicBufferImpl::GetStride() const { 1090f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) static const int kBytesPerPixel = 4; 1100f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) return mBuffer->getStride() * kBytesPerPixel; 1110f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} 1120f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles) 1130f03fbe1ea10c8a7efb8f46343a236720dacbb67Torne (Richard Coles)} // namespace android 114