/*
 * Copyright 2021 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gpu/test_support/gl_test_fixture.h"

namespace cros {

GlTestFixture::GlTestFixture() {
  // Create EGLContext.
  egl_context_ = EglContext::GetSurfacelessContext();
  if (!egl_context_->IsValid()) {
    LOGF(FATAL) << "Failed to create EGL context";
  }

  // Make current.
  if (!egl_context_->MakeCurrent()) {
    LOGF(FATAL) << "Failed to make display current";
  }

  EglDumpInfo();
  GlDumpInfo();
}

std::array<uint8_t, 4> GlTestFixture::GetTestRgbaColor(int x,
                                                       int y,
                                                       int width,
                                                       int height) {
  // Gradient color along the X/Y axes.
  uint8_t R = 255 * x / width;
  uint8_t G = 255 * y / height;
  uint8_t B = 0;
  return std::array<uint8_t, 4>{R, G, B, 255};
}

std::array<uint8_t, 3> GlTestFixture::GetTestYuvColor(int x,
                                                      int y,
                                                      int width,
                                                      int height) {
  auto rgb = GetTestRgbaColor(x, y, width, height);
  float Y = 0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2];
  float U = -0.16874 * rgb[0] - 0.33126 * rgb[1] + 0.5 * rgb[2] + 128;
  float V = 0.5 * rgb[0] - 0.41869 * rgb[1] - 0.08131 * rgb[2] + 128;
  return std::array<uint8_t, 3>{base::checked_cast<uint8_t>(Y),
                                base::checked_cast<uint8_t>(U),
                                base::checked_cast<uint8_t>(V)};
}

void GlTestFixture::FillTestPattern(buffer_handle_t buffer) {
  CameraBufferManager* buf_mgr = CameraBufferManager::GetInstance();
  int width = CameraBufferManager::GetWidth(buffer);
  int height = CameraBufferManager::GetHeight(buffer);
  uint32_t hal_format = CameraBufferManager::GetHalPixelFormat(buffer);
  if (hal_format == HAL_PIXEL_FORMAT_RGBX_8888) {
    void* addr = nullptr;
    ASSERT_EQ(buf_mgr->Lock(buffer, 0, 0, 0, width, height, &addr), 0);
    uint32_t* as_uint32 = reinterpret_cast<uint32_t*>(addr);
    size_t pixel_stride =
        CameraBufferManager::GetPlaneStride(buffer, 0) / sizeof(uint32_t);
    int base = 0;
    for (int y = 0; y < height; ++y) {
      base = y * pixel_stride;
      for (int x = 0; x < width; ++x) {
        as_uint32[base + x] = *reinterpret_cast<uint32_t*>(
            GetTestRgbaColor(x, y, width, height).data());
      }
    }
    ASSERT_EQ(buf_mgr->Unlock(buffer), 0);
  } else if (hal_format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
    android_ycbcr ycbcr = {};
    ASSERT_EQ(buf_mgr->LockYCbCr(buffer, 0, 0, 0, width, height, &ycbcr), 0);
    // Fill Y plane. 1 byte per pixel with dimension w x h.
    {
      uint8_t* as_uint8 = reinterpret_cast<uint8_t*>(ycbcr.y);
      size_t pixel_stride =
          CameraBufferManager::GetPlaneStride(buffer, 0) / sizeof(uint8_t);
      int base = 0;
      for (int y = 0; y < height; ++y) {
        base = y * pixel_stride;
        for (int x = 0; x < width; ++x) {
          as_uint8[base + x] = GetTestYuvColor(x, y, width, height)[0];
        }
      }
    }
    // Fill UV plane. 2x2 subsampling with 2 bytes per pixel and dimension
    // (w / 2) x (h / 2).
    {
      uint16_t* as_uint16 = reinterpret_cast<uint16_t*>(ycbcr.cb);
      size_t pixel_stride =
          CameraBufferManager::GetPlaneStride(buffer, 1) / sizeof(uint16_t);
      int base = 0;
      for (int y = 0; y < height / 2; ++y) {
        base = y * pixel_stride;
        for (int x = 0; x < width / 2; ++x) {
          as_uint16[base + x] = *reinterpret_cast<uint16_t*>(
              &GetTestYuvColor(x * 2, y * 2, width, height)[1]);
        }
      }
    }
    ASSERT_EQ(buf_mgr->Unlock(buffer), 0);
  } else if (hal_format == HAL_PIXEL_FORMAT_YCBCR_P010) {
    android_ycbcr ycbcr = {};
    ASSERT_EQ(buf_mgr->LockYCbCr(buffer, 0, 0, 0, width, height, &ycbcr), 0);
    // Fill Y plane. 2 byte per pixel with dimension w x h.
    {
      uint16_t* as_uint16 = reinterpret_cast<uint16_t*>(ycbcr.y);
      size_t pixel_stride =
          CameraBufferManager::GetPlaneStride(buffer, 0) / sizeof(uint16_t);
      int base = 0;
      for (int y = 0; y < height; ++y) {
        base = y * pixel_stride;
        for (int x = 0; x < width; ++x) {
          as_uint16[base + x] = GetTestYuvColor(x, y, width, height)[0];
          as_uint16[base + x] <<= 8;
        }
      }
    }
    // Fill UV plane. 2x2 subsampling with 4 bytes per pixel and dimension
    // (w / 2) x (h / 2).
    {
      uint32_t* as_uint32 = reinterpret_cast<uint32_t*>(ycbcr.cb);
      size_t pixel_stride =
          CameraBufferManager::GetPlaneStride(buffer, 1) / sizeof(uint32_t);
      int base = 0;
      for (int y = 0; y < height / 2; ++y) {
        base = y * pixel_stride;
        for (int x = 0; x < width / 2; ++x) {
          uint16_t* u = reinterpret_cast<uint16_t*>(as_uint32 + base + x);
          uint16_t* v = u + 1;
          *u = GetTestYuvColor(x * 2, y * 2, width, height)[1];
          *u <<= 8;
          *v = GetTestYuvColor(x * 2, y * 2, width, height)[2];
          *v <<= 8;
        }
      }
    }
    ASSERT_EQ(buf_mgr->Unlock(buffer), 0);
  }
}

}  // namespace cros
