godot/thirdparty/embree/common/sys/alloc.h

// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "platform.h"
#include <vector>
#include <set>

namespace embree
{
#if defined(EMBREE_SYCL_SUPPORT)

  /* enables SYCL USM allocation */
  void enableUSMAllocEmbree(sycl::context* context, sycl::device* device);
  void enableUSMAllocTutorial(sycl::context* context, sycl::device* device);

  /* disables SYCL USM allocation */
  void disableUSMAllocEmbree();
  void disableUSMAllocTutorial();

#endif
  
#define ALIGNED_STRUCT_(align)
  
#define ALIGNED_STRUCT_USM_(align)
  
#define ALIGNED_CLASS_(align)

#define ALIGNED_CLASS_USM_(align)

  enum EmbreeUSMMode {};
  
  /*! aligned allocation */
  void* alignedMalloc(size_t size, size_t align);
  void alignedFree(void* ptr);

  /*! aligned allocation using SYCL USM */
  void* alignedUSMMalloc(size_t size, size_t align = 16, EmbreeUSMMode mode = EMBREE_USM_SHARED_DEVICE_READ_ONLY);
  void alignedUSMFree(void* ptr);

#if defined(EMBREE_SYCL_SUPPORT)
  
  /*! aligned allocation using SYCL USM */
  void* alignedSYCLMalloc(sycl::context* context, sycl::device* device, size_t size, size_t align, EmbreeUSMMode mode);
  void alignedSYCLFree(sycl::context* context, void* ptr);

  // deleter functor to use as deleter in std unique or shared pointers that
  // capture raw pointers created by sycl::malloc and it's variants
  template<typename T>
  struct sycl_deleter
  {
    void operator()(T const* ptr)
    {
      alignedUSMFree((void*)ptr);
    }
  };

#endif
  
  /*! allocator that performs aligned allocations */
  template<typename T, size_t alignment>
    struct aligned_allocator
    {};

  /*! allocates pages directly from OS */
  bool win_enable_selockmemoryprivilege(bool verbose);
  bool os_init(bool hugepages, bool verbose);
  void* os_malloc (size_t bytes, bool& hugepages);
  size_t os_shrink (void* ptr, size_t bytesNew, size_t bytesOld, bool hugepages);
  void  os_free   (void* ptr, size_t bytes, bool hugepages);
  void  os_advise (void* ptr, size_t bytes);

  /*! allocator that performs OS allocations */
  template<typename T>
    struct os_allocator
    {};

  /*! allocator that newer performs allocations */
  template<typename T>
    struct no_allocator
    {};

  /*! allocator for IDs */
  template<typename T, size_t max_id>
    struct IDPool
    {};
}