// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
#define GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_

#include <string_view>

#include "base/memory/raw_ptr.h"
#include "gpu/command_buffer/service/common_decoder.h"
#include "gpu/command_buffer/service/decoder_context.h"
#include "gpu/gpu_gles2_export.h"

namespace cc {
class SharedImageProvider;
}  // namespace cc

namespace gpu {

class DecoderClient;
struct GpuFeatureInfo;
struct GpuPreferences;
class MemoryTracker;
class ServiceTransferCache;
class SharedContextState;
class SharedImageManager;

namespace gles2 {
class GLES2Util;
class Logger;
class Outputter;
}  // namespace gles2

namespace raster {

// This class implements the AsyncAPIInterface interface, decoding
// RasterInterface commands and calling GL.
class GPU_GLES2_EXPORT RasterDecoder : public DecoderContext,
                                       public CommonDecoder {
 public:
  static std::unique_ptr<RasterDecoder> Create(
      DecoderClient* client,
      CommandBufferServiceBase* command_buffer_service,
      gles2::Outputter* outputter,
      const GpuFeatureInfo& gpu_feature_info,
      const GpuPreferences& gpu_preferences,
      scoped_refptr<MemoryTracker> memory_tracker,
      SharedImageManager* shared_image_manager,
      scoped_refptr<SharedContextState> shared_context_state,
      bool is_priviliged);

  RasterDecoder(const RasterDecoder&) = delete;
  RasterDecoder& operator=(const RasterDecoder&) = delete;

  ~RasterDecoder() override;

  // DecoderContext implementation.
  bool initialized() const override;
  TextureBase* GetTextureBase(uint32_t client_id) override;
  void SetLevelInfo(uint32_t client_id,
                    int level,
                    unsigned internal_format,
                    unsigned width,
                    unsigned height,
                    unsigned depth,
                    unsigned format,
                    unsigned type,
                    const gfx::Rect& cleared_rect) override;
  void BeginDecoding() override;
  void EndDecoding() override;
  std::string_view GetLogPrefix() override;

  virtual gles2::GLES2Util* GetGLES2Util() = 0;
  virtual gles2::Logger* GetLogger() = 0;
  virtual void SetIgnoreCachedStateForTest(bool ignore) = 0;

  void set_initialized() { initialized_ = true; }

  // Set to true to call glGetError after every command.
  void set_debug(bool debug) { debug_ = debug; }
  bool debug() const { return debug_; }

  // Set to true to LOG every command.
  void SetLogCommands(bool log_commands) override;
  gles2::Outputter* outputter() const override;
  bool log_commands() const { return log_commands_; }

  virtual gpu::ContextResult Initialize(
      bool lose_context_when_out_of_memory) = 0;

  virtual int DecoderIdForTest() = 0;
  virtual ServiceTransferCache* GetTransferCacheForTest() = 0;

  virtual void SetUpForRasterCHROMIUMForTest() = 0;
  virtual void SetOOMErrorForTest() = 0;
  virtual void DisableFlushWorkaroundForTest() = 0;

  virtual cc::SharedImageProvider* GetSharedImageProviderForTest() const = 0;

 protected:
  RasterDecoder(DecoderClient* client,
                CommandBufferServiceBase* command_buffer_service,
                gles2::Outputter* outputter);

 private:
  bool initialized_ = false;
  bool debug_ = false;
  bool log_commands_ = false;
  raw_ptr<gles2::Outputter> outputter_ = nullptr;
};

}  // namespace raster
}  // namespace gpu

#endif  // GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
