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