Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7916f88 authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Alex Vakulenko
Browse files

VR: Do extra validation in VR HWC

Validate that the client target buffer is valid before using it and
validate that the requested layers have valid buffers associated with
them.

Bug: None
Test: Compiled
Change-Id: I4830d121e8ab519a24f954fe21c35199f1c1d900
parent c2cbe4ed
Loading
Loading
Loading
Loading
+38 −22
Original line number Diff line number Diff line
@@ -142,17 +142,20 @@ void HwcDisplay::GetChangedCompositionTypes(
  }
}

std::vector<ComposerView::ComposerLayer> HwcDisplay::GetFrame() {
  // Increment the time the fence is signalled every time we get the
  // presentation frame. This ensures that calling ReleaseFrame() only affects
  // the current frame.
  fence_time_++;

Error HwcDisplay::GetFrame(
    std::vector<ComposerView::ComposerLayer>* out_frames) {
  bool queued_client_target = false;
  std::vector<ComposerView::ComposerLayer> frame;
  for (const auto& layer : layers_) {
    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
      if (!queued_client_target) {
      if (queued_client_target)
        continue;

      if (!buffer_.get()) {
        ALOGE("Client composition requested but no client target buffer");
        return Error::BAD_LAYER;
      }

      ComposerView::ComposerLayer client_target_layer = {
          .buffer = buffer_,
          .fence = fence_.get() ? fence_ : new Fence(-1),
@@ -165,13 +168,22 @@ std::vector<ComposerView::ComposerLayer> HwcDisplay::GetFrame() {

      frame.push_back(client_target_layer);
      queued_client_target = true;
      }
    } else {
      if (!layer.info.buffer.get() || !layer.info.fence.get()) {
        ALOGE("Layer requested without valid buffer");
        return Error::BAD_LAYER;
      }

      frame.push_back(layer.info);
    }
  }

  return frame;
  // Increment the time the fence is signalled every time we get the
  // presentation frame. This ensures that calling ReleaseFrame() only affects
  // the current frame.
  fence_time_++;
  out_frames->swap(frame);
  return Error::NONE;
}

void HwcDisplay::GetReleaseFences(int* present_fence,
@@ -392,7 +404,8 @@ Error VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer,
  base::unique_fd fence(releaseFence);
  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;

  return Error::NONE;
  ALOGE("Virtual display support not implemented");
  return Error::UNSUPPORTED;
}

Error VrHwc::validateDisplay(
@@ -423,7 +436,10 @@ Error VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
  std::vector<ComposerView::ComposerLayer> frame;
  {
    std::lock_guard<std::mutex> guard(mutex_);
    frame = display_.GetFrame();
    Error status = display_.GetFrame(&frame);
    if (status != Error::NONE)
      return status;

    display_.GetReleaseFences(outPresentFence, outLayers, outReleaseFences);
  }

+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ class HwcDisplay {
      std::vector<Layer>* layer_ids,
      std::vector<IComposerClient::Composition>* composition);

  std::vector<ComposerView::ComposerLayer> GetFrame();
  Error GetFrame(std::vector<ComposerView::ComposerLayer>* out_frame);

  void GetReleaseFences(int* present_fence, std::vector<Layer>* layer_ids,
                        std::vector<int>* fences);