dvr_surface.cpp revision eaa5522feac452703a0836310047d4b15702487d
1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include "include/dvr/dvr_surface.h"
2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
3bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include <private/dvr/display_client.h>
4bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
5bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caiusing namespace android;
6bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caistruct DvrSurface {
874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  std::unique_ptr<dvr::DisplaySurfaceClient> display_surface_;
974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai};
1074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
11bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caiextern "C" {
12bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
1374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caiint dvrSurfaceCreate(int width, int height, int format, uint64_t usage0,
1474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai                     uint64_t usage1, int flags, DvrSurface** out_surface) {
1574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  if (out_surface == nullptr) {
1674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    ALOGE("dvrSurfaceCreate: invalid inputs: out_surface=%p.", out_surface);
1774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    return -EINVAL;
1874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  }
1974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
2074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  int error;
2174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  auto client = dvr::DisplayClient::Create(&error);
2274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  if (!client) {
2374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    ALOGE("Failed to create display client!");
2474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    return error;
2574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  }
2674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
2774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  // TODO(hendrikw): When we move to gralloc1, pass both usage0 and usage1 down.
2874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  std::unique_ptr<dvr::DisplaySurfaceClient> surface =
2974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai      client->CreateDisplaySurface(
3074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai          width, height, static_cast<int>(usage0 | usage1), format, flags);
3174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
3274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  DvrSurface* dvr_surface = new DvrSurface;
3374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  dvr_surface->display_surface_ = std::move(surface);
3474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  *out_surface = dvr_surface;
3574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  return 0;
3674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai}
3774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
3874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caiint dvrSurfaceGetWriteBufferQueue(DvrSurface* surface,
3974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai                                  DvrWriteBufferQueue** out_writer) {
4074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  if (surface == nullptr || out_writer == nullptr) {
4174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    ALOGE(
4274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai        "dvrSurfaceGetWriteBufferQueue: Invalid inputs: surface=%p, "
4374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai        "out_writer=%p.",
4474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai        surface, out_writer);
4574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    return -EINVAL;
4674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  }
4774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  DvrWriteBufferQueue* buffer_writer = new DvrWriteBufferQueue;
4874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  buffer_writer->producer_queue_ =
4974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai      surface->display_surface_->GetProducerQueue();
5074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  if (buffer_writer->producer_queue_ == nullptr) {
5174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    ALOGE(
5274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai        "dvrSurfaceGetWriteBufferQueue: Failed to get producer queue from "
5374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai        "display surface.");
5474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    return -ENOMEM;
5574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  }
5674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
5774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  *out_writer = buffer_writer;
5874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai  return 0;
5974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai}
6074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
61eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrGetNamedBuffer(const char* name, DvrBuffer** out_buffer) {
62bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai  auto client = android::dvr::DisplayClient::Create();
63bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai  if (!client) {
64eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    ALOGE("dvrGetNamedBuffer: Failed to create display client!");
65bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai    return -ECOMM;
66bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai  }
67bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
68eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  if (out_buffer == nullptr || name == nullptr) {
69eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    ALOGE("dvrGetNamedBuffer: Invalid inputs: name=%p, out_buffer=%p.", name,
70eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar          out_buffer);
71eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    return -EINVAL;
72eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  }
73eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar
74eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  auto named_buffer = client->GetNamedBuffer(name);
75eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  if (!named_buffer) {
76eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    ALOGE("dvrGetNamedBuffer: Failed to find named buffer: %s.", name);
77eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    return -EINVAL;
78eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  }
79eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  *out_buffer = CreateDvrBufferFromIonBuffer(std::move(named_buffer));
80bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai  return 0;
81bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai}
82bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
83bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai}  // extern "C"
84