// Copyright 2013 The Chromium 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/command_buffer/common/mailbox.h"

#include <stddef.h>
#include <stdint.h>
#include <string.h>

#include "base/logging.h"
#include "base/rand_util.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"

namespace gpu {
namespace {

// The last byte of the mailbox's name stores the SharedImage flag. This avoids
// conflicts with Verify logic, which uses the first byte.
constexpr size_t kSharedImageFlagIndex = GL_MAILBOX_SIZE_CHROMIUM - 1;

// Use the lowest bit for the SharedImage flag (any bit would work).
constexpr int8_t kSharedImageFlag = 0x1;

void MarkMailboxAsSharedImage(bool is_shared_image, int8_t* name) {
  if (is_shared_image)
    name[kSharedImageFlagIndex] |= kSharedImageFlag;
  else
    name[kSharedImageFlagIndex] &= ~kSharedImageFlag;
}

Mailbox GenerateMailbox(bool is_shared_image) {
  Mailbox result;
  // Generates cryptographically-secure bytes.
  base::RandBytes(result.name, sizeof(result.name));
  MarkMailboxAsSharedImage(is_shared_image, result.name);
#if !defined(NDEBUG)
  int8_t value = 1;
  for (size_t i = 1; i < sizeof(result.name); ++i)
    value ^= result.name[i];
  result.name[0] = value;
#endif
  return result;
}

}  // namespace

Mailbox::Mailbox() {
  memset(name, 0, sizeof(name));
}

bool Mailbox::IsZero() const {
  for (size_t i = 0; i < base::size(name); ++i) {
    if (name[i])
      return false;
  }
  return true;
}

void Mailbox::SetZero() {
  memset(name, 0, sizeof(name));
}

void Mailbox::SetName(const int8_t* n) {
  DCHECK(IsZero() || !memcmp(name, n, sizeof(name)));
  memcpy(name, n, sizeof(name));
}

bool Mailbox::IsSharedImage() const {
  return name[kSharedImageFlagIndex] & kSharedImageFlag;
}

Mailbox Mailbox::Generate() {
  return GenerateMailbox(false /* is_shared_image */);
}

Mailbox Mailbox::GenerateForSharedImage() {
  return GenerateMailbox(true /* is_shared_image */);
}

bool Mailbox::Verify() const {
#if !defined(NDEBUG)
  int8_t value = 1;
  for (size_t i = 0; i < sizeof(name); ++i)
    value ^= name[i];
  return value == 0;
#else
  return true;
#endif
}

std::string Mailbox::ToDebugString() const {
  std::string s;
  for (int i = 0; i < GL_MAILBOX_SIZE_CHROMIUM; ++i) {
    if (i > 0)
      s += ':';
    s += base::StringPrintf("%02X", static_cast<uint8_t>(name[i]));
  }
  return s;
}

}  // namespace gpu
