/*
 * Copyright 2023 The Cobalt Authors. All Rights Reserved.
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef GLIMP_GLES_RESOURCE_MANAGER_H_
#define GLIMP_GLES_RESOURCE_MANAGER_H_

#include "glimp/gles/buffer.h"
#include "glimp/gles/framebuffer.h"
#include "glimp/gles/program.h"
#include "glimp/gles/ref_counted_resource_map.h"
#include "glimp/gles/renderbuffer.h"
#include "glimp/gles/shader.h"
#include "glimp/gles/texture.h"
#include "glimp/ref_counted.h"
#include "starboard/common/mutex.h"

namespace glimp {
namespace gles {

// The ResourceManager is responsible for managing the set of all GL ES
// resources used by contexts.  It manages the assignment of IDs to resources
// like textures, buffers, shaders, programs and so on.  When it is specified
// that a context should share resources with another upon construction, it is
// this ResourceManager object that is shared between them, and thus it must
// also be thread-safe.
class ResourceManager : public nb::RefCountedThreadSafe<ResourceManager> {
 public:
  ~ResourceManager();

  uint32_t RegisterProgram(const nb::scoped_refptr<Program>& program);
  nb::scoped_refptr<Program> GetProgram(uint32_t id);
  nb::scoped_refptr<Program> DeregisterProgram(uint32_t id);

  uint32_t RegisterShader(const nb::scoped_refptr<Shader>& shader);
  nb::scoped_refptr<Shader> GetShader(uint32_t id);
  nb::scoped_refptr<Shader> DeregisterShader(uint32_t id);

  uint32_t RegisterBuffer(const nb::scoped_refptr<Buffer>& buffer);
  nb::scoped_refptr<Buffer> GetBuffer(uint32_t id);
  nb::scoped_refptr<Buffer> DeregisterBuffer(uint32_t id);

  uint32_t RegisterTexture(const nb::scoped_refptr<Texture>& texture);
  nb::scoped_refptr<Texture> GetTexture(uint32_t id);
  nb::scoped_refptr<Texture> DeregisterTexture(uint32_t id);

  uint32_t RegisterFramebuffer(
      const nb::scoped_refptr<Framebuffer>& framebuffer);
  nb::scoped_refptr<Framebuffer> GetFramebuffer(uint32_t id);
  nb::scoped_refptr<Framebuffer> DeregisterFramebuffer(uint32_t id);

  uint32_t RegisterRenderbuffer(
      const nb::scoped_refptr<Renderbuffer>& renderbuffer);
  nb::scoped_refptr<Renderbuffer> GetRenderbuffer(uint32_t id);
  nb::scoped_refptr<Renderbuffer> DeregisterRenderbuffer(uint32_t id);

 private:
  starboard::Mutex mutex_;

  RefCountedResourceMap<Program> programs_;
  RefCountedResourceMap<Shader> shaders_;
  RefCountedResourceMap<Buffer> buffers_;
  RefCountedResourceMap<Texture> textures_;
  RefCountedResourceMap<Framebuffer> framebuffers_;
  RefCountedResourceMap<Renderbuffer> renderbuffers_;
};

}  // namespace gles
}  // namespace glimp

#endif  // GLIMP_GLES_RESOURCE_MANAGER_H_
