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