blob: d38fcc0fe52d008c1d5521a6caab5e7eb6c00144 [file] [log] [blame]
#include "surface_flinger_view.h"
#include <binder/IServiceManager.h>
#include <impl/vr_composer_view.h>
#include <private/dvr/native_buffer.h>
#include "hwc_callback.h"
#include "texture.h"
namespace android {
namespace dvr {
SurfaceFlingerView::SurfaceFlingerView() {}
SurfaceFlingerView::~SurfaceFlingerView() {}
bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
const char instance[] = "DaydreamDisplay";
composer_service_ = IVrComposerView::getService(instance);
if (composer_service_ == nullptr) {
ALOGE("Failed to initialize composer service");
return false;
}
if (!composer_service_->isRemote()) {
ALOGE("Composer service is not remote");
return false;
}
// TODO(dnicoara): Query this from the composer service.
width_ = 1920;
height_ = 1080;
composer_observer_.reset(new HwcCallback(composer_service_.get(), client));
return true;
}
bool SurfaceFlingerView::GetTextures(const HwcCallback::Frame& frame,
std::vector<TextureLayer>* texture_layers,
TextureLayer* ime_layer,
bool debug) const {
auto& layers = frame.layers();
texture_layers->clear();
size_t start = 0;
// Skip the second layer if it is from the VR app.
if (!debug) {
start = 1;
if (layers[0].appid && layers[0].appid == layers[1].appid)
start = 2;
}
for (size_t i = start; i < layers.size(); ++i) {
if (!debug && layers[i].should_skip_layer())
continue;
std::unique_ptr<Texture> texture(new Texture());
if (!texture->Initialize(layers[i].buffer->getNativeBuffer())) {
ALOGE("Failed to create texture");
texture_layers->clear();
return false;
}
TextureLayer texture_layer = {
std::move(texture), layers[i].crop, layers[i].display_frame,
layers[i].blending, layers[i].alpha,
};
if (debug && layers[i].type == HwcCallback::HwcLayer::kInputMethod) {
*ime_layer = std::move(texture_layer);
} else {
texture_layers->emplace_back(std::move(texture_layer));
}
}
return true;
}
} // namespace dvr
} // namespace android